Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0xC0D9cdF5061c974021269a03Cb5ea9e7AA638254
Balance 0 ETH
Nonce 10
Code Size 24517 bytes
Indexed Transactions 0
External Etherscan · Sourcify

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