Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0xd6F5c46d4E1a02f9D145cEe41d2F8AF30D8d2d76
Balance 0 ETH
Nonce 1
Code Size 23893 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

23893 bytes
0x608060405234801561001057600080fd5b50600436106106235760003560e01c80637d66975211610336578063b1d23f02116101c3578063e6692f491161010f578063f5e95acb116100ad578063f8a3176c11610087578063f8a3176c14611522578063fb1ef52c1461152a578063fba58f3414611553578063fc0c546a1461155b57610623565b8063f5e95acb14611493578063f771fc87146114fd578063f83d08ba1461151a57610623565b8063f24ccbfe116100e9578063f24ccbfe1461139b578063f28699fa146113a3578063f2fde38b146113c2578063f41a9642146113e857610623565b8063e6692f491461133b578063e8afa8e814611358578063eceec1d31461137e57610623565b8063cf3090121161017c578063d86d53e711610156578063d86d53e7146112eb578063dcd962b214611308578063e568959a1461132b578063e59ee0c61461133357610623565b8063cf309012146112a7578063d6de07d0146112af578063d7f5549d146112ce57610623565b8063b1d23f02146111e4578063b65de35e14611207578063bc8756a914611224578063c710e92214611256578063cbf383d514611282578063cd6b83881461129f57610623565b8063987ab9db11610282578063a440ab1e1161023b578063a69df4b511610215578063a69df4b5146111a0578063a7ab6961146111a8578063a8dc889b146111b0578063b184be81146111b857610623565b8063a440ab1e146110f8578063a476907114611115578063a68548771461111d57610623565b8063987ab9db1461106257806399d18f6f1461106a5780639a8a62431461108d5780639b33f434146110955780639ddbbf85146110b25780639ff11500146110d557610623565b8063883b455f116102ef578063900cf0cf116102c9578063900cf0cf14611018578063914601491461102057806391f1a3a51461103d5780639342c8f41461104557610623565b8063883b455f146110005780638da5cb5b146110085780638f32d59b1461101057610623565b80637d66975214610f8b5780637ed4b27c14610f935780637f4b432314610fb05780637f952d9514610fcd578063817b1cd214610fd5578063858a7c0314610fdd57610623565b8063451b5985116104b45780635e47655f116104005780637060054d116103b957806377939d101161039357806377939d1014610f4d57806378f84a4414610f555780637b10399914610f7b5780637c7eaf1a14610f8357610623565b80637060054d14610f35578063715018a614610f3d5780637667180814610f4557610623565b80635e47655f14610d7357806360c8d12214610de15780636352211e14610e0a5780636365679814610e2757806368cb812a14610e535780636901b25314610f0357610623565b806352b8115d1161046d5780635508d8e1116104475780635508d8e114610d3e57806356342d8c14610d465780635aa6e67514610d635780635ab1bd5314610d6b57610623565b806352b8115d14610bd75780635325e14414610c6f57806354b8c60114610d3657610623565b8063451b598514610a9657806348ab8b2a14610a9e5780634b341aed14610ada5780634e3c83f114610b005780634fd101d714610b085780634fdd20f114610b1057610623565b806325316411116105735780632fa9d18b1161052c57806335aa2e441161050657806335aa2e44146109925780633862da0b14610a4b57806339610f7814610a7157806341b3d18514610a8e57610623565b80632fa9d18b146108f357806331c2273b14610982578063342745861461098a57610623565b8063253164111461079b57806325726df2146107a35780632649263a146107d957806328cc4e411461080a5780632cf44a43146108355780632e17de78146108d657610623565b8063174e6832116105e05780631ae4818f116105ba5780631ae4818f146107175780631dd6b9b11461073b5780631e9b12ef146107585780632079fb9a1461077e57610623565b8063174e6832146106cc578063178c2c83146106f257806317c2b9101461070f57610623565b806306cfb10414610628578063078a13b1146106475780630cccfc58146106855780630e15561a1461069f5780630ebb172a146106a757806316827b1b146106af575b600080fd5b6106456004803603602081101561063e57600080fd5b5035611563565b005b6106456004803603608081101561065d57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060013516611570565b61068d6115e8565b60408051918252519081900360200190f35b61068d6115ee565b61068d6115f4565b610645600480360360208110156106c557600080fd5b50356115fa565b61068d600480360360208110156106e257600080fd5b50356001600160a01b0316611683565b6106456004803603602081101561070857600080fd5b503561170d565b61068d61199a565b61071f6119a0565b604080516001600160a01b039092168252519081900360200190f35b6106456004803603602081101561075157600080fd5b50356119af565b6106456004803603602081101561076e57600080fd5b50356001600160a01b03166119bc565b61071f6004803603602081101561079457600080fd5b50356119f9565b61068d611a20565b6107c0600480360360208110156107b957600080fd5b5035611a26565b6040805192835260208301919091528051918290030190f35b6107f6600480360360208110156107ef57600080fd5b5035611a3f565b604080519115158252519081900360200190f35b6106456004803603606081101561082057600080fd5b50803590602081013590604001351515611a7a565b6106456004803603602081101561084b57600080fd5b810190602081018135600160201b81111561086557600080fd5b82018360208201111561087757600080fd5b803590602001918460208302840111600160201b8311171561089857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611c90945050505050565b610645600480360360208110156108ec57600080fd5b5035611cb8565b61068d600480360360a081101561090957600080fd5b8135916020810135916040820135916001600160a01b036060820135169181019060a081016080820135600160201b81111561094457600080fd5b82018360208201111561095657600080fd5b803590602001918460608302840111600160201b8311171561097757600080fd5b509092509050611d7a565b61071f61208b565b61068d61209a565b6109af600480360360208110156109a857600080fd5b50356120a0565b604051808e81526020018d81526020018c81526020018b81526020018a8152602001896001600160a01b03166001600160a01b03168152602001886001600160a01b03166001600160a01b03168152602001876003811115610a0d57fe5b60ff1681526020018681526020018581526020018481526020018381526020018281526020019d505050505050505050505050505060405180910390f35b61068d60048036036020811015610a6157600080fd5b50356001600160a01b0316612111565b61068d60048036036020811015610a8757600080fd5b5035612123565b61068d612163565b61068d612169565b61064560048036036080811015610ab457600080fd5b508035906001600160a01b0360208201358116916040810135909116906060013561216f565b61068d60048036036020811015610af057600080fd5b50356001600160a01b03166121f6565b61068d61232d565b61068d612333565b610645600480360360a0811015610b2657600080fd5b6001600160a01b0382351691602081013591604082013591606081013515159181019060a081016080820135600160201b811115610b6357600080fd5b820183602082011115610b7557600080fd5b803590602001918460018302840111600160201b83111715610b9657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612339945050505050565b610645600480360360c0811015610bed57600080fd5b6001600160a01b038235169160208101359160408201359160608101359160808201351515919081019060c0810160a0820135600160201b811115610c3157600080fd5b820183602082011115610c4357600080fd5b803590602001918460018302840111600160201b83111715610c6457600080fd5b5090925090506123fa565b610c8c60048036036020811015610c8557600080fd5b5035612519565b60405180868152602001858152602001846001600160a01b03166001600160a01b031681526020018315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610cf7578181015183820152602001610cdf565b50505050905090810190601f168015610d245780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b6107f66125df565b61068d6125e8565b61071f60048036036020811015610d5c57600080fd5b50356125ee565b61071f61260c565b61071f612620565b61068d60048036036020811015610d8957600080fd5b810190602081018135600160201b811115610da357600080fd5b820183602082011115610db557600080fd5b803590602001918460018302840111600160201b83111715610dd657600080fd5b509092509050612630565b61064560048036036060811015610df757600080fd5b5080359060208101359060400135612951565b61071f60048036036020811015610e2057600080fd5b50356129ba565b61064560048036036040811015610e3d57600080fd5b506001600160a01b038135169060200135612a06565b61064560048036036060811015610e6957600080fd5b813591602081013591810190606081016040820135600160201b811115610e8f57600080fd5b820183602082011115610ea157600080fd5b803590602001918460018302840111600160201b83111715610ec257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612a1b945050505050565b6107f660048036036060811015610f1957600080fd5b50803590602081013590604001356001600160a01b0316612bce565b61068d612c6b565b610645612c71565b61068d612ccc565b61068d612cd2565b61068d60048036036020811015610f6b57600080fd5b50356001600160a01b0316612cd8565b61071f612cea565b61068d612cf9565b61068d612cff565b61068d60048036036020811015610fa957600080fd5b5035612d05565b61068d60048036036020811015610fc657600080fd5b5035612d5c565b61068d612d71565b61068d612d77565b61064560048036036040811015610ff357600080fd5b5080359060200135612d7d565b61071f612dc3565b61071f612dd7565b6107f6612de6565b61068d612e29565b6106456004803603602081101561103657600080fd5b5035612e2f565b61068d612e46565b6106456004803603602081101561105b57600080fd5b5035612e4c565b61071f612e69565b6106456004803603604081101561108057600080fd5b5080359060200135612e78565b61068d612ede565b610645600480360360208110156110ab57600080fd5b5035612ee4565b610645600480360360408110156110c857600080fd5b5080359060200135612fa0565b610645600480360360408110156110eb57600080fd5b5080359060200135613006565b6106456004803603602081101561110e57600080fd5b503561309a565b61068d6130b1565b6106456004803603608081101561113357600080fd5b813591602081013591604082013515159190810190608081016060820135600160201b81111561116257600080fd5b82018360208201111561117457600080fd5b803590602001918460018302840111600160201b8311171561119557600080fd5b5090925090506130b7565b61064561316f565b61068d613181565b61068d613187565b610645600480360360408110156111ce57600080fd5b506001600160a01b03813516906020013561318d565b610645600480360360408110156111fa57600080fd5b508035906020013561319f565b61068d6004803603602081101561121d57600080fd5b50356131b2565b6107f66004803603606081101561123a57600080fd5b50803590602081013590604001356001600160a01b0316613200565b6106456004803603604081101561126c57600080fd5b50803590602001356001600160a01b0316613368565b6106456004803603602081101561129857600080fd5b5035613423565b61068d6134ac565b6107f66134b2565b610645600480360360208110156112c557600080fd5b503515156134bb565b61068d600480360360208110156112e457600080fd5b503561360d565b6106456004803603602081101561130157600080fd5b503561361f565b6106456004803603604081101561131e57600080fd5b5080359060200135613805565b61068d61386d565b6107c0613873565b6106456004803603602081101561135157600080fd5b503561387c565b6106456004803603602081101561136e57600080fd5b50356001600160a01b0316613938565b61068d6004803603602081101561139457600080fd5b50356139b8565b61071f6139ca565b610645600480360360208110156113b957600080fd5b503515156139d9565b610645600480360360208110156113d857600080fd5b50356001600160a01b03166139f4565b610645600480360360408110156113fe57600080fd5b81359190810190604081016020820135600160201b81111561141f57600080fd5b82018360208201111561143157600080fd5b803590602001918460018302840111600160201b8311171561145257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613a0e945050505050565b61064560048036036101208110156114aa57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c082013581169160e08101358216916101009091013516613bfc565b6106456004803603602081101561151357600080fd5b5035613d9f565b610645613dba565b61071f613dca565b6106456004803603606081101561154057600080fd5b5080359060208101359060400135613dd9565b61068d613ef4565b61071f613efa565b61156b613f09565b600f55565b611578613f09565b61158181613f57565b61158a57600080fd5b60238054610100600160a81b0319169055602580546001600160a01b03199081166001600160a01b03938416179091556006805482169583169590951790945560058054851693821693909317909255600780549093169116179055565b60155481565b60135481565b60085481565b611602613f09565b8061160c57600080fd5b60055460105460408051630f1980a560e41b8152600481018590526024810192909252516001600160a01b039092169163f1980a509160448082019260009290919082900301818387803b15801561166357600080fd5b505af1158015611677573d6000803e3d6000fd5b50505060109190915550565b60065460408051632f745c5960e01b81526001600160a01b038481166004830152600060248301819052925192931691632f745c5991604480820192602092909190829003018186803b1580156116d957600080fd5b505afa1580156116ed573d6000803e3d6000fd5b505050506040513d602081101561170357600080fd5b505190505b919050565b8061171781613f76565b60026000838152601a6020526040902060060154600160a01b900460ff16600381111561174057fe5b1461177f576040805162461bcd60e51b815260206004820152600a602482015269139bdd081a985a5b195960b21b604482015290519081900360640190fd5b6000828152601a6020526040902060030154156117d7576040805162461bcd60e51b8152602060048201526011602482015270416c726561647920756e7374616b696e6760781b604482015290519081900360640190fd5b6009546000838152601a6020526040902060040154811015611839576040805162461bcd60e51b8152602060048201526016602482015275125b98dbdb5c1b195d19481a985a5b081c195c9a5bd960521b604482015290519081900360640190fd5b6000838152601a6020526040902054600c5481101561185757600080fd5b6000848152601a60205260409020600601546001600160a01b031680156118cc57806001600160a01b031663a69df4b56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118b357600080fd5b505af11580156118c7573d6000803e3d6000fd5b505050505b6000858152601a60205260409020600a01546118fc906118f390849063ffffffff61400016565b60016000614012565b6000858152601a602052604080822060068101805460ff60a01b1916600160a01b1790556005908101549054825163f92ec5af60e01b8152600481018a90526001600160a01b039283166024820181905293519394929091169263f92ec5af9260448084019391929182900301818387803b15801561197a57600080fd5b505af115801561198e573d6000803e3d6000fd5b50505050505050505050565b60175481565b6007546001600160a01b031681565b6119b7613f09565b600955565b6119c4613f09565b6001600160a01b0381166119d757600080fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60268181548110611a0657fe5b6000918252602090912001546001600160a01b0316905081565b600e5481565b601e602052600090815260409020805460019091015482565b6000818152601a6020526040812060068101548154600390920154600954611a7493600160a01b90930460ff169291906140cd565b92915050565b611a82614105565b82611a8c81613f76565b6000848152601a602052604090206003015415611adf576040805162461bcd60e51b815260206004820152600c60248201526b4e6f2072657374616b696e6760a01b604482015290519081900360640190fd5b8215611af057611af0333085614146565b611af984614218565b8115611b4c576000848152601a60205260409020600190810154611b359190611b2990869063ffffffff61400016565b9063ffffffff61422716565b6000858152601a6020526040902060019081015592505b601154600090611b62908563ffffffff61400016565b60118190556000868152601a6020526040902054909150611b89908563ffffffff61400016565b6000868152601a6020526040812091909155611ba790859080614012565b6005546040805163532e19a960e01b81526004810188905290516001600160a01b039092169163532e19a99160248082019260009290919082900301818387803b158015611bf457600080fd5b505af1158015611c08573d6000803e3d6000fd5b50506005546000888152601a6020526040808220548151631585a9f360e21b8152600481018c905260248101919091526044810187905290516001600160a01b039093169450635616a7cc93506064808201939182900301818387803b158015611c7157600080fd5b505af1158015611c85573d6000803e3d6000fd5b505050505050505050565b611c98612de6565b611ca157600080fd5b8051611cb4906026906020840190615bc9565b5050565b80611cc281613f76565b600082815260208052604090205415611cda57600080fd5b6000828152601a602052604090206006810154600290910154600160a01b90910460ff169015801590611d1c57506000838152601a6020526040902060030154155b8015611d4857506001816003811115611d3157fe5b1480611d4857506002816003811115611d4657fe5b145b611d5157600080fd5b600954600090611d6890600163ffffffff61400016565b9050611d74848261423c565b50505050565b6002546000906001600160a01b03163314611d9457600080fd5b600954601d546000908190611da7615c2e565b6026546040805191840180835260208082028401019091528015611dd5578160200160208202803883390190505b5060408083019190915260268054825160208083028201810190945281815292830182828015611e2e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611e10575b50505050506060820152600060208201526026546080820152611e4f615c5d565b6026546040805191850180835260208082028401019091528015611e7d578160200160208202803883390190505b50602082015260005b8881101561204c576000611ed48e8c8c85818110611ea057fe5b90506060020160038060200260405190810160405280929190826003602002808284376000920191909152506143c0915050565b9050856001600160a01b0316816001600160a01b03161415611ef65750612044565b856001600160a01b0316816001600160a01b03161015611f16575061204c565b6001600160a01b0381166000908152601b6020908152604080832054808452601a909252909120805460068201546003909201548087529091600160a01b900460ff1690611f6890829084908e6140cd565b15611ff3576000838152601a60205260409020600a01549398508893611fa7908390611f9b908d9063ffffffff61400016565b9063ffffffff61400016565b8651909a5015611fe157828660200151876040015181518110611fc657fe5b60209081029190910101526040860180516001019052611fee565b611feb87856144c3565b96505b61203f565b600281600381111561200157fe5b141561203f5782876040015188600001518151811061201c57fe5b602090810291909101810191909152875160019081018952908801805190910190525b505050505b600101611e86565b506120588260006144c3565b915061207a8d8b878e86604001518760000151876020015188604001516145a0565b9d9c50505050505050505050505050565b6006546001600160a01b031681565b60165481565b601a60205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b909b0154999a98999798969795966001600160a01b039586169695851695600160a01b90950460ff16948d565b601b6020526000908152604090205481565b60008061212f83614708565b6000858152601a602052604090206009015490925061215c9150600190611b29908463ffffffff61400016565b9392505050565b600c5481565b60295481565b612177613f09565b6000848152601a60205260409020600601546001600160a01b03168061219c57600080fd5b6040805163abf59fc960e01b81526001600160a01b03868116600483015285811660248301526044820185905291519183169163abf59fc99160648082019260009290919082900301818387803b158015611c7157600080fd5b60006001600160a01b03821615806122845750600654604080516370a0823160e01b81526001600160a01b038581166004830152915191909216916370a08231916024808301926020929190829003018186803b15801561225657600080fd5b505afa15801561226a573d6000803e3d6000fd5b505050506040513d602081101561228057600080fd5b5051155b1561229157506000611708565b60065460408051632f745c5960e01b81526001600160a01b0385811660048301526000602483018190529251601a949190911691632f745c59916044808301926020929190829003018186803b1580156122ea57600080fd5b505afa1580156122fe573d6000803e3d6000fd5b505050506040513d602081101561231457600080fd5b5051815260208101919091526040016000205492915050565b600f5481565b60105481565b612341614105565b60105461234c612d71565b1061238e576040805162461bcd60e51b815260206004820152600d60248201526c6e6f206d6f726520736c6f747360981b604482015290519081900360640190fd5b600c548410156123da576040805162461bcd60e51b81526020600482015260126024820152711b9bdd08195b9bdd59da0819195c1bdcda5d60721b604482015290519081900360640190fd5b6123e685338587614784565b6123f28585848461486e565b505050505050565b33301461243c576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6124498788886000614784565b6124558560095461423c565b600061249988868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061486e92505050565b6005546040805163e12ab1af60e01b815260048101849052602481018a90526044810189905290519293506001600160a01b039091169163e12ab1af9160648082019260009290919082900301818387803b1580156124f757600080fd5b505af115801561250b573d6000803e3d6000fd5b505050505050505050505050565b60208080526000918252604091829020805460018083015460028085015460038601805489516101009682161596909602600019011692909204601f8101889004880285018801909852878452939691956001600160a01b03851695600160a01b90950460ff16949392908301828280156125d55780601f106125aa576101008083540402835291602001916125d5565b820191906000526020600020905b8154815290600101906020018083116125b857829003601f168201915b5050505050905085565b60195460ff1681565b60125481565b6000908152601a60205260409020600601546001600160a01b031690565b60005461010090046001600160a01b031681565b6004546001600160a01b03165b90565b6004805460408051631ab0168360e31b8152905160009333936001600160a01b03169263d580b4189281830192602092829003018186803b15801561267457600080fd5b505afa158015612688573d6000803e3d6000fd5b505050506040513d602081101561269e57600080fd5b50516001600160a01b0316146126ef576040805162461bcd60e51b81526020600482015260116024820152702737ba1039b630b9b41036b0b730b3b2b960791b604482015290519081900360640190fd5b606061273861273385858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250614c7b92505050565b614ca0565b90506000806000805b845181101561292557606061276886838151811061275b57fe5b6020026020010151614ca0565b905060006127898260008151811061277c57fe5b6020026020010151614d71565b905061279481614218565b60006127a68360018151811061277c57fe5b90506127b8858263ffffffff61400016565b6000838152601a60205260409020600601549095506001600160a01b03168015612886576000838152601a602090815260408083208054600a9091015482516306cbb60560e41b8152600481019290925260248201526044810186905290516001600160a01b03851692636cbb6050926064808201939182900301818787803b15801561284457600080fd5b505af1158015612858573d6000803e3d6000fd5b505050506040513d602081101561286e57600080fd5b50519050612882838263ffffffff61422716565b9250505b6000838152601a60205260408120546128a5908463ffffffff61422716565b6000858152601a602052604090208190559050806128ce576128c98460095461423c565b612914565b6128eb856002815181106128de57fe5b6020026020010151614dd1565b156129145761290b6128fe856001614e05565b899063ffffffff61400016565b60019099019897505b505060019093019250612741915050565b612946612938838563ffffffff61400016565b600003856000036000614012565b509695505050505050565b612959613f09565b60255460408051602481018690526044810185905260648082018590528251808303909101815260849091019091526020810180516001600160e01b0316633064689160e11b1790526129b5916001600160a01b031690614f4f565b505050565b600654604080516331a9108f60e11b81526004810184905290516000926001600160a01b031691636352211e916024808301926020929190829003018186803b1580156116d957600080fd5b612a0e614105565b611cb48233836000614784565b60408051336020808301919091528183018690528251808303840181526060830193849052805190820120601754631b23d15760e21b909452606483018181526084840187905260a48401859052608060c48501908152865160e4860152865173540bde6642a8cb547a6887934044e465914112d096636c8f455c9694958a9591948a9490939092610104019185019080838360005b83811015612ac9578181015183820152602001612ab1565b50505050905090810190601f168015612af65780820380516001836020036101000a031916815260200191505b509550505050505060206040518083038186803b158015612b1657600080fd5b505af4158015612b2a573d6000803e3d6000fd5b505050506040513d6020811015612b4057600080fd5b5051612b85576040805162461bcd60e51b815260206004820152600f60248201526e2bb937b7339030b1b190383937b7b360891b604482015290519081900360640190fd5b336000908152601f6020526040812054612ba690859063ffffffff61422716565b9050612bb23382614f77565b336000818152601f60205260409020859055611d749082614ff6565b600083612bda816150bb565b600354604080516323b872dd60e01b81526001600160a01b03868116600483015230602483015260448201889052915191909216916323b872dd9160648083019260209291908290030181600087803b158015612c3657600080fd5b505af1158015612c4a573d6000803e3d6000fd5b505050506040513d6020811015612c6057600080fd5b505195945050505050565b600a5481565b612c79612de6565b612c8257600080fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b60095481565b60185481565b601f6020526000908152604090205481565b6004546001600160a01b031681565b602a5481565b600b5481565b600081612d11816150bb565b612d1a83614218565b6000838152601a6020526040812060090154612d3d90600163ffffffff61422716565b6000858152601a60205260409020600160099091015592505050919050565b6000908152601a60205260409020600a015490565b601d5490565b60115481565b81612d87816150bb565b6000838152601a60205260409020600a0154612da9908363ffffffff61422716565b6000938452601a6020526040909320600a01929092555050565b60235461010090046001600160a01b031681565b6001546001600160a01b031690565b604080517f6d617469632e6e6574776f726b2e70726f78792e6f776e6572000000000000008152905190819003601901902054336001600160a01b039091161490565b60095490565b612e37613f09565b612e438160095461423c565b50565b60275481565b80612e5681613f76565b612e5f82614218565b611cb48233615129565b6002546001600160a01b031681565b612e80614105565b602554604080516024810185905260448101849052306064808301919091528251808303909101815260849091019091526020810180516001600160e01b031663561ad5c960e11b179052611cb4916001600160a01b031690614f4f565b60225481565b612eec613f09565b6005546016546040805163a3b1d8cb60e01b8152600481018590526024810192909252516001600160a01b039092169163a3b1d8cb9160448082019260009290919082900301818387803b158015612f4357600080fd5b505af1158015612f57573d6000803e3d6000fd5b505050506064811115612f9b576040805162461bcd60e51b8152602060048201526007602482015266746f6f2062696760c81b604482015290519081900360640190fd5b601655565b612fa8612de6565b612fb157600080fd5b602554604080516024810185905260448082018590528251808303909101815260649091019091526020810180516001600160e01b0316639ddbbf8560e01b179052611cb4916001600160a01b031690614f4f565b81613010816150bb565b60008213156130695760195460ff16613069576040805162461bcd60e51b815260206004820152601660248201527511195b1959d85d1a5bdb881a5cc8191a5cd8589b195960521b604482015290519081900360640190fd5b61307582600080614012565b6000821261308c5761308783836151ea565b6129b5565b6129b5838360001902612d7d565b6130a2613f09565b806130ac57600080fd5b600e55565b601c5490565b6130bf614105565b6025546040516024810187815260448201879052851515606483015260806084830190815260a48301859052613168936001600160a01b03169263a685487760e01b928a928a928a928a928a9260c40184848082843760008184015260408051601f19601f9093018316909401848103909201845252506020810180516001600160e01b03199a909a166001600160e01b03909a169990991790985250614f4f95505050505050565b5050505050565b613177613f09565b61317f615225565b565b60085490565b60245481565b613195613f09565b611cb48282614ff6565b6131a7613f09565b600c91909155600d55565b6000818152601a602052604081206003015481906131d7576131d383614708565b5090505b6000838152601a6020526040902060019081015461215c9190611b29908463ffffffff61400016565b6000838152601a60205260408120600601546001600160a01b031633148061329f57506004805460408051631ab0168360e31b8152905133936001600160a01b039093169263d580b41892808201926020929091829003018186803b15801561326857600080fd5b505afa15801561327c573d6000803e3d6000fd5b505050506040513d602081101561329257600080fd5b50516001600160a01b0316145b6132de576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6003546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561333457600080fd5b505af1158015613348573d6000803e3d6000fd5b505050506040513d602081101561335e57600080fd5b5051949350505050565b613370613f09565b306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133b357600080fd5b505afa1580156133c7573d6000803e3d6000fd5b505050506040513d60208110156133dd57600080fd5b50516001600160a01b0316146133f257600080fd5b6000918252601a602052604090912060060180546001600160a01b0319166001600160a01b03909216919091179055565b61342b613f09565b8061343557600080fd5b600554600b5460408051632dbe9d3160e21b8152600481018590526024810192909252516001600160a01b039092169163b6fa74c49160448082019260009290919082900301818387803b15801561348c57600080fd5b505af11580156134a0573d6000803e3d6000fd5b505050600b9190915550565b60145481565b60005460ff1681565b336000908152601b6020908152604080832054808452601a9092529091206006810154815460039092015460095461350093600160a01b90930460ff169291906140cd565b613541576040805162461bcd60e51b815260206004820152600d60248201526c3737ba103b30b634b230ba37b960991b604482015290519081900360640190fd5b6000818152601a60205260409020600601546001600160a01b0316806135a7576040805162461bcd60e51b815260206004820152601660248201527511195b1959d85d1a5bdb881a5cc8191a5cd8589b195960521b604482015290519081900360640190fd5b604080516303dd464160e51b8152841515600482015290516001600160a01b03831691637ba8c82091602480830192600092919082900301818387803b1580156135f057600080fd5b505af1158015613604573d6000803e3d6000fd5b50505050505050565b60216020526000908152604090205481565b8061362981613f76565b6000828152601a6020526040902060030154801580159061365f575060095460085461365c90839063ffffffff61400016565b11155b8015613692575060036000848152601a6020526040902060060154600160a01b900460ff16600381111561368f57fe5b14155b61369b57600080fd5b6000838152601a60205260408120546011549091906136c0908363ffffffff61422716565b601181905590506136d18533615129565b60065460408051630852cd8d60e31b81526004810188905290516001600160a01b03909216916342966c689160248082019260009290919082900301818387803b15801561371e57600080fd5b505af1158015613732573d6000803e3d6000fd5b5050506000868152601a6020526040812081815560048101919091556005810180546001600160a01b03191690556000197f584f46c60af19681376031579adb04a2416e54ee5505351c2a8435e3766026ea55600601805460ff60a01b1916600360a01b179055506137a43383614ff6565b6005546040805163ae2e26b160e01b815233600482015260248101889052604481018590526064810184905290516001600160a01b039092169163ae2e26b19160848082019260009290919082900301818387803b158015611c7157600080fd5b8161380f81613f76565b61381883614218565b602554604080516024810186905260448082018690528251808303909101815260649091019091526020810180516001600160e01b0316636e6cb15960e11b1790526129b5916001600160a01b031690614f4f565b60285481565b601c54601d5482565b613884613f09565b6000811161389157600080fd5b600554600a5460408051635071805360e11b8152600481018590526024810192909252516001600160a01b039092169163a0e300a69160448082019260009290919082900301818387803b1580156138e857600080fd5b505af11580156138fc573d6000803e3d6000fd5b505050600a82905550600881905561391b81600463ffffffff61523116565b60158190556009546139329163ffffffff61400016565b60185550565b613940612de6565b61394957600080fd5b6001600160a01b03811661395c57600080fd5b6002546040516001600160a01b038084169216907f211c9015fc81c0dbd45bd99f0f29fc1c143bfd53442d5ffd722bbbef7a887fe990600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000908152601a602052604090205490565b6005546001600160a01b031681565b6139e1613f09565b6019805460ff1916911515919091179055565b6139fc612de6565b613a0557600080fd5b612e4381615253565b81613a1881613f76565b6000613a23836152c2565b600954600f546000878152602160205260409020549293509091613a4c9163ffffffff61400016565b811015613a8e576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6000858152601a602090815260408083206005908101549054915163b80fbce560e01b8152600481018a81526001600160a01b039283166024830181905288841660448401526080606484019081528b5160848501528b519197949095169563b80fbce5958d9589958c958f95909460a490920192918601918190849084905b83811015613b26578181015183820152602001613b0e565b50505050905090810190601f168015613b535780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613b7557600080fd5b505af1158015613b89573d6000803e3d6000fd5b5050506001600160a01b038083166000908152601b6020908152604080832060001990559287168083528383208b90558a8352601a90915291902060050180546001600160a01b031916909117905550613be3818461537b565b5060009485526021602052604090942093909355505050565b60235460ff1615613c45576040805162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015290519081900360640190fd5b6023805460ff19166001179055613c5b81613f57565b613ca5576040805162461bcd60e51b8152602060048201526016602482015275185d58dd1a5bdb881a5b5c1b081a5b98dbdc9c9958dd60521b604482015290519081900360640190fd5b602580546001600160a01b03199081166001600160a01b038481169190911790925560008054610100600160a81b031916610100878516021790556004805482168c84161790556002805482168b84161790556003805482168a841617905560068054821689841617905560058054821688841617905560078054909116918616919091179055613d3582615253565b5050612000600855505060016009819055610376600a90815569044664c7bf6451f00000600b55670de0b6b3a7640000600c819055600d55610400600e556064600f55600760105560128290556108006015556016556019805460ff191690911790555050505050565b613da7613f09565b600954613932908263ffffffff61400016565b613dc2613f09565b61317f61538d565b6025546001600160a01b031681565b60078211613e22576040805162461bcd60e51b815260206004820152601160248201527024b73b30b634b21036b4b3b930ba34b7b760791b604482015290519081900360640190fd5b6000838152601a6020526040808220600601548151636e7ce59160e01b81523360048201526024810185905291516001600160a01b0390911692636e7ce591926044808201939182900301818387803b158015613e7e57600080fd5b505af1158015613e92573d6000803e3d6000fd5b5050506000838152601a6020526040808220600601548151632830728d60e21b81523360048201526024810186905291516001600160a01b03909116935063a0c1ca349260448084019391929182900301818387803b1580156135f057600080fd5b600d5481565b6003546001600160a01b031681565b60005461010090046001600160a01b0316331461317f5760405162461bcd60e51b8152600401808060200182810382526026815260200180615cfb6026913960400191505060405180910390fd5b60006001600160a01b038216613f6f57506000611708565b503b151590565b600654604080516331a9108f60e11b815260048101849052905133926001600160a01b031691636352211e916024808301926020929190829003018186803b158015613fc157600080fd5b505afa158015613fd5573d6000803e3d6000fd5b505050506040513d6020811015613feb57600080fd5b50516001600160a01b031614612e4357600080fd5b60008282018381101561215c57600080fd5b806140ab57600083131561403b57601c54614033908463ffffffff61400016565b601c5561405f565b600083121561405f57601c5461405b90600085900363ffffffff61422716565b601c555b600082131561408357601d5461407b908363ffffffff61400016565b601d55613087565b600082121561308757601d546140a390600084900363ffffffff61422716565b601d556129b5565b6000818152601e60205260409020805484018155600101805483019055505050565b600080841180156140e557508215806140e557508183115b80156140fc575060018560038111156140fa57fe5b145b95945050505050565b60005460ff161561317f576040805162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b604482015290519081900360640190fd5b600354604080516323b872dd60e01b81526001600160a01b038681166004830152858116602483015260448201859052915191909216916323b872dd9160648083019260209291908290030181600087803b1580156141a457600080fd5b505af11580156141b8573d6000803e3d6000fd5b505050506040513d60208110156141ce57600080fd5b50516129b5576040805162461bcd60e51b81526020600482015260146024820152731d1c985b9cd9995c88199c9bdb4819985a5b195960621b604482015290519081900360640190fd5b612e438160245460245461539c565b60008282111561423657600080fd5b50900390565b61424582614218565b6000828152601a60205260408120549061425e846129ba565b6000858152601a6020526040902060038101859055600a810154600690910154919250906001600160a01b031680156142e557806001600160a01b031663f83d08ba6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156142cc57600080fd5b505af11580156142e0573d6000803e3d6000fd5b505050505b6000868152601a6020526040902060050154614309906001600160a01b031661543d565b6143138684615129565b60006009548611156143255785614328565b60005b905061433c83860160000360001983614012565b60055460408051635e04d48360e01b81526001600160a01b038781166004830152602482018b9052604482018a90526064820189905291519190921691635e04d48391608480830192600092919082900301818387803b15801561439f57600080fd5b505af11580156143b3573d6000803e3d6000fd5b5050505050505050505050565b805160208201516040830151600092919060ff167f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156144085760009350505050611a74565b601b8160ff16101561441857601b015b8060ff16601b1415801561443057508060ff16601c14155b156144415760009350505050611a74565b60408051600080825260208083018085528a905260ff85168385015260608301879052608083018690529251909260019260a080820193601f1981019281900390910190855afa158015614499573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166144b957600080fd5b9695505050505050565b6144cb615c2e565b8260800151836020015110801561450f5750816001600160a01b031683606001518460200151815181106144fb57fe5b60200260200101516001600160a01b031614155b1561459057601b6000846060015185602001518151811061452c57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054836040015184600001518151811061456957fe5b602090810291909101810191909152835160019081018552908401805190910190526144cb565b5050602081018051600101905290565b601c546000906145cd6001611f9b60036145c185600263ffffffff61554716565b9063ffffffff61523116565b881015614617576040805162461bcd60e51b8152602060048201526013602482015272322f332b31206e6f6e2d6d616a6f726974792160681b604482015290519081900360640190fd5b60006146248b8a8461556e565b9050600061464260646145c16016548561554790919063ffffffff16565b6001600160a01b038c166000908152601b6020908152604080832054808452601a90925290912060018101549293509091614683908463ffffffff61400016565b600182015560178b905560006146d06146c18e6145c16a084595161401484a0000006146b58a8a63ffffffff61422716565b9063ffffffff61554716565b6024549063ffffffff61400016565b90506146dd8b8b836156c2565b60248190556146ed8989836156c2565b6146f56156f6565b50929d9c50505050505050505050505050565b6000818152601a602052604081208054600a90910154829190829061473490839063ffffffff61400016565b6000868152601a60205260409020600b0154602454919250900361477886846147726a084595161401484a0000006145c1868863ffffffff61554716565b8561576b565b94509450505050915091565b600d548210156147cb576040805162461bcd60e51b815260206004820152600d60248201526c199959481d1bdbc81cdb585b1b609a1b604482015290519081900360640190fd5b6147e583306147e0858563ffffffff61400016565b614146565b6022546147f8908363ffffffff61400016565b6022556005546040805163a449d79560e01b81526001600160a01b038781166004830152602482018690529151919092169163a449d79591604480830192600092919082900301818387803b15801561485057600080fd5b505af1158015614864573d6000803e3d6000fd5b5050505050505050565b60008061487a836152c2565b600954601254600554601154939450919290916001600160a01b0316906000906148aa908a63ffffffff61400016565b905080601181905550604051806101a001604052808a8152602001600181526020018581526020016000815260200160008152602001866001600160a01b03168152602001896148fb576000614987565b600754600480546040805163d4ad267360e01b81529283018990526001600160a01b03888116602485015291821660448401525192169163d4ad2673916064808201926020929091908290030181600087803b15801561495a57600080fd5b505af115801561496e573d6000803e3d6000fd5b505050506040513d602081101561498457600080fd5b50515b6001600160a01b031681526020016001815260006020808301829052604080840183905260016060808601829052608080870186905260245460a0978801528a8652601a855294839020875181559387015191840191909155908501516002830155840151600380830191909155918401516004820155918301516005830180546001600160a01b039283166001600160a01b03199182161790915560c08501516006850180549190931691161780825560e08501519260ff60a01b1990911690600160a01b908490811115614a5957fe5b0217905550610100820151600782015561012082015160088201556101408201516009820155610160820151600a82015561018090910151600b9091015560008381526021602052604080822086905560065481516340c10f1960e01b81526001600160a01b038e8116600483015260248201889052925192909116926340c10f199260448084019382900301818387803b158015614af757600080fd5b505af1158015614b0b573d6000803e3d6000fd5b5050506001600160a01b0386166000908152601b60205260408120859055614b3891508a90600190614012565b836020600085815260200190815260200160002060010181905550816001600160a01b03166333a8383c868986888e876040518763ffffffff1660e01b815260040180876001600160a01b03166001600160a01b0316815260200180602001868152602001858152602001848152602001838152602001828103825287818151815260200191508051906020019080838360005b83811015614be4578181015183820152602001614bcc565b50505050905090810190601f168015614c115780820380516001836020036101000a031916815260200191505b50975050505050505050600060405180830381600087803b158015614c3557600080fd5b505af1158015614c49573d6000803e3d6000fd5b50505050614c6160018461400090919063ffffffff16565b601255614c6d856157ff565b509098975050505050505050565b614c83615c7e565b506040805180820190915281518152602082810190820152919050565b6060614cab82615919565b614cb457600080fd5b6000614cbf83615953565b9050606081604051908082528060200260200182016040528015614cfd57816020015b614cea615c7e565b815260200190600190039081614ce25790505b5090506000614d0f85602001516159af565b60208601510190506000805b84811015614d6657614d2c83615a12565b9150604051806040016040528083815260200184815250848281518110614d4f57fe5b602090810291909101015291810191600101614d1b565b509195945050505050565b805160009015801590614d8657508151602110155b614d8f57600080fd5b6000614d9e83602001516159af565b83516020808601518301805193945091849003929190831015614dc857826020036101000a820491505b50949350505050565b8051600090600114614de257600080fd5b6020820151805160001a908115614dfa576001614dfd565b60005b949350505050565b6000828152601a60205260408120600601546001600160a01b03168015614e7a57806001600160a01b031663f83d08ba6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614e6157600080fd5b505af1158015614e75573d6000803e3d6000fd5b505050505b600954614e8d818563ffffffff61400016565b6000868152601a602052604080822060048082019490945560068101805460ff60a01b1916600160a11b1790556005805491015482516381dc101b60e01b81529485018a9052602485018690526001600160a01b03908116604486015291519116926381dc101b92606480830193919282900301818387803b158015614f1257600080fd5b505af1158015614f26573d6000803e3d6000fd5b5050506000868152601a60205260409020600a81015490546140fc92509063ffffffff61400016565b600080825160208401856127105a03f43d604051816000823e828015614f73578282f35b8282fd5b602254614f8a908263ffffffff61422716565b6022556005546040805163122b648160e01b81526001600160a01b038581166004830152602482018590529151919092169163122b648191604480830192600092919082900301818387803b158015614fe257600080fd5b505af11580156123f2573d6000803e3d6000fd5b6003546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561504c57600080fd5b505af1158015615060573d6000803e3d6000fd5b505050506040513d602081101561507657600080fd5b5051611cb4576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6000818152601a60205260409020600601546001600160a01b03163314612e43576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f6e747261637420616464726573730000000000000000604482015290519081900360640190fd5b6000828152601a6020526040812060019081015461514c9163ffffffff61422716565b601454909150615162908263ffffffff61400016565b6014556000838152601a60205260409020600181810155602454600b9091015561518c8282614ff6565b60055460145460408051635b42d93560e11b815260048101879052602481018590526044810192909252516001600160a01b039092169163b685b26a9160648082019260009290919082900301818387803b1580156135f057600080fd5b6000828152601a60205260409020600a015461520c908263ffffffff61400016565b6000928352601a6020526040909220600a019190915550565b6000805460ff19169055565b600080821161523f57600080fd5b600082848161524a57fe5b04949350505050565b6001600160a01b03811661526657600080fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60008151604014615304576040805162461bcd60e51b81526020600482015260076024820152663737ba10383ab160c91b604482015290519081900360640190fd5b815160208301206001600160a01b0381161580159061533957506001600160a01b0381166000908152601b6020526040902054155b611a74576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b4b3b732b960911b604482015290519081900360640190fd5b6153848261543d565b611cb4816157ff565b6000805460ff19166001179055565b6000838152601a60205260409020600b01548281101561541b576000848152601a602052604090208054600a9091015480156154035760006153e4838363ffffffff61400016565b90506153fd8784846153f88b868c8b615aab565b615acf565b50615418565b6154188661541388858988615aab565b615b75565b50505b80821115611d74576000848152601a60205260409020600b0182905550505050565b6026805490600090600019830183811061545357fe5b600091825260209091200154602680546001600160a01b03909216925090600019840190811061547f57fe5b600091825260209091200180546001600160a01b031916905560001982015b801561553657836001600160a01b0316826001600160a01b031614156154c357615536565b602660018203815481106154d357fe5b9060005260206000200160009054906101000a90046001600160a01b0316826026600184038154811061550257fe5b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905591506000190161549e565b506000198201611d74602682615c98565b60008261555657506000611a74565b8282028284828161556357fe5b041461215c57600080fd5b600e54600b54600091908261558e83888161558557fe5b04602954615bb3565b90506000811180156155a257506027548114155b156155e357602754156155dd5760006064602a548402816155bf57fe5b0490508160275411156155d557918201916155db565b80830392505b505b60278190555b60008388111561567c5760285461562b61561b60646145c161560e6002600019890189020486615547565b889063ffffffff61554716565b611b29868663ffffffff61554716565b915061564d615640848763ffffffff61554716565b8a9063ffffffff61422716565b985061567861566b60646145c1846146b5898963ffffffff61554716565b859063ffffffff61422716565b9350505b6156a0615693856145c18b8763ffffffff61554716565b829063ffffffff61400016565b90506156b6866145c1838a63ffffffff61554716565b98975050505050505050565b60245460005b83811015613168576156ee8582815181106156df57fe5b6020026020010151838561539c565b6001016156c8565b600954600061570c82600163ffffffff61400016565b9050615716615c7e565b506000818152601e6020908152604080832081518083019092528054808352600190910154928201839052909261574d9290614012565b506000918252601e6020526040822082815560010191909155600955565b6000808261577e575060009050806157f6565b6000615794846145c1888863ffffffff61554716565b6000888152601a602052604090206007015490915080156157db576157d86157cb60646145c1846146b58b8863ffffffff61422716565b839063ffffffff61400016565b91505b60006157ed878463ffffffff61422716565b92945091925050505b94509492505050565b6026805460018101825560008290527f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a35940180546001600160a01b0319166001600160a01b0384161790555460001901805b80156158d15760006026600183038154811061586857fe5b6000918252602090912001546001600160a01b039081169150841681101561589057506158d1565b806026838154811061589e57fe5b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790555060001901615850565b8181146129b55782602682815481106158e657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b805160009061592a57506000611708565b6020820151805160001a9060c082101561594957600092505050611708565b5060019392505050565b805160009061596457506000611708565b6000809050600061597884602001516159af565b602085015185519181019250015b808210156159a65761599782615a12565b60019093019290910190615986565b50909392505050565b8051600090811a60808110156159c9576000915050611708565b60b88110806159e4575060c081108015906159e4575060f881105b156159f3576001915050611708565b60c0811015615a075760b519019050611708565b60f519019050611708565b80516000908190811a6080811015615a2d5760019150615aa4565b60b8811015615a4257607e1981019150615aa4565b60c0811015615a6f5760b78103600185019450806020036101000a85510460018201810193505050615aa4565b60f8811015615a845760be1981019150615aa4565b60f78103600185019450806020036101000a855104600182018101935050505b5092915050565b60008183036144b96a084595161401484a0000006145c1838863ffffffff61554716565b6000615ae1838563ffffffff61400016565b9050600080615af28787868661576b565b90925090508015615b32576000878152601a6020526040902060090154615b1f908263ffffffff61400016565b6000888152601a60205260409020600901555b8115613604576000878152601a6020526040902060010154615b5a908363ffffffff61400016565b6000888152601a602052604090206001015550505050505050565b8015611cb4576000828152601a6020526040902060010154615b9d908263ffffffff61400016565b6000838152601a60205260409020600101555050565b6000818310615bc2578161215c565b5090919050565b828054828255906000526020600020908101928215615c1e579160200282015b82811115615c1e57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190615be9565b50615c2a929150615cbc565b5090565b6040518060a0016040528060008152602001600081526020016060815260200160608152602001600081525090565b60405180606001604052806000815260200160608152602001600081525090565b604051806040016040528060008152602001600081525090565b8154818355818111156129b5576000838152602090206129b5918101908301615ce0565b61262d91905b80821115615c2a5780546001600160a01b0319168155600101615cc2565b61262d91905b80821115615c2a5760008155600101615ce656fe4f6e6c7920676f7665726e616e636520636f6e747261637420697320617574686f72697a6564a265627a7a72315820431c6a8057326866c4c2118b555375b4c31f1897330945422ed25bde58989ddc64736f6c63430005110032

Verified Source Code Partial Match

Compiler: v0.5.17+commit.d19bba13 EVM: istanbul Optimization: Yes (200 runs)
StakeManager.sol 5131 lines
// File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.2;

/**
 * @title ERC20 interface
 * @dev see https://eips.ethereum.org/EIPS/eip-20
 */
interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: openzeppelin-solidity/contracts/math/Math.sol

pragma solidity ^0.5.2;

/**
 * @title Math
 * @dev Assorted math operations
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Calculates the average of two numbers. Since these are integers,
     * averages of an even and odd number cannot be represented, and will be
     * rounded down.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.5.2;

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

// File: solidity-rlp/contracts/RLPReader.sol

/*
* @author Hamdi Allam [email protected]
* Please reach out with any questions or concerns
*/
pragma solidity ^0.5.0;

library RLPReader {
    uint8 constant STRING_SHORT_START = 0x80;
    uint8 constant STRING_LONG_START  = 0xb8;
    uint8 constant LIST_SHORT_START   = 0xc0;
    uint8 constant LIST_LONG_START    = 0xf8;
    uint8 constant WORD_SIZE = 32;

    struct RLPItem {
        uint len;
        uint memPtr;
    }

    struct Iterator {
        RLPItem item;   // Item that's being iterated over.
        uint nextPtr;   // Position of the next item in the list.
    }

    /*
    * @dev Returns the next element in the iteration. Reverts if it has not next element.
    * @param self The iterator.
    * @return The next element in the iteration.
    */
    function next(Iterator memory self) internal pure returns (RLPItem memory) {
        require(hasNext(self));

        uint ptr = self.nextPtr;
        uint itemLength = _itemLength(ptr);
        self.nextPtr = ptr + itemLength;

        return RLPItem(itemLength, ptr);
    }

    /*
    * @dev Returns true if the iteration has more elements.
    * @param self The iterator.
    * @return true if the iteration has more elements.
    */
    function hasNext(Iterator memory self) internal pure returns (bool) {
        RLPItem memory item = self.item;
        return self.nextPtr < item.memPtr + item.len;
    }

    /*
    * @param item RLP encoded bytes
    */
    function toRlpItem(bytes memory item) internal pure returns (RLPItem memory) {
        uint memPtr;
        assembly {
            memPtr := add(item, 0x20)
        }

        return RLPItem(item.length, memPtr);
    }

    /*
    * @dev Create an iterator. Reverts if item is not a list.
    * @param self The RLP item.
    * @return An 'Iterator' over the item.
    */
    function iterator(RLPItem memory self) internal pure returns (Iterator memory) {
        require(isList(self));

        uint ptr = self.memPtr + _payloadOffset(self.memPtr);
        return Iterator(self, ptr);
    }

    /*
    * @param item RLP encoded bytes
    */
    function rlpLen(RLPItem memory item) internal pure returns (uint) {
        return item.len;
    }

    /*
    * @param item RLP encoded bytes
    */
    function payloadLen(RLPItem memory item) internal pure returns (uint) {
        return item.len - _payloadOffset(item.memPtr);
    }

    /*
    * @param item RLP encoded list in bytes
    */
    function toList(RLPItem memory item) internal pure returns (RLPItem[] memory) {
        require(isList(item));

        uint items = numItems(item);
        RLPItem[] memory result = new RLPItem[](items);

        uint memPtr = item.memPtr + _payloadOffset(item.memPtr);
        uint dataLen;
        for (uint i = 0; i < items; i++) {
            dataLen = _itemLength(memPtr);
            result[i] = RLPItem(dataLen, memPtr); 
            memPtr = memPtr + dataLen;
        }

        return result;
    }

    // @return indicator whether encoded payload is a list. negate this function call for isData.
    function isList(RLPItem memory item) internal pure returns (bool) {
        if (item.len == 0) return false;

        uint8 byte0;
        uint memPtr = item.memPtr;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < LIST_SHORT_START)
            return false;
        return true;
    }

    /** RLPItem conversions into data types **/

    // @returns raw rlp encoding in bytes
    function toRlpBytes(RLPItem memory item) internal pure returns (bytes memory) {
        bytes memory result = new bytes(item.len);
        if (result.length == 0) return result;
        
        uint ptr;
        assembly {
            ptr := add(0x20, result)
        }

        copy(item.memPtr, ptr, item.len);
        return result;
    }

    // any non-zero byte is considered true
    function toBoolean(RLPItem memory item) internal pure returns (bool) {
        require(item.len == 1);
        uint result;
        uint memPtr = item.memPtr;
        assembly {
            result := byte(0, mload(memPtr))
        }

        return result == 0 ? false : true;
    }

    function toAddress(RLPItem memory item) internal pure returns (address) {
        // 1 byte for the length prefix
        require(item.len == 21);

        return address(toUint(item));
    }

    function toUint(RLPItem memory item) internal pure returns (uint) {
        require(item.len > 0 && item.len <= 33);

        uint offset = _payloadOffset(item.memPtr);
        uint len = item.len - offset;

        uint result;
        uint memPtr = item.memPtr + offset;
        assembly {
            result := mload(memPtr)

            // shfit to the correct location if neccesary
            if lt(len, 32) {
                result := div(result, exp(256, sub(32, len)))
            }
        }

        return result;
    }

    // enforces 32 byte length
    function toUintStrict(RLPItem memory item) internal pure returns (uint) {
        // one byte prefix
        require(item.len == 33);

        uint result;
        uint memPtr = item.memPtr + 1;
        assembly {
            result := mload(memPtr)
        }

        return result;
    }

    function toBytes(RLPItem memory item) internal pure returns (bytes memory) {
        require(item.len > 0);

        uint offset = _payloadOffset(item.memPtr);
        uint len = item.len - offset; // data length
        bytes memory result = new bytes(len);

        uint destPtr;
        assembly {
            destPtr := add(0x20, result)
        }

        copy(item.memPtr + offset, destPtr, len);
        return result;
    }

    /*
    * Private Helpers
    */

    // @return number of payload items inside an encoded list.
    function numItems(RLPItem memory item) private pure returns (uint) {
        if (item.len == 0) return 0;

        uint count = 0;
        uint currPtr = item.memPtr + _payloadOffset(item.memPtr);
        uint endPtr = item.memPtr + item.len;
        while (currPtr < endPtr) {
           currPtr = currPtr + _itemLength(currPtr); // skip over an item
           count++;
        }

        return count;
    }

    // @return entire rlp item byte length
    function _itemLength(uint memPtr) private pure returns (uint) {
        uint itemLen;
        uint byte0;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < STRING_SHORT_START)
            itemLen = 1;
        
        else if (byte0 < STRING_LONG_START)
            itemLen = byte0 - STRING_SHORT_START + 1;

        else if (byte0 < LIST_SHORT_START) {
            assembly {
                let byteLen := sub(byte0, 0xb7) // # of bytes the actual length is
                memPtr := add(memPtr, 1) // skip over the first byte
                
                /* 32 byte word size */
                let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to get the len
                itemLen := add(dataLen, add(byteLen, 1))
            }
        }

        else if (byte0 < LIST_LONG_START) {
            itemLen = byte0 - LIST_SHORT_START + 1;
        } 

        else {
            assembly {
                let byteLen := sub(byte0, 0xf7)
                memPtr := add(memPtr, 1)

                let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to the correct length
                itemLen := add(dataLen, add(byteLen, 1))
            }
        }

        return itemLen;
    }

    // @return number of bytes until the data
    function _payloadOffset(uint memPtr) private pure returns (uint) {
        uint byte0;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < STRING_SHORT_START) 
            return 0;
        else if (byte0 < STRING_LONG_START || (byte0 >= LIST_SHORT_START && byte0 < LIST_LONG_START))
            return 1;
        else if (byte0 < LIST_SHORT_START)  // being explicit
            return byte0 - (STRING_LONG_START - 1) + 1;
        else
            return byte0 - (LIST_LONG_START - 1) + 1;
    }

    /*
    * @param src Pointer to source
    * @param dest Pointer to destination
    * @param len Amount of memory to copy from the source
    */
    function copy(uint src, uint dest, uint len) private pure {
        if (len == 0) return;

        // copy as many word sizes as possible
        for (; len >= WORD_SIZE; len -= WORD_SIZE) {
            assembly {
                mstore(dest, mload(src))
            }

            src += WORD_SIZE;
            dest += WORD_SIZE;
        }

        // left over bytes. Mask is used to remove unwanted bytes from the word
        uint mask = 256 ** (WORD_SIZE - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask)) // zero out src
            let destpart := and(mload(dest), mask) // retrieve the bytes
            mstore(dest, or(destpart, srcpart))
        }
    }
}

// File: contracts/common/lib/BytesLib.sol

pragma solidity ^0.5.2;


library BytesLib {
    function concat(bytes memory _preBytes, bytes memory _postBytes)
        internal
        pure
        returns (bytes memory)
    {
        bytes memory tempBytes;
        assembly {
            // Get a location of some free memory and store it in tempBytes as
            // Solidity does for memory variables.
            tempBytes := mload(0x40)

            // Store the length of the first bytes array at the beginning of
            // the memory for tempBytes.
            let length := mload(_preBytes)
            mstore(tempBytes, length)

            // Maintain a memory counter for the current write location in the
            // temp bytes array by adding the 32 bytes for the array length to
            // the starting location.
            let mc := add(tempBytes, 0x20)
            // Stop copying when the memory counter reaches the length of the
            // first bytes array.
            let end := add(mc, length)

            for {
                // Initialize a copy counter to the start of the _preBytes data,
                // 32 bytes into its memory.
                let cc := add(_preBytes, 0x20)
            } lt(mc, end) {
                // Increase both counters by 32 bytes each iteration.
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                // Write the _preBytes data into the tempBytes memory 32 bytes
                // at a time.
                mstore(mc, mload(cc))
            }

            // Add the length of _postBytes to the current length of tempBytes
            // and store it as the new length in the first 32 bytes of the
            // tempBytes memory.
            length := mload(_postBytes)
            mstore(tempBytes, add(length, mload(tempBytes)))

            // Move the memory counter back from a multiple of 0x20 to the
            // actual end of the _preBytes data.
            mc := end
            // Stop copying when the memory counter reaches the new combined
            // length of the arrays.
            end := add(mc, length)

            for {
                let cc := add(_postBytes, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            // Update the free-memory pointer by padding our last write location
            // to 32 bytes: add 31 bytes to the end of tempBytes to move to the
            // next 32 byte block, then round down to the nearest multiple of
            // 32. If the sum of the length of the two arrays is zero then add
            // one before rounding down to leave a blank 32 bytes (the length block with 0).
            mstore(
                0x40,
                and(
                    add(add(end, iszero(add(length, mload(_preBytes)))), 31),
                    not(31) // Round down to the nearest 32 bytes.
                )
            )
        }
        return tempBytes;
    }

    function slice(bytes memory _bytes, uint256 _start, uint256 _length)
        internal
        pure
        returns (bytes memory)
    {
        require(_bytes.length >= (_start + _length));
        bytes memory tempBytes;
        assembly {
            switch iszero(_length)
                case 0 {
                    // Get a location of some free memory and store it in tempBytes as
                    // Solidity does for memory variables.
                    tempBytes := mload(0x40)

                    // The first word of the slice result is potentially a partial
                    // word read from the original array. To read it, we calculate
                    // the length of that partial word and start copying that many
                    // bytes into the array. The first word we copy will start with
                    // data we don't care about, but the last `lengthmod` bytes will
                    // land at the beginning of the contents of the new array. When
                    // we're done copying, we overwrite the full first word with
                    // the actual length of the slice.
                    let lengthmod := and(_length, 31)

                    // The multiplication in the next line is necessary
                    // because when slicing multiples of 32 bytes (lengthmod == 0)
                    // the following copy loop was copying the origin's length
                    // and then ending prematurely not copying everything it should.
                    let mc := add(
                        add(tempBytes, lengthmod),
                        mul(0x20, iszero(lengthmod))
                    )
                    let end := add(mc, _length)

                    for {
                        // The multiplication in the next line has the same exact purpose
                        // as the one above.
                        let cc := add(
                            add(
                                add(_bytes, lengthmod),
                                mul(0x20, iszero(lengthmod))
                            ),
                            _start
                        )
                    } lt(mc, end) {
                        mc := add(mc, 0x20)
                        cc := add(cc, 0x20)
                    } {
                        mstore(mc, mload(cc))
                    }

                    mstore(tempBytes, _length)

                    //update free-memory pointer
                    //allocating the array padded to 32 bytes like the compiler does now
                    mstore(0x40, and(add(mc, 31), not(31)))
                }
                //if we want a zero-length slice let's just return a zero-length array
                default {
                    tempBytes := mload(0x40)
                    mstore(0x40, add(tempBytes, 0x20))
                }
        }

        return tempBytes;
    }

    // Pad a bytes array to 32 bytes
    function leftPad(bytes memory _bytes) internal pure returns (bytes memory) {
        // may underflow if bytes.length < 32. Hence using SafeMath.sub
        bytes memory newBytes = new bytes(SafeMath.sub(32, _bytes.length));
        return concat(newBytes, _bytes);
    }

    function toBytes32(bytes memory b) internal pure returns (bytes32) {
        require(b.length >= 32, "Bytes array should atleast be 32 bytes");
        bytes32 out;
        for (uint256 i = 0; i < 32; i++) {
            out |= bytes32(b[i] & 0xFF) >> (i * 8);
        }
        return out;
    }

    function toBytes4(bytes memory b) internal pure returns (bytes4 result) {
        assembly {
            result := mload(add(b, 32))
        }
    }

    function fromBytes32(bytes32 x) internal pure returns (bytes memory) {
        bytes memory b = new bytes(32);
        for (uint256 i = 0; i < 32; i++) {
            b[i] = bytes1(uint8(uint256(x) / (2**(8 * (31 - i)))));
        }
        return b;
    }

    function fromUint(uint256 _num) internal pure returns (bytes memory _ret) {
        _ret = new bytes(32);
        assembly {
            mstore(add(_ret, 32), _num)
        }
    }

    function toUint(bytes memory _bytes, uint256 _start)
        internal
        pure
        returns (uint256)
    {
        require(_bytes.length >= (_start + 32));
        uint256 tempUint;
        assembly {
            tempUint := mload(add(add(_bytes, 0x20), _start))
        }
        return tempUint;
    }

    function toAddress(bytes memory _bytes, uint256 _start)
        internal
        pure
        returns (address)
    {
        require(_bytes.length >= (_start + 20));
        address tempAddress;
        assembly {
            tempAddress := div(
                mload(add(add(_bytes, 0x20), _start)),
                0x1000000000000000000000000
            )
        }

        return tempAddress;
    }
}

// File: contracts/common/lib/ECVerify.sol

pragma solidity ^0.5.2;


library ECVerify {
    function ecrecovery(bytes32 hash, uint[3] memory sig)
        internal
        pure
        returns (address)
    {
        bytes32 r;
        bytes32 s;
        uint8 v;

        assembly {
            r := mload(sig)
            s := mload(add(sig, 32))
            v := byte(31, mload(add(sig, 64)))
        }

        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return address(0x0);
        }

        // https://github.com/ethereum/go-ethereum/issues/2053
        if (v < 27) {
            v += 27;
        }

        if (v != 27 && v != 28) {
            return address(0x0);
        }

        // get address out of hash and signature
        address result = ecrecover(hash, v, r, s);

        // ecrecover returns zero on error
        require(result != address(0x0));

        return result;
    }

    function ecrecovery(bytes32 hash, bytes memory sig)
        internal
        pure
        returns (address)
    {
        bytes32 r;
        bytes32 s;
        uint8 v;

        if (sig.length != 65) {
            return address(0x0);
        }

        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            v := and(mload(add(sig, 65)), 255)
        }

        // https://github.com/ethereum/go-ethereum/issues/2053
        if (v < 27) {
            v += 27;
        }

        if (v != 27 && v != 28) {
            return address(0x0);
        }

        // get address out of hash and signature
        address result = ecrecover(hash, v, r, s);

        // ecrecover returns zero on error
        require(result != address(0x0));

        return result;
    }

    function ecrecovery(bytes32 hash, uint8 v, bytes32 r, bytes32 s)
        internal
        pure
        returns (address)
    {
        // get address out of hash and signature
        address result = ecrecover(hash, v, r, s);

        // ecrecover returns zero on error
        require(result != address(0x0), "signature verification failed");

        return result;
    }

    function ecverify(bytes32 hash, bytes memory sig, address signer)
        internal
        pure
        returns (bool)
    {
        return signer == ecrecovery(hash, sig);
    }
}

// File: contracts/common/lib/Merkle.sol

pragma solidity ^0.5.2;

library Merkle {
    function checkMembership(
        bytes32 leaf,
        uint256 index,
        bytes32 rootHash,
        bytes memory proof
    ) public pure returns (bool) {
        require(proof.length % 32 == 0, "Invalid proof length");
        uint256 proofHeight = proof.length / 32;
        // Proof of size n means, height of the tree is n+1.
        // In a tree of height n+1, max #leafs possible is 2 ^ n
        require(index < 2 ** proofHeight, "Leaf index is too big");

        bytes32 proofElement;
        bytes32 computedHash = leaf;
        for (uint256 i = 32; i <= proof.length; i += 32) {
            assembly {
                proofElement := mload(add(proof, i))
            }

            if (index % 2 == 0) {
                computedHash = keccak256(
                    abi.encodePacked(computedHash, proofElement)
                );
            } else {
                computedHash = keccak256(
                    abi.encodePacked(proofElement, computedHash)
                );
            }

            index = index / 2;
        }
        return computedHash == rootHash;
    }
}

// File: contracts/common/governance/IGovernance.sol

pragma solidity ^0.5.2;

interface IGovernance {
    function update(address target, bytes calldata data) external;
}

// File: contracts/common/governance/Governable.sol

pragma solidity ^0.5.2;


contract Governable {
    IGovernance public governance;

    constructor(address _governance) public {
        governance = IGovernance(_governance);
    }

    modifier onlyGovernance() {
        _assertGovernance();
        _;
    }

    function _assertGovernance() private view {
        require(
            msg.sender == address(governance),
            "Only governance contract is authorized"
        );
    }
}

// File: contracts/common/mixin/Lockable.sol

pragma solidity ^0.5.2;

contract Lockable {
    bool public locked;

    modifier onlyWhenUnlocked() {
        _assertUnlocked();
        _;
    }

    function _assertUnlocked() private view {
        require(!locked, "locked");
    }

    function lock() public {
        locked = true;
    }

    function unlock() public {
        locked = false;
    }
}

// File: contracts/common/mixin/GovernanceLockable.sol

pragma solidity ^0.5.2;



contract GovernanceLockable is Lockable, Governable {
    constructor(address governance) public Governable(governance) {}

    function lock() public onlyGovernance {
        super.lock();
    }

    function unlock() public onlyGovernance {
        super.unlock();
    }
}

// File: contracts/common/misc/DelegateProxyForwarder.sol

pragma solidity ^0.5.2;

contract DelegateProxyForwarder {
    function delegatedFwd(address _dst, bytes memory _calldata) internal {
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            let result := delegatecall(
                sub(gas, 10000),
                _dst,
                add(_calldata, 0x20),
                mload(_calldata),
                0,
                0
            )
            let size := returndatasize

            let ptr := mload(0x40)
            returndatacopy(ptr, 0, size)

            // revert instead of invalid() bc if the underlying call failed with invalid() it already wasted gas.
            // if the call returned error data, forward it
            switch result
                case 0 {
                    revert(ptr, size)
                }
                default {
                    return(ptr, size)
                }
        }
    }
    
    function isContract(address _target) internal view returns (bool) {
        if (_target == address(0)) {
            return false;
        }

        uint256 size;
        assembly {
            size := extcodesize(_target)
        }
        return size > 0;
    }
}

// File: contracts/root/withdrawManager/IWithdrawManager.sol

pragma solidity ^0.5.2;

contract IWithdrawManager {
    function createExitQueue(address token) external;

    function verifyInclusion(
        bytes calldata data,
        uint8 offset,
        bool verifyTxInclusion
    ) external view returns (uint256 age);

    function addExitToQueue(
        address exitor,
        address childToken,
        address rootToken,
        uint256 exitAmountOrTokenId,
        bytes32 txHash,
        bool isRegularExit,
        uint256 priority
    ) external;

    function addInput(
        uint256 exitId,
        uint256 age,
        address utxoOwner,
        address token
    ) external;

    function challengeExit(
        uint256 exitId,
        uint256 inputId,
        bytes calldata challengeData,
        address adjudicatorPredicate
    ) external;
}

// File: contracts/common/Registry.sol

pragma solidity ^0.5.2;




contract Registry is Governable {
    // @todo hardcode constants
    bytes32 private constant WETH_TOKEN = keccak256("wethToken");
    bytes32 private constant DEPOSIT_MANAGER = keccak256("depositManager");
    bytes32 private constant STAKE_MANAGER = keccak256("stakeManager");
    bytes32 private constant VALIDATOR_SHARE = keccak256("validatorShare");
    bytes32 private constant WITHDRAW_MANAGER = keccak256("withdrawManager");
    bytes32 private constant CHILD_CHAIN = keccak256("childChain");
    bytes32 private constant STATE_SENDER = keccak256("stateSender");
    bytes32 private constant SLASHING_MANAGER = keccak256("slashingManager");

    address public erc20Predicate;
    address public erc721Predicate;

    mapping(bytes32 => address) public contractMap;
    mapping(address => address) public rootToChildToken;
    mapping(address => address) public childToRootToken;
    mapping(address => bool) public proofValidatorContracts;
    mapping(address => bool) public isERC721;

    enum Type {Invalid, ERC20, ERC721, Custom}
    struct Predicate {
        Type _type;
    }
    mapping(address => Predicate) public predicates;

    event TokenMapped(address indexed rootToken, address indexed childToken);
    event ProofValidatorAdded(address indexed validator, address indexed from);
    event ProofValidatorRemoved(address indexed validator, address indexed from);
    event PredicateAdded(address indexed predicate, address indexed from);
    event PredicateRemoved(address indexed predicate, address indexed from);
    event ContractMapUpdated(bytes32 indexed key, address indexed previousContract, address indexed newContract);

    constructor(address _governance) public Governable(_governance) {}

    function updateContractMap(bytes32 _key, address _address) external onlyGovernance {
        emit ContractMapUpdated(_key, contractMap[_key], _address);
        contractMap[_key] = _address;
    }

    /**
     * @dev Map root token to child token
     * @param _rootToken Token address on the root chain
     * @param _childToken Token address on the child chain
     * @param _isERC721 Is the token being mapped ERC721
     */
    function mapToken(
        address _rootToken,
        address _childToken,
        bool _isERC721
    ) external onlyGovernance {
        require(_rootToken != address(0x0) && _childToken != address(0x0), "INVALID_TOKEN_ADDRESS");
        rootToChildToken[_rootToken] = _childToken;
        childToRootToken[_childToken] = _rootToken;
        isERC721[_rootToken] = _isERC721;
        IWithdrawManager(contractMap[WITHDRAW_MANAGER]).createExitQueue(_rootToken);
        emit TokenMapped(_rootToken, _childToken);
    }

    function addErc20Predicate(address predicate) public onlyGovernance {
        require(predicate != address(0x0), "Can not add null address as predicate");
        erc20Predicate = predicate;
        addPredicate(predicate, Type.ERC20);
    }

    function addErc721Predicate(address predicate) public onlyGovernance {
        erc721Predicate = predicate;
        addPredicate(predicate, Type.ERC721);
    }

    function addPredicate(address predicate, Type _type) public onlyGovernance {
        require(predicates[predicate]._type == Type.Invalid, "Predicate already added");
        predicates[predicate]._type = _type;
        emit PredicateAdded(predicate, msg.sender);
    }

    function removePredicate(address predicate) public onlyGovernance {
        require(predicates[predicate]._type != Type.Invalid, "Predicate does not exist");
        delete predicates[predicate];
        emit PredicateRemoved(predicate, msg.sender);
    }

    function getValidatorShareAddress() public view returns (address) {
        return contractMap[VALIDATOR_SHARE];
    }

    function getWethTokenAddress() public view returns (address) {
        return contractMap[WETH_TOKEN];
    }

    function getDepositManagerAddress() public view returns (address) {
        return contractMap[DEPOSIT_MANAGER];
    }

    function getStakeManagerAddress() public view returns (address) {
        return contractMap[STAKE_MANAGER];
    }

    function getSlashingManagerAddress() public view returns (address) {
        return contractMap[SLASHING_MANAGER];
    }

    function getWithdrawManagerAddress() public view returns (address) {
        return contractMap[WITHDRAW_MANAGER];
    }

    function getChildChainAndStateSender() public view returns (address, address) {
        return (contractMap[CHILD_CHAIN], contractMap[STATE_SENDER]);
    }

    function isTokenMapped(address _token) public view returns (bool) {
        return rootToChildToken[_token] != address(0x0);
    }

    function isTokenMappedAndIsErc721(address _token) public view returns (bool) {
        require(isTokenMapped(_token), "TOKEN_NOT_MAPPED");
        return isERC721[_token];
    }

    function isTokenMappedAndGetPredicate(address _token) public view returns (address) {
        if (isTokenMappedAndIsErc721(_token)) {
            return erc721Predicate;
        }
        return erc20Predicate;
    }

    function isChildTokenErc721(address childToken) public view returns (bool) {
        address rootToken = childToRootToken[childToken];
        require(rootToken != address(0x0), "Child token is not mapped");
        return isERC721[rootToken];
    }
}

// File: contracts/staking/stakeManager/IStakeManager.sol

pragma solidity 0.5.17;

contract IStakeManager {
    // validator replacement
    function startAuction(
        uint256 validatorId,
        uint256 amount,
        bool acceptDelegation,
        bytes calldata signerPubkey
    ) external;

    function confirmAuctionBid(uint256 validatorId, uint256 heimdallFee) external;

    function transferFunds(
        uint256 validatorId,
        uint256 amount,
        address delegator
    ) external returns (bool);

    function delegationDeposit(
        uint256 validatorId,
        uint256 amount,
        address delegator
    ) external returns (bool);

    function unstake(uint256 validatorId) external;

    function totalStakedFor(address addr) external view returns (uint256);

    function stakeFor(
        address user,
        uint256 amount,
        uint256 heimdallFee,
        bool acceptDelegation,
        bytes memory signerPubkey
    ) public;

    function checkSignatures(
        uint256 blockInterval,
        bytes32 voteHash,
        bytes32 stateRoot,
        address proposer,
        uint[3][] calldata sigs
    ) external returns (uint256);

    function updateValidatorState(uint256 validatorId, int256 amount) public;

    function ownerOf(uint256 tokenId) public view returns (address);

    function slash(bytes calldata slashingInfoList) external returns (uint256);

    function validatorStake(uint256 validatorId) public view returns (uint256);

    function epoch() public view returns (uint256);

    function getRegistry() public view returns (address);

    function withdrawalDelay() public view returns (uint256);

    function delegatedAmount(uint256 validatorId) public view returns(uint256);

    function decreaseValidatorDelegatedAmount(uint256 validatorId, uint256 amount) public;

    function withdrawDelegatorsReward(uint256 validatorId) public returns(uint256);

    function delegatorsReward(uint256 validatorId) public view returns(uint256);

    function dethroneAndStake(
        address auctionUser,
        uint256 heimdallFee,
        uint256 validatorId,
        uint256 auctionAmount,
        bool acceptDelegation,
        bytes calldata signerPubkey
    ) external;
}

// File: contracts/staking/validatorShare/IValidatorShare.sol

pragma solidity 0.5.17;

// note this contract interface is only for stakeManager use
contract IValidatorShare {
    function withdrawRewards() public;

    function unstakeClaimTokens() public;

    function getLiquidRewards(address user) public view returns (uint256);
    
    function owner() public view returns (address);

    function restake() public returns(uint256, uint256);

    function unlock() external;

    function lock() external;

    function drain(
        address token,
        address payable destination,
        uint256 amount
    ) external;

    function slash(uint256 valPow, uint256 delegatedAmount, uint256 totalAmountToSlash) external returns (uint256);

    function updateDelegation(bool delegation) external;

    function migrateOut(address user, uint256 amount) external;

    function migrateIn(address user, uint256 amount) external;
}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol

pragma solidity ^0.5.2;



/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * https://eips.ethereum.org/EIPS/eip-20
 * Originally based on code by FirstBlood:
 * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 *
 * This implementation emits additional Approval events, allowing applications to reconstruct the allowance status for
 * all accounts just by listening to said events. Note that this isn't required by the specification, and other
 * compliant implementations may not do it.
 */
contract ERC20 is IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowed;

    uint256 private _totalSupply;

    /**
     * @dev Total number of tokens in existence
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner The address to query the balance of.
     * @return A uint256 representing the amount owned by the passed address.
     */
    function balanceOf(address owner) public view returns (uint256) {
        return _balances[owner];
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param owner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowed[owner][spender];
    }

    /**
     * @dev Transfer token to a specified address
     * @param to The address to transfer to.
     * @param value The amount to be transferred.
     */
    function transfer(address to, uint256 value) public returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     */
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another.
     * Note that while this function emits an Approval event, this is not required as per the specification,
     * and other compliant implementations may not emit the event.
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to tr vbmansfer to
     * @param value uint256 the amount of tokens to be transferred
     */
    function transferFrom(address from, address to, uint256 value) public returns (bool) {
        _transfer(from, to, value);
        _approve(from, msg.sender, _allowed[from][msg.sender].sub(value));
        return true;
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     * approve should be called when _allowed[msg.sender][spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param addedValue The amount of tokens to increase the allowance by.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowed[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     * approve should be called when _allowed[msg.sender][spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowed[msg.sender][spender].sub(subtractedValue));
        return true;
    }

    /**
     * @dev Transfer token for a specified addresses
     * @param from The address to transfer from.
     * @param to The address to transfer to.
     * @param value The amount to be transferred.
     */
    function _transfer(address from, address to, uint256 value) internal {
        require(to != address(0));

        _balances[from] = _balances[from].sub(value);
        _balances[to] = _balances[to].add(value);
        emit Transfer(from, to, value);
    }

    /**
     * @dev Internal function that mints an amount of the token and assigns it to
     * an account. This encapsulates the modification of balances such that the
     * proper events are emitted.
     * @param account The account that will receive the created tokens.
     * @param value The amount that will be created.
     */
    function _mint(address account, uint256 value) internal {
        require(account != address(0));

        _totalSupply = _totalSupply.add(value);
        _balances[account] = _balances[account].add(value);
        emit Transfer(address(0), account, value);
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account.
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function _burn(address account, uint256 value) internal {
        require(account != address(0));

        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }

    /**
     * @dev Approve an address to spend another addresses' tokens.
     * @param owner The address that owns the tokens.
     * @param spender The address that will spend the tokens.
     * @param value The number of tokens that can be spent.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        require(spender != address(0));
        require(owner != address(0));

        _allowed[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account, deducting from the sender's allowance for said account. Uses the
     * internal burn function.
     * Emits an Approval event (reflecting the reduced allowance).
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function _burnFrom(address account, uint256 value) internal {
        _burn(account, value);
        _approve(account, msg.sender, _allowed[account][msg.sender].sub(value));
    }
}

// File: contracts/common/tokens/ERC20NonTradable.sol

pragma solidity ^0.5.2;


contract ERC20NonTradable is ERC20 {
    function _approve(
        address owner,
        address spender,
        uint256 value
    ) internal {
        revert("disabled");
    }
}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

pragma solidity ^0.5.2;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    /**
     * @return the address of the owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     * @notice Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/staking/StakingInfo.sol

pragma solidity ^0.5.2;





// dummy interface to avoid cyclic dependency
contract IStakeManagerLocal {
    enum Status {Inactive, Active, Locked, Unstaked}

    struct Validator {
        uint256 amount;
        uint256 reward;
        uint256 activationEpoch;
        uint256 deactivationEpoch;
        uint256 jailTime;
        address signer;
        address contractAddress;
        Status status;
    }

    mapping(uint256 => Validator) public validators;
    bytes32 public accountStateRoot;
    uint256 public activeAmount; // delegation amount from validator contract
    uint256 public validatorRewards;

    function currentValidatorSetTotalStake() public view returns (uint256);

    // signer to Validator mapping
    function signerToValidator(address validatorAddress)
        public
        view
        returns (uint256);

    function isValidator(uint256 validatorId) public view returns (bool);
}

contract StakingInfo is Ownable {
    using SafeMath for uint256;
    mapping(uint256 => uint256) public validatorNonce;

    /// @dev Emitted when validator stakes in '_stakeFor()' in StakeManager.
    /// @param signer validator address.
    /// @param validatorId unique integer to identify a validator.
    /// @param nonce to synchronize the events in heimdal.
    /// @param activationEpoch validator's first epoch as proposer.
    /// @param amount staking amount.
    /// @param total total staking amount.
    /// @param signerPubkey public key of the validator
    event Staked(
        address indexed signer,
        uint256 indexed validatorId,
        uint256 nonce,
        uint256 indexed activationEpoch,
        uint256 amount,
        uint256 total,
        bytes signerPubkey
    );

    /// @dev Emitted when validator unstakes in 'unstakeClaim()'
    /// @param user address of the validator.
    /// @param validatorId unique integer to identify a validator.
    /// @param amount staking amount.
    /// @param total total stakin...

// [truncated — 176828 bytes total]

Read Contract

CHECKPOINT_REWARD 0x7d669752 → uint256
NFTContract 0x31c2273b → address
NFTCounter 0x5508d8e1 → uint256
WITHDRAWAL_DELAY 0x0ebb172a → uint256
accountStateRoot 0x17c2b910 → bytes32
auctionPeriod 0x0cccfc58 → uint256
checkPointBlockInterval 0x25316411 → uint256
checkpointRewardDelta 0x7c7eaf1a → uint256
currentEpoch 0x76671808 → uint256
currentValidatorSetSize 0x7f952d95 → uint256
currentValidatorSetTotalStake 0xa4769071 → uint256
delegatedAmount 0x7f4b4323 → uint256
delegationEnabled 0x54b8c601 → bool
delegatorsReward 0x39610f78 → uint256
dynasty 0x7060054d → uint256
epoch 0x900cf0cf → uint256
eventsHub 0x883b455f → address
extensionCode 0xf8a3176c → address
getRegistry 0x5ab1bd53 → address
getValidatorContract 0x56342d8c → address
getValidatorId 0x174e6832 → uint256
governance 0x5aa6e675 → address
isOwner 0x8f32d59b → bool
isValidator 0x2649263a → bool
latestSignerUpdateEpoch 0xd7f5549d → uint256
locked 0xcf309012 → bool
logger 0xf24ccbfe → address
maxRewardedCheckpoints 0x451b5985 → uint256
minDeposit 0x41b3d185 → uint256
minHeimdallFee 0xfba58f34 → uint256
owner 0x8da5cb5b → address
ownerOf 0x6352211e → address
prevBlockInterval 0x91f1a3a5 → uint256
proposerBonus 0x34274586 → uint256
registry 0x7b103999 → address
replacementCoolDown 0x77939d10 → uint256
rewardDecreasePerCheckpoint 0xe568959a → uint256
rewardPerStake 0xa8dc889b → uint256
rootChain 0x987ab9db → address
signerToValidator 0x3862da0b → uint256
signerUpdateLimit 0x4e3c83f1 → uint256
signers 0x2079fb9a → address
token 0xfc0c546a → address
totalHeimdallFee 0x9a8a6243 → uint256
totalRewards 0x0e15561a → uint256
totalRewardsLiquidated 0xcd6b8388 → uint256
totalStaked 0x817b1cd2 → uint256
totalStakedFor 0x4b341aed → uint256
userFeeExit 0x78f84a44 → uint256
validatorAuction 0x5325e144 → uint256, uint256, address, bool, bytes
validatorReward 0xb65de35e → uint256
validatorShareFactory 0x1ae4818f → address
validatorStake 0xeceec1d3 → uint256
validatorState 0xe59ee0c6 → uint256, uint256
validatorStateChanges 0x25726df2 → int256, int256
validatorThreshold 0x4fd101d7 → uint256
validators 0x35aa2e44 → uint256, uint256, uint256, uint256, uint256, address, address, uint8, uint256, uint256, uint256, uint256, uint256
withdrawalDelay 0xa7ab6961 → uint256

Write Contract 47 functions

These functions modify contract state and require a wallet transaction to execute.

changeRootChain 0xe8afa8e8
address newRootChain
checkSignatures 0x2fa9d18b
uint256 blockInterval
bytes32 voteHash
bytes32 stateRoot
address proposer
uint256[3][] sigs
returns: uint256
claimFee 0x68cb812a
uint256 accumFeeAmount
uint256 index
bytes proof
confirmAuctionBid 0x99d18f6f
uint256 validatorId
uint256 heimdallFee
decreaseValidatorDelegatedAmount 0x858a7c03
uint256 validatorId
uint256 amount
delegationDeposit 0x6901b253
uint256 validatorId
uint256 amount
address delegator
returns: bool
dethroneAndStake 0x52b8115d
address auctionUser
uint256 heimdallFee
uint256 validatorId
uint256 auctionAmount
bool acceptDelegation
bytes signerPubkey
drain 0xb184be81
address destination
uint256 amount
drainValidatorShares 0x48ab8b2a
uint256 validatorId
address tokenAddr
address destination
uint256 amount
forceUnstake 0x91460149
uint256 validatorId
initialize 0xf5e95acb
address _registry
address _rootchain
address _token
address _NFTContract
address _stakingLogger
address _validatorShareFactory
address _governance
address _owner
address _extensionCode
insertSigners 0x2cf44a43
address[] _signers
lock 0xf83d08ba
No parameters
migrateDelegation 0xfb1ef52c
uint256 fromValidatorId
uint256 toValidatorId
uint256 amount
migrateValidatorsData 0x9ddbbf85
uint256 validatorIdFrom
uint256 validatorIdTo
reinitialize 0x078a13b1
address _NFTContract
address _stakingLogger
address _validatorShareFactory
address _extensionCode
renounceOwnership 0x715018a6
No parameters
restake 0x28cc4e41
uint256 validatorId
uint256 amount
bool stakeRewards
setCurrentEpoch 0x1dd6b9b1
uint256 _currentEpoch
setDelegationEnabled 0xf28699fa
bool enabled
setStakingToken 0x1e9b12ef
address _token
slash 0x5e47655f
bytes _slashingInfoList
returns: uint256
stakeFor 0x4fdd20f1
address user
uint256 amount
uint256 heimdallFee
bool acceptDelegation
bytes signerPubkey
startAuction 0xa6854877
uint256 validatorId
uint256 amount
bool _acceptDelegation
bytes _signerPubkey
stopAuctions 0xf771fc87
uint256 forNCheckpoints
topUpForFee 0x63656798
address user
uint256 heimdallFee
transferFunds 0xbc8756a9
uint256 validatorId
uint256 amount
address delegator
returns: bool
transferOwnership 0xf2fde38b
address newOwner
unjail 0x178c2c83
uint256 validatorId
unlock 0xa69df4b5
No parameters
unstake 0x2e17de78
uint256 validatorId
unstakeClaim 0xd86d53e7
uint256 validatorId
updateCheckPointBlockInterval 0xa440ab1e
uint256 _blocks
updateCheckpointReward 0xcbf383d5
uint256 newReward
updateCheckpointRewardParams 0x60c8d122
uint256 _rewardDecreasePerCheckpoint
uint256 _maxRewardedCheckpoints
uint256 _checkpointRewardDelta
updateCommissionRate 0xdcd962b2
uint256 validatorId
uint256 newCommissionRate
updateDynastyValue 0xe6692f49
uint256 newDynasty
updateMinAmounts 0xb1d23f02
uint256 _minDeposit
uint256 _minHeimdallFee
updateProposerBonus 0x9b33f434
uint256 newProposerBonus
updateSigner 0xf41a9642
uint256 validatorId
bytes signerPubkey
updateSignerUpdateLimit 0x06cfb104
uint256 _limit
updateValidatorContractAddress 0xc710e922
uint256 validatorId
address newContractAddress
updateValidatorDelegation 0xd6de07d0
bool delegation
updateValidatorState 0x9ff11500
uint256 validatorId
int256 amount
updateValidatorThreshold 0x16827b1b
uint256 newThreshold
withdrawDelegatorsReward 0x7ed4b27c
uint256 validatorId
returns: uint256
withdrawRewards 0x9342c8f4
uint256 validatorId

Recent Transactions

No transactions found for this address