Address Contract Partially Verified
Address
0xdA393f62303Ce1396D6F425cd7e85b60DaC8233e
Balance
0 ETH
Nonce
1
Code Size
12521 bytes
Creator
0x628E8C4d...91d4 at tx 0x39dd95a7...b3952a
Last Active
Indexed Transactions
14 (10,607,647 → 10,741,183)
Gas Used (indexed)
938,546
Contract Bytecode
12521 bytes
0x608060405234801561001057600080fd5b50600436106102485760003560e01c80638e68dce41161013b578063bed1807d116100b8578063e56c9b6b1161007c578063e56c9b6b14610549578063e7366dc814610569578063ec5e178c14610597578063f83d08ba1461059f578063fcd13d65146105a757610248565b8063bed1807d146104e8578063cf309012146104f0578063d3705cb7146104f8578063d55c9bcf1461051b578063ddc0d5d61461054157610248565b8063a69df4b5116100ff578063a69df4b514610490578063a7616cb114610498578063ab6acfc4146104d0578063ad751ed3146104d8578063b5f1c29d146104e057610248565b80638e68dce41461042c578063977d4e5a146104345780639b9a7e681461043c5780639f587d1c14610462578063a09e0d901461048857610248565b80635ecf16a6116101c95780636887694b1161018d5780636887694b146103ba5780636cdb6746146103da5780637b93af4c146103e257806385b4bb53146103ea578063868ca49d1461042457610248565b80635ecf16a6146102ed5780636049d86214610313578063615c25451461033657806361885df81461035c578063676b15a71461039457610248565b8063245dcad311610210578063245dcad3146102c55780632c43bdd5146102cd5780633a88ab8e146102d55780633b781309146102dd5780635282346d146102e557610248565b8063021abb931461024d57806307b490af1461026957806311caadfb146102915780631dc669f4146102b5578063209df1e2146102bd575b600080fd5b6102556105cd565b604080519115158252519081900360200190f35b61028f6004803603602081101561027f57600080fd5b50356001600160a01b03166105f1565b005b6102996108c1565b604080516001600160a01b039092168252519081900360200190f35b61028f610955565b61028f6109c5565b61028f610a52565b610299610ce2565b610255610cf1565b61028f610d08565b610299610d95565b61028f6004803603602081101561030357600080fd5b50356001600160a01b0316610dfa565b61028f6004803603602081101561032957600080fd5b503563ffffffff16610e54565b6102996004803603602081101561034c57600080fd5b50356001600160a01b0316610ef8565b61028f6004803603608081101561037257600080fd5b506001600160a01b038135169060208101359060408101359060600135610f16565b61028f600480360360208110156103aa57600080fd5b50356001600160a01b0316611023565b61028f600480360360208110156103d057600080fd5b503560ff16611423565b610299611518565b61028f611586565b6103f26115f6565b6040805163ffffffff958616815293909416602084015260ff9182168385015216606082015290519081900360800190f35b61028f611661565b6102996117d5565b610299611836565b61028f6004803603602081101561045257600080fd5b50356001600160a01b031661189d565b61028f6004803603602081101561047857600080fd5b50356001600160a01b0316611902565b610299611967565b61028f6119ce565b6104be600480360360208110156104ae57600080fd5b50356001600160a01b0316611a49565b60408051918252519081900360200190f35b610299611a64565b610299611ac7565b610299611b28565b610299611b8a565b610255611b99565b61028f6004803603602081101561050e57600080fd5b503563ffffffff16611ba9565b61028f6004803603602081101561053157600080fd5b50356001600160a01b0316611ca8565b610299611d3e565b61028f6004803603602081101561055f57600080fd5b503560ff16611dad565b61028f6004803603604081101561057f57600080fd5b506001600160a01b0381351690602001351515611ea3565b610299611f30565b61028f611fa0565b61028f600480360360208110156105bd57600080fd5b50356001600160a01b0316612021565b600080546001600160a01b03166105e26120b8565b6001600160a01b031614905090565b600454600160a01b900460ff161561063a5760405162461bcd60e51b8152600401808060200182810382526025815260200180612e166025913960400191505060405180910390fd5b610642612dee565b5060408051608081018252600a5463ffffffff8082168352600160201b82041660208084019190915260ff600160401b8304811684860152600160481b9092049091166060830152336000908152600790915291822080546001600160a01b038581166001600160a01b031983161790925591929116906106c1610d95565b6001600160a01b03166327cd7f02336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561071657600080fd5b505afa15801561072a573d6000803e3d6000fd5b505050506040513d602081101561074057600080fd5b505190506001600160a01b038216610765573360009081526006602052604090208190555b6001600160a01b03841661078457336000908152600660205260408120555b600061078e610d95565b6001600160a01b031663cf3b670b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107c657600080fd5b505afa1580156107da573d6000803e3d6000fd5b505050506040513d60208110156107f057600080fd5b505190506001600160a01b0383161580159061081e5750846001600160a01b0316836001600160a01b031614155b15610831576108318360008484886120bc565b6001600160a01b03851615610877576000856001600160a01b0316846001600160a01b03161415610863576000610865565b825b90506108758682600085896120bc565b505b604080513381526001600160a01b038716602082015281517f275bb5f10bdccb6cea621dfabf75682103f2392a02061d953ebe212cfa26ef0e929181900390910190a15050505050565b6002546040805163349f642f60e11b81526020600482018190526009602483015268656c656374696f6e7360b81b604483015291516000936001600160a01b03169263693ec85e9260648082019391829003018186803b15801561092457600080fd5b505afa158015610938573d6000803e3d6000fd5b505050506040513d602081101561094e57600080fd5b5051905090565b6004546001600160a01b0316331461099e5760405162461bcd60e51b81526004018080602001828103825260298152602001806130566029913960400191505060405180910390fd5b6004546109b3906001600160a01b031661228c565b600480546001600160a01b0319169055565b6109cd6105cd565b610a085760405162461bcd60e51b8152600401808060200182810382526041815260200180612e3b6041913960600191505060405180910390fd5b600080546040516001600160a01b03909116907f7e8c4fc74f50849b4ec635ed03f5d13f87cd46ae422e97479704c6fd1c164e20908390a3600080546001600160a01b0319169055565b6000610a5c611d3e565b6001600160a01b03166310b3b293336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610ab157600080fd5b505afa158015610ac5573d6000803e3d6000fd5b505050506040513d6020811015610adb57600080fd5b50519050610ae88161232d565b15610b30576040805162461bcd60e51b815260206004820152601360248201527218d85b1b195c881a5cc81d9bdd19590b5bdd5d606a1b604482015290519081900360640190fd5b604080516001600160a01b0383168152600160208201819052818301529051600080516020612f168339815191529181900360600190a1610b6f611a64565b60408051608081018252600a5463ffffffff8082168352600160201b820416602083015260ff600160401b8204811693830193909352600160481b900490911660608201526001600160a01b03919091169063e272079f908390610bd490829061234b565b610bdc611967565b6001600160a01b031663dc8b6d73866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610c3157600080fd5b505afa158015610c45573d6000803e3d6000fd5b505050506040513d6020811015610c5b57600080fd5b5051604080516001600160e01b031960e087901b1681526001600160a01b0390941660048501526024840192909252151560448301525160648083019260209291908290030181600087803b158015610cb357600080fd5b505af1158015610cc7573d6000803e3d6000fd5b505050506040513d6020811015610cdd57600080fd5b505050565b6000546001600160a01b031690565b6003546000906001600160a01b03166105e26120b8565b610d10610cf1565b610d4b5760405162461bcd60e51b8152600401808060200182810382526043815260200180612fdd6043913960600191505060405180910390fd5b6003546040516000916001600160a01b0316907f322ef0cb3bcc6b6f659770a0acaf7473e9bc6ebe63e04e4f28924c285c8cc5ea908390a3600380546001600160a01b0319169055565b6002546040805163349f642f60e11b8152602060048201819052600b60248301526a64656c65676174696f6e7360a81b604483015291516000936001600160a01b03169263693ec85e9260648082019391829003018186803b15801561092457600080fd5b610e02611d3e565b6001600160a01b0316336001600160a01b031614610e515760405162461bcd60e51b8152600401808060200182810382526031815260200180612f366031913960400191505060405180910390fd5b50565b610e5c610cf1565b610e975760405162461bcd60e51b8152600401808060200182810382526043815260200180612fdd6043913960600191505060405180910390fd5b600a546040805163ffffffff8085168252909216602083015280517f2427a76397e086eb5b055730cfbde47e53ffe5cf9f53d889710ad988150963c99281900390910190a1600a805463ffffffff191663ffffffff92909216919091179055565b6001600160a01b039081166000908152600760205260409020541690565b610f1e610d95565b6001600160a01b0316336001600160a01b031614610f6d5760405162461bcd60e51b8152600401808060200182810382526026815260200180612fb76026913960400191505060405180910390fd5b600454600160a01b900460ff1615610fb65760405162461bcd60e51b8152600401808060200182810382526025815260200180612e166025913960400191505060405180910390fd5b610fbe612dee565b5060408051608081018252600a5463ffffffff8082168352600160201b820416602083015260ff600160401b8204811693830193909352600160481b9004909116606082015261101085858584612471565b61101c8584848461256c565b5050505050565b600454600160a01b900460ff161561106c5760405162461bcd60e51b8152600401808060200182810382526025815260200180612e166025913960400191505060405180910390fd5b6000611077336125bd565b6001600160a01b03808216600081815260056020908152604080832094881680845294825291829020429055815192835282019290925281519293507f5b5ed1bc1b5bcfd388e5a0ac824cde2750edf4dab08582860302e6295c2c4635929081900390910190a160608060606110eb611a64565b6001600160a01b031663ab8f6ffe6040518163ffffffff1660e01b815260040160006040518083038186803b15801561112357600080fd5b505afa158015611137573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052606081101561116057600080fd5b8101908080516040519392919084600160201b82111561117f57600080fd5b90830190602082018581111561119457600080fd5b82518660208202830111600160201b821117156111b057600080fd5b82525081516020918201928201910280838360005b838110156111dd5781810151838201526020016111c5565b5050505090500160405260200180516040519392919084600160201b82111561120557600080fd5b90830190602082018581111561121a57600080fd5b82518660208202830111600160201b8211171561123657600080fd5b82525081516020918201928201910280838360005b8381101561126357818101518382015260200161124b565b5050505090500160405260200180516040519392919084600160201b82111561128b57600080fd5b9083019060208201858111156112a057600080fd5b82518660208202830111600160201b821117156112bc57600080fd5b82525081516020918201928201910280838360005b838110156112e95781810151838201526020016112d1565b50505050905001604052505050925092509250600061130a848484896127df565b9050801561141b5761131c8487612a49565b604080516001600160a01b038816815290517fc808d7f6285926a53d708653414e2d2a88e3c1715debb80fb09ca41d744e5ba69181900360200190a1604080516001600160a01b0388168152600060208201819052818301529051600080516020612f168339815191529181900360600190a1611397611a64565b6001600160a01b0316630b1ca49a876040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156113ee57600080fd5b505af1158015611402573d6000803e3d6000fd5b505050506040513d602081101561141857600080fd5b50505b505050505050565b61142b610cf1565b6114665760405162461bcd60e51b8152600401808060200182810382526043815260200180612fdd6043913960600191505060405180910390fd5b60648160ff1611156114a95760405162461bcd60e51b815260040180806020018281038252603a815260200180612e7c603a913960400191505060405180910390fd5b600a546040805160ff8481168252600160401b909304909216602083015280517f4c6b52c721c1410e2ca6d8ffa4f4060d25ea5c08da923dc8d85d8d64b9e0ce8a9281900390910190a1600a805460ff909216600160401b0268ff000000000000000019909216919091179055565b6002546040805163349f642f60e11b815260206004820181905260146024830152731cdd185ada5b99d4995dd85c991cd5d85b1b195d60621b604483015291516000936001600160a01b03169263693ec85e9260648082019391829003018186803b15801561092457600080fd5b6001546001600160a01b031633146115cf5760405162461bcd60e51b8152600401808060200182810382526028815260200180612eee6028913960400191505060405180910390fd5b6001546115e4906001600160a01b0316612aa4565b600180546001600160a01b0319169055565b600080600080611604612dee565b505060408051608081018252600a5463ffffffff808216808452600160201b83049091166020840181905260ff600160401b84048116958501869052600160481b9093049092166060909301929092529095909450909250829150565b600061166b611d3e565b6001600160a01b03166310b3b293336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156116c057600080fd5b505afa1580156116d4573d6000803e3d6000fd5b505050506040513d60208110156116ea57600080fd5b505190506116f78161232d565b1561173f576040805162461bcd60e51b815260206004820152601360248201527218d85b1b195c881a5cc81d9bdd19590b5bdd5d606a1b604482015290519081900360640190fd5b604080516001600160a01b0383168152600160208201526000818301529051600080516020612f168339815191529181900360600190a161177e611a64565b6001600160a01b0316630b1ca49a826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015610cb357600080fd5b6002546040805163349f642f60e11b815260206004820181905260076024830152667374616b696e6760c81b604483015291516000936001600160a01b03169263693ec85e9260648082019391829003018186803b15801561092457600080fd5b6002546040805163349f642f60e11b8152602060048201819052600d60248301526c737562736372697074696f6e7360981b604483015291516000936001600160a01b03169263693ec85e9260648082019391829003018186803b15801561092457600080fd5b6118a5610cf1565b6118e05760405162461bcd60e51b8152600401808060200182810382526043815260200180612fdd6043913960600191505060405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b61190a6105cd565b6119455760405162461bcd60e51b8152600401808060200182810382526041815260200180612e3b6041913960600191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546040805163349f642f60e11b8152602060048201819052600d60248301526c31b2b93a34b334b1b0ba34b7b760991b604483015291516000936001600160a01b03169263693ec85e9260648082019391829003018186803b15801561092457600080fd5b6119d66105cd565b611a115760405162461bcd60e51b8152600401808060200182810382526041815260200180612e3b6041913960600191505060405180910390fd5b6004805460ff60a01b191690556040517f19aad37188a1d3921e29eb3c66acf43d81975e107cb650d58cca878627955fd690600090a1565b6001600160a01b031660009081526008602052604090205490565b6002546040805163349f642f60e11b81526020600482018190526009602483015268636f6d6d697474656560b81b604483015291516000936001600160a01b03169263693ec85e9260648082019391829003018186803b15801561092457600080fd5b6002546040805163349f642f60e11b815260206004820181905260076024830152667265776172647360c81b604483015291516000936001600160a01b03169263693ec85e9260648082019391829003018186803b15801561092457600080fd5b6002546040805163349f642f60e11b815260206004820181905260086024830152671c1c9bdd1bd8dbdb60c21b604483015291516000936001600160a01b03169263693ec85e9260648082019391829003018186803b15801561092457600080fd5b6003546001600160a01b031690565b600454600160a01b900460ff1681565b611bb1610cf1565b611bec5760405162461bcd60e51b8152600401808060200182810382526043815260200180612fdd6043913960600191505060405180910390fd5b620186a08163ffffffff161115611c345760405162461bcd60e51b815260040180806020018281038252602f815260200180612f67602f913960400191505060405180910390fd5b600a546040805163ffffffff8481168252600160201b909304909216602083015280517f5f1e6a4b65e5b155a39124570a9d52d1a94b94d17b9cefb044afd83367344f739281900390910190a1600a805463ffffffff909216600160201b0267ffffffff0000000019909216919091179055565b611cb0611d3e565b6001600160a01b0316336001600160a01b031614611cff5760405162461bcd60e51b8152600401808060200182810382526031815260200180612f366031913960400191505060405180910390fd5b604080516001600160a01b0383168152600060208201819052818301529051600080516020612f168339815191529181900360600190a161177e611a64565b6002546040805163349f642f60e11b8152602060048201819052601560248301527433bab0b93234b0b739a932b3b4b9ba3930ba34b7b760591b604483015291516000936001600160a01b03169263693ec85e9260648082019391829003018186803b15801561092457600080fd5b611db5610cf1565b611df05760405162461bcd60e51b8152600401808060200182810382526043815260200180612fdd6043913960600191505060405180910390fd5b60648160ff161115611e335760405162461bcd60e51b815260040180806020018281038252603681526020018061307f6036913960400191505060405180910390fd5b600a546040805160ff8481168252600160481b909304909216602083015280517f9fba7f85fbe066a702355a0fde85fdd320d323248d6f6b15419e8579356aac239281900390910190a1600a805460ff909216600160481b0269ff00000000000000000019909216919091179055565b611eab611a64565b6040805163e66b9c1d60e01b81526001600160a01b03858116600483015284151560248301529151929091169163e66b9c1d916044808201926020929091908290030181600087803b158015611f0057600080fd5b505af1158015611f14573d6000803e3d6000fd5b505050506040513d6020811015611f2a57600080fd5b50505050565b6002546040805163349f642f60e11b81526020600482018190526016602483015275189bdbdd1cdd1c985c14995dd85c991cd5d85b1b195d60521b604483015291516000936001600160a01b03169263693ec85e9260648082019391829003018186803b15801561092457600080fd5b611fa86105cd565b611fe35760405162461bcd60e51b8152600401808060200182810382526041815260200180612e3b6041913960600191505060405180910390fd5b6004805460ff60a01b1916600160a01b1790556040517f0f2e5b6c72c6a4491efd919a9f9a409f324ef0708c11ee57d410c2cb06c0992b90600090a1565b6120296105cd565b6120645760405162461bcd60e51b8152600401808060200182810382526041815260200180612e3b6041913960600191505060405180910390fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b3390565b6120c58561232d565b156120cf5761101c565b6001600160a01b03851660009081526008602052604081205461210a9086906120fe908763ffffffff612b4416565b9063ffffffff612b8616565b9050600080841180156121445750606083015160ff166121418561213585606463ffffffff612be016565b9063ffffffff612c3916565b10155b9050801561226b576001600160a01b038716600081815260096020908152604091829020805460ff19166001179055815192835290517f0bc20ba748c0b7a01e134c521b1e20764a53c3a6b4710a54cbbcf6c8bb3ba3079281900390910190a1604080516001600160a01b0389168152600060208201819052818301529051600080516020612f168339815191529181900360600190a16121e3611a64565b6001600160a01b0316630b1ca49a886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561223a57600080fd5b505af115801561224e573d6000803e3d6000fd5b505050506040513d602081101561226457600080fd5b5060009250505b506001600160a01b0386166000908152600860205260409020555050505050565b6001600160a01b0381166122d15760405162461bcd60e51b8152600401808060200182810382526038815260200180612eb66038913960400191505060405180910390fd5b6003546040516001600160a01b038084169216907f322ef0cb3bcc6b6f659770a0acaf7473e9bc6ebe63e04e4f28924c285c8cc5ea90600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526009602052604090205460ff1690565b60006124686123586117d5565b6001600160a01b031663e9aea8c8856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156123ad57600080fd5b505afa1580156123c1573d6000803e3d6000fd5b505050506040513d60208110156123d757600080fd5b50516123e1610d95565b6001600160a01b03166327cd7f02866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561243657600080fd5b505afa15801561244a573d6000803e3d6000fd5b505050506040513d602081101561246057600080fd5b505184612c7b565b90505b92915050565b600061247e848484612c7b565b604080516001600160a01b0388168152602081018790528082018690526060810183905290519192507fd5c5ef58495d970aa497140d952854435af4876c07e0735daaa3fc32874c3cf8919081900360800190a16124da611a64565b6001600160a01b03166368f52e5086836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561253957600080fd5b505af115801561254d573d6000803e3d6000fd5b505050506040513d602081101561256357600080fd5b50505050505050565b6001600160a01b0380851660009081526007602052604090205416806125925750611f2a565b6001600160a01b038516600090815260066020526040902080549085905561141b82868387876120bc565b604080516001808252818301909252600091606091906020808301908038833901905050905082816000815181106125f157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600061261b611d3e565b6001600160a01b031663bdb813ab836040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019060200280838360005b83811015612679578181015183820152602001612661565b505050509050019250505060006040518083038186803b15801561269c57600080fd5b505afa1580156126b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156126d957600080fd5b8101908080516040519392919084600160201b8211156126f857600080fd5b90830190602082018581111561270d57600080fd5b82518660208202830111600160201b8211171561272957600080fd5b82525081516020918201928201910280838360005b8381101561275657818101518382015260200161273e565b5050505090500160405250505060008151811061276f57fe5b6020026020010151905060006001600160a01b0316816001600160a01b031614156127d8576040805162461bcd60e51b8152602060048201526014602482015273756e6b6e6f776e206f726273206164647265737360601b604482015290519081900360640190fd5b9392505050565b60006127e9612dee565b5060408051608081018252600a5463ffffffff8082168352600160201b820416602083015260ff600160401b8204811693830193909352600160481b900490911660608201526000808080808080805b8d518110156129d2578d818151811061284e57fe5b602002602001015193508c818151811061286457fe5b602002602001015192508a6001600160a01b0316846001600160a01b031614801561289f57508b818151811061289657fe5b60200260200101515b156128a957600191505b6128b9888463ffffffff612b8616565b97508b81815181106128c757fe5b6020026020010151156128e7576128e4868463ffffffff612b8616565b95505b6001600160a01b038085166000908152600560209081526040808320938f168352929052205480156129c957896000015163ffffffff166129318242612b4490919063ffffffff16565b101561297a57612947888563ffffffff612b8616565b97508c828151811061295557fe5b60200260200101511561297557612972868563ffffffff612b8616565b95505b6129c9565b600060056000876001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b03168152602001908152602001600020819055505b50600101612839565b506000871180156129fe5750604088015160ff166129fb8861213589606463ffffffff612be016565b10155b80612a385750808015612a115750600085115b8015612a385750604088015160ff16612a358661213587606463ffffffff612be016565b10155b9d9c50505050505050505050505050565b60005b8251811015610cdd57600060056000858481518110612a6757fe5b6020908102919091018101516001600160a01b03908116835282820193909352604091820160009081209387168152929052902055600101612a4c565b6001600160a01b038116612ae95760405162461bcd60e51b81526004018080602001828103825260368152602001806130206036913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f7e8c4fc74f50849b4ec635ed03f5d13f87cd46ae422e97479704c6fd1c164e2091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600061246883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612cf2565b600082820183811015612468576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082612bef5750600061246b565b82820282848281612bfc57fe5b04146124685760405162461bcd60e51b8152600401808060200182810382526021815260200180612f966021913960400191505060405180910390fd5b600061246883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612d89565b600083612c8a575060006127d8565b612ca7826020015163ffffffff1684612be090919063ffffffff16565b612cba85620186a063ffffffff612be016565b10612cc65750816127d8565b612cea826020015163ffffffff16612135620186a087612be090919063ffffffff16565b949350505050565b60008184841115612d815760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d46578181015183820152602001612d2e565b50505050905090810190601f168015612d735780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183612dd85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612d46578181015183820152602001612d2e565b506000838581612de457fe5b0495945050505050565b6040805160808101825260008082526020820181905291810182905260608101919091529056fe636f6e7472616374206973206c6f636b656420666f722074686973206f7065726174696f6e57697468436c61696d61626c654d6967726174696f6e4f776e6572736869703a2063616c6c6572206973206e6f7420746865206d6967726174696f6e4f776e6572766f7465556e726561647950657263656e746167655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303046756e6374696f6e616c4f776e65723a206e65772066756e6374696f6e616c4f776e657220697320746865207a65726f206164647265737343616c6c6572206973206e6f74207468652070656e64696e67206d6967726174696f6e4f776e6572f2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec63616c6c6572206973206e6f742074686520677561726469616e20726567697374726174696f6e7320636f6e74726163746d696e53656c665374616b6550657263656e744d696c6c65206d75737420626520313030303030206174206d6f7374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616c6c6572206973206e6f74207468652064656c65676174696f6e7320636f6e747261637457697468436c61696d61626c6546756e6374696f6e616c4f776e6572736869703a2063616c6c6572206973206e6f74207468652066756e6374696f6e616c4f776e65724d6967726174696f6e4f776e65723a206e6577206d6967726174696f6e4f776e657220697320746865207a65726f206164647265737343616c6c6572206973206e6f74207468652070656e64696e672066756e6374696f6e616c4f776e6572766f74654f757450657263656e746167655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e20313030a265627a7a72315820defb91b6db51b3a141b06660d2efab01cbfcd6674939ef7c196e6faab27e3a7264736f6c63430005100032
Verified Source Code Partial Match
Compiler: v0.5.16+commit.9c3226ce
EVM: istanbul
Optimization: Yes (200 runs)
Elections.sol 1572 lines
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity ^0.5.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*
* _Available since v2.4.0._
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot 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-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/math/Math.sol
pragma solidity ^0.5.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
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 Returns the average of two numbers. The result is rounded towards
* zero.
*/
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: contracts/spec_interfaces/ICommitteeListener.sol
pragma solidity 0.5.16;
interface ICommitteeListener {
function committeeChanged(address[] calldata addrs, uint256[] calldata stakes) external;
}
// File: contracts/spec_interfaces/IContractRegistry.sol
pragma solidity 0.5.16;
interface IContractRegistry {
event ContractAddressUpdated(string contractName, address addr);
/// @dev updates the contracts address and emits a corresponding event
function set(string calldata contractName, address addr) external /* onlyGovernor */;
/// @dev returns the current address of the
function get(string calldata contractName) external view returns (address);
}
// File: contracts/spec_interfaces/IDelegation.sol
pragma solidity 0.5.16;
/// @title Elections contract interface
interface IDelegations /* is IStakeChangeNotifier */ {
// Delegation state change events
event DelegatedStakeChanged(address indexed addr, uint256 selfDelegatedStake, uint256 delegatedStake, address[] delegators, uint256[] delegatorTotalStakes);
// Function calls
event Delegated(address indexed from, address indexed to);
/*
* External methods
*/
/// @dev Stake delegation
function delegate(address to) external /* onlyWhenActive */;
function refreshStakeNotification(address addr) external /* onlyWhenActive */;
/*
* Governance
*/
/// @dev Updates the address calldata of the contract registry
function setContractRegistry(IContractRegistry _contractRegistry) external /* onlyMigrationOwner */;
function importDelegations(address[] calldata from, address[] calldata to, bool notifyElections) external /* onlyMigrationOwner onlyDuringDelegationImport */;
function finalizeDelegationImport() external /* onlyMigrationOwner onlyDuringDelegationImport */;
event DelegationsImported(address[] from, address[] to, bool notifiedElections);
event DelegationImportFinalized();
/*
* Getters
*/
function getDelegatedStakes(address addr) external view returns (uint256);
function getSelfDelegatedStake(address addr) external view returns (uint256);
function getDelegation(address addr) external view returns (address);
function getTotalDelegatedStake() external view returns (uint256) ;
}
// File: contracts/IStakeChangeNotifier.sol
pragma solidity 0.5.16;
/// @title An interface for notifying of stake change events (e.g., stake, unstake, partial unstake, restate, etc.).
interface IStakeChangeNotifier {
/// @dev Notifies of stake change event.
/// @param _stakeOwner address The address of the subject stake owner.
/// @param _amount uint256 The difference in the total staked amount.
/// @param _sign bool The sign of the added (true) or subtracted (false) amount.
/// @param _updatedStake uint256 The updated total staked amount.
function stakeChange(address _stakeOwner, uint256 _amount, bool _sign, uint256 _updatedStake) external;
/// @dev Notifies of multiple stake change events.
/// @param _stakeOwners address[] The addresses of subject stake owners.
/// @param _amounts uint256[] The differences in total staked amounts.
/// @param _signs bool[] The signs of the added (true) or subtracted (false) amounts.
/// @param _updatedStakes uint256[] The updated total staked amounts.
function stakeChangeBatch(address[] calldata _stakeOwners, uint256[] calldata _amounts, bool[] calldata _signs,
uint256[] calldata _updatedStakes) external;
/// @dev Notifies of stake migration event.
/// @param _stakeOwner address The address of the subject stake owner.
/// @param _amount uint256 The migrated amount.
function stakeMigration(address _stakeOwner, uint256 _amount) external;
}
// File: contracts/interfaces/IElections.sol
pragma solidity 0.5.16;
/// @title Elections contract interface
interface IElections /* is IStakeChangeNotifier */ {
// Election state change events
event GuardianVotedUnready(address guardian);
event GuardianVotedOut(address guardian);
// Function calls
event VoteUnreadyCasted(address voter, address subject);
event VoteOutCasted(address voter, address subject);
event StakeChanged(address addr, uint256 selfStake, uint256 delegated_stake, uint256 effective_stake);
event GuardianStatusUpdated(address addr, bool readyToSync, bool readyForCommittee);
// Governance
event VoteUnreadyTimeoutSecondsChanged(uint32 newValue, uint32 oldValue);
event MinSelfStakePercentMilleChanged(uint32 newValue, uint32 oldValue);
event VoteOutPercentageThresholdChanged(uint8 newValue, uint8 oldValue);
event VoteUnreadyPercentageThresholdChanged(uint8 newValue, uint8 oldValue);
/*
* External methods
*/
/// @dev Called by a guardian as part of the automatic vote-out flow
function voteUnready(address subject_addr) external;
/// @dev casts a voteOut vote by the sender to the given address
function voteOut(address subjectAddr) external;
/// @dev Called by a guardian when ready to start syncing with other nodes
function readyToSync() external;
/// @dev Called by a guardian when ready to join the committee, typically after syncing is complete or after being voted out
function readyForCommittee() external;
/*
* Methods restricted to other Orbs contracts
*/
/// @dev Called by: delegation contract
/// Notifies a delegated stake change event
/// total_delegated_stake = 0 if addr delegates to another guardian
function delegatedStakeChange(address addr, uint256 selfStake, uint256 delegatedStake, uint256 totalDelegatedStake) external /* onlyDelegationContract */;
/// @dev Called by: guardian registration contract
/// Notifies a new guardian was registered
function guardianRegistered(address addr) external /* onlyGuardiansRegistrationContract */;
/// @dev Called by: guardian registration contract
/// Notifies a new guardian was unregistered
function guardianUnregistered(address addr) external /* onlyGuardiansRegistrationContract */;
/// @dev Called by: guardian registration contract
/// Notifies on a guardian certification change
function guardianCertificationChanged(address addr, bool isCertified) external /* onlyCertificationContract */;
/*
* Governance
*/
/// @dev Updates the address of the contract registry
function setContractRegistry(IContractRegistry _contractRegistry) external /* onlyMigrationOwner */;
function setVoteUnreadyTimeoutSeconds(uint32 voteUnreadyTimeoutSeconds) external /* onlyFunctionalOwner onlyWhenActive */;
function setMinSelfStakePercentMille(uint32 minSelfStakePercentMille) external /* onlyFunctionalOwner onlyWhenActive */;
function setVoteOutPercentageThreshold(uint8 voteUnreadyPercentageThreshold) external /* onlyFunctionalOwner onlyWhenActive */;
function setVoteUnreadyPercentageThreshold(uint8 voteUnreadyPercentageThreshold) external /* onlyFunctionalOwner onlyWhenActive */;
function getSettings() external view returns (
uint32 voteUnreadyTimeoutSeconds,
uint32 minSelfStakePercentMille,
uint8 voteUnreadyPercentageThreshold,
uint8 voteOutPercentageThreshold
);
}
// File: contracts/spec_interfaces/IGuardiansRegistration.sol
pragma solidity 0.5.16;
/// @title Elections contract interface
interface IGuardiansRegistration {
event GuardianRegistered(address addr);
event GuardianDataUpdated(address addr, bytes4 ip, address orbsAddr, string name, string website, string contact);
event GuardianUnregistered(address addr);
event GuardianMetadataChanged(address addr, string key, string newValue, string oldValue);
/*
* External methods
*/
/// @dev Called by a participant who wishes to register as a guardian
function registerGuardian(bytes4 ip, address orbsAddr, string calldata name, string calldata website, string calldata contact) external;
/// @dev Called by a participant who wishes to update its propertires
function updateGuardian(bytes4 ip, address orbsAddr, string calldata name, string calldata website, string calldata contact) external;
/// @dev Called by a participant who wishes to update its IP address (can be call by both main and Orbs addresses)
function updateGuardianIp(bytes4 ip) external /* onlyWhenActive */;
/// @dev Called by a participant to update additional guardian metadata properties.
function setMetadata(string calldata key, string calldata value) external;
/// @dev Called by a participant to get additional guardian metadata properties.
function getMetadata(address addr, string calldata key) external view returns (string memory);
/// @dev Called by a participant who wishes to unregister
function unregisterGuardian() external;
/// @dev Returns a guardian's data
/// Used also by the Election contract
function getGuardianData(address addr) external view returns (bytes4 ip, address orbsAddr, string memory name, string memory website, string memory contact, uint registration_time, uint last_update_time);
/// @dev Returns the Orbs addresses of a list of guardians
/// Used also by the committee contract
function getGuardiansOrbsAddress(address[] calldata addrs) external view returns (address[] memory orbsAddrs);
/// @dev Returns a guardian's ip
/// Used also by the Election contract
function getGuardianIp(address addr) external view returns (bytes4 ip);
/// @dev Returns guardian ips
function getGuardianIps(address[] calldata addr) external view returns (bytes4[] memory ips);
/// @dev Returns true if the given address is of a registered guardian
/// Used also by the Election contract
function isRegistered(address addr) external view returns (bool);
/*
* Methods restricted to other Orbs contracts
*/
/// @dev Translates a list guardians Ethereum addresses to Orbs addresses
/// Used by the Election contract
function getOrbsAddresses(address[] calldata ethereumAddrs) external view returns (address[] memory orbsAddr);
/// @dev Translates a list guardians Orbs addresses to Ethereum addresses
/// Used by the Election contract
function getEthereumAddresses(address[] calldata orbsAddrs) external view returns (address[] memory ethereumAddr);
/// @dev Resolves the ethereum address for a guardian, given an Ethereum/Orbs address
function resolveGuardianAddress(address ethereumOrOrbsAddress) external view returns (address mainAddress);
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.5.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see {ERC20Detailed}.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: 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
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: contracts/IMigratableStakingContract.sol
pragma solidity 0.5.16;
/// @title An interface for staking contracts which support stake migration.
interface IMigratableStakingContract {
/// @dev Returns the address of the underlying staked token.
/// @return IERC20 The address of the token.
function getToken() external view returns (IERC20);
/// @dev Stakes ORBS tokens on behalf of msg.sender. This method assumes that the user has already approved at least
/// the required amount using ERC20 approve.
/// @param _stakeOwner address The specified stake owner.
/// @param _amount uint256 The number of tokens to stake.
function acceptMigration(address _stakeOwner, uint256 _amount) external;
event AcceptedMigration(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
}
// File: contracts/IStakingContract.sol
pragma solidity 0.5.16;
/// @title An interface for staking contracts.
interface IStakingContract {
/// @dev Stakes ORBS tokens on behalf of msg.sender. This method assumes that the user has already approved at least
/// the required amount using ERC20 approve.
/// @param _amount uint256 The amount of tokens to stake.
function stake(uint256 _amount) external;
/// @dev Unstakes ORBS tokens from msg.sender. If successful, this will start the cooldown period, after which
/// msg.sender would be able to withdraw all of his tokens.
/// @param _amount uint256 The amount of tokens to unstake.
function unstake(uint256 _amount) external;
/// @dev Requests to withdraw all of staked ORBS tokens back to msg.sender. Stake owners can withdraw their ORBS
/// tokens only after previously unstaking them and after the cooldown period has passed (unless the contract was
/// requested to release all stakes).
function withdraw() external;
/// @dev Restakes unstaked ORBS tokens (in or after cooldown) for msg.sender.
function restake() external;
/// @dev Distributes staking rewards to a list of addresses by directly adding rewards to their stakes. This method
/// assumes that the user has already approved at least the required amount using ERC20 approve. Since this is a
/// convenience method, we aren't concerned about reaching block gas limit by using large lists. We assume that
/// callers will be able to properly batch/paginate their requests.
/// @param _totalAmount uint256 The total amount of rewards to distributes.
/// @param _stakeOwners address[] The addresses of the stake owners.
/// @param _amounts uint256[] The amounts of the rewards.
function distributeRewards(uint256 _totalAmount, address[] calldata _stakeOwners, uint256[] calldata _amounts) external;
/// @dev Returns the stake of the specified stake owner (excluding unstaked tokens).
/// @param _stakeOwner address The address to check.
/// @return uint256 The total stake.
function getStakeBalanceOf(address _stakeOwner) external view returns (uint256);
/// @dev Returns the total amount staked tokens (excluding unstaked tokens).
/// @return uint256 The total staked tokens of all stake owners.
function getTotalStakedTokens() external view returns (uint256);
/// @dev Returns the time that the cooldown period ends (or ended) and the amount of tokens to be released.
/// @param _stakeOwner address The address to check.
/// @return cooldownAmount uint256 The total tokens in cooldown.
/// @return cooldownEndTime uint256 The time when the cooldown period ends (in seconds).
function getUnstakeStatus(address _stakeOwner) external view returns (uint256 cooldownAmount,
uint256 cooldownEndTime);
/// @dev Migrates the stake of msg.sender from this staking contract to a new approved staking contract.
/// @param _newStakingContract IMigratableStakingContract The new staking contract which supports stake migration.
/// @param _amount uint256 The amount of tokens to migrate.
function migrateStakedTokens(IMigratableStakingContract _newStakingContract, uint256 _amount) external;
event Staked(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
event Unstaked(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
event Withdrew(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
event Restaked(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
event MigratedStake(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
}
// File: contracts/spec_interfaces/ICommittee.sol
pragma solidity 0.5.16;
/// @title Elections contract interface
interface ICommittee {
event GuardianCommitteeChange(address addr, uint256 weight, bool certification, bool inCommittee);
event CommitteeSnapshot(address[] addrs, uint256[] weights, bool[] certification);
// No external functions
/*
* Methods restricted to other Orbs contracts
*/
/// @dev Called by: Elections contract
/// Notifies a weight change for sorting to a relevant committee member.
/// weight = 0 indicates removal of the member from the committee (for exmaple on unregister, voteUnready, voteOut)
function memberWeightChange(address addr, uint256 weight) external returns (bool committeeChanged) /* onlyElectionContract */;
/// @dev Called by: Elections contract
/// Notifies a guardian certification change
function memberCertificationChange(address addr, bool isCertified) external returns (bool committeeChanged) /* onlyElectionsContract */;
/// @dev Called by: Elections contract
/// Notifies a a member removal for exampl e due to voteOut / voteUnready
function removeMember(address addr) external returns (bool committeeChanged) /* onlyElectionContract */;
/// @dev Called by: Elections contract
/// Notifies a new member applicable for committee (due to registration, unbanning, certification change)
function addMember(address addr, uint256 weight, bool isCertified) external returns (bool committeeChanged) /* onlyElectionsContract */;
/// @dev Called by: Elections contract
/// Returns the committee members and their weights
function getCommittee() external view returns (address[] memory addrs, uint256[] memory weights, bool[] memory certification);
/*
* Governance
*/
function setMaxTimeBetweenRewardAssignments(uint32 maxTimeBetweenRewardAssignments) external /* onlyFunctionalOwner onlyWhenActive */;
function setMaxCommittee(uint8 maxCommitteeSize) external /* onlyFunctionalOwner onlyWhenActive */;
event MaxTimeBetweenRewardAssignmentsChanged(uint32 newValue, uint32 oldValue);
event MaxCommitteeSizeChanged(uint8 newValue, uint8 oldValue);
/// @dev Updates the address calldata of the contract registry
function setContractRegistry(IContractRegistry _contractRegistry) external /* onlyMigrationOwner */;
/*
* Getters
*/
/// @dev returns the current committee
/// used also by the rewards and fees contracts
function getCommitteeInfo() external view returns (address[] memory addrs, uint256[] memory weights, address[] memory orbsAddrs, bool[] memory certification, bytes4[] memory ips);
/// @dev returns the current settings of the committee contract
function getSettings() external view returns (uint32 maxTimeBetweenRewardAssignments, uint8 maxCommitteeSize);
}
// File: contracts/spec_interfaces/ICertification.sol
pragma solidity 0.5.16;
/// @title Elections contract interface
interface ICertification /* is Ownable */ {
event GuardianCertificationUpdate(address guardian, bool isCertified);
/*
* External methods
*/
/// @dev Called by a guardian as part of the automatic vote unready flow
/// Used by the Election contract
function isGuardianCertified(address addr) external view returns (bool isCertified);
/// @dev Called by a guardian as part of the automatic vote unready flow
/// Used by the Election contract
function setGuardianCertification(address addr, bool isCertified) external /* Owner only */ ;
/*
* Governance
*/
/// @dev Updates the address calldata of the contract registry
function setContractRegistry(IContractRegistry _contractRegistry) external /* onlyMigrationOwner */;
}
// File: contracts/spec_interfaces/IProtocol.sol
pragma solidity 0.5.16;
interface IProtocol {
event ProtocolVersionChanged(string deploymentSubset, uint256 currentVersion, uint256 nextVersion, uint256 fromTimestamp);
/*
* External methods
*/
/// @dev returns true if the given deployment subset exists (i.e - is registered with a protocol version)
function deploymentSubsetExists(string calldata deploymentSubset) external view returns (bool);
/// @dev returns the current protocol version for the given deployment subset.
function getProtocolVersion(string calldata deploymentSubset) external view returns (uint256);
/*
* Governor methods
*/
/// @dev create a new deployment subset.
function createDeploymentSubset(string calldata deploymentSubset, uint256 initialProtocolVersion) external /* onlyFunctionalOwner */;
/// @dev schedules a protocol version upgrade for the given deployment subset.
function setProtocolVersion(string calldata deploymentSubset, uint256 nextVersion, uint256 fromTimestamp) external /* onlyFunctionalOwner */;
}
// File: contracts/spec_interfaces/ISubscriptions.sol
pragma solidity 0.5.16;
/// @title Subscriptions contract interface
interface ISubscriptions {
event SubscriptionChanged(uint256 vcid, uint256 genRefTime, uint256 expiresAt, string tier, string deploymentSubset);
event Payment(uint256 vcid, address by, uint256 amount, string tier, uint256 rate);
event VcConfigRecordChanged(uint256 vcid, string key, string value);
event SubscriberAdded(address subscriber);
event VcCreated(uint256 vcid, address owner); // TODO what about isCertified, deploymentSubset?
event VcOwnerChanged(uint256 vcid, address previousOwner, address newOwner);
/*
* Methods restricted to other Orbs contracts
*/
/// @dev Called by: authorized subscriber (plan) contracts
/// Creates a new VC
function createVC(string calldata tier, uint256 rate, uint256 amount, address owner, bool isCertified, string calldata deploymentSubset) external returns (uint, uint);
/// @dev Called by: authorized subscriber (plan) contracts
/// Extends the subscription of an existing VC.
function extendSubscription(uint256 vcid, uint256 amount, address payer) external;
/// @dev called by VC owner to set a VC config record. Emits a VcConfigRecordChanged event.
function setVcConfigRecord(uint256 vcid, string calldata key, string calldata value) external /* onlyVcOwner */;
/// @dev returns the value of a VC config record
function getVcConfigRecord(uint256 vcid, string calldata key) external view returns (string memory);
/// @dev Transfers VC ownership to a new owner (can only be called by the current owner)
function setVcOwner(uint256 vcid, address owner) external /* onlyVcOwner */;
/// @dev Returns the genesis ref time delay
function getGenesisRefTimeDelay() external view returns (uint256);
/*
* Governance methods
*/
/// @dev Called by the owner to authorize a subscriber (plan)
function addSubscriber(address addr) external /* onlyFunctionalOwner */;
/// @dev Called by the owner to set the genesis ref time delay
function setGenesisRefTimeDelay(uint256 newGenesisRefTimeDelay) external /* onlyFunctionalOwner */;
/// @dev Updates the address of the contract registry
function setContractRegistry(IContractRegistry _contractRegistry) external /* onlyMigrationOwner */;
}
// File: contracts/interfaces/IRewards.sol
pragma solidity 0.5.16;
/// @title Rewards contract interface
interface IRewards {
function assignRewards() external;
function assignRewardsToCommittee(address[] calldata generalCommittee, uint256[] calldata generalCommitteeWeights, bool[] calldata certification) external /* onlyCommitteeContract */;
// staking
event StakingRewardsDistributed(address indexed distributer, uint256 fromBlock, uint256 toBlock, uint split, uint txIndex, address[] to, uint256[] amounts);
event StakingRewardsAssigned(address[] assignees, uint256[] amounts); // todo balance?
event StakingRewardsAddedToPool(uint256 added, uint256 total);
event MaxDelegatorsStakingRewardsChanged(uint32 maxDelegatorsStakingRewardsPercentMille);
/// @return Returns the currently unclaimed orbs token reward balance of the given address.
function getStakingRewardBalance(address addr) external view returns (uint256 balance);
/// @dev Distributes msg.sender's orbs token rewards to a list of addresses, by transferring directly into the staking contract.
/// @dev `to[0]` must be the sender's main address
/// @dev Total delegators reward (`to[1:n]`) must be less then maxDelegatorsStakingRewardsPercentMille of total amount
function distributeOrbsTokenStakingRewards(uint256 totalAmount, uint256 fromBlock, uint256 toBlock, uint split, uint txIndex, address[] calldata to, uint256[] calldata amounts) external;
/// @dev Transfers the given amount of orbs tokens form the sender to this contract an update the pool.
function topUpStakingRewardsPool(uint256 amount) external;
/*
* Reward-governor methods
*/
/// @dev Assigns rewards and sets a new monthly rate for the pro-rata pool.
function setAnnualStakingRewardsRate(uint256 annual_rate_in_percent_mille, uint256 annual_cap) external /* onlyFunctionalOwner */;
// fees
event FeesAssigned(uint256 generalGuardianAmount, uint256 certifiedGuardianAmount);
event FeesWithdrawn(address guardian, uint256 amount);
event FeesWithdrawnFromBucket(uint256 bucketId, uint256 withdrawn, uint256 total, bool isCertified);
event FeesAddedToBucket(uint256 bucketId, uint256 added, uint256 total, bool isCertified);
/*
* External methods
*/
/// @return Returns the currently unclaimed orbs token reward balance of the given address.
function getFeeBalance(address addr) external view returns (uint256 balance);
/// @dev Transfer all of msg.sender's outstanding balance to their account
function withdrawFeeFunds() external;
/// @dev Called by: subscriptions contract
/// Top-ups the certification fee pool with the given amount at the given rate (typically called by the subscriptions contract)
function fillCertificationFeeBuckets(uint256 amount, uint256 monthlyRate, uint256 fromTimestamp) external;
/// @dev Called by: subscriptions contract
/// Top-ups the general fee pool with the given amount at the given rate (typically called by the subscriptions contract)
function fillGeneralFeeBuckets(uint256 amount, uint256 monthlyRate, uint256 fromTimestamp) external;
function getTotalBalances() external view returns (uint256 feesTotalBalance, uint256 stakingRewardsTotalBalance, uint256 bootstrapRewardsTotalBalance);
// bootstrap
event BootstrapRewardsAssigned(uint256 generalGuardianAmount, uint256 certifiedGuardianAmount);
event BootstrapAddedToPool(uint256 added, uint256 total);
event BootstrapRewardsWithdrawn(address guardian, uint256 amount);
/*
* External methods
*/
/// @return Returns the currently unclaimed bootstrap balance of the given address.
function getBootstrapBalance(address addr) external view returns (uint256 balance);
/// @dev Transfer all of msg.sender's outstanding balance to their account
function withdrawBootstrapFunds() external;
/// @return The timestamp of the last reward assignment.
function getLastRewardAssignmentTime() external view returns (uint256 time);
/// @dev Transfers the given amount of bootstrap tokens form the sender to this contract and update the pool.
/// Assumes the tokens were approved for transfer
function topUpBootstrapPool(uint256 amount) external;
/*
* Reward-governor methods
*/
/// @dev Assigns rewards and sets a new monthly rate for the geenral commitee bootstrap.
function setGeneralCommitteeAnnualBootstrap(uint256 annual_amount) external /* onlyFunctionalOwner */;
/// @dev Assigns rewards and sets a new monthly rate for the certification commitee bootstrap.
function setCertificationCommitteeAnnualBootstrap(uint256 annual_amount) external /* onlyFunctionalOwner */;
event EmergencyWithdrawal(address addr);
function emergencyWithdraw() external /* onlyMigrationManager */;
/*
* General governance
*/
/// @dev Updates the address of the contract registry
function setContractRegistry(IContractRegistry _contractRegistry) external /* onlyMigrationOwner */;
}
// File: @openzeppelin/contracts/GSN/Context.sol
pragma solidity ^0.5.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
contract Context {
// Empty internal constructor, to prevent people from mistakenly deploying
// an instance of this contract, which should be used via inheritance.
constructor () internal { }
// solhint-disable-previous-line no-empty-blocks
function _msgSender() internal view returns (address payable) {
return msg.sender;
}
function _msgData() internal view returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: contracts/WithClaimableMigrationOwnership.sol
pragma solidity 0.5.16;
/**
* @title Claimable
* @dev Extension for the Ownable contract, where the ownership needs to be claimed.
* This allows the new owner to accept the transfer.
*/
contract WithClaimableMigrationOwnership is Context{
address private _migrationOwner;
address pendingMigrationOwner;
event MigrationOwnershipTransferred(address indexed previousMigrationOwner, address indexed newMigrationOwner);
/**
* @dev Initializes the contract setting the deployer as the initial migrationMigrationOwner.
*/
constructor () internal {
address msgSender = _msgSender();
_migrationOwner = msgSender;
emit MigrationOwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current migrationOwner.
*/
function migrationOwner() public view returns (address) {
return _migrationOwner;
}
/**
* @dev Throws if called by any account other than the migrationOwner.
*/
modifier onlyMigrationOwner() {
require(isMigrationOwner(), "WithClaimableMigrationOwnership: caller is not the migrationOwner");
_;
}
/**
* @dev Returns true if the caller is the current migrationOwner.
*/
function isMigrationOwner() public view returns (bool) {
return _msgSender() == _migrationOwner;
}
/**
* @dev Leaves the contract without migrationOwner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current migrationOwner.
*
* NOTE: Renouncing migrationOwnership will leave the contract without an migrationOwner,
* thereby removing any functionality that is only available to the migrationOwner.
*/
function renounceMigrationOwnership() public onlyMigrationOwner {
emit MigrationOwnershipTransferred(_migrationOwner, address(0));
_migrationOwner = address(0);
}
/**
* @dev Transfers migrationOwnership of the contract to a new account (`newOwner`).
*/
function _transferMigrationOwnership(address newMigrationOwner) internal {
require(newMigrationOwner != address(0), "MigrationOwner: new migrationOwner is the zero address");
emit MigrationOwnershipTransferred(_migrationOwner, newMigrationOwner);
_migrationOwner = newMigrationOwner;
}
/**
* @dev Modifier throws if called by any account other than the pendingOwner.
*/
modifier onlyPendingMigrationOwner() {
require(msg.sender == pendingMigrationOwner, "Caller is not the pending migrationOwner");
_;
}
/**
* @dev Allows the current migrationOwner to set the pendingOwner address.
* @param newMigrationOwner The address to transfer migrationOwnership to.
*/
function transferMigrationOwnership(address newMigrationOwner) public onlyMigrationOwner {
pendingMigrationOwner = newMigrationOwner;
}
/**
* @dev Allows the pendingMigrationOwner address to finalize the transfer.
*/
function claimMigrationOwnership() external onlyPendingMigrationOwner {
_transferMigrationOwnership(pendingMigrationOwner);
pendingMigrationOwner = address(0);
}
}
// File: contracts/Lockable.sol
pragma solidity 0.5.16;
/**
* @title Claimable
* @dev Extension for the Ownable contract, where the ownership needs to be claimed.
* This allows the new owner to accept the transfer.
*/
contract Lockable is WithClaimableMigrationOwnership {
bool public locked;
event Locked();
event Unlocked();
function lock() external onlyMigrationOwner {
locked = true;
emit Locked();
}
function unlock() external onlyMigrationOwner {
locked = false;
emit Unlocked();
}
modifier onlyWhenActive() {
require(!locked, "contract is locked for this operation");
_;
}
}
// File: contracts/spec_interfaces/IProtocolWallet.sol
pragma solidity 0.5.16;
pragma solidity 0.5.16;
/// @title Protocol Wallet interface
interface IProtocolWallet {
event FundsAddedToPool(uint256 added, uint256 total);
event ClientSet(address client);
event MaxAnnualRateSet(uint256 maxAnnualRate);
event EmergencyWithdrawal(address addr);
/// @dev Returns the address of the underlying staked token.
/// @return IERC20 The address of the token.
function getToken() external view returns (IERC20);
/// @dev Returns the address of the underlying staked token.
/// @return IERC20 The address of the token.
function getBalance() external view returns (uint256 balance);
/// @dev Transfers the given amount of orbs tokens form the sender to this contract an update the pool.
function topUp(uint256 amount) external;
/// @dev Withdraw from pool to a the sender's address, limited by the pool's MaxRate.
/// A maximum of MaxRate x time period since the last Orbs transfer may be transferred out.
/// Flow:
/// PoolWallet.approveTransfer(amount);
/// ERC20.transferFrom(PoolWallet, client, amount)
function withdraw(uint256 amount) external; /* onlyClient */
/* Governance */
/// @dev Sets a new transfer rate for the Orbs pool.
function setMaxAnnualRate(uint256 annual_rate) external; /* onlyMigrationManager */
/// @dev transfer the entire pool's balance to a new wallet.
function emergencyWithdraw() external; /* onlyMigrationManager */
/// @dev sets the address of the new contract
function setClient(address client) external; /* onlyFunctionalManager */
}
// File: contracts/ContractRegistryAccessor.sol
pragma solidity 0.5.16;
contract ContractRegistryAccessor is WithClaimableMigrationOwnership {
IContractRegistry contractRegistry;
event ContractRegistryAddressUpdated(address addr);
function setContractRegistry(IContractRegistry _contractRegistry) external onlyMigrationOwner {
contractRegistry = _contractRegistry;
emit ContractRegistryAddressUpdated(address(_contractRegistry));
}
function getProtocolContract() public view returns (IProtocol) {
return IProtocol(contractRegistry.get("protocol"));
}
function getRewardsContract() public view returns (IRewards) {
return IRewards(contractRegistry.get("rewards"));
}
function getCommitteeContract() public view returns (ICommittee) {
return ICommittee(contractRegistry.get("committee"));
}
function getElectionsContract() public view returns (IElections) {
return IElections(contractRegistry.get("elections"));
}
function getDelegationsContract() public view returns (IDelegations) {
return IDelegations(contractRegistry.get("delegations"));
}
function getGuardiansRegistrationContract() public view returns (IGuardiansRegistration) {
return IGuardiansRegistration(contractRegistry.get("guardiansRegistration"));
}
function getCertificationContract() public view returns (ICertification) {
return ICertification(contractRegistry.get("certification"));
}
function getStakingContract() public view returns (IStakingContract) {
return IStakingContract(contractRegistry.get("staking"));
}
function getSubscriptionsContract() public view returns (ISubscriptions) {
return ISubscriptions(contractRegistry.get("subscriptions"));
}
function getStakingRewardsWallet() public view returns (IProtocolWallet) {
return IProtocolWallet(contractRegistry.get("stakingRewardsWallet"));
}
function getBootstrapRewardsWallet() public view returns (IProtocolWallet) {
return IProtocolWallet(contractRegistry.get("bootstrapRewardsWallet"));
}
}
// File: contracts/WithClaimableFunctionalOwnership.sol
pragma solidity 0.5.16;
/**
* @title Claimable
* @dev Extension for the Ownable contract, where the ownership needs to be claimed.
* This allows the new owner to accept the transfer.
*/
contract WithClaimableFunctionalOwnership is Context{
address private _functionalOwner;
address pendingFunctionalOwner;
event FunctionalOwnershipTransferred(address indexed previousFunctionalOwner, address indexed newFunctionalOwner);
/**
* @dev Initializes the contract setting the deployer as the initial functionalFunctionalOwner.
*/
constructor () internal {
address msgSender = _msgSender();
_functionalOwner = msgSender;
emit FunctionalOwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current functionalOwner.
*/
function functionalOwner() public view returns (address) {
return _functionalOwner;
}
/**
* @dev Throws if called by any account other than the functionalOwner.
*/
modifier onlyFunctionalOwner() {
require(isFunctionalOwner(), "WithClaimableFunctionalOwnership: caller is not the functionalOwner");
_;
}
/**
* @dev Returns true if the caller is the current functionalOwner.
*/
function isFunctionalOwner() public view returns (bool) {
return _msgSender() == _functionalOwner;
}
/**
* @dev Leaves the contract without functionalOwner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current functionalOwner.
*
* NOTE: Renouncing functionalOwnership will leave the contract without an functionalOwner,
* thereby removing any functionality that is only available to the functionalOwner.
*/
function renounceFunctionalOwnership() public onlyFunctionalOwner {
emit FunctionalOwnershipTransferred(_functionalOwner, address(0));
_functionalOwner = address(0);
}
/**
* @dev Transfers functionalOwnership of the contract to a new account (`newOwner`).
*/
function _transferFunctionalOwnership(address newFunctionalOwner) internal {
require(newFunctionalOwner != address(0), "FunctionalOwner: new functionalOwner is the zero address");
emit FunctionalOwnershipTransferred(_functionalOwner, newFunctionalOwner);
_functionalOwner = newFunctionalOwner;
}
/**
* @dev Modifier throws if called by any account other than the pendingOwner.
*/
modifier onlyPendingFunctionalOwner() {
require(msg.sender == pendingFunctionalOwner, "Caller is not the pending functionalOwner");
_;
}
/**
* @dev Allows the current functionalOwner to set the pendingOwner address.
* @param newFunctionalOwner The address to transfer functionalOwnership to.
*/
function transferFunctionalOwnership(address newFunctionalOwner) public onlyFunctionalOwner {
pendingFunctionalOwner = newFunctionalOwner;
}
/**
* @dev Allows the pendingFunctionalOwner address to finalize the transfer.
*/
function claimFunctionalOwnership() external onlyPendingFunctionalOwner {
_transferFunctionalOwnership(pendingFunctionalOwner);
pendingFunctionalOwner = address(0);
}
}
// File: ../contracts/Elections.sol
pragma solidity 0.5.16;
contract Elections is IElections, ContractRegistryAccessor, WithClaimableFunctionalOwnership, Lockable {
using SafeMath for uint256;
mapping (address => mapping (address => uint256)) votedUnreadyVotes; // by => to => timestamp
ma...
// [truncated — 62804 bytes total]
Read Contract
functionalOwner 0xbed1807d → address
getAccumulatedStakesForVoteOut 0xa7616cb1 → uint256
getBootstrapRewardsWallet 0xec5e178c → address
getCertificationContract 0xa09e0d90 → address
getCommitteeContract 0xab6acfc4 → address
getDelegationsContract 0x5282346d → address
getElectionsContract 0x11caadfb → address
getGuardiansRegistrationContract 0xddc0d5d6 → address
getProtocolContract 0xb5f1c29d → address
getRewardsContract 0xad751ed3 → address
getSettings 0x85b4bb53 → uint32, uint32, uint8, uint8
getStakingContract 0x8e68dce4 → address
getStakingRewardsWallet 0x6cdb6746 → address
getSubscriptionsContract 0x977d4e5a → address
getVoteOutVote 0x615c2545 → address
isFunctionalOwner 0x3a88ab8e → bool
isMigrationOwner 0x021abb93 → bool
locked 0xcf309012 → bool
migrationOwner 0x2c43bdd5 → address
Write Contract 21 functions
These functions modify contract state and require a wallet transaction to execute.
claimFunctionalOwnership 0x1dc669f4
No parameters
claimMigrationOwnership 0x7b93af4c
No parameters
delegatedStakeChange 0x61885df8
address addr
uint256 selfStake
uint256 delegatedStake
uint256 totalDelegatedStake
guardianCertificationChanged 0xe7366dc8
address addr
bool isCertified
guardianRegistered 0x5ecf16a6
address addr
guardianUnregistered 0xd55c9bcf
address addr
lock 0xf83d08ba
No parameters
readyForCommittee 0x245dcad3
No parameters
readyToSync 0x868ca49d
No parameters
renounceFunctionalOwnership 0x3b781309
No parameters
renounceMigrationOwnership 0x209df1e2
No parameters
setContractRegistry 0xfcd13d65
address _contractRegistry
setMinSelfStakePercentMille 0xd3705cb7
uint32 minSelfStakePercentMille
setVoteOutPercentageThreshold 0xe56c9b6b
uint8 voteOutPercentageThreshold
setVoteUnreadyPercentageThreshold 0x6887694b
uint8 voteUnreadyPercentageThreshold
setVoteUnreadyTimeoutSeconds 0x6049d862
uint32 voteUnreadyTimeoutSeconds
transferFunctionalOwnership 0x9b9a7e68
address newFunctionalOwner
transferMigrationOwnership 0x9f587d1c
address newMigrationOwner
unlock 0xa69df4b5
No parameters
voteOut 0x07b490af
address subject
voteUnready 0x676b15a7
address subjectAddr
Top Interactions
| Address | Txns | Sent | Received |
|---|---|---|---|
| 0x0838b805...811D | 3 | 3 | |
| 0xA0015EF8...771E | 2 | 2 | |
| 0x90e544Fa...2630 | 1 | 1 | |
| 0x21Ff8c5D...dBf3 | 1 | 1 | |
| 0x6412cb7c...366f | 1 | 1 | |
| 0x400aB9C5...6E4D | 1 | 1 | |
| 0x79F08840...0D68 | 1 | 1 |
Recent Transactions
|
| Hash | Block | Age | From/To | Value | |
|---|---|---|---|---|---|
| 0x7c1387f0...6d84d4 | 10,741,183 | IN | 0x6412cb7c...366f | 0 ETH | |
| 0xddd075fe...3763f8 | 10,696,766 | IN | 0x400aB9C5...6E4D | 0 ETH | |
| 0x3eb57139...54f530 | 10,696,634 | IN | 0x79F08840...0D68 | 0 ETH | |
| 0xc64a77e1...05c0da | 10,633,948 | IN | 0x21Ff8c5D...dBf3 | 0 ETH | |
| 0xb6f72588...73220e | 10,633,726 | IN | 0x90e544Fa...2630 | 0 ETH | |
| 0x081172dd...e91032 | 10,632,795 | IN | 0xA0015EF8...771E | 0 ETH | |
| 0xbcb6b983...d5e581 | 10,632,474 | IN | 0xA0015EF8...771E | 0 ETH | |
| 0x26688857...44291e | 10,608,073 | IN | 0x0838b805...811D | 0 ETH | |
| 0x47bb36d7...44937b | 10,607,689 | IN | 0x0838b805...811D | 0 ETH | |
| 0xc92a034d...fa8595 | 10,607,647 | IN | 0x0838b805...811D | 0 ETH |