Address Contract Partially Verified
Address
0xC0D9cdF5061c974021269a03Cb5ea9e7AA638254
Balance
0 ETH
Nonce
10
Code Size
24517 bytes
Creator
0x9F88d9B0...1cAb at tx 0xb4110abc...a7c08d
Indexed Transactions
0
Contract Bytecode
24517 bytes
0x608060405260043610620001fb5760003560e01c80633ccfd60b116200011b5780639c67f06f11620000a3578063d4846c35116200006d578063d4846c3514620005b0578063d70caccc14620005d2578063e1ea2b0714620005e9578063fad8d6d414620006005762000230565b80639c67f06f14620005605780639e5886311462000578578063a3570b9b146200058f578063bd00444d14620005995762000230565b806354fd4d5011620000e557806354fd4d5014620004e9578063610db7af14620005025780637dd4febf146200052757806383027f4514620005495762000230565b80633ccfd60b1462000470578063488a90f0146200048857806351de0daa14620004ad5780635292b87214620004b75762000230565b80630230a07c116200019f57806322ec1244116200016957806322ec124414620003d5578063267b692214620004095780632b936b7c14620004445780633408e470146200045b5762000230565b80630230a07c146200033957806302d629f214620003505780630b74bdaa146200038b57806311ac72e014620003b05762000230565b80616a2611620001d75780616a2614620002dd578061824d14620002f45780619204146200030b578061f5c214620003225762000230565b8061283b146200027257806146cb1462000289578061615414620002a05762000230565b366200023057604051349033907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90600090a3005b3480156200023d57600080fd5b5060405162461bcd60e51b815260206004820152600260248201526120b360f11b60448201526064015b60405180910390fd5b005b62000270620002833660046200493d565b62000625565b620002706200029a36600462004957565b62000a0b565b348015620002ad57600080fd5b50620002c5620002bf3660046200493d565b62000bb4565b604051620002d49190620049b3565b60405180910390f35b62000270620002ee36600462004957565b62000c7f565b62000270620003053660046200493d565b62000edf565b620002706200031c3660046200493d565b620013fe565b6200027062000333366004620049d9565b620017be565b620002706200034a3660046200493d565b620018da565b3480156200035d57600080fd5b5060065462000372906001600160a01b031681565b6040516001600160a01b039091168152602001620002d4565b3480156200039857600080fd5b5062000372620003aa3660046200493d565b62001a5b565b348015620003bd57600080fd5b5062000372620003cf3660046200493d565b62001add565b348015620003e257600080fd5b50620003fa620003f436600462004a15565b62001af5565b604051908152602001620002d4565b3480156200041657600080fd5b506200042e620004283660046200493d565b62001b30565b604051620002d498979695949392919062004a55565b62000270620004553660046200493d565b62001c7c565b3480156200046857600080fd5b5046620003fa565b3480156200047d57600080fd5b506200027062001d8e565b3480156200049557600080fd5b50620003fa620004a736600462004aa4565b62001de8565b6200027062001e1b565b348015620004c457600080fd5b50620004cf62001eb4565b60405167ffffffffffffffff9091168152602001620002d4565b348015620004f657600080fd5b506301315479620003fa565b3480156200050f57600080fd5b50620003fa620005213660046200493d565b62001f20565b3480156200053457600080fd5b5060075462000372906001600160a01b031681565b3480156200055657600080fd5b50600454620003fa565b3480156200056d57600080fd5b50620003fa60045481565b620002706200058936600462004ad3565b62001f42565b62000270620020e2565b62000270620005aa36600462004b06565b6200217b565b348015620005bd57600080fd5b5060055462000372906001600160a01b031681565b62000270620005e336600462004b33565b620026c1565b62000270620005fa36600462004957565b620028e2565b3480156200060d57600080fd5b50620003726200061f36600462004aa4565b62002d53565b6000620006328262002d61565b90506002620006418362000bb4565b60068111156200065557620006556200497a565b148062000680575060066200066a8362000bb4565b60068111156200067e576200067e6200497a565b145b8015620007025750806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620006c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006ed919062004b6b565b6001600160a01b0316336001600160a01b0316145b620007355760405162461bcd60e51b815260206004820152600260248201526137a360f11b604482015260640162000267565b60008281526003602052604081205462000775906001600160501b03165b60008581526002602052604090205460b01c67ffffffffffff00001662002d7c565b905062000783838262002d97565b60405163f959e1ad60e01b8152600481018290526001600160a01b0383169063f959e1ad90602401600060405180830381600087803b158015620007c657600080fd5b505af1158015620007db573d6000803e3d6000fd5b505050506000620007ec8462002ddf565b9050620007f98162002dfa565b15620008d0576200087181846001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000843573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000869919062004b6b565b848662002e1a565b60405161495560e01b81526001600160a01b03828116600483015284169061495590602401600060405180830381600087803b158015620008b157600080fd5b505af1158015620008c6573d6000803e3d6000fd5b5050505062000928565b60405161495560e01b81523060048201526001600160a01b0384169061495590602401600060405180830381600087803b1580156200090e57600080fd5b505af115801562000923573d6000803e3d6000fd5b505050505b620009358460016200302c565b62000943338560006200308e565b81836001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000983573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009a9919062004b6b565b6001600160a01b0316857f581e6a55831079cea5921c4f298ef03621df4c829692f6b1c0c687d74f330a8c620009f48860009081526002602052604090205460a01c637fffffff1690565b60405190815260200160405180910390a450505050565b600062000a193384620030fe565b90506001600160a01b0381161562000b725762000a4b8260009081526003602052604090205460501c637fffffff1690565b62000a5890600262004ba1565b816001600160a01b03166305b344106040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000a97573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000abd919062004bbb565b67ffffffffffffffff1662000ad3919062004be7565b42101562000b0c5760405162461bcd60e51b8152602060048201526005602482015264634269643160d81b604482015260640162000267565b60405161495560e01b8152600060048201526001600160a01b0382169061495590602401600060405180830381600087803b15801562000b4b57600080fd5b505af115801562000b60573d6000803e3d6000fd5b5050505062000b723384600062003127565b62000b80338360006200308e565b600062000b8d8362002ddf565b905062000b9a8162002dfa565b1562000bae5762000bac81826200316e565b505b50505050565b600062000bc182620032c6565b1562000bcf57506006919050565b600062000bf18360009081526002602052604090205460a01c637fffffff1690565b90508042101562000c425762000c1c8360009081526003602052604090205460501c637fffffff1690565b62000c28908262004bfd565b42101562000c395750600192915050565b50600492915050565b62000c658360009081526001602052604090205460a01c6001600160501b031690565b60000362000c765750600092915050565b50600292915050565b62000c89620032e0565b62000c9481620032c6565b62000cc75760405162461bcd60e51b8152602060048201526002602482015261634560f01b604482015260640162000267565b6000336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d08573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d2e919062004b6b565b9050600062000d3e8285620030fe565b90506001600160a01b0381161562000e9d5762000d708360009081526003602052604090205460501c637fffffff1690565b62000d7d90600262004ba1565b816001600160a01b03166305b344106040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000dbc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000de2919062004bbb565b67ffffffffffffffff1662000df8919062004be7565b42101562000e375760405162461bcd60e51b815260206004820152600b60248201526a18d85b98d95b115e109a5960aa1b604482015260640162000267565b60405161495560e01b8152600060048201526001600160a01b0382169061495590602401600060405180830381600087803b15801562000e7657600080fd5b505af115801562000e8b573d6000803e3d6000fd5b5050505062000e9d8285600062003127565b62000eab828460006200308e565b600062000eb88462002ddf565b905062000ec58162002dfa565b1562000bac5762000ed781826200316e565b505050505050565b62000ee9620032e0565b600081900362000f215760405162461bcd60e51b8152602060048201526002602482015261195160f21b604482015260640162000267565b6000336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000f62573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f88919062004b6b565b60405190915033319060009062000fca908590859085907f4db45745d63e3d3fca02d388bb6d96a256b72fa6a5ca7e7b2c10c90c84130f3b9060200162004c13565b604051602081830303815290604052805190602001209050336001600160a01b031662000ff88483620030fe565b6001600160a01b031614620010355760405162461bcd60e51b8152602060048201526002602482015261221960f11b604482015260640162000267565b6000620010438483620030fe565b90506001600160a01b038116620010825760405162461bcd60e51b8152602060048201526002602482015261443360f01b604482015260640162000267565b620010908483600062003127565b60008581526002602052604090205460b01c67ffffffffffff000016831080620011725750620010d58560009081526003602052604090205460501c637fffffff1690565b620010f58660009081526002602052604090205460a01c637fffffff1690565b62001101919062004bfd565b816001600160a01b03166305b344106040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001140573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001166919062004bbb565b67ffffffffffffffff16115b15620011e55760405161495560e01b8152600060048201526001600160a01b03821690614955906024015b600060405180830381600087803b158015620011b857600080fd5b505af1158015620011cd573d6000803e3d6000fd5b50505050620011df848660006200308e565b62000bac565b620012088560009081526001602052604090205460a01c6001600160501b031690565b831115620013425760006200121d8662002d61565b6001600160a01b03161462001307576000620012398662002d61565b9050620012ad816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200127e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012a4919062004b6b565b8760006200308e565b60405161495560e01b8152600060048201526001600160a01b0382169061495590602401600060405180830381600087803b158015620012ec57600080fd5b505af115801562001301573d6000803e3d6000fd5b50505050505b62001335856200132f8760009081526001602052604090205460a01c6001600160501b031690565b62002d97565b620011df8582856200338b565b6000858152600360205260409020546001600160501b031683111562001398576200136e858462002d97565b60405161495560e01b8152600060048201526001600160a01b03821690614955906024016200119d565b60405161495560e01b8152600060048201526001600160a01b0382169061495590602401600060405180830381600087803b158015620013d757600080fd5b505af1158015620013ec573d6000803e3d6000fd5b5050505062000bac848660006200308e565b62001408620032e0565b6000620014158262002d61565b90506200142282620032c6565b1580156200144f57506200144b8260009081526002602052604090205460a01c637fffffff1690565b4210155b80156200147e575060006200147c8360009081526001602052604090205460a01c6001600160501b031690565b115b8015620015645750806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620014c5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620014eb919062004b6b565b6001600160a01b0316336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001533573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001559919062004b6b565b6001600160a01b0316145b620015975760405162461bcd60e51b81526020600482015260026024820152610ccf60f31b604482015260640162000267565b600082815260036020526040812054620015ba906001600160501b031662000753565b9050620015c8838262002d97565b60405163f959e1ad60e01b8152600481018290526001600160a01b0383169063f959e1ad90602401600060405180830381600087803b1580156200160b57600080fd5b505af115801562001620573d6000803e3d6000fd5b505050506000620016318462002ddf565b90506200163e8162002dfa565b15620016e7576200168881846001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000843573d6000803e3d6000fd5b60405161495560e01b81526001600160a01b03828116600483015284169061495590602401600060405180830381600087803b158015620016c857600080fd5b505af1158015620016dd573d6000803e3d6000fd5b505050506200173f565b60405161495560e01b81523060048201526001600160a01b0384169061495590602401600060405180830381600087803b1580156200172557600080fd5b505af11580156200173a573d6000803e3d6000fd5b505050505b6200174c8460016200302c565b62000943336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200178f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620017b5919062004b6b565b8560006200308e565b620017c982620033ca565b620017d4826200358d565b6007546001600160a01b038281169116148015620017f157508215155b80156200181257506000620018073385620030fe565b6001600160a01b0316145b80156200183a575060008281526002602052604090205460b01c67ffffffffffff0000163410155b6200186d5760405162461bcd60e51b8152602060048201526002602482015261042560f41b604482015260640162000267565b6000348233856040516200188190620048e7565b6001600160a01b03938416815292909116602083015260408201526060016040518091039082f0905080158015620018bd573d6000803e3d6000fd5b509050620018cd33858362003127565b62000bae3384346200308e565b6000620018e78262002d61565b90506006620018f68362000bb4565b60068111156200190a576200190a6200497a565b1480156200198d5750806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001952573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001978919062004b6b565b6001600160a01b0316336001600160a01b0316145b8015620019b95750620019b58260009081526002602052604090205460a01c637fffffff1690565b4210155b620019ec5760405162461bcd60e51b8152602060048201526002602482015261726560f01b604482015260640162000267565b620019f982600062002d97565b62001a07826000806200338b565b60405161495560e01b8152600060048201526001600160a01b0382169061495590602401600060405180830381600087803b15801562001a4657600080fd5b505af115801562000ed7573d6000803e3d6000fd5b600062001a6882620033ca565b62001a738262002ddf565b6001600160a01b0316630378d9b16040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001ab1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ad7919062004b6b565b92915050565b600062001aea82620033ca565b62001ad78262002ddf565b60008484848460405160200162001b10949392919062004c13565b604051602081830303815290604052805190602001209050949350505050565b600080600080600080600080600062001b5e8a60009081526003602052604090205460501c637fffffff1690565b9050600062001b6d8b62000bb4565b9050600062001b7c8c62002d61565b905062001b88620048f5565b60008d81526002602052604090205460b01c67ffffffffffff000016815262001bb18d620032c6565b62001bbe57600062001bc1565b60015b60ff16816001602002015262001bef8d60009081526001602052604090205460a01c6001600160501b031690565b60408083019190915260008e8152600360205220546001600160501b0316606082015260008d81526002602052604090205460a01c637fffffff1681600460200201528282826004602002015183600360200201518460026020020151856001602002015186600060200201518a9b509b509b509b509b509b509b509b5050505050919395975091939597565b600062001c898262002d61565b9050600662001c988362000bb4565b600681111562001cac5762001cac6200497a565b14801562001d2f5750806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001cf4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001d1a919062004b6b565b6001600160a01b0316336001600160a01b0316145b801562001d5b575062001d578260009081526002602052604090205460a01c637fffffff1690565b4210155b620019ec5760405162461bcd60e51b8152602060048201526002602482015261724560f01b604482015260640162000267565b62001d98620036a9565b60405133904780156108fc02916000818181858888f1935050505062001de65760405162461bcd60e51b8152602060048201526002602482015261776960f01b604482015260640162000267565b565b6001600160a01b0382166000908152602081815260408083208484529091528120546001600160501b03165b9392505050565b62001e25620036a9565b6000803060405162001e379062004913565b6001600160a01b0390911681526020016040518091039082f090508015801562001e65573d6000803e3d6000fd5b50600780546001600160a01b0319166001600160a01b038316908117909155604051919250907f68968799e0f0315403f223f9a149d83d42af5c82f791ca47d9098179dedcd4ef90600090a250565b60008062001ec1620036e9565b62001ece90606462004c4d565b62001edd622520633a62004ba1565b62001ee9919062004ba1565b905066038d7ea4c680008167ffffffffffffffff16101562001f1b5762001f1866038d7ea4c680008262004c70565b90505b919050565b60008181526002602052604081205460b01c67ffffffffffff00001662001ad7565b62001f4d82620033ca565b6006546001600160a01b03828116911614801562001f895750600162001f738362000bb4565b600681111562001f875762001f876200497a565b145b801562001f9e575062001f9c82620032c6565b155b62001fd15760405162461bcd60e51b8152602060048201526002602482015261041560f41b604482015260640162000267565b600080828460405162001fe49062004921565b6001600160a01b03909216825260208201526040016040518091039082f090508015801562002017573d6000803e3d6000fd5b5090506000620020278462002ddf565b905062002034816200379a565b6200203f8162003851565b60006200204c8262003a9e565b9050620020598262003e31565b6001600160a01b031663b82b5a58620020728462003f54565b6040516001600160e01b031960e084901b1681526004810191909152602481018490526001600160a01b0386166044820152606401600060405180830381600087803b158015620020c257600080fd5b505af1158015620020d7573d6000803e3d6000fd5b505050505050505050565b620020ec620036a9565b60008030604051620020fe906200492f565b6001600160a01b0390911681526020016040518091039082f09050801580156200212c573d6000803e3d6000fd5b50600680546001600160a01b0319166001600160a01b038316908117909155604051919250907fac68b168d054bd7d2af8e007c9b9b3cd9d21bff4326e7e29f6aeb515119cba8d90600090a250565b60008333848460405160200162002196949392919062004c13565b6040516020818303038152906040528051906020012090506000620021bc3383620030fe565b90506001600160a01b038116620021fb5760405162461bcd60e51b8152602060048201526002602482015261189960f21b604482015260640162000267565b620022093383600062003127565b60006200222185836001600160a01b03163162004068565b60405163f959e1ad60e01b8152600481018290529091506001600160a01b0383169063f959e1ad90602401600060405180830381600087803b1580156200226757600080fd5b505af11580156200227c573d6000803e3d6000fd5b5050505060006200228d8762000bb4565b90506002816006811115620022a657620022a66200497a565b03620023195760405161495560e01b8152600060048201526001600160a01b03841690614955906024015b600060405180830381600087803b158015620022ec57600080fd5b505af115801562002301573d6000803e3d6000fd5b5050505062002313338860006200308e565b620026b8565b60048160068111156200233057620023306200497a565b14620023935760405162461bcd60e51b815260206004820152602b60248201527f756e7365616c4269642061756374696f6e537461746520213d204d6f64652e5260448201526a32bb32b0b61032b93937b960a91b606482015260840162000267565b60008781526002602052604090205460b01c67ffffffffffff000016821080620024755750620023d88760009081526003602052604090205460501c637fffffff1690565b620023f88860009081526002602052604090205460a01c637fffffff1690565b62002404919062004bfd565b836001600160a01b03166305b344106040518163ffffffff1660e01b8152600401602060405180830381865afa15801562002443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002469919062004bbb565b67ffffffffffffffff16115b15620024a55760405161495560e01b8152600060048201526001600160a01b0384169061495590602401620022d1565b620024c88760009081526001602052604090205460a01c6001600160501b031690565b821115620025fc576000620024dd8862002d61565b6001600160a01b031614620025c7576000620024f98862002d61565b90506200256d816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200253e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002564919062004b6b565b8960006200308e565b60405161495560e01b8152600060048201526001600160a01b0382169061495590602401600060405180830381600087803b158015620025ac57600080fd5b505af1158015620025c1573d6000803e3d6000fd5b50505050505b620025ef876200132f8960009081526001602052604090205460a01c6001600160501b031690565b620023138784846200338b565b6000878152600360205260409020546001600160501b0316821115620026525762002628878362002d97565b60405161495560e01b8152600060048201526001600160a01b0384169061495590602401620022d1565b60405161495560e01b8152600060048201526001600160a01b0384169061495590602401600060405180830381600087803b1580156200269157600080fd5b505af1158015620026a6573d6000803e3d6000fd5b50505050620026b8338860006200308e565b50505050505050565b6000620026ce8362002ddf565b9050620026db816200379a565b6000816001600160a01b0316630378d9b16040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200271c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002742919062004b6b565b6040516353b0c0ed60e11b81526001600160a01b0384811660048301528781166024830152919091169063a76181da90604401602060405180830381865afa15801562002793573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620027b9919062004c9b565b11620027ed5760405162461bcd60e51b81526020600482015260026024820152614c4960f01b604482015260640162000267565b60405160009062002829908590879086907f4db45745d63e3d3fca02d388bb6d96a256b72fa6a5ca7e7b2c10c90c84130f3b9060200162004c13565b60405160208183030381529060405280519060200120905060006001600160a01b0316620028588683620030fe565b6001600160a01b03161480156200288a575060008481526002602052604090205460b01c67ffffffffffff0000168310155b620028bd5760405162461bcd60e51b81526020600482015260026024820152610e6f60f31b604482015260640162000267565b620028c8856200407b565b620028d585823362003127565b62000bac8585856200308e565b620028ed336200407b565b620028f8336200379a565b6000620029058362000bb4565b60068111156200291957620029196200497a565b146200294c5760405162461bcd60e51b81526020600482015260016024820152602d60f91b604482015260640162000267565b6000808263ffffffff16116200296457603c62002966565b815b90506000336001600160a01b0316630378d9b16040518163ffffffff1660e01b8152600401602060405180830381865afa158015620029a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620029cf919062004b6b565b9050620029dc8162002dfa565b62002a0e5760405162461bcd60e51b81526020600482015260016024820152606160f81b604482015260640162000267565b6040516351f0713d60e01b81523360048201526000906001600160a01b038316906351f0713d90602401602060405180830381865afa15801562002a56573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002a7c919062004c9b565b9050600062002a8a62001eb4565b67ffffffffffffffff169050600062002aa33362003e31565b6040516370a0823160e01b81523060048201529091506000906064906001600160a01b038416906370a0823190602401602060405180830381865afa15801562002af1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002b17919062004c9b565b62002b23919062004c4d565b905060006001336001600160a01b031663578cb8f96040518163ffffffff1660e01b8152600401602060405180830381865afa15801562002b68573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002b8e919062004c9b565b62002b9a919062004bfd565b90506000811162002bd25760405162461bcd60e51b81526020600482015260016024820152601d60fa1b604482015260640162000267565b604051631aae8f7360e11b81526004810182905260009060d090339063355d1ee690602401602060405180830381865afa15801562002c15573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002c3b919062004c9b565b6003911c16905062002c4e818062004ba1565b62002c5b90600162004be7565b62002c699061271062004ba1565b62002c75908462004be7565b905060008611801562002c8757508486115b1562002cac5762124f8062002c9d828862004ba1565b62002ca9919062004c4d565b94505b62002cc08a8963ffffffff16600062004256565b62002ccd8a60006200428f565b62002cfc8a3362002ce963fffffffe60018d901b164262004c70565b67ffffffffffffffff16600089620042dd565b62002d1c8a60009081526002602052604090205460a01c637fffffff1690565b6040518b907f87e97e825a1d1fa0c54e1d36c7506c1dea8b1efd451fe68b000cf96f7cf4000390600090a350505050505050505050565b600062001e148383620030fe565b6000908152600160205260409020546001600160a01b031690565b60008183111562002d8f57508162001ad7565b508062001ad7565b60008281526003602052604090205462002dc9906001600160501b0383169069ffffffffffffffffffff191662004be7565b6000928352600360205260409092209190915550565b6000908152600260205260409020546001600160a01b031690565b60006001600160a01b0382161580159062001ad75750813b151562001ad7565b600062002e278562003e31565b90506001600160a01b03811662002e665760405162461bcd60e51b81526020600482015260026024820152611c1d60f21b604482015260640162000267565b6001600160a01b03841662002ea35760405162461bcd60e51b8152602060048201526002602482015261393b60f11b604482015260640162000267565b6001600160a01b03821662002ee05760405162461bcd60e51b8152602060048201526002602482015261644360f01b604482015260640162000267565b6000831162002f175760405162461bcd60e51b8152602060048201526002602482015261707960f01b604482015260640162000267565b600062002f248662003f54565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa15801562002f6f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002f95919062004c9b565b905063ffffffff811615620026b85760405163176efcd160e11b81526001600160a01b03878116600483015263ffffffff8316602483015260448201879052606482018490528581166084830152841690632eddf9a29060a401600060405180830381600087803b1580156200300a57600080fd5b505af11580156200301f573d6000803e3d6000fd5b5050505050505050505050565b80156200306a576000828152600260205260409020546200305a90600160bf1b90600160bf1b191662004be7565b6000838152600260205260409020555b806200308a5760008281526002602052604090208054600160bf1b191690555b5050565b6001600160a01b038316600090815260208181526040808320858452909152902054620030d3906001600160501b0383169069ffffffffffffffffffff191662004be7565b6001600160a01b03909316600090815260208181526040808320948352939052919091209190915550565b6001600160a01b03918216600090815260208181526040808320938352929052205460501c1690565b6001600160a01b038316600090815260208181526040808320858452909152902054620030d3906001600160501b0316600160501b600160f01b03605084901b1662004be7565b6000806200317c8462003e31565b90506001600160a01b038316158015906200319f57506001600160a01b03811615155b620031d25760405162461bcd60e51b81526020600482015260026024820152610e0760f31b604482015260640162000267565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156200321a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003240919062004c9b565b90508015620032aa5760405161c77160e01b81526001600160a01b0385811660048301526024820183905283169061c77190604401600060405180830381600087803b1580156200329057600080fd5b505af1158015620032a5573d6000803e3d6000fd5b505050505b60008111620032bb576001620032bd565b805b95945050505050565b600090815260026020526040902054600160bf1b16151590565b306001600160a01b0316336001600160a01b0316632b20e3976040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003329573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200334f919062004b6b565b6001600160a01b03161462001de65760405162461bcd60e51b81526020600482015260016024820152601560fa1b604482015260640162000267565b620033b360a082901b69ffffffffffffffffffff60a01b166001600160a01b03841662004be7565b600093845260016020526040909320929092555050565b6000620033d78262002ddf565b90506001600160a01b03811615801590620033f85750620033f88162002dfa565b6200342a5760405162461bcd60e51b81526020600482015260016024820152605160f81b604482015260640162000267565b6000620034378262003f54565b90506000826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200347a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034a0919062004b6b565b90508315801590620034b157508115155b8015620034c45750620034c48362002dfa565b8015620034d75750620034d78162002dfa565b80156200355b5750604051636f5c98d160e11b8152600481018390526001600160a01b03808516919083169063deb931a290602401602060405180830381865afa1580156200352a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003550919062004b6b565b6001600160a01b0316145b62000bae5760405162461bcd60e51b81526020600482015260016024820152602960f91b604482015260640162000267565b60006200359a8262002ddf565b90506001600160a01b03811615801590620035bb5750620035bb8162002dfa565b620035ed5760405162461bcd60e51b81526020600482015260016024820152602760f91b604482015260640162000267565b620035f88162002dfa565b80156200360457503332145b8015620036775750604051632b0891e960e01b81523360048201526001600160a01b03821690632b0891e990602401602060405180830381865afa15801562003651573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003677919062004cb5565b6200308a5760405162461bcd60e51b81526020600482015260016024820152604f60f81b604482015260640162000267565b6005546001600160a01b0316331462001de65760405162461bcd60e51b81526020600482015260016024820152605360f81b604482015260640162000267565b600046600a819003620036fe57600a91505090565b806089036200370f57601991505090565b80612105036200372157600a91505090565b8061a4b1036200373357600a91505090565b8062013e31036200374657600a91505090565b8062066eee036200375957600a91505090565b8062082750036200376c57600a91505090565b8062aa36a7036200377f57601991505090565b8062aa37dc036200379257600a91505090565b600591505090565b620037a58162002dfa565b80156200381c57506200381c816001600160a01b0316630378d9b16040518163ffffffff1660e01b8152600401602060405180830381865afa158015620037f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003816919062004b6b565b62002dfa565b6200384e5760405162461bcd60e51b81526020600482015260016024820152605560f81b604482015260640162000267565b50565b6000816001600160a01b0316630378d9b16040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003892573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038b8919062004b6b565b90506000816001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa158015620038fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003921919062004b6b565b90506000836001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003964573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200398a919062004b6b565b90506000620039998562003e31565b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620039d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620039fd919062004b6b565b905062003a0a8362002dfa565b801562003a1d575062003a1d8262002dfa565b801562003a30575062003a308162002dfa565b801562003a4e5750816001600160a01b0316836001600160a01b0316145b801562003a6c5750826001600160a01b0316816001600160a01b0316145b62000bac5760405162461bcd60e51b81526020600482015260016024820152602b60f91b604482015260640162000267565b600080826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003ae0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003b06919062004b6b565b90506001600160a01b03811662003b455760405162461bcd60e51b8152602060048201526002602482015261666360f01b604482015260640162000267565b6000816001600160a01b0316633f15457f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003b86573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003bac919062004b6b565b90506001600160a01b03811662003beb5760405162461bcd60e51b8152602060048201526002602482015261657360f01b604482015260640162000267565b60008062003bf98662004352565b90925090506001600160a01b0382161580159062003c175750600081115b62003c4a5760405162461bcd60e51b81526020600482015260026024820152612a4160f01b604482015260640162000267565b600062003c588783620044f1565b9050600062003c678862003f54565b905060008060005b8062003c7b8162004cd9565b91505062003c9462003c8e86836200457c565b6200459f565b8051602091820120604080519283018790528201819052935060600160408051808303601f19018152908290528051602090910120631ef3fca760e31b82526004820181905292506001600160a01b0389169063f79fe53890602401602060405180830381865afa15801562003d0e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003d34919062004cb5565b801562003d425750601a8111155b62003c6f57604051631ef3fca760e31b8152600481018390526001600160a01b0389169063f79fe53890602401602060405180830381865afa15801562003d8d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003db3919062004cb5565b62003e0357600062003dc58a62004768565b90508062003ddd5750919a9950505050505050505050565b62003df362003ded87846200457c565b620047ea565b9c9b505050505050505050505050565b60405162461bcd60e51b8152602060048201526002602482015261313160f11b604482015260640162000267565b600080826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003e73573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003e99919062004b6b565b90506001600160a01b03811662003ed75760405162461bcd60e51b81526020600482015260016024820152600b60fb1b604482015260640162000267565b806001600160a01b03166336aaedbe62003ef18562003f54565b6040518263ffffffff1660e01b815260040162003f1091815260200190565b602060405180830381865afa15801562003f2e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001e14919062004b6b565b600080826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003f96573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003fbc919062004b6b565b90506001600160a01b03811662003ffb5760405162461bcd60e51b8152602060048201526002602482015261687360f01b604482015260640162000267565b604051631aae8f7360e11b81526001600160a01b03828116600483015284169063355d1ee690602401602060405180830381865afa15801562004042573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001e14919062004c9b565b60008183101562002d8f57508162001ad7565b620040868162002dfa565b620040b85760405162461bcd60e51b81526020600482015260016024820152602560f91b604482015260640162000267565b6000620040c58262003f54565b90506000819003620040fe5760405162461bcd60e51b81526020600482015260016024820152604b60f81b604482015260640162000267565b6000826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200413f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004165919062004b6b565b9050620041728162002dfa565b620041a45760405162461bcd60e51b81526020600482015260016024820152601360fa1b604482015260640162000267565b604051636f5c98d160e11b8152600481018390526001600160a01b03808516919083169063deb931a290602401602060405180830381865afa158015620041ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004215919062004b6b565b6001600160a01b031614620042515760405162461bcd60e51b81526020600482015260016024820152604d60f81b604482015260640162000267565b505050565b620042786001600160501b038216605084901b637fffffff60501b1662004be7565b600093845260036020526040909320929092555050565b600082815260016020526040902054620042c79060a083901b69ffffffffffffffffffff60a01b16906001600160a01b031662004be7565b6000928352600160205260409092209190915550565b60008215620042ed5750600160bf1b5b65ffffffffffff60c01b60b083901b16816200432060a087901b637fffffff60a01b166001600160a01b03891662004be7565b6200432c919062004be7565b62004338919062004be7565b600096875260026020526040909620959095555050505050565b600080600080846001600160a01b031663578cb8f96040518163ffffffff1660e01b8152600401602060405180830381865afa15801562004397573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620043bd919062004c9b565b905060008111620043f65760405162461bcd60e51b815260206004820152600260248201526103e360f41b604482015260640162000267565b80620044028162004cf5565b604051631aae8f7360e11b8152600481018290529092506001600160a01b038716915063355d1ee690602401602060405180830381865afa1580156200444c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004472919062004c9b565b9150600081118015620044855750600082115b8015620044985750600f60fc1b80831614155b620043f6576001600160a01b0382163014620044dc5760405162461bcd60e51b81526020600482015260026024820152616e4160f01b604482015260640162000267565b6001600160a01b039190911694909350915050565b6000603065ffffffffffff60a01b846001600160a01b031663355d1ee6856040518263ffffffff1660e01b81526004016200452e91815260200190565b602060405180830381865afa1580156200454c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004572919062004c9b565b16901b9392505050565b6000600883901c60f86200459284606062004be7565b62001e1492911b62004be7565b604080516020808252818301909252606091600091906020820181803683370190505090506000805b848260208110620045dd57620045dd62004c37565b1a60f81b6001600160f81b031916156200463c5784826020811062004606576200460662004c37565b1a60f81b8383815181106200461f576200461f62004c37565b60200101906001600160f81b031916908160001a9053506200463f565b50805b816200464b8162004cd9565b9250506020821080156200465d575080155b620045c85760008167ffffffffffffffff81111562004680576200468062004d0f565b6040519080825280601f01601f191660200182016040528015620046ab576020820181803683370190505b509050600092505b838381518110620046c857620046c862004c37565b01602001516001600160f81b031916156200472a57838381518110620046f257620046f262004c37565b602001015160f81c60f81b81848151811062004712576200471262004c37565b60200101906001600160f81b031916908160001a9053505b81620047368162004cf5565b9250508280620047469062004cd9565b9350506020831080156200475a5750600082115b620046b35795945050505050565b6000806001600160a01b0316826001600160a01b03166347c5da986040518163ffffffff1660e01b8152600401602060405180830381865afa158015620047b3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620047d9919062004b6b565b6001600160a01b0316141592915050565b600062004801620047fb836200459f565b62004814565b62001ad79060ff1660ff19841662004be7565b8051600090600183810191840101825b81831015620048df57825160ff16608081101562004851576200484960018562004be7565b9350620048c9565b60e08160ff1610156200486b576200484960028562004be7565b60f08160ff16101562004885576200484960038562004be7565b60f88160ff1610156200489f576200484960048562004be7565b60fc8160ff161015620048b9576200484960058562004be7565b620048c660068562004be7565b93505b5080620048d68162004cd9565b91505062004824565b949350505050565b61025c8062004d2683390190565b6040518060a001604052806005906020820280368337509192915050565b6105118062004f8283390190565b610255806200549383390190565b6108a880620056e883390190565b6000602082840312156200495057600080fd5b5035919050565b600080604083850312156200496b57600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b60078110620049af57634e487b7160e01b600052602160045260246000fd5b9052565b6020810162001ad7828462004990565b6001600160a01b03811681146200384e57600080fd5b600080600060608486031215620049ef57600080fd5b8335925060208401359150604084013562004a0a81620049c3565b809150509250925092565b6000806000806080858703121562004a2c57600080fd5b84359350602085013562004a4081620049c3565b93969395505050506040820135916060013590565b610100810162004a66828b62004990565b6001600160a01b0398909816602082015260408101969096526060860194909452608085019290925260a084015260c083015260e090910152919050565b6000806040838503121562004ab857600080fd5b823562004ac581620049c3565b946020939093013593505050565b6000806040838503121562004ae757600080fd5b82359150602083013562004afb81620049c3565b809150509250929050565b60008060006060848603121562004b1c57600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121562004b4957600080fd5b833562004b5681620049c3565b95602085013595506040909401359392505050565b60006020828403121562004b7e57600080fd5b815162001e1481620049c3565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762001ad75762001ad762004b8b565b60006020828403121562004bce57600080fd5b815167ffffffffffffffff8116811462001e1457600080fd5b8082018082111562001ad75762001ad762004b8b565b8181038181111562001ad75762001ad762004b8b565b9384526001600160a01b039290921660208401526040830152606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60008262004c6b57634e487b7160e01b600052601260045260246000fd5b500490565b67ffffffffffffffff81811683821601908082111562004c945762004c9462004b8b565b5092915050565b60006020828403121562004cae57600080fd5b5051919050565b60006020828403121562004cc857600080fd5b8151801515811462001e1457600080fd5b60006001820162004cee5762004cee62004b8b565b5060010190565b60008162004d075762004d0762004b8b565b506000190190565b634e487b7160e01b600052604160045260246000fdfe608060405260405161025c38038061025c833981016040819052610022916100bc565b600080546001600160a01b0319166001600160a01b03858116919091178255600280549185166001600160e01b031990921691909117600160a01b426001600160401b031602179055600182905560405130917ff8c55061664758367c865dbb9bc7769b0b38a15fa32b8c62322bd1efc567b8f491a25050506100f8565b80516001600160a01b03811681146100b757600080fd5b919050565b6000806000606084860312156100d157600080fd5b6100da846100a0565b92506100e8602085016100a0565b9150604084015190509250925092565b610155806101076000396000f3fe6080604052600436106100345760003560e01c806305b344101461007d57806323491869146100c35780638da5cb5b146100e7575b600080546001600160a01b0316632cf35bc960e11b82350161005857808252602082f35b6040513683823782833683855af49150503d82833e806100785761020482fd5b503d81f35b34801561008957600080fd5b506002546100a590600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156100cf57600080fd5b506100d960015481565b6040519081526020016100ba565b3480156100f357600080fd5b50600254610107906001600160a01b031681565b6040516001600160a01b0390911681526020016100ba56fea26469706673582212204ee43046386bff10ef0cee4d55936bdd30d87139f2e2ca02eda4adcb0845292c64736f6c63430008130033608060405260405161051138038061051183398101604081905261002291610089565b600080546001600160a01b039092166001600160a01b0319928316179055600280546003805490931633179092556001600160401b034216600160a01b02600160a01b600160e01b031932166001600160e01b0319909316929092179190911790556100b9565b60006020828403121561009b57600080fd5b81516001600160a01b03811681146100b257600080fd5b9392505050565b610449806100c86000396000f3fe6080604052600436106100795760003560e01c80632b20e3971161004e5780632b20e3971461012f5780638da5cb5b14610137578063c546e5fb14610157578063f959e1ad1461017757600080fd5b806149551461007e57806304e80e901461009357806305b34410146100ca578063234918691461010b575b600080fd5b61009161008c366004610392565b61018a565b005b34801561009f57600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100d657600080fd5b506002546100f290600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016100c1565b34801561011757600080fd5b5061012160015481565b6040519081526020016100c1565b6100ad61026e565b34801561014357600080fd5b506002546100ad906001600160a01b031681565b34801561016357600080fd5b506003546100ad906001600160a01b031681565b6100916101853660046103b6565b6102eb565b6002546001600160a01b0316806101cc5760405162461bcd60e51b81526020600482015260016024820152600960fb1b60448201526064015b60405180910390fd5b6001600160a01b038216156101de5750805b6101e661026e565b6001600160a01b0316336001600160a01b031614801561020e57506001600160a01b03811615155b801561023a57506040516001600160a01b038216904780156108fc02916000818181858888f193505050505b61026a5760405162461bcd60e51b81526020600482015260016024820152604960f81b60448201526064016101c3565b5050565b60008060009054906101000a90046001600160a01b03166001600160a01b031663c546e5fb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e691906103cf565b905090565b804710156102f65750565b6102fe61026e565b6001600160a01b0316336001600160a01b031614801561034a57506002546001600160a01b03166108fc61033283476103ec565b6040518115909202916000818181858888f193505050505b61037a5760405162461bcd60e51b81526020600482015260016024820152604760f81b60448201526064016101c3565b50565b6001600160a01b038116811461037a57600080fd5b6000602082840312156103a457600080fd5b81356103af8161037d565b9392505050565b6000602082840312156103c857600080fd5b5035919050565b6000602082840312156103e157600080fd5b81516103af8161037d565b8181038181111561040d57634e487b7160e01b600052601160045260246000fd5b9291505056fea2646970667358221220a71e4b3743ffc15b3597c9d5ece5e4f560e3e73421a9c3603c2d1204342b6ad164736f6c634300081300336080604052604051610255380380610255833981016040819052610022916100a7565b600080546001600160a01b0384166001600160a01b03199182161782556002805490911633179055600180546001600160401b034216600160a01b02600160a01b600160e01b03199091161790556003829055604051829130917fecaa63b23826d6939c8b3b3dd2e3e8b25aaa4bf2b4738d699883b6d7e6414f8c9190a350506100e1565b600080604083850312156100ba57600080fd5b82516001600160a01b03811681146100d157600080fd5b6020939093015192949293505050565b610165806100f06000396000f3fe60806040526004361061003f5760003560e01c806305b344101461006d57806323491869146100b35780632b20e397146100d75780638da5cb5b1461010f575b6040516000368183378081368460018060a01b038554165af491503d81823e816100695761020481fd5b3d81f35b34801561007957600080fd5b5060015461009590600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156100bf57600080fd5b506100c960035481565b6040519081526020016100aa565b3480156100e357600080fd5b506002546100f7906001600160a01b031681565b6040516001600160a01b0390911681526020016100aa565b34801561011b57600080fd5b506001546100f7906001600160a01b03168156fea2646970667358221220dbe54de4a7bcfd8660953877ecfc4185f58ae8a91ea34a0732057170ad5bdd4264736f6c6343000813003360806040526040516108a83803806108a883398101604081905261002291610089565b600080546001600160a01b039092166001600160a01b0319928316179055600180546002805490931633179092556001600160401b034216600160a01b02600160a01b600160e01b031932166001600160e01b0319909316929092179190911790556100b9565b60006020828403121561009b57600080fd5b81516001600160a01b03811681146100b257600080fd5b9392505050565b6107e0806100c86000396000f3fe6080604052600436106100725760003560e01c8063234918691161004e578063234918691461058d5780632b20e397146105b15780638da5cb5b146105d1578063f959e1ad146105f157600080fd5b806149551461050257806304e80e901461051557806305b344101461054c57600080fd5b366104fd5760025460035460405161185560e21b815260048101919091526000916001600160a01b03169061615490602401602060405180830381865afa1580156100c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e59190610721565b9050806001036101ed57600354158015906101005750600034115b801561010b57503447145b6101405760405162461bcd60e51b81526020600482015260016024820152604360f81b60448201526064015b60405180910390fd5b600180546001600160a01b031916339081179091556002546003546040516335c32b3360e21b8152600481019390935260248301523460448301526001600160a01b03169063d70caccc90606401600060405180830381600087803b1580156101a857600080fd5b505af11580156101bc573d6000803e3d6000fd5b50506040513392507f1c10a18fffb6543afbf4d75ce6f3cfa56c73dd74e56fdc8c9474f30fc27123869150600090a2005b600354158015906101fc575034155b801561021257506001546001600160a01b031633145b6102425760405162461bcd60e51b81526020600482015260016024820152601160fa1b6044820152606401610137565b806004036102da5760025460035460405161824d60e01b81526001600160a01b039092169161824d9161027b9160040190815260200190565b600060405180830381600087803b15801561029557600080fd5b505af11580156102a9573d6000803e3d6000fd5b50506040513392507fbb7f5ee433a2b38a41220afcf3d0bbd4859aac783c1b4897c742776030ca19e29150600090a2005b806002036103435760025460035460405161248160e21b81526001600160a01b0390921691619204916103139160040190815260200190565b600060405180830381600087803b15801561032d57600080fd5b505af1158015610341573d6000803e3d6000fd5b005b80600603610444576002546003546001546040805160208101939093526001600160a01b03918216908301524760608301527f4db45745d63e3d3fca02d388bb6d96a256b72fa6a5ca7e7b2c10c90c84130f3b608083015290911690616a269060a001604051602081830303815290604052805190602001206003546040518363ffffffff1660e01b81526004016103e5929190918252602082015260400190565b600060405180830381600087803b1580156103ff57600080fd5b505af1158015610413573d6000803e3d6000fd5b50506040513392507fe71ef3bfd4185ae19262ec51a940e1f049287182a6ab8eb8a2d8fde2ca3f15279150600090a2005b806000036104d1576001546040516001600160a01b03909116904780156108fc02916000818181858888f193505050506104a45760405162461bcd60e51b81526020600482015260016024820152604560f81b6044820152606401610137565b60405133907fe71ef3bfd4185ae19262ec51a940e1f049287182a6ab8eb8a2d8fde2ca3f152790600090a2005b60405162461bcd60e51b81526020600482015260016024820152602360f91b6044820152606401610137565b600080fd5b61034161051036600461073a565b610604565b34801561052157600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561055857600080fd5b5060015461057490600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610543565b34801561059957600080fd5b506105a360035481565b604051908152602001610543565b3480156105bd57600080fd5b5060025461052f906001600160a01b031681565b3480156105dd57600080fd5b5060015461052f906001600160a01b031681565b6103416105ff36600461076a565b610695565b6002546001600160a01b03163314801561066257506001600160a01b038116610638576001546001600160a01b031661063a565b805b6001600160a01b03166108fc479081150290604051600060405180830381858888f193505050505b6106925760405162461bcd60e51b81526020600482015260016024820152602160f91b6044820152606401610137565b50565b80471161069f5750565b6002546001600160a01b0316331480156106b95750600047115b80156106f157506001546001600160a01b03166108fc6106d98347610783565b6040518115909202916000818181858888f193505050505b6106925760405162461bcd60e51b81526020600482015260016024820152604160f81b6044820152606401610137565b60006020828403121561073357600080fd5b5051919050565b60006020828403121561074c57600080fd5b81356001600160a01b038116811461076357600080fd5b9392505050565b60006020828403121561077c57600080fd5b5035919050565b818103818111156107a457634e487b7160e01b600052601160045260246000fd5b9291505056fea264697066735822122012556046f6c6f1f2fa7859f5e8263407eb1cf729ca3703f03e27fb9f18bfc58364736f6c63430008130033a2646970667358221220e14213309645a1fd9c1a3e0601020f9ef9cf38f62bc0aefd459eaba18f5db0d764736f6c63430008130033
Verified Source Code Partial Match
Compiler: v0.8.19+commit.7dd6d404
EVM: paris
Optimization: Yes (200 runs)
AuctionMaster.sol 1341 lines
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.18 <0.8.20;
/*
AuctionMaster, intDeedMaster, extDeedMaster, IntDeedProxy, BiddingProxy ( by pepihasenfuss.eth, copyright (c) 2025, based on ENS 1.0 Temporary Hash Registrar, a Vickrey Auction introduced by Nick Johnson and the ENS team )
A Vickrey auction or sealed-bid second-price auction (SBSPA) is a type of sealed-bid auction.
ungravel.eth, GroupWalletFactory, GroupWalletMaster, GroupWallet, ProxyWallet, TokenMaster, ProxyToken, PrePaidContract, AuctionMaster, BiddingProxy, intDeedMaster, extDeedMaster, IntDeedProxy, Intentions by pepihasenfuss.eth 2017-2025, Copyright (c) 2025
========================
// ENS, ENSRegistryWithFallback, PublicResolver, Resolver, FIFS-Registrar, Registrar, AuctionRegistrar, BaseRegistrar, ReverseRegistrar, DefaultReverseResolver, ETHRegistrarController,
// PriceOracle, SimplePriceOracle, StablePriceOracle, ENSMigrationSubdomainRegistrar, CustomRegistrar, Root, RegistrarMigration are contracts of "ENS", by Nick Johnson and team.
//
// Copyright (c) 2018, True Names Limited / ENS Labs Limited
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
interface Abstract_ENS {
function owner(bytes32 node) external view returns(address);
function resolver(bytes32 node) external view returns(address);
function ttl(bytes32 node) external view returns(uint64);
function setOwner(bytes32 node, address ensowner) external;
function setSubnodeOwner(bytes32 node, bytes32 label, address ensowner) external;
function setResolver(bytes32 node, address ensresolver) external;
function setTTL(bytes32 node, uint64 ensttl) external;
function recordExists(bytes32 nodeENS) external view returns (bool);
event NewOwner(bytes32 indexed node, bytes32 indexed label, address ensowner);
event Transfer(bytes32 indexed node, address ensowner);
event NewResolver(bytes32 indexed node, address ensresolver);
event NewTTL(bytes32 indexed node, uint64 ensttl);
}
abstract contract ABS_TokenProxy {
function owner() external virtual view returns (address ow);
function balanceOf(address tokenOwner) external virtual view returns (uint thebalance);
function name() external virtual view returns (string memory);
function transferFrom_78S(address from, address toReceiver, uint amount) external virtual;
function tokenAllow(address tokenOwner,address spender) external virtual view returns (uint256 tokens);
function transfer_G8l(address toReceiver, uint amount) external virtual;
function transferAdjustPrices(address toReceiver, uint amount, uint payment, bytes32 dhash, address deedContract) external virtual;
function nameBidBucket(bytes32 dhash,bytes32 labelhash,address deedContract) external virtual;
}
abstract contract Abstract_Resolver {
mapping (bytes32 => string) public name;
}
abstract contract ABS_ReverseRegistrar {
Abstract_Resolver public defaultResolver;
function node(address addr) external virtual pure returns (bytes32);
}
abstract contract ABS_Resolver {
mapping(bytes32=>bytes) hashes;
event AddrChanged(bytes32 indexed node, address a);
event AddressChanged(bytes32 indexed node, uint coinType, bytes newAddress);
event NameChanged(bytes32 indexed node, string name);
event ABIChanged(bytes32 indexed node, uint256 indexed contentType);
event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);
event TextChanged(bytes32 indexed node, string indexed indexedKey, string key);
event ContenthashChanged(bytes32 indexed node, bytes hash);
function name(bytes32 node) external virtual view returns (string memory);
function addr(bytes32 node) external virtual view returns (address payable);
function setABI(bytes32 node, uint256 contentType, bytes calldata data) external virtual;
function setAddr(bytes32 node, address r_addr) external virtual;
function setAddr(bytes32 node, uint coinType, bytes calldata a) external virtual;
function setName(bytes32 node, string calldata _name) external virtual;
function setText(bytes32 node, string calldata key, string calldata value) external virtual;
function setAuthorisation(bytes32 node, address target, bool isAuthorised) external virtual;
function supportsInterface(bytes4 interfaceId) external virtual view returns (bool);
}
contract AbstractGWMBaseReg {
event NameMigrated(uint256 indexed id, address indexed owner, uint expires);
event NameRegistered(uint256 indexed id, address indexed owner, uint expires);
event NameRenewed(uint256 indexed id, uint expires);
bytes32 public baseNode; // The namehash of the TLD this registrar owns (eg, .eth)
}
abstract contract AbstractETHRegCntrl {
event NameRegistered(string name, bytes32 indexed label, address indexed owner, uint cost, uint expires);
event NameRenewed(string name, bytes32 indexed label, uint cost, uint expires);
function rentPrice(string memory name, uint duration) view external virtual returns(uint);
function registerWithConfig(string memory name, address owner, uint duration, bytes32 secret, address resolver, address addr) external virtual payable;
}
abstract contract AbsIntentions {
function getGWF() public virtual view returns (ABS_GWF);
function saveLetterOfIntent(address target, uint nbOfShares) public virtual payable;
function hashOfGWP(ABS_GWP _gwp) internal virtual view returns (bytes32);
function getIntendedLOIShares(address target, address investor) public virtual view returns (uint);
function mCap(address _gwp) public virtual view returns (uint);
}
abstract contract ABS_GWP {
function getIsOwner(address _owner) external view virtual returns (bool);
function getOwners() external view virtual returns (address[] memory);
function getGWF() external view virtual returns (address);
function getTransactionsCount() external view virtual returns (uint);
function getTransactionRecord(uint _tNb) external view virtual returns (uint256);
function getIntention() public view virtual returns (AbsIntentions);
}
abstract contract NmWrapper {
function setSubnodeRecord(bytes32 parentNode,string memory label,address owner,address resolver,uint64 ttl,uint32 fuses,uint64 expiry) external virtual returns (bytes32 node);
function setSubnodeOwner(bytes32 node,string calldata label,address newOwner,uint32 fuses,uint64 expiry) external virtual returns (bytes32);
function ownerOf(uint256 id) external virtual view returns (address);
function setApprovalForAll(address operator,bool approved) external virtual;
}
abstract contract ABS_GWF {
ABS_Resolver public resolverContract;
AbstractETHRegCntrl public controllerContract;
AbstractGWMBaseReg public base;
Abstract_ENS public ens;
ABS_ReverseRegistrar public reverseContract;
NmWrapper public ensNameWrapper;
function getProxyToken(bytes32 _domainHash) public virtual view returns (address p);
function getGWProxy(bytes32 _dHash) external view virtual returns (address);
function getOwner(bytes32 _domainHash) external view virtual returns (address);
function getGWF() external view virtual returns (address);
}
abstract contract ABS_Reg {
function state_pln(bytes32 _hash) public view virtual returns (uint);
function saveExtDeedCntr_gm9(address _sender,bytes32 _hash,uint _value) public payable virtual;
function unsealExternalBid_qfG(bytes32 _hash) public payable virtual;
function finalizeExternalAuction_WmS(bytes32 _hash) public payable virtual;
function cancelExternalBid_9ig(bytes32 seal, bytes32 hash) public payable virtual;
}
bytes32 constant kkk = 0x4db45745d63e3d3fca02d388bb6d96a256b72fa6a5ca7e7b2c10c90c84130f3b;
// ******************************* DeedProxy CONTRACT **************************
// The internal deed proxy is a cheap contract deployed for each bid of a member of the group, aka internal bidder.
pragma solidity ^0.8.18 <0.8.20;
contract IntDeedProxy {
address internal masterCopy;
bytes32 public lhash;
address public owner;
uint64 public creationDate;
event DeedCreated(address indexed);
constructor(address _masterCopy,address _owner,bytes32 _lhash) payable {
masterCopy = _masterCopy;
owner = _owner;
creationDate = uint64(block.timestamp);
lhash = _lhash;
emit DeedCreated(address(this));
}
fallback () external payable
{
// solium-disable-next-line security/no-inline-assembly
assembly {
let master := and(sload(0),0xffffffffffffffffffffffffffffffffffffffff)
if eq(calldataload(0),0xa619486e00000000000000000000000000000000000000000000000000000000) {
mstore(0, master)
return(0, 0x20)
}
let ptr := mload(0x40)
calldatacopy(ptr, 0, calldatasize())
let success := delegatecall(gas(),master,ptr,calldatasize(),0,0)
returndatacopy(0, 0, returndatasize())
if eq(success,0) { revert(0,0x204) }
return(0, returndatasize())
}
}
}
// ******************************* DeedProxy CONTRACT **************************
abstract contract ABS_IntDeedMaster {
address public masterCopy;
ABS_Reg public theRegistrar;
}
// ******************************* DEED MASTER CONTRACT ************************
pragma solidity ^0.8.18 <0.8.20;
contract intDeedMaster {
address internal masterCopy;
bytes32 public lhash;
address public owner;
uint64 public creationDate;
event DeedCreated(address indexed);
ABS_Reg public theRegistrar;
constructor(address _masterCopy) payable
{
masterCopy = _masterCopy;
owner = tx.origin;
theRegistrar = ABS_Reg(msg.sender);
creationDate = uint64(block.timestamp);
}
function getMasterCopy() public view returns (address) {
return masterCopy;
}
function registrar() public payable returns (ABS_Reg) {
return ABS_IntDeedMaster(masterCopy).theRegistrar();
}
function adjustBal_1k3(uint newValue) public payable { // 0x0000f6a6
if (address(this).balance<newValue) return;
require(msg.sender==address(registrar())&&payable(address(uint160(owner))).send(address(this).balance-newValue),"G");
}
function closeDeed_igk(address receiver) public payable { // 0x00004955
address l_rcv = owner;
require(owner!=address(0x0),'H');
if (uint160(receiver)>0) l_rcv = receiver;
require(msg.sender==address(registrar())&&l_rcv!=address(0x0)&&payable(l_rcv).send(address(this).balance),"I");
}
}
// ******************************* EXT DEED MASTER CONTRACT ********************
// An external bidder is unknown, anonymous and not a member of the group. A proxy bidding contract is deployed
// for each external bidder beeing invited to participate in a Funding Auction.
pragma solidity ^0.8.18 <0.8.20;
contract extDeedMaster {
address internal masterCopy;
address public owner;
uint64 public creationDate;
ABS_Reg public registrar;
bytes32 public lhash;
event DeedCreated(address indexed,bytes32 indexed);
event NewBid(address indexed);
event RevealBid(address indexed);
event CancelBid(address indexed);
constructor(address _masterCopy) payable
{
masterCopy = _masterCopy;
owner = tx.origin;
registrar = ABS_Reg(msg.sender);
creationDate = uint64(block.timestamp);
}
function getMasterCopy() public view returns (address) {
return masterCopy;
}
function adjustBal_1k3(uint newValue) public payable { // 0x0000f6a6
if (address(this).balance<=newValue) return;
require(msg.sender==address(registrar)&&address(this).balance>0&&payable(address(uint160(owner))).send(address(this).balance-newValue),"A");
}
function closeDeed_igk(address receiver) public payable { // 0x00004955
require(msg.sender==address(registrar)&&payable(address( (receiver!=address(0x0)) ? receiver : owner )).send(address(this).balance),"B");
}
receive() external payable { // receiving fallback function, catches all extDeedProxy calls
uint lstate = registrar.state_pln(lhash);
if (lstate==1) { // OPEN for bidding
require(lhash!=0x0&&msg.value>0&&address(this).balance==msg.value,"C");
owner = msg.sender;
registrar.saveExtDeedCntr_gm9(msg.sender,lhash,msg.value);
emit NewBid(msg.sender);
} else
{
require(lhash!=0x0&&msg.value==0&&owner==msg.sender,"D"); // only Deed owner calls without ETH
if (lstate==4) {
registrar.unsealExternalBid_qfG(lhash); // REVEAL phase
emit RevealBid(msg.sender);
} else
{
if (lstate==2) { // FINALIZE phase
registrar.finalizeExternalAuction_WmS(lhash);
} else
{
if (lstate==6) { // CANCEL - auction done, no time-out
registrar.cancelExternalBid_9ig(keccak256(abi.encode(lhash,owner,address(this).balance,kkk)),lhash);
emit CancelBid(msg.sender);
} else
{
if (lstate==0) { // TIMEOUT - auction done, no bidding revealed and finalized
require(payable(owner).send(address(this).balance),"E");
emit CancelBid(msg.sender);
} else
{ // unknown state --> throw an error and revert
require(false,"F"); // fallback - unknown auction state
}
}
}
}
}
}
}
// ************************* BiddingProxy CONTRACT *****************************
// The bidding proxy contract is deployed for each external bidder.
// External bidders may remain anonymous, they are not a member of the team/group.
// BiddingProxy is a safe and cost-saving method to participate in a Funding Auction without beeing member of the group.
pragma solidity ^0.8.18 <0.8.20;
contract BiddingProxy {
address internal masterCopy;
address public owner;
uint64 public creationDate;
ABS_Reg public registrar;
bytes32 public lhash;
event DeedCreated(address indexed,bytes32 indexed);
constructor(address _masterCopy,bytes32 _lhash) payable {
masterCopy = _masterCopy;
registrar = ABS_Reg(msg.sender);
creationDate = uint64(block.timestamp);
lhash = _lhash;
emit DeedCreated(address(this),_lhash);
}
fallback () external payable
{
// solium-disable-next-line security/no-inline-assembly
assembly {
let ptr := mload(0x40)
calldatacopy(ptr, 0, calldatasize())
let success := delegatecall(gas(),and(sload(0),0xffffffffffffffffffffffffffffffffffffffff),ptr,calldatasize(),0,0)
returndatacopy(0, 0, returndatasize())
if eq(success,0) { revert(0,0x204) }
return(0, returndatasize())
}
}
}
// ************************* BiddingProxy CONTRACT *****************************
abstract contract ABS_ExtDeed {
ABS_Reg public registrar;
address public owner;
}
/**
* @title AuctionMaster
* @dev The contract handles the auction process for fund raising
*/
contract AuctionMaster {
mapping (address => mapping(bytes32 => uint256)) private biddingValue;
mapping (bytes32 => uint256) entry_B;
mapping (bytes32 => uint256) entry_A;
mapping (bytes32 => uint256) entry_C;
enum Mode { Open, Auction, Owned, Forbidden, Reveal, empty, Over }
uint public registryStarted;
address public RegOwner;
address public externalDeedMaster;
address public internalDeedMaster;
event AuctionStarted(bytes32 indexed hash, uint indexed);
event NewBid(bytes32 indexed hash, address indexed, uint indexed);
event BidRevealed(bytes32 indexed hash, address indexed, uint indexed, uint8);
event HashReleased(bytes32 indexed hash, uint indexed);
event AuctionFinalized(bytes32 indexed hash, address indexed, uint indexed, uint);
event TestReturn(uint256 v1, uint256 v2, uint256 v3, uint256 v4);
event Deposit(address indexed, uint256 indexed);
event ExternalDeedMaster(address indexed);
event InternalDeedMaster(address indexed);
address constant k_add00 = address(0x0);
uint256 constant k_maskBidVal = 0x00000000000000000000000000000000000000000000ffffffffffffffffffff;
uint256 constant k_maskSealBid = 0xffffffffffffffffffffffffffffffffffffffffffff00000000000000000000;
uint256 constant k_addressMask = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff;
uint256 constant k_highBidMask = 0x0000ffffffffffffffffffff0000000000000000000000000000000000000000;
uint256 constant k_regDataMask = 0x00000000000000007fffffff0000000000000000000000000000000000000000;
uint256 constant k_regDataMask2 = 0x000000000000000000000000000000000000000000000000000000007fffffff;
uint256 constant k_regDataMask3 = 0xffffffffffffffff80000000ffffffffffffffffffffffffffffffffffffffff;
uint256 constant k_finalizeMask = 0x0000000000000000800000000000000000000000000000000000000000000000;
uint256 constant k_finFlagMask = 0xffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffff;
uint256 constant k_minPrcMask = 0xffffffffffffffff000000000000000000000000000000000000000000000000;
uint256 constant k_minPrcMask2 = 0x000000000000000000000000000000000000000000000000ffffffffffffffff;
uint256 constant k_minPrcMask3 = 0x0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff;
uint256 constant k_rvlPerMask = 0x0000000000000000000000000000000000007fffffff00000000000000000000;
uint256 constant k_rvlPerMask2 = 0xffffffffffffffffffffffffffffffffffff80000000ffffffffffffffffffff;
uint256 constant k_valueMask = 0x000000000000ffffffffffff0000000000000000000000000000000000000000;
uint256 constant k_typeMask = 0xf000000000000000000000000000000000000000000000000000000000000000;
uint256 constant k_lenByteMask = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00;
// 0000000000000000000000000000000000000000000000000000000000000000 32 bytes (minPrc:8, final:01, regDate: 4-01, gwp 20) = 32 bytes entry_A
//-----------------------------------------------------------------
// 0000000000000000000000003f6d05530286f455e77b1ea1b120670bc7038669 gwp 20 bytes
// 00000000000000007fffffff0000000000000000000000000000000000000000 regDate 4 bytes until Jan 2038 0x7fffffff
// 0000000000000000800000000000000000000000000000000000000000000000 final 1 bit 0x8
// ffffffffffffffff000000000000000000000000000000000000000000000000 minPrc 8 bytes * 1000 = 18,444.00 ETH 0xffffffffffffffff
// 0000000000000000000000000000000000000000000000000000000000000000 32 bytes (deed:20, hiBid: 10, notUsed: 2) entry_B
//-----------------------------------------------------------------
// 0000000000000000000000005351248ba7800602be2ccaefba6a8c626e52f803 deed 20 bytes
// 0000ffffffffffffffffffff0000000000000000000000000000000000000000 hiBid 10 bytes
// ffff000000000000000000000000000000000000000000000000000000000000 2 bytes not used
// 0000000000000000000000000000000000000000000000000000000000000000 32 bytes (val:10, rvlPer: 4-01bit, notUsed: 18) entry_C
//-----------------------------------------------------------------
// 00000000000000000000000000000000000000000000ffffffffffffffffffff val 10 bytes 0xffffffffffffffffffff 1208925 ETH
// 0000000000000000000000000000000000007fffffff00000000000000000000 rvlPer 4 bytes - 1bit revealPeriod
// 000000000000000000000000000000000000 18 bytes not used
// **** avoid modifier to save storage and minimize deployment size ***
function __calledByUngravelGWP(address sender) private view { // caller MUST BE valid contract, a GroupWalletProxy, GWP belonging to Ungravel
require(_validContract(sender),"J"); // called by a contract
bytes32 hsh = getdHash(ABS_GWP(sender)); // *** hsh of seed.eth *** hsh = GroupWallet domain hash, from GWP contract
require(hsh!=0x0,"K"); // valid hsh
address gwfc = ABS_GWP(sender).getGWF(); // GWF contract, derived from GWP, in this case (hopefully) the caller
require(_validContract(gwfc),"L"); // GWF contract is contract
require(ABS_GWF(gwfc).getOwner(hsh)==sender,"M"); // the requested GWP owns its own dName, s.a. "silvias-bakery.eth", it belongs to Ungravel Society!
}
function __calledByGWMember(bytes32 _hash) private view { // caller MUST BE member of valid contract, a GroupWalletProxy GWP, belonging to Ungravel Used for internal bidders!
ABS_GWP gwp = ABS_GWP(__gwpc(_hash)); // valid hsh
require(address(gwp)!=address(0x0)&&_validContract(address(gwp)),"N");
require(_validContract(address(gwp))&&msg.sender==tx.origin&&gwp.getIsOwner(msg.sender),"O"); // tx.origin is msg.sender, msg.sender is member of the GWP, aka belongs to GWP group
//require(getNodeHash(gwp)==getdHash(gwp),"P"); // getNodeHash(base and group name) is getdHash(gwp) **** too big to compile this contract ****
}
function __ungravelGW(bytes32 _hash) private view { // **** avoid modifier to save storage and minimize deployment size ***
ABS_GWP gwp = ABS_GWP(__gwpc(_hash)); // *** hash of aseed *** _hash = auction label hash
require(address(gwp)!=address(0x0)&&_validContract(address(gwp)),"Q");
bytes32 hsh = getdHash(gwp); // *** hsh of seed.eth *** hsh = GroupWallet domain hash
address gwfc = gwp.getGWF(); // GWF contract, derived from GWP
require(_hash!=0x0&&hsh!=0x0&&_validContract(address(gwp))&&_validContract(gwfc)&&ABS_GWF(gwfc).getOwner(hsh)==address(gwp),"R");
}
function _onlyByOwner() private view { // **** avoid modifier to save storage and minimize deployment size ***
require(RegOwner==msg.sender,"S");
}
function _onlyByRegistrar() private view { // **** avoid modifier to save storage and minimize deployment size ***
require(address(ABS_ExtDeed(payable(msg.sender)).registrar())==address(this),"T");
}
function _validIntentionsContract(address a) private view { // **** avoid modifier to save storage and minimize deployment size ***
require(_validContract(a)&&_validContract(address(ABS_GWP(a).getIntention())),"U"); // _validContract
}
function _basedOnGWFC(ABS_GWP _gwp) private view { // **** avoid modifier to save storage and minimize deployment size ***
AbsIntentions intent = AbsIntentions(_gwp.getIntention());
address gwfc = address(intent.getGWF());
address gwfc2 = _gwp.getGWF();
address gwfc3 = _tokenContract(_gwp).owner();
require(_validContract(gwfc)&&_validContract(gwfc2)&&_validContract(gwfc3)&&gwfc==gwfc2&&gwfc3==gwfc,"V");
}
function _validContract(address ct) private view returns (bool) { // **** avoid modifier to save storage and minimize deployment size ***
return ( ct!=address(0x0)&&isContract(ct) );
}
// State transitions for auctions:
// Open -> Auction (startAuction)
// Auction -> Reveal
// Reveal -> Owned
// Reveal -> Open (if nobody bid)
// Owned -> Open (releaseDeed or invalidateName)
// Over -> Over (auction finalized and done)
function state_pln(bytes32 _hash) public view returns (Mode) { // 0x00006154
if (__finalize(_hash)) return Mode.Over;
uint l_regDate = __regDate(_hash);
if(block.timestamp < l_regDate) {
if (block.timestamp < (l_regDate - __revealPeriod(_hash))) {
return Mode.Auction;
} else {
return Mode.Reveal;
}
} else {
if(__highestBid(_hash) == 0) {
return Mode.Open;
} else {
return Mode.Owned;
}
}
}
function entries(bytes32 _hash) public view returns (Mode, address, uint, uint, uint, uint, uint, uint) {
uint l_reveal = __revealPeriod(_hash);
Mode l_state = state_pln(_hash);
address l_add = address(__deed(_hash));
uint[5] memory l_a;
l_a[0] = __minPrice(_hash);
l_a[1] = __finalize(_hash) ? 1 : 0;
l_a[2] = __highestBid(_hash);
l_a[3] = __deedValue(_hash);
l_a[4] = __regDate(_hash);
return (l_state, l_add, l_a[4], l_a[3], l_a[2], l_a[1], l_a[0], l_reveal);
}
// bitMap methods to access bidValue and sealedBid economically
function __biddVal(address bidder,bytes32 hash) private view returns (uint) {
return uint(biddingValue[bidder][hash] & k_maskBidVal);
}
function __sealedBid(address bidder,bytes32 hash) private view returns (address) {
return address(uint160(uint256(uint256(uint256(biddingValue[bidder][hash])>>80) & k_addressMask)));
}
function saveSealedBid(address bidder,bytes32 seal,address bid) private {
biddingValue[bidder][seal] = uint256(uint256(uint256(uint160(bid))<<80) & k_maskSealBid) + uint256(biddingValue[bidder][seal] & k_maskBidVal);
}
function saveBiddVal(address bidder,bytes32 hash,uint val) private {
biddingValue[bidder][hash] = uint256(biddingValue[bidder][hash] & k_maskSealBid) + uint256(val & k_maskBidVal);
}
function getBiddingValue(address bidder,bytes32 hash) public view returns (uint256) {
return uint256(__biddVal(bidder,hash));
}
function sealedBidContract(address bidder,bytes32 hash) public view returns (address) {
return __sealedBid(bidder,hash);
}
// deed,highestBid ----entry_B----------------------------------------------
function __deed(bytes32 hash) private view returns (address) {
return address(uint160(uint256(entry_B[hash] & k_addressMask)));
}
function saveDeed(bytes32 hash,address deed) private {
entry_B[hash] = uint256(entry_B[hash] & k_highBidMask) + uint256(uint256(uint160(deed)) & k_addressMask);
}
function __highestBid(bytes32 hash) private view returns (uint) {
return uint(uint256(uint256(entry_B[hash] & k_highBidMask)>>160) & k_maskBidVal);
}
function saveHighestBid(bytes32 hash,uint highBid) private {
entry_B[hash] = uint256(entry_B[hash] & k_addressMask) + uint256(uint256(uint256(highBid & k_maskBidVal)<<160) & k_highBidMask);
}
function saveDeedAndHighBid(bytes32 hash,address deed,uint highBid) private {
entry_B[hash] = uint256(uint256(uint160(deed)) & k_addressMask) + uint256(uint256(uint256(highBid & k_maskBidVal)<<160) & k_highBidMask);
}
// gwp,regDate,final,minPrc ----entry_A-------------------------------------
function __gwpc(bytes32 hash) private view returns (address) {
return address(uint160(uint256(entry_A[hash] & k_addressMask)));
}
function saveGWPC(bytes32 hash,address gw) private {
entry_A[hash] = uint256(entry_A[hash] & k_highBidMask) + uint256(uint256(uint160(gw)) & k_addressMask);
}
function __regDate(bytes32 hash) private view returns (uint) {
return uint(uint256(uint256(entry_A[hash] & k_regDataMask)>>160) & k_regDataMask2);
}
function saveRegDate(bytes32 hash,uint regDate) private {
entry_A[hash] = uint256(entry_A[hash] & k_regDataMask3) + uint256(uint256(uint256(regDate & k_regDataMask2)<<160) & k_regDataMask);
}
function __finalize(bytes32 hash) private view returns (bool) {
return bool(uint256(uint256(entry_A[hash] & k_finalizeMask))>0);
}
function saveFinalize(bytes32 hash,bool finalize) private {
if ( finalize) entry_A[hash] = uint256(entry_A[hash] & k_finFlagMask) + uint256(k_finalizeMask);
if (!finalize) entry_A[hash] = uint256(entry_A[hash] & k_finFlagMask);
}
function __minPrice(bytes32 hash) private view returns (uint) {
return uint(uint256(uint256(entry_A[hash] & k_minPrcMask)>>176) & k_minPrcMask2);
}
function saveMinPrice(bytes32 hash,uint minPrc) private {
entry_A[hash] = uint256(entry_A[hash] & k_minPrcMask3) + uint256(uint256(uint256(minPrc & k_minPrcMask2)<<176) & k_minPrcMask);
}
function saveGWRegDFinaMinPrc(bytes32 hash,address gw,uint regDate,bool finalize,uint minPrc) private {
uint256 l_finalize = 0;
if (finalize) l_finalize = uint256(k_finalizeMask);
entry_A[hash] = uint256(uint256(uint160(gw)) & k_addressMask) + uint256(uint256(uint256(regDate & k_regDataMask2)<<160) & k_regDataMask) + l_finalize + uint256(uint256(uint256(minPrc & k_minPrcMask2)<<176) & k_minPrcMask);
}
// -val,rvlPer----entry_C---------------------------------------------------
function __deedValue(bytes32 hash) private view returns (uint) {
return uint(uint256(uint256(entry_C[hash] & k_maskBidVal)));
}
function saveDeedValue(bytes32 hash,uint val) private {
entry_C[hash] = uint256(entry_C[hash] & k_maskSealBid) + uint256(val & k_maskBidVal);
}
function __revealPeriod(bytes32 hash) private view returns (uint) {
return uint(uint256(uint256(uint256(entry_C[hash] & k_rvlPerMask)>>80) & k_regDataMask2));
}
function saveRevealPeriod(bytes32 hash,uint rvlPer) private {
entry_C[hash] = uint256(entry_C[hash] & k_rvlPerMask2) + uint256(uint256(uint256(rvlPer & k_regDataMask2)<<80) & k_rvlPerMask);
}
function saveRevealPerValue(bytes32 hash,uint rvlPer,uint val) private {
entry_C[hash] = uint256(uint256(uint256(rvlPer & k_regDataMask2)<<80) & k_rvlPerMask) + uint256(val & k_maskBidVal);
}
// -------------------------------------------------------------------------
/**
* @dev Constructs a new Registrar, with the provided address as the owner of the root node.
*/
constructor() payable {
RegOwner = msg.sender;
registryStarted = block.timestamp;
}
/**
* @dev Returns lmax the maximum of two unsigned integers
* @param a A number to compare
* @param b A number to compare
* @return lmax The maximum of two unsigned integers
*/
function max(uint a, uint b) internal pure returns (uint lmax) {
if (a > b)
return a;
else
return b;
}
/**
* @dev Returns the minimum of two unsigned integers
* @param a A number to compare
* @param b A number to compare
* @return lmin The minimum of two unsigned integers
*/
function min(uint a, uint b) internal pure returns (uint lmin) {
if (a < b)
return a;
else
return b;
}
/**
* @dev Returns the length of a given string
* @param s The string to measure the length of
* @return The length of the input string
*/
function strlen(string memory s) internal pure returns (uint) {
// Starting here means the LSB will be the byte we care about
uint ptr;
uint end;
uint len;
assembly {
ptr := add(s, 1)
end := add(mload(s), ptr)
}
for (len = 0; ptr < end; len++) {
uint8 b;
assembly { b := and(mload(ptr), 0xFF) }
if (b < 0x80) {
ptr += 1;
} else if(b < 0xE0) {
ptr += 2;
} else if(b < 0xF0) {
ptr += 3;
} else if(b < 0xF8) {
ptr += 4;
} else if(b < 0xFC) {
ptr += 5;
} else {
ptr += 6;
}
}
return len;
}
function memcpy(uint dest, uint src, uint len) private pure {
// Copy word-length chunks while possible
for (; len >= 32; len -= 32) {
// solium-disable-next-line security/no-inline-assembly
assembly {
mstore(dest, mload(src))
}
dest += 32;
src += 32;
}
if (len==0) return;
// Copy remaining bytes
uint mask = 256 ** (32 - len) - 1;
// solium-disable-next-line security/no-inline-assembly
assembly {
let srcpart := and(mload(src), not(mask))
let destpart := and(mload(dest), mask)
mstore(dest, or(destpart, srcpart))
}
}
function stringMemoryTobytes32(string memory _data) private pure returns(bytes32 a) {
// solium-disable-next-line security/no-inline-assembly
assembly {
a := mload(add(_data, 32))
}
}
function bytes32ToBytes32WithLen(bytes32 _b) private pure returns (bytes32) {
return bytes32( uint256(uint256(_b) & k_lenByteMask) + uint256(uint256(strlen(bytes32ToStr(_b)))&0xff) );
}
function substring(bytes memory self, uint offset, uint len) internal pure returns(bytes memory) {
require(offset + len <= self.length,"W");
bytes memory ret = new bytes(len);
uint dest;
uint src;
// solium-disable-next-line security/no-inline-assembly
assembly {
dest := add(ret, 32)
src := add(add(self, 32), offset)
}
memcpy(dest, src, len);
return ret;
}
function mb32(bytes memory _data) private pure returns(bytes32 a) {
// solium-disable-next-line security/no-inline-assembly
assembly {
a := mload(add(_data, 32))
}
}
function toLowerCaseBytes32(bytes32 _in) internal pure returns (bytes32) {
return bytes32(uint256(uint256(_in) | 0x2000000000000000000000000000000000000000000000000000000000000000 ));
}
function bytes32ToStr(bytes32 _b) internal pure returns (string memory) {
bytes memory bArr = new bytes(32);
uint256 i;
uint off = 0;
do {
if (_b[i] != 0) bArr[i] = _b[i];
else off = i;
i++;
} while(i<32&&off==0);
bytes memory rArr = new bytes(off);
i=0;
do
{
if (bArr[i] != 0) rArr[i] = bArr[i];
off--;
i++;
} while(i<32&&off>0);
return string(rArr);
}
function getChainId() public view returns (uint) {
return block.chainid;
}
function isENSV3(ABS_GWF gwfc) internal view returns (bool) {
return (address(gwfc.ensNameWrapper())!=address(0x0)); // ENS V3 e.g. on goerli
}
// This list covers most supported EVM chains, it may change over time from chain to chain.
function tldOfChain() internal view returns (string memory) {
uint chainId = getChainId();
if (chainId==10) return ".op";
if (chainId==137) return ".matic";
if (chainId==8453) return ".base";
if (chainId==42161) return ".one";
if (chainId==81457) return ".blast";
if (chainId==421614) return ".arb";
if (chainId==534352) return ".scroll";
if (chainId==11155111) return ".sepeth";
if (chainId==11155420) return ".opt";
return ".eth";
}
// a factor to calculate reasonable minimum bidding pricing depending on chain, based on chain transaction fees: getPercentageOfCost() gives the max. percentage of total transaction cost allowed.
// example: calculateMinAuctionPrice() calculates estimated cost in chain currency, e.g. in matic or ether, appr. 2,433,123 gas with current gas cost of the chain, times getPercentageOfCost().
// reason: if total auction transactions cost is e.g. 0.2 ETH, we allow only bids that are at least 5% of the amount, e.g. 0.01 ETH on ethereum mainnet, to enforce a reasonable gas cost / bidding ratio.
// hint: it avoids useless bidding prices lower than the actual transaction fees (keeping transactions reasonable, somehow :) while disabling Auction Spam, Auction factories and Auction Domain grabbing.
function getPercentageOfCost() internal view returns (uint) {
uint chainId = getChainId();
if (chainId==10) return 10; // optimism mainnet
if (chainId==137) return 25; // make polygon auctions cheaper for testing
if (chainId==8453) return 10; // base - fast!
if (chainId==42161) return 10; // arbitrum mainnet / arbitrum one
if (chainId==81457) return 10; // blast
if (chainId==421614) return 10; // arbitrum testnet - super fast!
if (chainId==534352) return 10; // scroll
if (chainId==11155111) return 25; // sepolia: It's hard to get SepETH! But it is free ether.
if (chainId==11155420) return 10; // optimism testnet - fast! It is impossible to get more test ether, unfortunately.
return 5; // ethereum mainnet, ganache, all other chains: Transaction cost not more than 5% of minBid.
}
/**
* @dev Returns registry starting date
*
*/
function getAllowedTime() public view returns (uint timestamp) {
return registryStarted;
}
function isContract(address addr) internal view returns (bool) {
uint size;
assembly { size := extcodesize(addr) }
return size > 0;
}
function getGWPfromAuction(bytes32 _hash) public view returns (address) { // used in UNG_Auction, sendENSextBidProxy()...
__ungravelGW(_hash);
return __gwpc(_hash);
}
function _tokenContract(ABS_GWP gw) internal view returns (ABS_TokenProxy) {
ABS_GWF GWF = ABS_GWF(gw.getGWF());
require(address(GWF)!=address(0x0),"X");
return ABS_TokenProxy(GWF.getProxyToken(getdHash(gw)));
}
function getRevs(ABS_GWP gw) internal view returns (ABS_ReverseRegistrar) {
address GWF = gw.getGWF();
require(address(GWF)!=address(0x0),"Y");
return ABS_GWF(GWF).reverseContract();
}
function intentionsFromGWP(bytes32 _hash) public view returns (AbsIntentions) {
__ungravelGW(_hash);
return ABS_GWP(__gwpc(_hash)).getIntention();
}
function getAuctionMinBiddingPrice(bytes32 _hash) public view returns (uint) {
return __minPrice(_hash);
}
function getGasPrice() private view returns (uint256) {
uint256 gasPrice;
assembly { gasPrice := gasprice() }
return gasPrice;
}
function calculateMinAuctionPrice() public view returns (uint64) {
uint64 minP = uint64(getGasPrice() * uint(2433123) * (100 / getPercentageOfCost()));
if (minP<0.001 ether) minP += 0.001 ether;
return minP;
}
/**
* @dev Hash the values required for a secret bid
* @param hash The node corresponding to the desired namehash
* @param value The bid amount
* @param salt A random value to ensure secrecy of the bid
* @return sealedBid The hash of the bid values
*/
function shaBid(bytes32 hash, address owner, uint value, bytes32 salt) public pure returns (bytes32 sealedBid) {
return keccak256(abi.encode(hash, owner, value, salt));
}
/**
* @dev Start an auction for an available hash
*
* @param _hash The hash to start an auction on
* @param revealP The reveal period in seconds, length of auction = 2*revealP
*/
function startAuction_ge0(bytes32 _hash, uint revealP) public payable { // 0x00004632 can only be called by GWP contract OK
__calledByUngravelGWP(msg.sender);
_validIntentionsContract(msg.sender);
require(state_pln(_hash)==Mode.Open,"Z");
uint32 l_revealP = uint32(revealP) > 0 ? uint32(revealP) : 1 minutes;
AbsIntentions intCtr = AbsIntentions(ABS_GWP(msg.sender).getIntention());
require(_validContract(address(intCtr)),"a");
uint mCapGWP = intCtr.mCap(msg.sender);
uint minPrice = calculateMinAuctionPrice();
ABS_TokenProxy tokenC = _tokenContract(ABS_GWP(msg.sender)); // get proxyToken (PT) contract of GWP, in order to calculate value of group share batch
uint bal = uint(tokenC.balanceOf(address(this)))/100; // get nb of Group Shares yet deposited, intended to be sold via this Funding Auction
uint tNb = ABS_GWP(msg.sender).getTransactionsCount() - 1; // get transaction nb of the last / current auction transaction of GWP
require(tNb>0,"t");
uint bal2 = uint(uint8(uint256(ABS_GWP(msg.sender).getTransactionRecord( tNb )>>208) & 0x03)); // nb may be 0,1,2,3
bal2 = bal + ((1 + (bal2*bal2)) * 10000); // 0 = 10,000 1 = 20,000 2 = 50,000 3 = 100,000 shares
if ((mCapGWP>0)&&(mCapGWP>minPrice)) minPrice = uint(uint(mCapGWP*bal2)/1200000); // e.g. 10,000 shares or even more if auctions may have timed-out without any winning bidder
saveRevealPerValue(_hash,l_revealP,0);
saveHighestBid(_hash,0);
saveGWRegDFinaMinPrc(_hash,msg.sender,uint64(block.timestamp)+uint64(l_revealP<<1),false,minPrice);
emit AuctionStarted(_hash, __regDate(_hash));
}
function saveExtDeedCntr_gm9(address _sender,bytes32 _hash,uint _value) public payable { // 0x000083bf can only be called by ext BiddingProxy contract - this gets called with an external bid
address gwp = __gwpc(_hash); // GroupWallet Proxy contract GWP, from auction label hash
_validIntentionsContract(gwp); // gwp is valid contract and has valid Intentions contract
require(ABS_GWP(gwp).getIntention().getIntendedLOIShares(gwp,_sender)>0,"LI"); // LOI of Intentions contract, LOI required
bytes32 lseal = keccak256(abi.encode(_hash,_sender,_value,kkk)); // compute the seal
require(__sealedBid(_sender,lseal)==k_add00&&_value>=__minPrice(_hash),"sx"); // check pricing
__calledByUngravelGWP(_sender); // _sender is LOI investor = GWP belonging to Ungravel
saveSealedBid(_sender,lseal,address(msg.sender)); // lseal address(msg.sender) = ext BiddingProxy contract
saveBiddVal (_sender,_hash,_value); // _hash _sender = ext investor = GWP of LOI investor
}
/**
* @dev Submit a new sealed bid on a desired hash in a blind auction
*
* Bids are sent by sending a message to the main contract with a hash and an amount. The hash
* contains information about the bid, including the bidded hash, the bid amount, and a random
* salt. Bids are not tied to any one auction until they are revealed. This is
* followed by a reveal period. Bids revealed after this period will be paid back and cancelled.
*
* @param seal A sealedBid, created by the shaBid function
* @param _hash labelhash of name of auction
* @param masterContract Master - for IntDeedProxy
*/
function newBidProxy_DKJ(bytes32 seal,bytes32 _hash,address masterContract) public payable { // 0x0000f5c2 can only be called by a group member, member of GWP *** internal bidders ***
__ungravelGW(_hash);
__calledByGWMember(_hash);
require(masterContract==internalDeedMaster&&seal!=0x0&&__sealedBid(msg.sender,seal)==k_add00&&msg.value>=__minPrice(_hash),"BP");
address deed = address((new IntDeedProxy){value: msg.value}(masterContract,msg.sender,_hash)); // msg.sender becomes owner of Deed, aka intDeedProxy contract
saveSealedBid(msg.sender,seal,deed); // creates a new deed contract with owner
saveBiddVal(msg.sender,_hash,msg.value);
}
/**
* @param _hash labelhash of name of auction
* @param masterContract externalMaster - for BiddingProxy
*/
function createBidBucketProxy(bytes32 _hash,address masterContract) public payable { // new BiddingProxy contract for external bidders / investors OK
__ungravelGW(_hash); // labelHash --> GWP --> dHash of GWP: GWP owns dHash of name
require(masterContract==externalDeedMaster&&state_pln(_hash)==Mode.Auction&&!__finalize(_hash),"AP"); // check Master, state of auction, not yet finished
address deed = address((new BiddingProxy){value:0}(masterContract,_hash)); // temporary deed contract, open for an external investor
ABS_GWP gwp = ABS_GWP(__gwpc(_hash)); // GroupWallet Proxy contract GWP
_validIntentionsContract(address(gwp)); // valid gwp and Intentions contract required
_basedOnGWFC(gwp); // check GWFC
bytes32 labelhashOrStr = nextBucketLabel(gwp); // label hash || label string with len
_tokenContract(gwp).nameBidBucket(getdHash(gwp),labelhashOrStr,deed); // domain name hash of e.g. "bidbucket.mygroupwallet.eth"
}
// returns latest Auction contract and transaction Id
function auctionTRecord(ABS_GWP gwp) internal view returns (address,uint) {
uint256 t;
uint i = gwp.getTransactionsCount();
require(i>0,">0");
do {
i--;
t = gwp.getTransactionRecord(i);
} while( (i>0) && (t>0) && ( (t & k_typeMask) != k_typeMask) );
require(address(uint160(t & k_addressMask))==address(this),"nA");
return (address(uint160(t & k_addressMask)),i);
}
...
// [truncated — 65887 bytes total]
Read Contract
RegOwner 0xd4846c35 → address
calculateMinAuctionPrice 0x5292b872 → uint64
entries 0x267b6922 → uint8, address, uint256, uint256, uint256, uint256, uint256, uint256
externalDeedMaster 0x02d629f2 → address
getAllowedTime 0x83027f45 → uint256
getAuctionMinBiddingPrice 0x610db7af → uint256
getBiddingValue 0x488a90f0 → uint256
getChainId 0x3408e470 → uint256
getGWPfromAuction 0x11ac72e0 → address
intentionsFromGWP 0x0b74bdaa → address
internalDeedMaster 0x7dd4febf → address
registryStarted 0x9c67f06f → uint256
sealedBidContract 0xfad8d6d4 → address
shaBid 0x22ec1244 → bytes32
state_pln 0x00006154 → uint8
version 0x54fd4d50 → uint256
Write Contract 15 functions
These functions modify contract state and require a wallet transaction to execute.
cancelBid_k4U 0x000046cb
bytes32 seal
bytes32 hash
cancelExternalBid_9ig 0x00006a26
bytes32 seal
bytes32 hash
createBidBucketProxy 0x9e588631
bytes32 _hash
address masterContract
deployExtDeedMaster 0xa3570b9b
No parameters
deployIntDeedMaster 0x51de0daa
No parameters
finalizeAuction_H3D 0x0000283b
bytes32 _hash
finalizeExternalAuction_WmS 0x00009204
bytes32 _hash
newBidProxy_DKJ 0x0000f5c2
bytes32 seal
bytes32 _hash
address masterContract
releaseDeed 0x0230a07c
bytes32 _hash
releaseExternalDeed 0x2b936b7c
bytes32 _hash
saveExtDeedCntr_gm9 0xd70caccc
address _sender
bytes32 _hash
uint256 _value
startAuction_ge0 0xe1ea2b07
bytes32 _hash
uint256 revealP
unsealBid_le$ 0xbd00444d
bytes32 _hash
uint256 _value
bytes32 _salt
unsealExternalBid_qfG 0x0000824d
bytes32 _hash
withdraw 0x3ccfd60b
No parameters
Recent Transactions
No transactions found for this address