// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.33;
// AuctionMaster, intDeedMaster, extDeedMaster, IntDeedProxy, BiddingProxy ( by pepihasenfuss.eth, copyright (c) 2026,
// 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, ungravel, GroupWallet, Cooperation Markets, Virtual Enterprises, GroupWalletFactory, GroupWalletMaster, GroupWallet, ProxyWallet, TokenMaster, ProxyToken,
// AuctionMaster, BiddingProxy, intDeedMaster, extDeedMaster, IntDeedProxy, Intentions, PrePaidContract by pepihasenfuss.eth 2016-2026, Copyright (c) 2026
// AuctionMaster and Ungravel is entirely based on Ethereum Name Service, "ENS", the domain name registry.
// Although, Ungravel extends ENS to 20+ different chains: EVM Names across chains create an Ungravel Unified Name Space, UUNS.
// 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.
// TLTR;
// AuctionMaster is a beast: It enables groups or group members to invest
// in other groups, acquiring group shares - the safe way. This contract consists
// of 5 different contracts that provide safe and yet affordable funding, but it is complex.
//
// Funding Auctions are so-called Vickrey auctions: Winners pay the second-highest price.
//
// Ungravel auctions are safe because all participating parties will act inside of UUNS:
// Ungravel Unified Name Space. Example: "ethereum.eth" invests into "arc-testnet.eth".
//
// But also "vitalik.ethereum.eth" may invest into his own group: "ethereum.eth".
//
// Everything is happing inside of UUNS, thus making outside attacks virtually impossible.
// Even smart contracts, such as "GroupWalletMaster", (GWM), "AuctionMaster", (AM), and all other masters,
// have proper UUNS names assigned, therefore, they are all agents acting indide of UUNS.
// (resolver and reverse resolver records are automatically assigned - while instantiating each contract)
interface IAbsAucEns {
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 AbsTokenProxy {
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 AbsResolver {
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);
}
abstract contract AbsReverseRegistrar {
IAbsAucEns public immutable ens;
function setName(string memory name) external virtual returns (bytes32);
function node(address addr) external virtual pure returns (bytes32);
}
abstract contract AbsIntentions {
function getGWF() public virtual view returns (AbsGwf);
function saveLetterOfIntent(address target, uint nbOfShares) public virtual payable;
function getIntendedLOIShares(address target, address investor) public virtual view returns (uint);
function mCap(address _gwp) public virtual view returns (uint);
function getGlobalTokenAddr() public virtual view returns (address);
}
abstract contract AbsGwp {
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 AbsGwf {
NmWrapper public ensNameWrapper;
IAbsAucEns public ens;
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 AbsReg {
AbsReverseRegistrar public reverseR;
function __calledByUngravelGWP(address sender) public virtual view;
function __calledByGWMember(bytes32 _hash) public virtual view returns (bool);
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;
}
abstract contract AbsIntDeedMaster {
AbsReg public theRegistrar;
}
abstract contract AbsExtDeed {
address public masterCopy;
AbsReg public registrar;
address public beneficiary;
}
abstract contract AbsGenericDeed {
address public owner;
address public beneficiary;
uint64 public creationDate;
function closeDeed_igk(address receiver) public virtual payable;
function adjustBal_1k3(uint newValue) external virtual payable;
}
abstract contract AbsMultiFour {
address public masterCopy; // deployer, owner of this contract
AbsGwf public GWF; // GroupWalletFactory Ungravel.com
event Deployment(address owner, address theContract);
event DeploymentMulticall4(address theContract, bytes32 dhash);
event Deposit(address from, uint256 value);
function tld() public virtual view returns (string memory);
function chainName() public virtual view returns (string memory);
}
bytes32 constant KSALT = 0x4db45745d63e3d3fca02d388bb6d96a256b72fa6a5ca7e7b2c10c90c84130f3b;
// ******************************* DeedProxy CONTRACT **************************
// The internal deed proxy is a cheap contract deployed for each bid of a member of the group, aka internal bidder.
// This proxy contract is for one bid of one group member bidding in a internal Funding Auction.
pragma solidity 0.8.33;
contract IntDeedProxy {
address public masterCopy;
bytes32 public lhash;
address public owner;
uint64 public creationDate;
event DeedCreated(address indexed);
modifier onlyMember() {
AbsReg reg =AbsIntDeedMaster(masterCopy).theRegistrar();
if (msg.sender!=address(reg))
reg.__calledByGWMember(lhash);
_;
}
constructor(address _masterCopy,address _owner,bytes32 _lhash) payable {
masterCopy = _masterCopy;
owner = _owner;
creationDate = uint64(block.timestamp);
lhash = _lhash;
emit DeedCreated(address(this));
}
fallback () external onlyMember 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())
}
}
receive() external onlyMember 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())
}
}
}
// ******************************* DEED MASTER CONTRACT ************************
// The internal DeedMaster provides functionality for internal bids. Most important,
// it may adjust the actual price being paid during an auction. And it may close
// "the deed", transferring the deposit funding to the organizing group of the auction.
// Once a deed is closed, it will not longer be used, but it still owns its own domain name.
// s.a. "sun.my-company.stable" | "someauction.the-team.arc"
// To use proper, unique domain names for contracts makes investments more transparent.
pragma solidity 0.8.33;
contract intDeedMaster {
address internal masterCopy;
bytes32 public lhash;
address public owner;
uint64 public creationDate;
AbsReg public immutable theRegistrar;
uint256 private _guardCounter = 1;
event DeedMasterCreated(address indexed);
event AdjustBalance(uint indexed);
event CloseDeed(address indexed, address indexed);
modifier nonReentrant() {
_guardCounter += 1;
uint256 localCounter = _guardCounter;
_;
require(localCounter == _guardCounter,"r"); // this may lead to a warning if calling my_require() !
}
modifier onlyTheRegistrar() {
my_require(msg.sender==address(theRegistrar),"x");
_;
}
function my_require(bool b, string memory str) internal pure {
require(b,str);
}
constructor(string memory _intDName) payable
{
masterCopy = msg.sender;
owner = msg.sender;
theRegistrar = AbsReg(msg.sender); // AuctionMaster contract
creationDate = uint64(block.timestamp);
emit DeedMasterCreated(address(this));
AbsReverseRegistrar(theRegistrar.reverseR()).setName(_intDName);
}
function my_transfer(address _beneficiary, uint _value, string memory _caller) internal {
(bool succ,) = payable(_beneficiary).call{value: _value}("");
my_require(succ,_caller);
}
function getMasterCopy() external view returns (address) { return masterCopy; }
function registrar() external view returns (AbsReg) { return AbsIntDeedMaster(masterCopy).theRegistrar(); }
function adjustBal_1k3(uint newValue) external nonReentrant onlyTheRegistrar payable { // 0x0000f6a6
if (address(this).balance<=newValue) return;
my_transfer(owner, address(this).balance-newValue, "G");
emit AdjustBalance(newValue);
}
function closeDeed_igk(address receiver) external nonReentrant onlyTheRegistrar payable { // 0x00004955
my_transfer( address( (receiver!=address(0)) ? receiver : owner ), address(this).balance, "I");
emit CloseDeed(address(this), receiver);
}
}
// ******************************* EXT DEED MASTER CONTRACT ********************
// An external bidder is also an Ungravel Group. A proxy bidding contract is deployed
// for each external bidder in order to participate in a Funding Auction.
//
// Any group will issue a Letter of Intent, LOI, before it can invest in any other group.
//
// The Letter of Intent indicates interest in investing into the other group,
// potentially participating in future Funding Auctions.
//
// Example: The Group "ethereum.eth" shows interest in "ens.eth" and sends an LOI,
// the Letter of Intent, indicating its interest to invest into ens.eth.
//
// The group "ens.eth" will have to complete one internal auction, first of all.
//
// Let‘s assume that "ens.eth" needs a bit of funding and one of the members invests
// during an internal funding auction, then he or she or it gets more group shares,
// consequently, the group gets common funding and increased liquidity.
//
// The internal funding auction is for group members only. It can be considered an
// ultra-sound method to deposit common assets. Only group majority may decide on how
// to use the funding and what to do with it.
//
// Once completed, the group is entitled to organize an External Funding Auction.
// It has "qualified" to proceed and to target external investors.
//
// Since "ethereum.eth" did show interest, "ens.eth" starts yet another auction,
// this time around, they also create / deploy a BidBucket, aka BiddingProxy.
// This is a simple contract that enables external groups to bid in a Funding Auction, the safe way.
// Why so complicated?
//
// Because only an auction provides a safe and fair method to
// distribute group shares: To members of the group, who can always bid in any auction.
//
// To other groups, aka external investors, who want to acquire a stake of the group.
//
// The auction we are using was first introduced by ENS, Nick Johnson and his team, back then.
// It is a so-called Vickrey Auction, a blind auction, where the winner will only pay
// the second-highest bid price, if he wins the auction. The Vickrey auction is a complicated
// beast itself. But it offers some advantages: Economists and researches argue that the
// Vickrey auction ultimately leads to better results, since each bidder is incentivized
// to bet a "fair" price for group shares. Knowing that he will only pay the second-best price!
// This is incentives design at its best!
// Anyway, since this type of auction was done before, in a smart contract on Ethereum,
// we decided to adapt the concept to Ungravel Funding requirements. Thanks to ENS and Nick Johnson, btw.
// This master contract, AuctionMaster, is yet another beast: It is a master that
// deploys two other master contracts: The "intDeedMaster" and the "extDeedMaster".
//
// Both deed master contracts are needed to offer slightly different functionality
// during an auction, depending on internal or external bidders.
//
// Why so many masters?
//
// Both masters are needed to safe gas and funding! Otherwise, deployment of bidding contracts
// would have been too costly. Therefore, we decided that we need two more contracts:
// The "IntDeedProxy" aka internal deed and bidding proxy contract, and the
// "BiddingProxy" aka the external deed and bidding proxy contract.
//
// Yes, this leads to 5 contracts in a single solidity file. Sorry, but needed.
//
// Consequently, implementation and APIs to access 5 contracts leads to more complexity.
//
// But this is not true from the perspective of a group or a group member, seen from
// the user. From her or his or its point-of-view, this leads to ultra-safe bidding
// procedures, each bid gets its own bidding proxy installed. Since we are using
// proxies, this is still relatively cheap. It can even be used on Ethereum mainnet :)
// Consider each bidding proxy, a safe deposit contract, where each bidder may deposit
// its bid, sometimes also known as a "deed". The bid remains safe under all circum-
// stances. It can only be delegated, forwarded to the organizers of the auction,
// if bidder did actually win the auction. Otherwise, it can only be sent back to bidder,
// if he/she/it does not reveal his bid or will have to cancel the bid at the end, in
// the case that someone else won the auction. In the end, bidding proxies, combined
// with Ungravel Unified Name Space, UUNS, offer superior safety for investing on EVM chains.
//
// Due to UUNS, only groups or group members may participate, all other senders will be rejected.
// Yes, this is a closed society of participants, each of them ligitimate, authenticated by
// the unified name space, UUNS. This party is only for "invited guest".
//
// Ungravel contracts involved, such as this "AuctionMaster", the "intDeedMaster" or the
// "extDeedMaster", they all have proper UUNS domain names by themselves, leading to a
// ultra-safe, closed and unified name space of participating agents: Whether it is a
// group, a group member, or any of the Master contracts, they all belong to Ungravel UUNS.
//
// In this respect, UUNS is a closed, gated, safe domain, enabling ultra-sound group investments.
// UUNS is available on 22+ different EVM compatible chains, s.a.: Ethereum, BNBmainnet, Base,
// Arbitrum, Polygon, STABLE mainnet, ARC-testnet and others.
pragma solidity 0.8.33;
contract extDeedMaster {
address internal masterCopy;
uint64 public creationDate;
AbsReg public registrar; // registrar = Auction Registrar = AuctionMaster
bytes32 public lhash;
address public beneficiary;
event DeedMasterCreated(address indexed thisDeedContract);
event NewBid(address indexed sender);
event RevealBid(address indexed revealer);
event CancelBid(address indexed canceler);
event FinalizeBid(address indexed finalizer);
event AdjustBalance(uint indexed theBalance, uint indexed newValue);
event CloseDeed(address indexed deedContract, address indexed theReceiver);
uint256 private _guardCounter = 1;
modifier nonReentrant() {
_guardCounter += 1;
uint256 localCounter = _guardCounter;
_;
my_require(localCounter == _guardCounter,"t");
}
modifier onlyReg() {
my_require(msg.sender==address(registrar),"o");
_;
}
modifier onlyGWP() {
registrar.__calledByUngravelGWP(msg.sender);
_;
}
constructor(string memory _extDName) payable
{
masterCopy = msg.sender; // auction master contract
registrar = AbsReg(msg.sender); // registrar = AuctionMaster
creationDate = uint64(block.timestamp);
emit DeedMasterCreated(address(this));
AbsReverseRegistrar(registrar.reverseR()).setName(_extDName);
}
function my_transfer(address _beneficiary, uint _value, string memory _caller) internal {
(bool succ,) = payable(_beneficiary).call{value: _value}("");
my_require(succ,_caller);
}
function my_require(bool b, string memory str) internal pure {
require(b,str);
}
function getMasterCopy() external view returns (address) { return masterCopy; }
function adjustBal_1k3(uint newValue) external onlyReg payable { // 0x0000f6a6 (short cmd ids are cheaper)
my_require(address(this).balance!=0,"a");
if (address(this).balance<=newValue) return;
my_transfer(beneficiary, address(this).balance-newValue, "A");
emit AdjustBalance(address(this).balance,newValue);
}
function closeDeed_igk(address receiver) external onlyReg payable { // 0x00004955 (short cmd ids are cheaper)
my_transfer(address( (receiver!=address(0)) ? receiver : beneficiary ), address(this).balance, "B");
emit CloseDeed(address(this),receiver);
}
receive() external nonReentrant onlyGWP payable { // receiving fallback function, catches all extDeedProxy calls
uint lstate = registrar.state_pln(lhash);
uint lvalue = msg.value;
address lsender = msg.sender;
uint lthisBal = address(this).balance;
if (lstate==1) { // OPEN for bidding
my_require(lhash!=0x0&&lvalue!=0&<hisBal==lvalue,"C");
beneficiary = lsender;
registrar.saveExtDeedCntr_gm9(lsender,lhash,lvalue);
emit NewBid(lsender);
} else
{
my_require(lhash!=0x0&&lvalue==0&&beneficiary==lsender,"D"); // only deed owner calls without ETH, cancel & finalize DO NOT need funding!
if (lstate==4) {
registrar.unsealExternalBid_qfG(lhash); // REVEAL phase
emit RevealBid(lsender);
} else
{
if (lstate==2) { // FINALIZE phase
registrar.finalizeExternalAuction_WmS(lhash);
emit FinalizeBid(lsender);
} else
{
if (lstate==6) { // CANCEL - auction done, no time-out
registrar.cancelExternalBid_9ig(keccak256(abi.encode(lhash,beneficiary,lthisBal,KSALT)),lhash);
emit CancelBid(lsender);
} else
{
if (lstate==0) { // TIMEOUT - auction done, no bidding revealed and not finalized
my_transfer(beneficiary,lthisBal,"E");
emit CancelBid(lsender);
}
}
}
}
}
}
}
// ************************* BiddingProxy CONTRACT *****************************
// The bidding proxy contract is deployed for each external bidder, an Ungravel Group.
// External bidders are GWP from another team/group. Bidders must be from a Group.
// BiddingProxy is a safe and cost-saving method to participate and bid in a Funding Auction.
pragma solidity 0.8.33;
contract BiddingProxy {
address public masterCopy;
uint64 public creationDate;
AbsReg public registrar;
bytes32 public lhash;
address public beneficiary;
event DeedCreated(address indexed,bytes32 indexed);
modifier onlyGWP() {
if (msg.sender!=address(registrar))
registrar.__calledByUngravelGWP(msg.sender);
_;
}
constructor(address _masterCopy,bytes32 _lhash) payable {
masterCopy = _masterCopy;
registrar = AbsReg(msg.sender);
creationDate = uint64(block.timestamp);
lhash = _lhash;
emit DeedCreated(address(this),_lhash);
}
fallback () external onlyGWP 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())
}
}
receive() external onlyGWP 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())
}
}
}
/**
* @title AuctionMaster
* @dev The contract handles the auction process for fund raising
*/
contract AuctionMaster {
mapping (address bidder => mapping(bytes32 auctionHash => uint256 bidAmount)) private biddingValue;
mapping (bytes32 auctionHash => uint256 slotValueStored_B) private entry_B;
mapping (bytes32 auctionHash => uint256 slotValueStored_A) private entry_A;
mapping (bytes32 auctionHash => uint256 slotValueStored_C) private entry_C;
enum Mode { Open, Auction, Owned, Forbidden, Reveal, empty, Over }
uint public immutable registryStarted;
address public immutable RegOwner;
address public externalDeedMaster;
address public internalDeedMaster;
AbsReverseRegistrar public immutable reverseR;
string public tld;
event AuctionStarted(bytes32 indexed hash, uint indexed regdate);
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 private K_ADD00 = address(0);
// memory slot masking: Bit masks help to fit multiple values into a single memory slot. (saves gas and cost)
uint256 constant private K_MASKBIDVAL = 0x00000000000000000000000000000000000000000000ffffffffffffffffffff;
uint256 constant private K_MASKSEALBID = 0xffffffffffffffffffffffffffffffffffffffffffff00000000000000000000;
uint256 constant private K_ADDRESSMASK = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff;
uint256 constant private K_HIGHBIDMASK = 0x0000ffffffffffffffffffff0000000000000000000000000000000000000000;
uint256 constant private K_REGDATAMASK = 0x00000000000000007fffffff0000000000000000000000000000000000000000;
uint256 constant private K_REGDATAMASK2 = 0x000000000000000000000000000000000000000000000000000000007fffffff;
uint256 constant private K_REGDATAMASK3 = 0xffffffffffffffff80000000ffffffffffffffffffffffffffffffffffffffff;
uint256 constant private K_FINALIZEMASK = 0x0000000000000000800000000000000000000000000000000000000000000000;
uint256 constant private K_FINFLAGMASK = 0xffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffff;
uint256 constant private K_MINPRCMASK = 0xffffffffffffffff000000000000000000000000000000000000000000000000;
uint256 constant private K_MINPRCMASK2 = 0x000000000000000000000000000000000000000000000000ffffffffffffffff;
uint256 constant private K_MINPRCMASK3 = 0x0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff;
uint256 constant private K_RVLPERMASK = 0x0000000000000000000000000000000000007fffffff00000000000000000000;
uint256 constant private K_RVLPERMASK2 = 0xffffffffffffffffffffffffffffffffffff80000000ffffffffffffffffffff;
uint256 constant private K_TYPEMASK = 0xf000000000000000000000000000000000000000000000000000000000000000;
uint256 private _guardCounter = 1;
// The storage layout, 3 memory slots: entry_A, entry_B, entry_C each of 32 bytes
// 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 contract address of the deed
// 0000ffffffffffffffffffff0000000000000000000000000000000000000000 hiBid 10 bytes highest bid
// 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
modifier nonReentrant() {
_guardCounter += 1;
uint256 localCounter = _guardCounter;
_;
my_require(localCounter == _guardCounter,"r");
}
modifier onlyGWP() { // only group wallet proxy, GWP, may call
__calledByUngravelGWP(msg.sender);
_;
}
modifier onlyRegistrar(bytes32 _hash) { // only this AuctionMaster may call
__ungravelGW(_hash);
my_require(address(AbsExtDeed(payable(msg.sender)).registrar())==address(this),"T");
_;
}
modifier onlyDeployer() { // only deployer of this contract may call, e.g. withdraw()
my_require(RegOwner==msg.sender,"S");
_;
}
modifier onlyGW(bytes32 _hash) { // only known auction hash, leading to valid Ungravel Group, GWP
__ungravelGW(_hash);
_;
}
modifier onlyMember(bytes32 _hash) { // only by valid GWP and member of the group
__ungravelGW(_hash);
__calledByGWMember(_hash);
_;
}
modifier onlyDeedOwner(bytes32 _hash) { // first bidder becomes owner of the "deed", the deposit proxy contract that holds the bidding
my_require(msg.sender==AbsGenericDeed(payable(__deed(_hash))).owner(),"H");
_;
}
modifier onlyExtDeedOwner(bytes32 _hash) { // first external group bidding becomes beneficiary (owner) of the BiddingProxy contract
my_require(msg.sender==AbsExtDeed(payable(__deed(_hash))).beneficiary(),"H");
_;
}
function __callerExists(address _caller) private view returns (bool) { // check reverse name node of sender address, e.g. "silvias-bakery.eth"
return reverseR.ens().recordExists(reverseR.node(_caller)); // check if ENS entry of node exists: true | false
}
function __calledByUngravelGWP(address sender) public view { // caller MUST BE valid contract, a GroupWalletProxy, GWP, belonging to Ungravel
//my_require(_validAddress(sender)&&__callerExists(sender),"J"); // called by a contract && check reverse name of sender, e.g. "silvias-bakery.eth"
// getdHash(AbsGwp(sender)) hsh = GroupWallet domain hash, from GWP contract
// AbsGwp(sender).getGWF() GWF contract, derived from GWP, in this case (hopefully) the caller
my_require(_validAddress(sender)&&__callerExists(sender)&&((sender==address(this))||(getdHash(AbsGwp(sender))!=0x0&&AbsGwf( AbsGwp(sender).getGWF() ).getOwner(getdHash(AbsGwp(sender)))==sender)),"M");// the requested GWP owns its own dName, s.a. "silvias-bakery.eth"
}
function __calledByGWMember(bytes32 _hash) public nonReentrant returns (bool) { // caller MUST BE member of contract, a GroupWalletProxy GWP, belonging to Ungravel
// used for internal bidders!
if (intentionsFromGWP(_hash).getGlobalTokenAddr()==msg.sender) return true; // allow access from Global Token contract "global.ungravel.tld"
AbsGwp gwp = AbsGwp(__gwpc(_hash)); // valid hsh
my_require( // msg.sender is member of the GWP, aka belongs to GWP group
address(gwp)!=address(0) &&
gwp.getIsOwner(msg.sender)
,"N");
return true;
}
function __ungravelGW(bytes32 _hash) private view { // _hash belongs to a domain name that belongs to Ungravel Unified Name Space
// _hash belongs to a domain name that belongs to Ungravel -
// protecting the call to only accept calls from inside the unified name space, UUNS
AbsGwp gwp = AbsGwp(__gwpc(_hash)); // *** hash of aseed *** _hash = auction label hash
bytes32 hsh = getdHash(gwp); // hsh = GroupWallet domain hash
address gwfc = gwp.getGWF(); // GWF contract, derived from GWP
my_require(__callerExists(address(gwp))&&hsh!=0x0&&_validAddress(gwfc)&&AbsGwf(gwfc).getOwner(hsh)==address(gwp),"R"); // auction label hash identifies GWP, organizing an auction
}
function _validIntentionsContract(address a) private view returns (AbsIntentions intent) { // get Intentions contract address from GWP
intent = AbsGwp(a).getIntention();
my_require(_validAddress(a)&&_validAddress(address(intent)),"U"); // _validAddress
return intent;
}
function _validAddress(address ct) private pure returns (bool) { // checks for 0x0 addresses
return ct!=address(0);
}
function _timeStamp() internal view returns (uint){ // timeStamp from block
return uint(block.timestamp);
}
function getChainId() public view returns (uint) { // chain id, e.g. 1 === Ethereum mainnet, 1135 = lisk
return block.chainid;
}
function my_require(bool b, string memory str) internal pure { // avoiding require() calls, it saves deployment bytes
require(b,str);
}
// 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(_timeStamp() < l_regDate) {
if (_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) external 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 (one word - one slot)
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) external view returns (uint256) {
return uint256(__biddVal(bidder,hash));
}
function sealedBidContract(address bidder,bytes32 hash) external 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 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 len The length of the input string
*/
function strlen(string memory s) internal pure returns (uint len) {
// Starting here means the LSB will be the byte we care about
uint ptr;
uint end;
assembly {
ptr := add(s, 1)
end := add(mload(s), ptr)
}
for (; 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) & 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00) + uint256(uint256(strlen(bytes32ToStr(_b)))&0xff) );
}
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 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);
}
// 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/preventing Auction Spam, Auction factories and Auction Domain grabbing.
function getPercentageOfCost() internal pure returns (uint64) {
return 10; // all other chains: Transaction cost not more than 10% of minBid.
}
/**
* @dev Returns registry starting date
*
*/
function getAllowedTime() external view returns (uint) {
return registryStarted;
}
function getGWPfromAuction(bytes32 _hash) external onlyGW(_hash) view returns (address) { // used in UNG_Auction, sendENSextBidProxy()...
// provide the GWP - GroupWalletProxy contract address from the hash
// of the auction name, only if auction name belongs to Ungravel unified name space!
return __gwpc(_hash);
}
function _tokenContract(AbsGwp gw) internal view returns (AbsTokenProxy) {
// get proxy token contract of group
// from the GWF that controls the group
// Token Proxy is a contract that controls group shares.
AbsGwf GWF = AbsGwf(gw.getGWF());
my_require(address(GWF)!=address(0),"X");
return AbsTokenProxy(GWF.getProxyToken(getdHash(gw)));
}
function intentionsFromGWP(bytes32 _hash) public onlyGW(_hash) view returns (AbsIntentions) { // used in GWF - GroupWalletFactory, getIntention()
return AbsGwp(__gwpc(_hash)).getIntention();
}
function getAuctionMinBiddingPrice(bytes32 _hash) external view returns (uint) {
return __minPrice(_hash);
}
function getGasPrice() private view returns (uint256 gasPrice) {
assembly { gasPrice := gasprice() }
}
function calculateMinAuctionPrice() public view returns (uint64 minP) {
minP = uint64(uint64(getGasPrice()) * uint(2433123) * 100) / getPercentageOfCost();
if (minP<=0.001 ether) minP += 0.001 ether;
return minP;
}
/**
* @dev Start an auction for an available hash
*
* @param _hash The hash to start an auction, auction label name hash
* @param revealP The reveal period in seconds, length of auction = 2*revealP
*/
function startAuction_ge0(bytes32 _hash, uint revealP) external nonReentrant onlyGWP payable { // 0x00004632 can only be called by GWP contract OK
uint tNb = AbsGwp(msg.sender).getTransactionsCount()-1; // get transaction nb of the last / current auction transaction of GWP
my_require(tNb!=0&&state_pln(_hash)==Mode.Open,"Z"); // only if auction is NOT yet running
uint32 l_revealP = uint32(revealP)!=0 ? uint32(revealP) : 1 minutes;
AbsIntentions intCtr = _validIntentionsContract(msg.sender);
uint mCapGWP = intCtr.mCap(msg.sender); // market cap == value of the GWP calling
uint minPrice = calculateMinAuctionPrice(); // minimum bid price, derived from gas cost of chain
AbsTokenProxy tokenC = _tokenContract(AbsGwp(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, aka left-over shares of the Funding Auction
uint amnt = uint(uint8(uint256(AbsGwp(msg.sender).getTransactionRecord( tNb )>>208) & 0x03)); // nb may be 0,1,2,3
amnt = bal + ((1 + (amnt*amnt)) * 1e4); // 0 = 10,000 1 = 20,000 2 = 50,000 3 = 100,000 shares + left over shares
if ((mCapGWP!=0)&&(mCapGWP>=minPrice)) minPrice = uint(uint(mCapGWP*amnt)/1.2e6); // also: >=10,000 shares if timed-out auctions without a winning bidder
saveRevealPerValue(_hash,l_revealP,0);
saveHighestBid(_hash,0);
saveGWRegDFinaMinPrc(_hash,msg.sender,uint64(_timeStamp())+uint64(l_revealP<<1),false,minPrice);
emit AuctionStarted(_hash,__regDate(_hash));
}
function saveExtDeedCntr_gm9(address _sender,bytes32 _hash,uint _value) external nonReentrant onlyRegistrar(_hash) 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
AbsIntentions intCtr = _validIntentionsContract(gwp); // gwp is valid contract and has valid Intentions contract
bytes32 lseal = keccak256(abi.encode(_hash,_sender,_value,KSALT)); // compute the seal, KSALT is "salt"
my_require(intCtr.getIntendedLOIShares(gwp,_sender)!=0 && __sealedBid(_sender,lseal)==K_ADD00&&_value>=__minPrice(_hash),"s"); // LOI required, check pricing
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 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 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) external onlyMember(_hash) payable { // 0x0000f5c2
// can only be called by a group member, member of GWP *** for internal bidders ***
my_require(masterContract==internalDeedMaster&&seal!=0x0&&__sealedBid(msg.sender,seal)==K_ADD00&&msg.value>=__minPrice(_hash),"j");
// msg.sender becomes owner of Deed, aka intDeedProxy contract
address deed = address((new IntDeedProxy){value: msg.value}(masterContract,msg.sender,_hash)); // bidding proxy contract - for group members
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 onlyGW(_hash) payable { // new BiddingProxy contract for external bidders / investors
// labelHash --> GWP --> dHash of GWP: GWP owns dHash of name
my_require(masterContract==externalDeedMaster&&state_pln(_hash)==Mode.Auction&&!__finalize(_hash),"c"); // 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
AbsGwp gwp = AbsGwp(__gwpc(_hash)); // GroupWallet Proxy contract GWP
AbsIntentions intent = _validIntentionsContract(address(gwp)); // valid gwp and Intentions contract required
address gwfc = address(intent.getGWF());
address gwfc2 = gwp.getGWF();
address gwfc3 = _tokenContract(gwp).owner();
my_require(_validAddress(gwfc)&&_validAddress(gwfc2)&&_validAddress(gwfc3)&&gwfc==gwfc2&&gwfc3==gwfc,"V");
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(AbsGwp gwp) internal view returns (address,uint) {
uint256 t;
uint i = gwp.getTransactionsCount();
my_require(i!=0,"0");
do {
i--;
t = gwp.getTransactionRecord(i);
} while( (i!=0) && (t!=0) && ((t & K_TYPEMASK) != K_TYPEMASK) );
my_require(address(uint160(t & K_ADDRESSMASK))==address(this),"n");
return (address(uint160(t & K_ADDRESSMASK)),i);
}
function getLabelBytes32(AbsGwp gw,uint _tNb) internal view returns (bytes32) {
return bytes32(uint256(gw.getTransactionRecord(_tNb) & 0x000000000000ffffffffffff0000000000000000000000000000000000000000)<<48); // e.g. label name "seed"
}
function addBucketNbToLabel(bytes32 label32,uint nb) internal pure returns (bytes32) { // *** only one byte ***
return bytes32( uint256(uint256(uint256(nb+96))<<248) + uint256(uint256(label32)>>8) );
}
function nextBucketLabel(AbsGwp gw) internal view returns (bytes32 b) {
address gwfc = gw.getGWF();
my_require(address(gwfc)!=address(0),"f");
IAbsAucEns ens = AbsGwf(gwfc).ens();
(address auctionTAddr,uint tNb) = auctionTRecord(gw);
my_require(address(ens)!=address(0) && auctionTAddr!=address(0)&&tNb!=0,"*");
bytes32 label = getLabelBytes32(gw,tNb);
bytes32 domHash = getdHash(gw);
bytes32 labelHash;
bytes32 dhash;
uint i = 0;
do {
i++;
labelHash = keccak256(bytes(bytes32ToStr( addBucketNbToLabel(label,i) )));
dhash = keccak256(abi.encodePacked(domHash,labelHash));
} while(ens.recordExists(dhash)&&i<=26);
if (!ens.recordExists(dhash)) {
if ((address(AbsGwf(gwfc).ensNameWrapper())==address(0))) return labelHash;
else return bytes32ToBytes32WithLen(addBucketNbToLabel(label,i));
}
my_require(false,"bb"); // *** max. 26 different labels *** a-z
}
// UNSEAL
/**
* @dev Submit the properties of a bid to reveal them
* @param _hash The node in the sealedBid
* @param _value The bid amount in the sealedBid
* @param _salt The sale in the sealedBid
*/
function unsealBid_le$(bytes32 _hash, uint _value, bytes32 _salt) external onlyMember(_hash) payable { // 0x0000bf3a
_unseal(true, _value, _hash, msg.sender, _salt);
}
function unsealExternalBid_qfG(bytes32 _hash) external onlyRegistrar(_hash) payable { // 0x0000824d
_unseal(false, address(msg.sender).balance, _hash, AbsExtDeed(msg.sender).beneficiary(),KSALT);
}
function _unseal(bool _internal, uint l_value, bytes32 _hash, address l_sender, bytes32 _salt) private {
// generic unseal - external or internal auction
bytes32 seal = keccak256(abi.encode(_hash,l_sender,l_value,_salt));
if (!_internal) {
my_require(_hash!=0x0 && __sealedBid(l_sender,seal)==msg.sender,"D2");
}
AbsGenericDeed bid = AbsGenericDeed(payable(__sealedBid(l_sender,seal)));
my_require(address(bid)!=address(0),"Db");
saveSealedBid(l_sender,seal,address(0));
if (_internal) {
//bid.adjustBal_1k3( min(l_value, address(bid).balance) );
Mode auctionState = state_pln(_hash);
if(auctionState == Mode.Owned) {
bid.closeDeed_igk(address(0)); // Too late! Get's 100% back.
saveBiddVal(l_sender,_hash,0);
} else if (auctionState != Mode.Reveal) {
my_require(false,"MR"); // Invalid phase
}
}
if (l_value < __minPrice(_hash) || bid.creationDate() > __regDate(_hash) - __revealPeriod(_hash)) {
bid.closeDeed_igk(address(0)); // Bid too low or too late, refund 100%
saveBiddVal(l_sender,_hash,0); // * NOT msg.sender * instead l_sender
} else if (l_value > __highestBid(_hash)) {
if( __deed(_hash) != address(0)) { // new winner: cancel the other bid, refund 100%
if (!_internal) {
AbsGenericDeed previousWinner = AbsGenericDeed(payable(__deed(_hash)));
saveBiddVal(previousWinner.beneficiary(),_hash,0);
previousWinner.closeDeed_igk(address(0));
}
else
{
AbsGenericDeed previousWinner = AbsGenericDeed(payable(__deed(_hash)));
saveBiddVal(previousWinner.owner(),_hash,0);
previousWinner.closeDeed_igk(address(0));
}
}
// set new winner: per the rules of a vickery auction, the value becomes the previous highest Bid
saveDeedValue(_hash,__highestBid(_hash)); // will be zero if there's only 1 bidder
saveDeedAndHighBid(_hash,address(bid),l_value);
} else if (l_value > __deedValue(_hash)) {
saveDeedValue(_hash,l_value); // not winner, but affects second place
bid.closeDeed_igk(address(0));
saveBiddVal(l_sender,_hash,0); // * NOT msg.sender * instead l_sender
} else {
bid.closeDeed_igk(address(0)); // bid doesn't affect auction
saveBiddVal(l_sender,_hash,0); // * NOT msg.sender * instead l_sender
}
}
function getdHash(AbsGwp gw) internal view returns (bytes32) {
address gwfc = gw.getGWF();
my_require(address(gwfc)!=address(0),"h");
return bytes32(gw.getTransactionRecord(uint256(uint160(gwfc)))); // domain hash, s.a. hash of "mygroupwallet.eth"
}
function transferGroupShares(AbsGwp gwc, address receiver) internal {
if (!_validAddress(address(gwc))) return;
AbsTokenProxy ptoken = _tokenContract(gwc); // token contract of group shares
my_require(address(receiver)!=address(0)&&address(ptoken)!=address(0),"p");
uint bal = ptoken.balanceOf(address(this));
if (bal != 0) ptoken.transfer_G8l(receiver,bal); // send back shares to GroupWallet
}
function transferGroupSharesAdjustPrices(AbsGwp gwc, address receiver, uint payment, address deedContract) internal {
AbsTokenProxy ptoken = _tokenContract(gwc); // token contract of group shares
my_require(address(receiver)!=address(0)&&address(deedContract)!=address(0)&&payment!=0&&address(ptoken)!=address(0),"v");
bytes32 dHash = getdHash(gwc);
uint bal = ptoken.balanceOf(address(this));
if (bal != 0) ptoken.transferAdjustPrices(receiver,bal,payment,dHash,deedContract);
}
// FINALIZE
function _prepareFinalize(bytes32 _hash, AbsGenericDeed _deed) private returns (address,uint) {
uint l_deedVal = max(__deedValue(_hash), __minPrice(_hash)); // handles the case when there's only a single bidder value is zero
saveDeedValue(_hash,l_deedVal);
_deed.adjustBal_1k3(l_deedVal);
address gwp = __gwpc(_hash);
if (!_validAddress(gwp)) _deed.closeDeed_igk(address(this));
return (gwp,l_deedVal);
}
/**
* @dev Finalize an auction after the registration date has passed
* @param _hash The hash of the name of the auction
*/
function finalizeAuction_H3D(bytes32 _hash) external nonReentrant onlyDeedOwner(_hash) payable { // 0x0000283b
AbsGenericDeed l_deed = AbsGenericDeed(payable(__deed(_hash))); // intDeedMaster
my_require(((state_pln(_hash)==Mode.Owned) || (state_pln(_hash)==Mode.Over)),"F");
(address gwp, uint l_deedVal) = _prepareFinalize(_hash, l_deed);
if (_validAddress(gwp)) {
transferGroupSharesAdjustPrices(AbsGwp(gwp),l_deed.owner(),l_deedVal,address(l_deed)); // transfer all token to highest bidder
l_deed.closeDeed_igk(gwp);
}
saveFinalize(_hash,true); // finalized flag
saveBiddVal(msg.sender,_hash,0);
emit AuctionFinalized(_hash, l_deed.owner(), l_deedVal, __regDate(_hash));
}
function finalizeExternalAuction_WmS(bytes32 _hash) external nonReentrant onlyRegistrar(_hash) payable { // 0x00009204
AbsGenericDeed l_deed = AbsGenericDeed(payable(__deed(_hash))); // extDeedMaster
my_require(!__finalize(_hash)&&__highestBid(_hash)!=0&&AbsExtDeed(msg.sender).beneficiary()==l_deed.beneficiary()&&_timeStamp()>=__regDate(_hash),"fx");
(address gwp, uint l_deedVal) = _prepareFinalize(_hash, l_deed);
if (_validAddress(gwp)) {
transferGroupSharesAdjustPrices(AbsGwp(gwp),l_deed.beneficiary(),l_deedVal,address(l_deed)); // transfer all token to highest bidder
l_deed.closeDeed_igk(gwp);
}
saveFinalize(_hash,true); // finalized flag
saveBiddVal(AbsExtDeed(msg.sender).beneficiary(),_hash,0); // AbsExtDeed(msg.sender).beneficiary() *
emit AuctionFinalized(_hash, l_deed.beneficiary(), l_deedVal, __regDate(_hash));
}
// CANCEL
function _transferShares(address _sender, bytes32 _hash, address _bid, bytes32 _seal) internal {
if (address(_bid)!=address(0) && address(_sender)!=address(0)) {
my_require((__finalize(_hash) || (state_pln(_hash)==Mode.Open)) && (_timeStamp() > (AbsGenericDeed(_bid).creationDate() + (__revealPeriod(_hash)<<1))),"d");
AbsGenericDeed(_bid).closeDeed_igk(K_ADD00); // send back cancelled bid
saveSealedBid(_sender,_seal,K_ADD00);
saveBiddVal(_sender,_hash,0);
address gwp = __gwpc(_hash);
transferGroupShares(AbsGwp(gwp),gwp);
}
}
function cancelBid_k4U(bytes32 _seal, bytes32 _hash) external onlyMember(_hash) payable { // 0x000046cb
_transferShares(msg.sender,_hash,__sealedBid(msg.sender,_seal),_seal);
}
function cancelExternalBid_9ig(bytes32 seal, bytes32 hash) external onlyRegistrar(hash) payable { // 0x00006a26
address l_sender = AbsExtDeed(msg.sender).beneficiary();
_transferShares(l_sender,hash,payable(__sealedBid(l_sender,seal)),seal);
}
// RELEASE
function _release(bytes32 _hash, AbsGenericDeed _deed) private {
my_require(state_pln(_hash)==Mode.Over&&_timeStamp()>=__regDate(_hash),"e");
saveDeedValue(_hash,0);
saveDeedAndHighBid(_hash,address(0),0);
_deed.closeDeed_igk(address(0));
}
/**
* @dev After some time, the owner can release the deed and get their ether back.
* @param _hash The node to release
*/
function releaseDeed(bytes32 _hash) external onlyDeedOwner(_hash) payable { // 0x0230a07c
_release(_hash,AbsGenericDeed(payable(__deed(_hash))));
}
function releaseExternalDeed(bytes32 _hash) external onlyExtDeedOwner(_hash) payable { // 0x2b936b7c
_release(_hash,AbsGenericDeed(payable(__deed(_hash))));
}
function _deedDomainName(string memory _prefix) private view returns (string memory) {
return string(bytes.concat(bytes(_prefix),bytes('ternal-deed.ungravel'),bytes(tld))); // e.g. external-deed.ungravel.stable | internal-deed.ungravel.arc
}
function deployExtDeedMaster() external onlyDeployer payable {
externalDeedMaster = address((new extDeedMaster){value: 0}(_deedDomainName("ex"))); // external-deed.ungravel.tld
emit ExternalDeedMaster(externalDeedMaster);
}
function deployIntDeedMaster() external onlyDeployer payable {
internalDeedMaster = address((new intDeedMaster){value: 0}(_deedDomainName("in"))); // internal-deed.ungravel.tld
emit InternalDeedMaster(internalDeedMaster);
}
function onERC1155Received(address,address,uint256,uint256,bytes calldata) external pure returns (bytes4) {
return 0xf23a6e61; // this.onERC1155Received.selector;
}
function version() external pure returns (uint256) {
return 20010192;
}
function withdraw() external onlyDeployer payable {
(bool succ,) = payable(msg.sender).call{value: address(this).balance}("");
my_require(succ,"X");
}
receive() external payable {
emit Deposit(msg.sender, msg.value);
}
/**
* @dev Constructs a new Auction Master Contract
*/
constructor(AbsReverseRegistrar _reverse, AbsMultiFour _multifour) payable {
RegOwner = msg.sender;
registryStarted = _timeStamp();
reverseR = _reverse;
tld = _multifour.tld();
// ENS/UUNS reverse resolver entry of address(this) ---> "auctionmaster.ungravel.eth" | "auctionmaster.ungravel.arc" | "auctionmaster.ungravel.stable"
_reverse.setName(string(bytes.concat(bytes('auctionmaster.ungravel'),bytes(tld)))); // assigning reverse resolver record
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_reverse",
"type": "address",
"internalType": "contract AbsReverseRegistrar"
},
{
"name": "_multifour",
"type": "address",
"internalType": "contract AbsMultiFour"
}
],
"stateMutability": "payable"
},
{
"name": "AuctionFinalized",
"type": "event",
"inputs": [
{
"name": "hash",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "AuctionStarted",
"type": "event",
"inputs": [
{
"name": "hash",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "regdate",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "BidRevealed",
"type": "event",
"inputs": [
{
"name": "hash",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
}
],
"anonymous": false
},
{
"name": "Deposit",
"type": "event",
"inputs": [
{
"name": "",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ExternalDeedMaster",
"type": "event",
"inputs": [
{
"name": "",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "HashReleased",
"type": "event",
"inputs": [
{
"name": "hash",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "InternalDeedMaster",
"type": "event",
"inputs": [
{
"name": "",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "NewBid",
"type": "event",
"inputs": [
{
"name": "hash",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TestReturn",
"type": "event",
"inputs": [
{
"name": "v1",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "v2",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "v3",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "v4",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RegOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "__calledByGWMember",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "__calledByUngravelGWP",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "view"
},
{
"name": "calculateMinAuctionPrice",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "minP",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "cancelBid_k4U",
"type": "function",
"inputs": [
{
"name": "_seal",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "cancelExternalBid_9ig",
"type": "function",
"inputs": [
{
"name": "seal",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "createBidBucketProxy",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "masterContract",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "deployExtDeedMaster",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "deployIntDeedMaster",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "entries",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "enum AuctionMaster.Mode"
},
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "externalDeedMaster",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "finalizeAuction_H3D",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "finalizeExternalAuction_WmS",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "getAllowedTime",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getAuctionMinBiddingPrice",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getBiddingValue",
"type": "function",
"inputs": [
{
"name": "bidder",
"type": "address",
"internalType": "address"
},
{
"name": "hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getChainId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getGWPfromAuction",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "intentionsFromGWP",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract AbsIntentions"
}
],
"stateMutability": "view"
},
{
"name": "internalDeedMaster",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "newBidProxy_DKJ",
"type": "function",
"inputs": [
{
"name": "seal",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "masterContract",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "onERC1155Received",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "pure"
},
{
"name": "registryStarted",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "releaseDeed",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "releaseExternalDeed",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "reverseR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract AbsReverseRegistrar"
}
],
"stateMutability": "view"
},
{
"name": "saveExtDeedCntr_gm9",
"type": "function",
"inputs": [
{
"name": "_sender",
"type": "address",
"internalType": "address"
},
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "_value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "sealedBidContract",
"type": "function",
"inputs": [
{
"name": "bidder",
"type": "address",
"internalType": "address"
},
{
"name": "hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "shaBid",
"type": "function",
"inputs": [
{
"name": "hash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "salt",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "sealedBid",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "pure"
},
{
"name": "startAuction_ge0",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "revealP",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "state_pln",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "enum AuctionMaster.Mode"
}
],
"stateMutability": "view"
},
{
"name": "tld",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "unsealBid_le$",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "_value",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_salt",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "unsealExternalBid_qfG",
"type": "function",
"inputs": [
{
"name": "_hash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "version",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "pure"
},
{
"name": "withdraw",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60e0604052600160075560405161644138038061644183398101604081905261002791610190565b3360a052426080526001600160a01b0380831660c052604080516316aa8a1960e11b8152905191831691632d551432916004808201925f929091908290030181865afa158015610079573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526100a091908101906101dc565b6006906100ad908261031b565b50816001600160a01b031663c47f00276040518060400160405280601681526020017f61756374696f6e6d61737465722e756e67726176656c0000000000000000000081525060066040516020016101069291906103d9565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401610131919061045d565b6020604051808303815f875af115801561014d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101719190610492565b5050506104a9565b6001600160a01b038116811461018d575f5ffd5b50565b5f5f604083850312156101a1575f5ffd5b82516101ac81610179565b60208401519092506101bd81610179565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156101ec575f5ffd5b81516001600160401b03811115610201575f5ffd5b8201601f81018413610211575f5ffd5b80516001600160401b0381111561022a5761022a6101c8565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610258576102586101c8565b60405281815282820160200186101561026f575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b600181811c908216806102a057607f821691505b6020821081036102be57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610316578282111561031657805f5260205f20601f840160051c60208510156102ef57505f5b90810190601f840160051c035f5b81811015610312575f838201556001016102fd565b5050505b505050565b81516001600160401b03811115610334576103346101c8565b61034881610342845461028c565b846102c4565b6020601f82116001811461037a575f83156103635750848201515b5f19600385901b1c1916600184901b1784556103d2565b5f84815260208120601f198516915b828110156103a95787850151825560209485019460019092019101610389565b50848210156103c657868401515f19600387901b60f8161c191681555b505060018360011b0184555b5050505050565b5f83518060208601845e80830190505f81525f84546103f78161028c565b60018216801561040e576001811461042357610450565b60ff1983168552811515820285019350610450565b875f5260205f205f5b838110156104485781548782015260019091019060200161042c565b505081850193505b5091979650505050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156104a2575f5ffd5b5051919050565b60805160a05160c051615f446104fd5f395f818161046501528181612dbd0152612e4b01525f818161054a0152818161139f01528181611495015261190901525f81816104b401526104e90152615f445ff3fe6080604052600436106101a2575f3560e01c8063488a90f0116100e6578063488a90f0146103cc57806351de0daa146103eb5780635292b872146103f357806354fd4d501461041f578063610db7af1461043557806370b228eb146104545780637dd4febf1461048757806383027f45146104a65780639c67f06f146104d85780639e5886311461050b578063a3570b9b1461051e578063bd00444d14610526578063d4846c3514610539578063d70caccc1461056c578063e1ea2b071461057f578063e9a4aed114610592578063f23a6e61146105c1578063fad8d6d414610606575f5ffd5b8061283b146101d957806146cb146101ee5780616154146102015780616a2614610236578061824d1461024957806192041461025c578061f5c21461026f5780630230a07c1461028257806302d629f2146102955780630b74bdaa146102c157806311ac72e0146102e057806322ec1244146102ff578063267b69221461032c5780632b936b7c1461035f5780632d551432146103725780633408e4701461039357806334f18df6146103a55780633ccfd60b146103c4575f5ffd5b366101d557604051349033907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c905f90a3005b5f5ffd5b6101ec6101e7366004613d27565b610625565b005b6101ec6101fc366004613d3e565b610917565b34801561020c575f5ffd5b5061022061021b366004613d27565b610945565b60405161022d9190613d92565b60405180910390f35b6101ec610244366004613d3e565b6109c2565b6101ec610257366004613d27565b610ae0565b6101ec61026a366004613d27565b610bb6565b6101ec61027d366004613db4565b610ec4565b6101ec610290366004613d27565b610fb2565b3480156102a0575f5ffd5b506004546102b4906001600160a01b031681565b60405161022d9190613dea565b3480156102cc575f5ffd5b506102b46102db366004613d27565b610fd1565b3480156102eb575f5ffd5b506102b46102fa366004613d27565b61104b565b34801561030a575f5ffd5b5061031e610319366004613dfe565b61105f565b60405190815260200161022d565b348015610337575f5ffd5b5061034b610346366004613d27565b611097565b60405161022d989796959493929190613e38565b6101ec61036d366004613d27565b61116a565b34801561037d575f5ffd5b506103866111b2565b60405161022d9190613e85565b34801561039e575f5ffd5b504661031e565b3480156103b0575f5ffd5b506101ec6103bf366004613eba565b61123e565b6101ec611390565b3480156103d7575f5ffd5b5061031e6103e6366004613ed5565b611452565b6101ec611486565b3480156103fe575f5ffd5b5061040761157c565b6040516001600160401b03909116815260200161022d565b34801561042a575f5ffd5b5063013154d061031e565b348015610440575f5ffd5b5061031e61044f366004613d27565b6115da565b34801561045f575f5ffd5b506102b47f000000000000000000000000000000000000000000000000000000000000000081565b348015610492575f5ffd5b506005546102b4906001600160a01b031681565b3480156104b1575f5ffd5b507f000000000000000000000000000000000000000000000000000000000000000061031e565b3480156104e3575f5ffd5b5061031e7f000000000000000000000000000000000000000000000000000000000000000081565b6101ec610519366004613eff565b6115e4565b6101ec6118fa565b6101ec610534366004613f2d565b6119f0565b348015610544575f5ffd5b506102b47f000000000000000000000000000000000000000000000000000000000000000081565b6101ec61057a366004613f56565b611a12565b6101ec61058d366004613d3e565b611bdf565b34801561059d575f5ffd5b506105b16105ac366004613d27565b611f54565b604051901515815260200161022d565b3480156105cc575f5ffd5b506105ed6105db366004613f88565b63f23a6e6160e01b9695505050505050565b6040516001600160e01b0319909116815260200161022d565b348015610611575f5ffd5b506102b4610620366004613ed5565b6120c8565b600160075f828254610637919061403f565b9091555050600754816106de61064c826120d3565b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610687573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ab9190614052565b6001600160a01b0316336001600160a01b031614604051806040016040528060018152602001600960fb1b8152506120ed565b5f6106e8846120d3565b905061074d60026106f886610945565b600681111561070957610709613d5e565b148061072e5750600661071b86610945565b600681111561072c5761072c613d5e565b145b604051806040016040528060018152602001602360f91b8152506120ed565b5f5f6107598684612115565b915091506107668261220c565b1561082c576107d682846001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107cf9190614052565b838661221a565b60405161495560e01b81526001600160a01b03841690614955906107fe908590600401613dea565b5f604051808303815f87803b158015610815575f5ffd5b505af1158015610827573d5f5f3e3d5ffd5b505050505b610837866001612384565b61084233875f6123dd565b80836001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a39190614052565b6001600160a01b0316877f581e6a55831079cea5921c4f298ef03621df4c829692f6b1c0c687d74f330a8c6108d78a612446565b60405190815260200160405180910390a4505050506109136007548214604051806040016040528060018152602001603960f91b8152506120ed565b5050565b8061092181612460565b61092a81611f54565b50610940338361093a338761259f565b866125c7565b505050565b5f61094f82612745565b1561095c57506006919050565b5f61096683612446565b90508042101561099c576109798361275e565b610983908261406d565b4210156109935750600192915050565b50600492915050565b6109a583612778565b5f036109b357505f92915050565b50600292915050565b50919050565b806109cc81612460565b610a62306001600160a01b0316336001600160a01b0316632b20e3976040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a15573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a399190614052565b6001600160a01b031614604051806040016040528060018152602001601560fa1b8152506120ed565b5f336001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ac39190614052565b9050610ada8184610ad4848861259f565b876125c7565b50505050565b80610aea81612460565b610b33306001600160a01b0316336001600160a01b0316632b20e3976040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a15573d5f5f3e3d5ffd5b6109135f336001600160a01b03163184336001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba39190614052565b5f516020615eef5f395f51905f52612795565b600160075f828254610bc8919061403f565b909155505060075481610bda81612460565b610c23306001600160a01b0316336001600160a01b0316632b20e3976040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a15573d5f5f3e3d5ffd5b5f610c2d846120d3565b9050610d5e610c3b85612745565b158015610c4f5750610c4c85612778565b15155b8015610d2a5750816001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb69190614052565b6001600160a01b0316336001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cfb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1f9190614052565b6001600160a01b0316145b8015610d3e5750610d3a85612446565b4210155b604051806040016040528060028152602001610ccf60f31b8152506120ed565b5f5f610d6a8684612115565b91509150610d778261220c565b15610e1257610dbc82846001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107ab573d5f5f3e3d5ffd5b60405161495560e01b81526001600160a01b0384169061495590610de4908590600401613dea565b5f604051808303815f87803b158015610dfb575f5ffd5b505af1158015610e0d573d5f5f3e3d5ffd5b505050505b610e1d866001612384565b610e87336001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e5c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e809190614052565b875f6123dd565b80836001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087f573d5f5f3e3d5ffd5b81610ece81612460565b610ed781611f54565b50600554610f48906001600160a01b038481169116148015610ef857508415155b8015610f1557505f610f0a338761259f565b6001600160a01b0316145b8015610f295750610f2584612c63565b3410155b604051806040016040528060018152602001603560f91b8152506120ed565b5f34833386604051610f5990613cd5565b6001600160a01b03938416815292909116602083015260408201526060016040518091039082f0905080158015610f92573d5f5f3e3d5ffd5b509050610fa0338683612c81565b610fab3385346123dd565b5050505050565b80610fbf61064c826120d3565b61091382610fcc846120d3565b612cc5565b5f81610fdc81612460565b610fe583612d86565b6001600160a01b0316630378d9b16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611020573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110449190614052565b9392505050565b5f8161105681612460565b61104483612d86565b5f848484846040516020016110779493929190614080565b604051602081830303815290604052805190602001209050949350505050565b5f5f5f5f5f5f5f5f5f6110a98a61275e565b90505f6110b58b610945565b90505f6110c18c6120d3565b90506110cb613ce2565b6110d48d612c63565b81526110df8d612745565b6110e9575f6110ec565b60015b60ff1660208201526110fd8d612778565b604082015261110b8d612da0565b60608201526111198d612446565b816004602002015282828260046020020151836003602002015184600260200201518560016020020151865f60200201518a9b509b509b509b509b509b509b509b5050505050919395975091939597565b80610fbf611177826120d3565b6001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610687573d5f5f3e3d5ffd5b600680546111bf906140b8565b80601f01602080910402602001604051908101604052809291908181526020018280546111eb906140b8565b80156112365780601f1061120d57610100808354040283529160200191611236565b820191905f5260205f20905b81548152906001019060200180831161121957829003601f168201915b505050505081565b61138d61124a8261220c565b801561125a575061125a82612dba565b801561136e57506001600160a01b03821630148061136e575061127c82612f31565b1580159061136e5750816001600160a01b0316826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112ef9190614052565b6001600160a01b031663deb931a261130685612f31565b6040518263ffffffff1660e01b815260040161132491815260200190565b602060405180830381865afa15801561133f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113639190614052565b6001600160a01b0316145b604051806040016040528060018152602001604d60f81b8152506120ed565b50565b6113e7336001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614604051806040016040528060018152602001605360f81b8152506120ed565b6040515f90339047908381818185875af1925050503d805f8114611426576040519150601f19603f3d011682016040523d82523d5f602084013e61142b565b606091505b5050905061138d81604051806040016040528060018152602001600b60fb1b8152506120ed565b6001600160a01b0382165f908152602081815260408083208484529091528120546001600160501b03165b90505b92915050565b6114dd336001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614604051806040016040528060018152602001605360f81b8152506120ed565b5f6115016040518060400160405280600281526020016134b760f11b815250613035565b60405161150d90613d00565b6115179190613e85565b6040518091039082f0905080158015611532573d5f5f3e3d5ffd5b50600580546001600160a01b0319166001600160a01b039290921691821790556040517f68968799e0f0315403f223f9a149d83d42af5c82f791ca47d9098179dedcd4ef905f90a2565b5f600a611595622520636001600160401b033a166140ea565b6115a09060646140ea565b6115aa9190614115565b905066038d7ea4c68000816001600160401b0316116115d7576115d466038d7ea4c6800082614142565b90505b90565b5f61148082612c63565b816115ee81612460565b600454611659906001600160a01b0384811691161480156116285750600161161585610945565b600681111561162657611626613d5e565b145b801561163a575061163884612745565b155b604051806040016040528060018152602001606360f81b8152506120ed565b5f5f838560405161166990613d0d565b611674929190614161565b6040518091039082f090508015801561168f573d5f5f3e3d5ffd5b5090505f61169c85612d86565b90505f6116a88261308f565b90505f816001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170b9190614052565b90505f836001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561174a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176e9190614052565b90505f61177a85613132565b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117b5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d99190614052565b90506118606117e78461220c565b80156117f757506117f78361220c565b801561180757506118078261220c565b80156118245750826001600160a01b0316846001600160a01b0316145b80156118415750836001600160a01b0316826001600160a01b0316145b604051806040016040528060018152602001602b60f91b8152506120ed565b5f61186a8661321f565b905061187586613132565b6001600160a01b031663b82b5a5861188c88612f31565b6040516001600160e01b031960e084901b1681526004810191909152602481018490526001600160a01b038a1660448201526064015f604051808303815f87803b1580156118d8575f5ffd5b505af11580156118ea573d5f5f3e3d5ffd5b5050505050505050505050505050565b611951336001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614604051806040016040528060018152602001605360f81b8152506120ed565b5f611975604051806040016040528060028152602001610caf60f31b815250613035565b60405161198190613d1a565b61198b9190613e85565b6040518091039082f09050801580156119a6573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b039290921691821790556040517fac68b168d054bd7d2af8e007c9b9b3cd9d21bff4326e7e29f6aeb515119cba8d905f90a2565b826119fa81612460565b611a0381611f54565b50610ada600184863386612795565b600160075f828254611a24919061403f565b909155505060075482611a3681612460565b611a7f306001600160a01b0316336001600160a01b0316632b20e3976040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a15573d5f5f3e3d5ffd5b5f611a8985612d86565b90505f611a958261308f565b90505f8688875f516020615eef5f395f51905f525f1b604051602001611abe9493929190614080565b60408051601f198184030181529082905280516020909101206353b0c0ed60e11b82526001600160a01b0385811660048401528a81166024840152909250611b9e919084169063a76181da90604401602060405180830381865afa158015611b28573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4c919061417a565b15801590611b6b57505f611b608a8461259f565b6001600160a01b0316145b8015611b7f5750611b7b88612c63565b8710155b604051806040016040528060018152602001607360f81b8152506120ed565b611ba9888233612c81565b611bb48888886123dd565b50505050610ada6007548214604051806040016040528060018152602001603960f91b8152506120ed565b600160075f828254611bf1919061403f565b9091555050600754611c023361123e565b5f6001336001600160a01b031663578cb8f96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c65919061417a565b611c6f919061406d565b9050611cba8115801590611c9b57505f611c8886610945565b6006811115611c9957611c99613d5e565b145b604051806040016040528060018152602001602d60f91b8152506120ed565b5f8363ffffffff165f03611ccf57603c611cd1565b835b90505f611cdd3361308f565b90505f816001600160a01b03166351f0713d336040518263ffffffff1660e01b8152600401611d0c9190613dea565b602060405180830381865afa158015611d27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4b919061417a565b90505f611d5661157c565b6001600160401b031690505f611d6b33613132565b90505f6064826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611d9c9190613dea565b602060405180830381865afa158015611db7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ddb919061417a565b611de59190614191565b604051631aae8f7360e11b8152600481018990529091505f9060d090339063355d1ee690602401602060405180830381865afa158015611e27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e4b919061417a565b6003911c169050611e5c81806140ea565b611e6790600161403f565b611e73906127106140ea565b611e7d908361403f565b90508415801590611e8e5750838510155b15611eae5762124f80611ea182876140ea565b611eab9190614191565b93505b611ebf8b8863ffffffff165f6135a8565b611ec98b5f6135de565b611ef28b33611ee263fffffffe60018c901b1642614142565b6001600160401b03165f88613625565b611efb8b612446565b6040518c907f87e97e825a1d1fa0c54e1d36c7506c1dea8b1efd451fe68b000cf96f7cf40003905f90a350505050505050506109406007548214604051806040016040528060018152602001603960f91b8152506120ed565b5f600160075f828254611f67919061403f565b909155505060075433611f7984610fd1565b6001600160a01b03166342042a036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fb4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd89190614052565b6001600160a01b031603611fef57600191506120a1565b5f611ff984612d86565b905061209b6001600160a01b0382161580159061207c5750604051632b0891e960e01b81526001600160a01b03831690632b0891e99061203d903390600401613dea565b602060405180830381865afa158015612058573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061207c91906141a4565b604051806040016040528060018152602001602760f91b8152506120ed565b60019250505b6109bc6007548214604051806040016040528060018152602001603960f91b8152506120ed565b5f61147d838361259f565b5f908152600160205260409020546001600160a01b031690565b80826109405760405162461bcd60e51b815260040161210c9190613e85565b60405180910390fd5b5f5f5f61213261212486612da0565b61212d87612c63565b613691565b905061213e85826136a7565b60405163f959e1ad60e01b8152600481018290526001600160a01b0385169063f959e1ad906024015f604051808303815f87803b15801561217d575f5ffd5b505af115801561218f573d5f5f3e3d5ffd5b505050505f61219d86612d86565b90506121a88161220c565b6122025760405161495560e01b81526001600160a01b03861690614955906121d4903090600401613dea565b5f604051808303815f87803b1580156121eb575f5ffd5b505af11580156121fd573d5f5f3e3d5ffd5b505050505b9590945092505050565b6001600160a01b0316151590565b5f61222485613132565b90506122876001600160a01b0385161580159061224957506001600160a01b03831615155b801561225457508315155b801561226857506001600160a01b03821615155b604051806040016040528060018152602001603b60f91b8152506120ed565b5f61229186612f31565b90505f826001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016122c09190613dea565b602060405180830381865afa1580156122db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ff919061417a565b9050801561237b5760405163176efcd160e11b81526001600160a01b0387811660048301526024820183905260448201879052606482018490528581166084830152841690632eddf9a29060a4015f604051808303815f87803b158015612364575f5ffd5b505af1158015612376573d5f5f3e3d5ffd5b505050505b50505050505050565b80156123bd575f828152600260205260409020546123ae90600160bf1b90600160bf1b191661403f565b5f838152600260205260409020555b8061091357505f9081526002602052604090208054600160bf1b19169055565b6001600160a01b0383165f9081526020818152604080832085845290915290205461241c906001600160501b038316906001600160501b03191661403f565b6001600160a01b039093165f90815260208181526040808320948352939052919091209190915550565b5f9081526002602052604090205460a01c637fffffff1690565b5f61246a82612d86565b90505f61247682612f31565b90505f826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124b5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124d99190614052565b9050610ada6124e784612dba565b80156124f257508215155b801561250257506125028261220c565b80156125805750604051636f5c98d160e11b8152600481018490526001600160a01b03808616919084169063deb931a290602401602060405180830381865afa158015612551573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125759190614052565b6001600160a01b0316145b604051806040016040528060018152602001602960f91b8152506120ed565b6001600160a01b039182165f90815260208181526040808320938352929052205460501c1690565b6001600160a01b038216158015906125e757506001600160a01b03841615155b15610ada576126c46125f884612745565b8061261b57505f61260885610945565b600681111561261957612619613d5e565b145b80156126a55750600161262d8561275e565b901b836001600160a01b03166305b344106040518163ffffffff1660e01b8152600401602060405180830381865afa15801561266b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061268f91906141c3565b6001600160401b03166126a2919061403f565b42115b604051806040016040528060018152602001601960fa1b8152506120ed565b60405161495560e01b81526001600160a01b03831690614955906126ec905f90600401613dea565b5f604051808303815f87803b158015612703575f5ffd5b505af1158015612715573d5f5f3e3d5ffd5b5050505061272484825f612c81565b61272f84845f6123dd565b5f61273984612d86565b9050610fab81826136e8565b5f90815260026020526040902054600160bf1b16151590565b5f9081526003602052604090205460501c637fffffff1690565b5f9081526001602052604090205460a01c6001600160501b031690565b5f838386846040516020016127ad9493929190614080565b6040516020818303038152906040528051906020012090508561280d5761280d84158015906127ed5750336127e2858461259f565b6001600160a01b0316145b60405180604001604052806002815260200161221960f11b8152506120ed565b5f612818848361259f565b90506128535f6001600160a01b0316826001600160a01b0316141560405180604001604052806002815260200161223160f11b8152506120ed565b61285e84835f612c81565b861561292d575f61286e86610945565b9050600281600681111561288457612884613d5e565b036128ee5760405161495560e01b81526001600160a01b03831690614955906128b1905f90600401613dea565b5f604051808303815f87803b1580156128c8575f5ffd5b505af11580156128da573d5f5f3e3d5ffd5b505050506128e985875f6123dd565b61292b565b600481600681111561290257612902613d5e565b1461292b5761292b5f6040518060400160405280600281526020016126a960f11b8152506120ed565b505b61293685612c63565b8610806129c557506129478561275e565b61295086612446565b61295a919061406d565b816001600160a01b03166305b344106040518163ffffffff1660e01b8152600401602060405180830381865afa158015612996573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129ba91906141c3565b6001600160401b0316115b15612a2f5760405161495560e01b81526001600160a01b03821690614955906129f2905f90600401613dea565b5f604051808303815f87803b158015612a09575f5ffd5b505af1158015612a1b573d5f5f3e3d5ffd5b50505050612a2a84865f6123dd565b61237b565b612a3885612778565b861115612bc1575f612a49866120d3565b6001600160a01b031614612ba45786612b02575f612a66866120d3565b9050612aa7816001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e5c573d5f5f3e3d5ffd5b60405161495560e01b81526001600160a01b0382169061495590612acf905f90600401613dea565b5f604051808303815f87803b158015612ae6575f5ffd5b505af1158015612af8573d5f5f3e3d5ffd5b5050505050612ba4565b5f612b0c866120d3565b9050612b4d816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e5c573d5f5f3e3d5ffd5b60405161495560e01b81526001600160a01b0382169061495590612b75905f90600401613dea565b5f604051808303815f87803b158015612b8c575f5ffd5b505af1158015612b9e573d5f5f3e3d5ffd5b50505050505b612bb685612bb187612778565b6136a7565b612a2a858288613819565b612bca85612da0565b861115612c0357612bdb85876136a7565b60405161495560e01b81526001600160a01b03821690614955906129f2905f90600401613dea565b60405161495560e01b81526001600160a01b0382169061495590612c2b905f90600401613dea565b5f604051808303815f87803b158015612c42575f5ffd5b505af1158015612c54573d5f5f3e3d5ffd5b5050505061237b84865f6123dd565b5f9081526002602052604090205460b01c67ffffffffffff00001690565b6001600160a01b0383165f9081526020818152604080832085845290915290205461241c906001600160501b0316600160501b600160f01b03605084901b1661403f565b612d186006612cd384610945565b6006811115612ce457612ce4613d5e565b148015612cf95750612cf583612446565b4210155b604051806040016040528060018152602001606560f81b8152506120ed565b612d22825f6136a7565b612d2d825f5f613819565b60405161495560e01b81526001600160a01b0382169061495590612d55905f90600401613dea565b5f604051808303815f87803b158015612d6c575f5ffd5b505af1158015612d7e573d5f5f3e3d5ffd5b505050505050565b5f908152600260205260409020546001600160a01b031690565b5f908152600360205260409020546001600160501b031690565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633f15457f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e17573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e3b9190614052565b6001600160a01b031663f79fe5387f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bffbe61c856040518263ffffffff1660e01b8152600401612e959190613dea565b602060405180830381865afa158015612eb0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed4919061417a565b6040518263ffffffff1660e01b8152600401612ef291815260200190565b602060405180830381865afa158015612f0d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061148091906141a4565b5f5f826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f939190614052565b9050612fcd5f6001600160a01b0316826001600160a01b03161415604051806040016040528060018152602001600d60fb1b8152506120ed565b604051631aae8f7360e11b81526001600160a01b03828116600483015284169063355d1ee690602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611044919061417a565b606081604051806040016040528060148152602001731d195c9b985b0b591959590b9d5b99dc985d995b60621b815250600660405160200161307993929190614200565b6040516020818303038152906040529050919050565b5f816001600160a01b0316630378d9b16040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130f09190614052565b905061312d6130fe8361220c565b801561310e575061310e8261220c565b604051806040016040528060018152602001605560f81b8152506120ed565b919050565b5f5f826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613170573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131949190614052565b90506131ce5f6001600160a01b0316826001600160a01b03161415604051806040016040528060018152602001600b60fb1b8152506120ed565b806001600160a01b03166336aaedbe6131e685612f31565b6040518263ffffffff1660e01b815260040161320491815260200190565b602060405180830381865afa158015611020573d5f5f3e3d5ffd5b5f5f826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561325d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132819190614052565b90506132bb5f6001600160a01b0316826001600160a01b03161415604051806040016040528060018152602001603360f91b8152506120ed565b5f816001600160a01b0316633f15457f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132f8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061331c9190614052565b90505f5f61332986613852565b909250905061337b6001600160a01b0384161580159061335157506001600160a01b03831615155b801561335c57508115155b604051806040016040528060018152602001601560f91b8152506120ed565b5f61338687836139bc565b90505f61339288612f31565b90505f80805b806133a2816142b0565b9150506133b76133b28683613a3c565b613a5a565b8051602091820120604080519283018790528201819052935060600160408051808303601f19018152908290528051602090910120631ef3fca760e31b82526004820181905292506001600160a01b0389169063f79fe53890602401602060405180830381865afa15801561342e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061345291906141a4565b801561345f5750601a8111155b61339857604051631ef3fca760e31b8152600481018390526001600160a01b0389169063f79fe53890602401602060405180830381865afa1580156134a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ca91906141a4565b613576575f6001600160a01b0316896001600160a01b03166347c5da986040518163ffffffff1660e01b8152600401602060405180830381865afa158015613514573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135389190614052565b6001600160a01b0316036135555750909998505050505050505050565b6135676135628683613a3c565b613bf8565b9b9a5050505050505050505050565b61359a5f60405180604001604052806002815260200161313160f11b8152506120ed565b505050505050505050919050565b6135c86001600160501b038216605084901b637fffffff60501b1661403f565b5f93845260036020526040909320929092555050565b5f828152600160205260409020546136109060a083901b600160a01b600160f01b0316906001600160a01b031661403f565b5f928352600160205260409092209190915550565b5f82156136335750600160bf1b5b65ffffffffffff60c01b60b083901b168161366460a087901b637fffffff60a01b166001600160a01b03891661403f565b61366e919061403f565b613678919061403f565b5f96875260026020526040909620959095555050505050565b5f8183106136a0575081611480565b5080611480565b5f828152600360205260409020546136d3906001600160501b038316906001600160501b03191661403f565b5f928352600360205260409092209190915550565b6136f18261220c565b6136f9575050565b5f61370383613132565b90506137476001600160a01b0383161580159061372857506001600160a01b03821615155b604051806040016040528060018152602001600760fc1b8152506120ed565b6040516370a0823160e01b81525f906001600160a01b038316906370a0823190613775903090600401613dea565b602060405180830381865afa158015613790573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137b4919061417a565b90508015610ada5760405161c77160e01b81526001600160a01b0383169061c771906137e69086908590600401614161565b5f604051808303815f87803b1580156137fd575f5ffd5b505af115801561380f573d5f5f3e3d5ffd5b5050505050505050565b61383c60a082901b600160a01b600160f01b03166001600160a01b03841661403f565b5f93845260016020526040909320929092555050565b5f5f5f5f846001600160a01b031663578cb8f96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613892573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138b6919061417a565b90506138de815f1415604051806040016040528060018152602001600360fc1b8152506120ed565b806138e8816142c8565b604051631aae8f7360e11b8152600481018290529092506001600160a01b038716915063355d1ee690602401602060405180830381865afa15801561392f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613953919061417a565b9150801580159061396357508115155b80156139755750600f60fc1b80831614155b6138de576040805180820190915260018152603760f91b60208201526139a7906001600160a01b0384163014906120ed565b6001600160a01b039190911694909350915050565b604051631aae8f7360e11b8152600481018290525f906030906001600160a01b0385169063355d1ee690602401602060405180830381865afa158015613a04573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a28919061417a565b65ffffffffffff60a01b16901b9392505050565b5f600883901c60f8613a4f84606061403f565b61147d92911b61403f565b6040805160208082528183019092526060915f91906020820181803683370190505090505f805b848260208110613a9357613a936140a4565b1a60f81b6001600160f81b03191615613ae957848260208110613ab857613ab86140a4565b1a60f81b838381518110613ace57613ace6140a4565b60200101906001600160f81b03191690815f1a905350613aec565b50805b81613af6816142b0565b925050602082108015613b07575080155b613a81575f816001600160401b03811115613b2457613b246142dd565b6040519080825280601f01601f191660200182016040528015613b4e576020820181803683370190505b5090505f92505b838381518110613b6757613b676140a4565b01602001516001600160f81b03191615613bc157838381518110613b8d57613b8d6140a4565b602001015160f81c60f81b818481518110613baa57613baa6140a4565b60200101906001600160f81b03191690815f1a9053505b81613bcb816142c8565b9250508280613bd9906142b0565b935050602083108015613beb57508115155b613b555795945050505050565b5f613c0a613c0583613a5a565b613c1b565b6114809060ff1660ff19841661403f565b80515f906001838101918401015b80821015613cce57815160ff166080811015613c5157613c4a60018461403f565b9250613cbb565b60e08160ff161015613c6857613c4a60028461403f565b60f08160ff161015613c7f57613c4a60038461403f565b60f88160ff161015613c9657613c4a60048461403f565b60fc8160ff161015613cad57613c4a60058461403f565b613cb860068461403f565b92505b5082613cc6816142b0565b935050613c29565b5050919050565b6103f8806142f283390190565b6040518060a001604052806005906020820280368337509192915050565b610897806146ea83390190565b61032380614f8183390190565b610c4b806152a483390190565b5f60208284031215613d37575f5ffd5b5035919050565b5f5f60408385031215613d4f575f5ffd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b60078110613d8e57634e487b7160e01b5f52602160045260245ffd5b9052565b602081016114808284613d72565b6001600160a01b038116811461138d575f5ffd5b5f5f5f60608486031215613dc6575f5ffd5b83359250602084013591506040840135613ddf81613da0565b809150509250925092565b6001600160a01b0391909116815260200190565b5f5f5f5f60808587031215613e11575f5ffd5b843593506020850135613e2381613da0565b93969395505050506040820135916060013590565b6101008101613e47828b613d72565b6001600160a01b0398909816602082015260408101969096526060860194909452608085019290925260a084015260c083015260e090910152919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215613eca575f5ffd5b813561104481613da0565b5f5f60408385031215613ee6575f5ffd5b8235613ef181613da0565b946020939093013593505050565b5f5f60408385031215613f10575f5ffd5b823591506020830135613f2281613da0565b809150509250929050565b5f5f5f60608486031215613f3f575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f60608486031215613f68575f5ffd5b8335613f7381613da0565b95602085013595506040909401359392505050565b5f5f5f5f5f5f60a08789031215613f9d575f5ffd5b8635613fa881613da0565b95506020870135613fb881613da0565b9450604087013593506060870135925060808701356001600160401b03811115613fe0575f5ffd5b8701601f81018913613ff0575f5ffd5b80356001600160401b03811115614005575f5ffd5b896020828401011115614016575f5ffd5b60208201935080925050509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b808201808211156114805761148061402b565b5f60208284031215614062575f5ffd5b815161104481613da0565b818103818111156114805761148061402b565b9384526001600160a01b039290921660208401526040830152606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806140cc57607f821691505b6020821081036109bc57634e487b7160e01b5f52602260045260245ffd5b80820281158282048414176114805761148061402b565b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0383168061412d5761412d614101565b806001600160401b0384160491505092915050565b6001600160401b0381811683821601908111156114805761148061402b565b6001600160a01b03929092168252602082015260400190565b5f6020828403121561418a575f5ffd5b5051919050565b5f8261419f5761419f614101565b500490565b5f602082840312156141b4575f5ffd5b81518015158114611044575f5ffd5b5f602082840312156141d3575f5ffd5b81516001600160401b0381168114611044575f5ffd5b5f81518060208401855e5f93019283525090919050565b5f61421461420e83876141e9565b856141e9565b83545f90600181811c9082168061422c57607f821691505b60208210810361424a57634e487b7160e01b5f52602260045260245ffd5b80801561425e5760018114614273576142a1565b60ff19841686528215158302860194506142a1565b5f898152602090205f5b848110156142995781548882015260019091019060200161427d565b505082860194505b50929998505050505050505050565b5f600182016142c1576142c161402b565b5060010190565b5f816142d6576142d661402b565b505f190190565b634e487b7160e01b5f52604160045260245ffdfe60806040526040516103f83803806103f8833981016040819052610022916100ba565b5f80546001600160a01b0319166001600160a01b03858116919091178255600280549185166001600160e01b031990921691909117600160a01b426001600160401b031602179055600182905560405130917ff8c55061664758367c865dbb9bc7769b0b38a15fa32b8c62322bd1efc567b8f491a25050506100f3565b80516001600160a01b03811681146100b5575f5ffd5b919050565b5f5f5f606084860312156100cc575f5ffd5b6100d58461009f565b92506100e36020850161009f565b9150604084015190509250925092565b6102f8806101005f395ff3fe608060405260043610610042575f3560e01c806305b34410146101bb57806323491869146101fe5780638da5cb5b14610221578063a619486e146102585761016b565b3661016b575f5f5f9054906101000a90046001600160a01b03166001600160a01b031663c546e5fb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610097573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100bb9190610276565b9050336001600160a01b0382161461013a5760015460405163e9a4aed160e01b815260048101919091526001600160a01b0382169063e9a4aed190602401602060405180830381865afa158015610114573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061013891906102a3565b505b604051365f82375f80548190369084906001600160a01b03165af490503d5f5f3e80610166576102045ffd5b503d5ff35b5f5f5f9054906101000a90046001600160a01b03166001600160a01b031663c546e5fb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610097573d5f5f3e3d5ffd5b3480156101c6575f5ffd5b506002546101e190600160a01b90046001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b348015610209575f5ffd5b5061021360015481565b6040519081526020016101f5565b34801561022c575f5ffd5b50600254610240906001600160a01b031681565b6040516001600160a01b0390911681526020016101f5565b348015610263575f5ffd5b505f54610240906001600160a01b031681565b5f60208284031215610286575f5ffd5b81516001600160a01b038116811461029c575f5ffd5b9392505050565b5f602082840312156102b3575f5ffd5b8151801515811461029c575f5ffdfea2646970667358221220b295b3f6e6c0cc4cf8ccfe8de48eae83acd6c91f9176b6b90580d220aa953ba664736f6c6343000821003360a0604052600160035560405161089738038061089783398101604081905261002791610184565b5f8054336001600160a01b0319909116811782556002805460808390526001600160e01b031916600160a01b600160e01b031990921691909117600160a01b426001600160401b03160217905560405130917f2baf35b00b455d039e283ce7101a4fe2fa96bac02567a4b74fee70b12efdfaa291a26080516001600160a01b03166370b228eb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100da573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100fe9190610234565b6001600160a01b031663c47f0027826040518263ffffffff1660e01b81526004016101299190610261565b6020604051808303815f875af1158015610145573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101699190610296565b50506102ad565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215610194575f5ffd5b81516001600160401b038111156101a9575f5ffd5b8201601f810184136101b9575f5ffd5b80516001600160401b038111156101d2576101d2610170565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020057610200610170565b604052818152828201602001861015610217575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215610244575f5ffd5b81516001600160a01b038116811461025a575f5ffd5b9392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156102a6575f5ffd5b5051919050565b6080516105c46102d35f395f818161015b015281816101d1015261035901526105c45ff3fe608060405260043610610068575f3560e01c806149551461006c57806304e80e901461008157806305b34410146100b657806323491869146100f45780632b20e397146101175780638da5cb5b1461012b578063c546e5fb1461014a578063f959e1ad1461017d575b5f5ffd5b61007f61007a3660046104aa565b610190565b005b34801561008c575f5ffd5b505f546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100c1575f5ffd5b506002546100dc90600160a01b90046001600160401b031681565b6040516001600160401b0390911681526020016100ad565b3480156100ff575f5ffd5b5061010960015481565b6040519081526020016100ad565b348015610122575f5ffd5b5061009961029f565b348015610136575f5ffd5b50600254610099906001600160a01b031681565b348015610155575f5ffd5b506100997f000000000000000000000000000000000000000000000000000000000000000081565b61007f61018b3660046104cc565b610318565b600160035f8282546101a291906104f7565b90915550506003546040805180820190915260018152600f60fb1b60208201526101f890336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016149061040d565b61023c6001600160a01b03831661021a576002546001600160a01b031661021c565b825b47604051806040016040528060018152602001604960f81b815250610431565b6040516001600160a01b0383169030907f871b8ea19b142db889ef4176d14f1bbcf494f76d7f8511a562c5cd713071b446905f90a3600354811461029b5760405162461bcd60e51b815260040161029290610510565b60405180910390fd5b5050565b5f5f5f9054906101000a90046001600160a01b03166001600160a01b031663c546e5fb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102ef573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610313919061052b565b905090565b600160035f82825461032a91906104f7565b90915550506003546040805180820190915260018152600f60fb1b602082015261038090336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016149061040d565b814711156103ec576002546103c1906001600160a01b03166103a28447610546565b604051806040016040528060018152602001604760f81b815250610431565b60405182907f9cd50fb5a4a96a214119847d663c370c93f98014b556d088357240d7c3b68557905f90a25b600354811461029b5760405162461bcd60e51b815260040161029290610510565b808261042c5760405162461bcd60e51b81526004016102929190610559565b505050565b5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f811461047a576040519150601f19603f3d011682016040523d82523d5f602084013e61047f565b606091505b5050905061048d818361040d565b50505050565b6001600160a01b03811681146104a7575f5ffd5b50565b5f602082840312156104ba575f5ffd5b81356104c581610493565b9392505050565b5f602082840312156104dc575f5ffd5b5035919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561050a5761050a6104e3565b92915050565b6020808252600190820152603960f91b604082015260600190565b5f6020828403121561053b575f5ffd5b81516104c581610493565b8181038181111561050a5761050a6104e3565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea264697066735822122047ddf20c2fd5dbed9e416c5b2e511da90454308d6dcb85536d76a1d6294aab2264736f6c6343000821003360806040526040516103233803806103238339810160408190526020916095565b5f8054600180546001600160a01b031916331790556001600160401b034216600160a01b026001600160e01b03199091166001600160a01b038516171781556002829055604051829130917fecaa63b23826d6939c8b3b3dd2e3e8b25aaa4bf2b4738d699883b6d7e6414f8c9190a3505060ca565b5f5f6040838503121560a5575f5ffd5b82516001600160a01b038116811460ba575f5ffd5b6020939093015192949293505050565b61024c806100d75f395ff3fe60806040526004361061004d575f3560e01c806305b344101461013457806323491869146101765780632b20e3971461019957806338af3eed146101c5578063a619486e146101e4576100f2565b366100f2576001546001600160a01b031633146100c157600154604051631a78c6fb60e11b81526001600160a01b03909116906334f18df690610094903390600401610202565b5f6040518083038186803b1580156100aa575f5ffd5b505afa1580156100bc573d5f5f3e3d5ffd5b505050505b604051365f82375f80548190369084906001600160a01b03165af490503d5f5f3e806100ed576102045ffd5b503d5ff35b6001546001600160a01b031633146100c157600154604051631a78c6fb60e11b81526001600160a01b03909116906334f18df690610094903390600401610202565b34801561013f575f5ffd5b505f5461015990600160a01b90046001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b348015610181575f5ffd5b5061018b60025481565b60405190815260200161016d565b3480156101a4575f5ffd5b506001546101b8906001600160a01b031681565b60405161016d9190610202565b3480156101d0575f5ffd5b506003546101b8906001600160a01b031681565b3480156101ef575f5ffd5b505f546101b8906001600160a01b031681565b6001600160a01b039190911681526020019056fea26469706673582212204d40397025600675ea42d70bd6e173369d7cd0b68462ce4d66f79620f23c3de664736f6c6343000821003360806040526001600455604051610c4b380380610c4b83398101604081905261002791610191565b5f805460018054336001600160a01b031990911681179091556001600160e01b0319909116600160a01b600160e01b031990911617600160a01b426001600160401b03160217815560405130917f2baf35b00b455d039e283ce7101a4fe2fa96bac02567a4b74fee70b12efdfaa291a260015f9054906101000a90046001600160a01b03166001600160a01b03166370b228eb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061010b9190610241565b6001600160a01b031663c47f0027826040518263ffffffff1660e01b8152600401610136919061026e565b6020604051808303815f875af1158015610152573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017691906102a3565b50506102ba565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156101a1575f5ffd5b81516001600160401b038111156101b6575f5ffd5b8201601f810184136101c6575f5ffd5b80516001600160401b038111156101df576101df61017d565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020d5761020d61017d565b604052818152828201602001861015610224575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215610251575f5ffd5b81516001600160a01b0381168114610267575f5ffd5b9392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156102b3575f5ffd5b5051919050565b610984806102c75f395ff3fe608060405260043610610060575f3560e01c806149551461055257806304e80e901461056557806305b344101461059357806323491869146105d05780632b20e397146105f357806338af3eed14610612578063f959e1ad14610631575f5ffd5b3661054e57600160045f828254610077919061085e565b909155505060048054600154604051631a78c6fb60e11b815291926001600160a01b03909116916334f18df6916100b091339101610877565b5f6040518083038186803b1580156100c6575f5ffd5b505afa1580156100d8573d5f5f3e3d5ffd5b505060015460025460405161185560e21b815260048101919091525f93506001600160a01b03909116915061615490602401602060405180830381865afa158015610125573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610149919061088b565b9050343347600184900361024d57600254610195901580159061016b57508315155b801561017657508382145b604051806040016040528060018152602001604360f81b815250610644565b600380546001600160a01b0319166001600160a01b038481169182179092556001546002546040516335c32b3360e21b815260048101939093526024830152604482018690529091169063d70caccc906064015f604051808303815f87803b1580156101ff575f5ffd5b505af1158015610211573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507f1c10a18fffb6543afbf4d75ce6f3cfa56c73dd74e56fdc8c9474f30fc271238691505f90a2610521565b6002546102989015801590610260575083155b801561027957506003546001600160a01b038481169116145b604051806040016040528060018152602001601160fa1b815250610644565b836004036103365760015460025460405161824d60e01b81526001600160a01b039092169161824d916102d19160040190815260200190565b5f604051808303815f87803b1580156102e8575f5ffd5b505af11580156102fa573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507fbb7f5ee433a2b38a41220afcf3d0bbd4859aac783c1b4897c742776030ca19e291505f90a2610521565b836002036103d45760015460025460405161248160e21b81526001600160a01b03909216916192049161036f9160040190815260200190565b5f604051808303815f87803b158015610386575f5ffd5b505af1158015610398573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507f578b9d29c44553b0f8fbdc6a93dfa736178942272a13103688b05b6ccd9cb81491505f90a2610521565b836006036104c9576001546002546003546040805160208101939093526001600160a01b0391821690830152606082018490527f4db45745d63e3d3fca02d388bb6d96a256b72fa6a5ca7e7b2c10c90c84130f3b608083015290911690616a269060a001604051602081830303815290604052805190602001206002546040518363ffffffff1660e01b8152600401610477929190918252602082015260400190565b5f604051808303815f87803b15801561048e575f5ffd5b505af11580156104a0573d5f5f3e3d5ffd5b50506040516001600160a01b03851692505f51602061092f5f395f51905f5291505f90a2610521565b835f03610521576003546040805180820190915260018152604560f81b6020820152610500916001600160a01b0316908390610671565b6040516001600160a01b038316905f51602061092f5f395f51905f52905f90a25b5050505061054c6004548214604051806040016040528060018152602001601d60fa1b815250610644565b005b5f5ffd5b61054c6105603660046108a2565b6106d3565b348015610570575f5ffd5b505f546001600160a01b03165b60405161058a9190610877565b60405180910390f35b34801561059e575f5ffd5b505f546105b890600160a01b90046001600160401b031681565b6040516001600160401b03909116815260200161058a565b3480156105db575f5ffd5b506105e560025481565b60405190815260200161058a565b3480156105fe575f5ffd5b5060015461057d906001600160a01b031681565b34801561061d575f5ffd5b5060035461057d906001600160a01b031681565b61054c61063f3660046108cf565b610781565b808261066c5760405162461bcd60e51b815260040161066391906108e6565b60405180910390fd5b505050565b5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f81146106ba576040519150601f19603f3d011682016040523d82523d5f602084013e6106bf565b606091505b505090506106cd8183610644565b50505050565b6001805460408051808201909152918252606f60f81b6020830152610705916001600160a01b03909116331490610644565b6107496001600160a01b038216610727576003546001600160a01b0316610729565b815b47604051806040016040528060018152602001602160f91b815250610671565b6040516001600160a01b0382169030907f871b8ea19b142db889ef4176d14f1bbcf494f76d7f8511a562c5cd713071b446905f90a350565b6001805460408051808201909152918252606f60f81b60208301526107b3916001600160a01b03909116331490610644565b6107d9475f1415604051806040016040528060018152602001606160f81b815250610644565b804711156108475760035461081a906001600160a01b03166107fb834761091b565b604051806040016040528060018152602001604160f81b815250610671565b604051819047907f365811741d37a3bf942e4c23d8e38cfbedcb4f029d42238bb81c87325cbd007c905f90a35b50565b634e487b7160e01b5f52601160045260245ffd5b808201808211156108715761087161084a565b92915050565b6001600160a01b0391909116815260200190565b5f6020828403121561089b575f5ffd5b5051919050565b5f602082840312156108b2575f5ffd5b81356001600160a01b03811681146108c8575f5ffd5b9392505050565b5f602082840312156108df575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b818103818111156108715761087161084a56fee71ef3bfd4185ae19262ec51a940e1f049287182a6ab8eb8a2d8fde2ca3f1527a2646970667358221220dff328b39f4f1ed7c1ce0745e669f06fb4dac7820244e03d7dedd3de5d335f3f64736f6c634300082100334db45745d63e3d3fca02d388bb6d96a256b72fa6a5ca7e7b2c10c90c84130f3ba2646970667358221220fbe6f9285e18a93f2fce469911264b3dea22ae6282f79ccc421e3c2893a7087164736f6c63430008210033000000000000000000000000afe96ad86a9b10834cb02ebe083c4044e27be623000000000000000000000000b4663dbd3b73466e101b05a25ebd443bb45d9945
0x6080604052600436106101a2575f3560e01c8063488a90f0116100e6578063488a90f0146103cc57806351de0daa146103eb5780635292b872146103f357806354fd4d501461041f578063610db7af1461043557806370b228eb146104545780637dd4febf1461048757806383027f45146104a65780639c67f06f146104d85780639e5886311461050b578063a3570b9b1461051e578063bd00444d14610526578063d4846c3514610539578063d70caccc1461056c578063e1ea2b071461057f578063e9a4aed114610592578063f23a6e61146105c1578063fad8d6d414610606575f5ffd5b8061283b146101d957806146cb146101ee5780616154146102015780616a2614610236578061824d1461024957806192041461025c578061f5c21461026f5780630230a07c1461028257806302d629f2146102955780630b74bdaa146102c157806311ac72e0146102e057806322ec1244146102ff578063267b69221461032c5780632b936b7c1461035f5780632d551432146103725780633408e4701461039357806334f18df6146103a55780633ccfd60b146103c4575f5ffd5b366101d557604051349033907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c905f90a3005b5f5ffd5b6101ec6101e7366004613d27565b610625565b005b6101ec6101fc366004613d3e565b610917565b34801561020c575f5ffd5b5061022061021b366004613d27565b610945565b60405161022d9190613d92565b60405180910390f35b6101ec610244366004613d3e565b6109c2565b6101ec610257366004613d27565b610ae0565b6101ec61026a366004613d27565b610bb6565b6101ec61027d366004613db4565b610ec4565b6101ec610290366004613d27565b610fb2565b3480156102a0575f5ffd5b506004546102b4906001600160a01b031681565b60405161022d9190613dea565b3480156102cc575f5ffd5b506102b46102db366004613d27565b610fd1565b3480156102eb575f5ffd5b506102b46102fa366004613d27565b61104b565b34801561030a575f5ffd5b5061031e610319366004613dfe565b61105f565b60405190815260200161022d565b348015610337575f5ffd5b5061034b610346366004613d27565b611097565b60405161022d989796959493929190613e38565b6101ec61036d366004613d27565b61116a565b34801561037d575f5ffd5b506103866111b2565b60405161022d9190613e85565b34801561039e575f5ffd5b504661031e565b3480156103b0575f5ffd5b506101ec6103bf366004613eba565b61123e565b6101ec611390565b3480156103d7575f5ffd5b5061031e6103e6366004613ed5565b611452565b6101ec611486565b3480156103fe575f5ffd5b5061040761157c565b6040516001600160401b03909116815260200161022d565b34801561042a575f5ffd5b5063013154d061031e565b348015610440575f5ffd5b5061031e61044f366004613d27565b6115da565b34801561045f575f5ffd5b506102b47f000000000000000000000000afe96ad86a9b10834cb02ebe083c4044e27be62381565b348015610492575f5ffd5b506005546102b4906001600160a01b031681565b3480156104b1575f5ffd5b507f000000000000000000000000000000000000000000000000000000006a4bc38161031e565b3480156104e3575f5ffd5b5061031e7f000000000000000000000000000000000000000000000000000000006a4bc38181565b6101ec610519366004613eff565b6115e4565b6101ec6118fa565b6101ec610534366004613f2d565b6119f0565b348015610544575f5ffd5b506102b47f0000000000000000000000009f88d9b0b934a5261c364a726a9a36d67b431cab81565b6101ec61057a366004613f56565b611a12565b6101ec61058d366004613d3e565b611bdf565b34801561059d575f5ffd5b506105b16105ac366004613d27565b611f54565b604051901515815260200161022d565b3480156105cc575f5ffd5b506105ed6105db366004613f88565b63f23a6e6160e01b9695505050505050565b6040516001600160e01b0319909116815260200161022d565b348015610611575f5ffd5b506102b4610620366004613ed5565b6120c8565b600160075f828254610637919061403f565b9091555050600754816106de61064c826120d3565b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610687573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ab9190614052565b6001600160a01b0316336001600160a01b031614604051806040016040528060018152602001600960fb1b8152506120ed565b5f6106e8846120d3565b905061074d60026106f886610945565b600681111561070957610709613d5e565b148061072e5750600661071b86610945565b600681111561072c5761072c613d5e565b145b604051806040016040528060018152602001602360f91b8152506120ed565b5f5f6107598684612115565b915091506107668261220c565b1561082c576107d682846001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107cf9190614052565b838661221a565b60405161495560e01b81526001600160a01b03841690614955906107fe908590600401613dea565b5f604051808303815f87803b158015610815575f5ffd5b505af1158015610827573d5f5f3e3d5ffd5b505050505b610837866001612384565b61084233875f6123dd565b80836001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a39190614052565b6001600160a01b0316877f581e6a55831079cea5921c4f298ef03621df4c829692f6b1c0c687d74f330a8c6108d78a612446565b60405190815260200160405180910390a4505050506109136007548214604051806040016040528060018152602001603960f91b8152506120ed565b5050565b8061092181612460565b61092a81611f54565b50610940338361093a338761259f565b866125c7565b505050565b5f61094f82612745565b1561095c57506006919050565b5f61096683612446565b90508042101561099c576109798361275e565b610983908261406d565b4210156109935750600192915050565b50600492915050565b6109a583612778565b5f036109b357505f92915050565b50600292915050565b50919050565b806109cc81612460565b610a62306001600160a01b0316336001600160a01b0316632b20e3976040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a15573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a399190614052565b6001600160a01b031614604051806040016040528060018152602001601560fa1b8152506120ed565b5f336001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ac39190614052565b9050610ada8184610ad4848861259f565b876125c7565b50505050565b80610aea81612460565b610b33306001600160a01b0316336001600160a01b0316632b20e3976040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a15573d5f5f3e3d5ffd5b6109135f336001600160a01b03163184336001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba39190614052565b5f516020615eef5f395f51905f52612795565b600160075f828254610bc8919061403f565b909155505060075481610bda81612460565b610c23306001600160a01b0316336001600160a01b0316632b20e3976040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a15573d5f5f3e3d5ffd5b5f610c2d846120d3565b9050610d5e610c3b85612745565b158015610c4f5750610c4c85612778565b15155b8015610d2a5750816001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb69190614052565b6001600160a01b0316336001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cfb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1f9190614052565b6001600160a01b0316145b8015610d3e5750610d3a85612446565b4210155b604051806040016040528060028152602001610ccf60f31b8152506120ed565b5f5f610d6a8684612115565b91509150610d778261220c565b15610e1257610dbc82846001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107ab573d5f5f3e3d5ffd5b60405161495560e01b81526001600160a01b0384169061495590610de4908590600401613dea565b5f604051808303815f87803b158015610dfb575f5ffd5b505af1158015610e0d573d5f5f3e3d5ffd5b505050505b610e1d866001612384565b610e87336001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e5c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e809190614052565b875f6123dd565b80836001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087f573d5f5f3e3d5ffd5b81610ece81612460565b610ed781611f54565b50600554610f48906001600160a01b038481169116148015610ef857508415155b8015610f1557505f610f0a338761259f565b6001600160a01b0316145b8015610f295750610f2584612c63565b3410155b604051806040016040528060018152602001603560f91b8152506120ed565b5f34833386604051610f5990613cd5565b6001600160a01b03938416815292909116602083015260408201526060016040518091039082f0905080158015610f92573d5f5f3e3d5ffd5b509050610fa0338683612c81565b610fab3385346123dd565b5050505050565b80610fbf61064c826120d3565b61091382610fcc846120d3565b612cc5565b5f81610fdc81612460565b610fe583612d86565b6001600160a01b0316630378d9b16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611020573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110449190614052565b9392505050565b5f8161105681612460565b61104483612d86565b5f848484846040516020016110779493929190614080565b604051602081830303815290604052805190602001209050949350505050565b5f5f5f5f5f5f5f5f5f6110a98a61275e565b90505f6110b58b610945565b90505f6110c18c6120d3565b90506110cb613ce2565b6110d48d612c63565b81526110df8d612745565b6110e9575f6110ec565b60015b60ff1660208201526110fd8d612778565b604082015261110b8d612da0565b60608201526111198d612446565b816004602002015282828260046020020151836003602002015184600260200201518560016020020151865f60200201518a9b509b509b509b509b509b509b509b5050505050919395975091939597565b80610fbf611177826120d3565b6001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610687573d5f5f3e3d5ffd5b600680546111bf906140b8565b80601f01602080910402602001604051908101604052809291908181526020018280546111eb906140b8565b80156112365780601f1061120d57610100808354040283529160200191611236565b820191905f5260205f20905b81548152906001019060200180831161121957829003601f168201915b505050505081565b61138d61124a8261220c565b801561125a575061125a82612dba565b801561136e57506001600160a01b03821630148061136e575061127c82612f31565b1580159061136e5750816001600160a01b0316826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112ef9190614052565b6001600160a01b031663deb931a261130685612f31565b6040518263ffffffff1660e01b815260040161132491815260200190565b602060405180830381865afa15801561133f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113639190614052565b6001600160a01b0316145b604051806040016040528060018152602001604d60f81b8152506120ed565b50565b6113e7336001600160a01b03167f0000000000000000000000009f88d9b0b934a5261c364a726a9a36d67b431cab6001600160a01b031614604051806040016040528060018152602001605360f81b8152506120ed565b6040515f90339047908381818185875af1925050503d805f8114611426576040519150601f19603f3d011682016040523d82523d5f602084013e61142b565b606091505b5050905061138d81604051806040016040528060018152602001600b60fb1b8152506120ed565b6001600160a01b0382165f908152602081815260408083208484529091528120546001600160501b03165b90505b92915050565b6114dd336001600160a01b03167f0000000000000000000000009f88d9b0b934a5261c364a726a9a36d67b431cab6001600160a01b031614604051806040016040528060018152602001605360f81b8152506120ed565b5f6115016040518060400160405280600281526020016134b760f11b815250613035565b60405161150d90613d00565b6115179190613e85565b6040518091039082f0905080158015611532573d5f5f3e3d5ffd5b50600580546001600160a01b0319166001600160a01b039290921691821790556040517f68968799e0f0315403f223f9a149d83d42af5c82f791ca47d9098179dedcd4ef905f90a2565b5f600a611595622520636001600160401b033a166140ea565b6115a09060646140ea565b6115aa9190614115565b905066038d7ea4c68000816001600160401b0316116115d7576115d466038d7ea4c6800082614142565b90505b90565b5f61148082612c63565b816115ee81612460565b600454611659906001600160a01b0384811691161480156116285750600161161585610945565b600681111561162657611626613d5e565b145b801561163a575061163884612745565b155b604051806040016040528060018152602001606360f81b8152506120ed565b5f5f838560405161166990613d0d565b611674929190614161565b6040518091039082f090508015801561168f573d5f5f3e3d5ffd5b5090505f61169c85612d86565b90505f6116a88261308f565b90505f816001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170b9190614052565b90505f836001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561174a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176e9190614052565b90505f61177a85613132565b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117b5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d99190614052565b90506118606117e78461220c565b80156117f757506117f78361220c565b801561180757506118078261220c565b80156118245750826001600160a01b0316846001600160a01b0316145b80156118415750836001600160a01b0316826001600160a01b0316145b604051806040016040528060018152602001602b60f91b8152506120ed565b5f61186a8661321f565b905061187586613132565b6001600160a01b031663b82b5a5861188c88612f31565b6040516001600160e01b031960e084901b1681526004810191909152602481018490526001600160a01b038a1660448201526064015f604051808303815f87803b1580156118d8575f5ffd5b505af11580156118ea573d5f5f3e3d5ffd5b5050505050505050505050505050565b611951336001600160a01b03167f0000000000000000000000009f88d9b0b934a5261c364a726a9a36d67b431cab6001600160a01b031614604051806040016040528060018152602001605360f81b8152506120ed565b5f611975604051806040016040528060028152602001610caf60f31b815250613035565b60405161198190613d1a565b61198b9190613e85565b6040518091039082f09050801580156119a6573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b039290921691821790556040517fac68b168d054bd7d2af8e007c9b9b3cd9d21bff4326e7e29f6aeb515119cba8d905f90a2565b826119fa81612460565b611a0381611f54565b50610ada600184863386612795565b600160075f828254611a24919061403f565b909155505060075482611a3681612460565b611a7f306001600160a01b0316336001600160a01b0316632b20e3976040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a15573d5f5f3e3d5ffd5b5f611a8985612d86565b90505f611a958261308f565b90505f8688875f516020615eef5f395f51905f525f1b604051602001611abe9493929190614080565b60408051601f198184030181529082905280516020909101206353b0c0ed60e11b82526001600160a01b0385811660048401528a81166024840152909250611b9e919084169063a76181da90604401602060405180830381865afa158015611b28573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4c919061417a565b15801590611b6b57505f611b608a8461259f565b6001600160a01b0316145b8015611b7f5750611b7b88612c63565b8710155b604051806040016040528060018152602001607360f81b8152506120ed565b611ba9888233612c81565b611bb48888886123dd565b50505050610ada6007548214604051806040016040528060018152602001603960f91b8152506120ed565b600160075f828254611bf1919061403f565b9091555050600754611c023361123e565b5f6001336001600160a01b031663578cb8f96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c65919061417a565b611c6f919061406d565b9050611cba8115801590611c9b57505f611c8886610945565b6006811115611c9957611c99613d5e565b145b604051806040016040528060018152602001602d60f91b8152506120ed565b5f8363ffffffff165f03611ccf57603c611cd1565b835b90505f611cdd3361308f565b90505f816001600160a01b03166351f0713d336040518263ffffffff1660e01b8152600401611d0c9190613dea565b602060405180830381865afa158015611d27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4b919061417a565b90505f611d5661157c565b6001600160401b031690505f611d6b33613132565b90505f6064826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611d9c9190613dea565b602060405180830381865afa158015611db7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ddb919061417a565b611de59190614191565b604051631aae8f7360e11b8152600481018990529091505f9060d090339063355d1ee690602401602060405180830381865afa158015611e27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e4b919061417a565b6003911c169050611e5c81806140ea565b611e6790600161403f565b611e73906127106140ea565b611e7d908361403f565b90508415801590611e8e5750838510155b15611eae5762124f80611ea182876140ea565b611eab9190614191565b93505b611ebf8b8863ffffffff165f6135a8565b611ec98b5f6135de565b611ef28b33611ee263fffffffe60018c901b1642614142565b6001600160401b03165f88613625565b611efb8b612446565b6040518c907f87e97e825a1d1fa0c54e1d36c7506c1dea8b1efd451fe68b000cf96f7cf40003905f90a350505050505050506109406007548214604051806040016040528060018152602001603960f91b8152506120ed565b5f600160075f828254611f67919061403f565b909155505060075433611f7984610fd1565b6001600160a01b03166342042a036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fb4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd89190614052565b6001600160a01b031603611fef57600191506120a1565b5f611ff984612d86565b905061209b6001600160a01b0382161580159061207c5750604051632b0891e960e01b81526001600160a01b03831690632b0891e99061203d903390600401613dea565b602060405180830381865afa158015612058573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061207c91906141a4565b604051806040016040528060018152602001602760f91b8152506120ed565b60019250505b6109bc6007548214604051806040016040528060018152602001603960f91b8152506120ed565b5f61147d838361259f565b5f908152600160205260409020546001600160a01b031690565b80826109405760405162461bcd60e51b815260040161210c9190613e85565b60405180910390fd5b5f5f5f61213261212486612da0565b61212d87612c63565b613691565b905061213e85826136a7565b60405163f959e1ad60e01b8152600481018290526001600160a01b0385169063f959e1ad906024015f604051808303815f87803b15801561217d575f5ffd5b505af115801561218f573d5f5f3e3d5ffd5b505050505f61219d86612d86565b90506121a88161220c565b6122025760405161495560e01b81526001600160a01b03861690614955906121d4903090600401613dea565b5f604051808303815f87803b1580156121eb575f5ffd5b505af11580156121fd573d5f5f3e3d5ffd5b505050505b9590945092505050565b6001600160a01b0316151590565b5f61222485613132565b90506122876001600160a01b0385161580159061224957506001600160a01b03831615155b801561225457508315155b801561226857506001600160a01b03821615155b604051806040016040528060018152602001603b60f91b8152506120ed565b5f61229186612f31565b90505f826001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016122c09190613dea565b602060405180830381865afa1580156122db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ff919061417a565b9050801561237b5760405163176efcd160e11b81526001600160a01b0387811660048301526024820183905260448201879052606482018490528581166084830152841690632eddf9a29060a4015f604051808303815f87803b158015612364575f5ffd5b505af1158015612376573d5f5f3e3d5ffd5b505050505b50505050505050565b80156123bd575f828152600260205260409020546123ae90600160bf1b90600160bf1b191661403f565b5f838152600260205260409020555b8061091357505f9081526002602052604090208054600160bf1b19169055565b6001600160a01b0383165f9081526020818152604080832085845290915290205461241c906001600160501b038316906001600160501b03191661403f565b6001600160a01b039093165f90815260208181526040808320948352939052919091209190915550565b5f9081526002602052604090205460a01c637fffffff1690565b5f61246a82612d86565b90505f61247682612f31565b90505f826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124b5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124d99190614052565b9050610ada6124e784612dba565b80156124f257508215155b801561250257506125028261220c565b80156125805750604051636f5c98d160e11b8152600481018490526001600160a01b03808616919084169063deb931a290602401602060405180830381865afa158015612551573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125759190614052565b6001600160a01b0316145b604051806040016040528060018152602001602960f91b8152506120ed565b6001600160a01b039182165f90815260208181526040808320938352929052205460501c1690565b6001600160a01b038216158015906125e757506001600160a01b03841615155b15610ada576126c46125f884612745565b8061261b57505f61260885610945565b600681111561261957612619613d5e565b145b80156126a55750600161262d8561275e565b901b836001600160a01b03166305b344106040518163ffffffff1660e01b8152600401602060405180830381865afa15801561266b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061268f91906141c3565b6001600160401b03166126a2919061403f565b42115b604051806040016040528060018152602001601960fa1b8152506120ed565b60405161495560e01b81526001600160a01b03831690614955906126ec905f90600401613dea565b5f604051808303815f87803b158015612703575f5ffd5b505af1158015612715573d5f5f3e3d5ffd5b5050505061272484825f612c81565b61272f84845f6123dd565b5f61273984612d86565b9050610fab81826136e8565b5f90815260026020526040902054600160bf1b16151590565b5f9081526003602052604090205460501c637fffffff1690565b5f9081526001602052604090205460a01c6001600160501b031690565b5f838386846040516020016127ad9493929190614080565b6040516020818303038152906040528051906020012090508561280d5761280d84158015906127ed5750336127e2858461259f565b6001600160a01b0316145b60405180604001604052806002815260200161221960f11b8152506120ed565b5f612818848361259f565b90506128535f6001600160a01b0316826001600160a01b0316141560405180604001604052806002815260200161223160f11b8152506120ed565b61285e84835f612c81565b861561292d575f61286e86610945565b9050600281600681111561288457612884613d5e565b036128ee5760405161495560e01b81526001600160a01b03831690614955906128b1905f90600401613dea565b5f604051808303815f87803b1580156128c8575f5ffd5b505af11580156128da573d5f5f3e3d5ffd5b505050506128e985875f6123dd565b61292b565b600481600681111561290257612902613d5e565b1461292b5761292b5f6040518060400160405280600281526020016126a960f11b8152506120ed565b505b61293685612c63565b8610806129c557506129478561275e565b61295086612446565b61295a919061406d565b816001600160a01b03166305b344106040518163ffffffff1660e01b8152600401602060405180830381865afa158015612996573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129ba91906141c3565b6001600160401b0316115b15612a2f5760405161495560e01b81526001600160a01b03821690614955906129f2905f90600401613dea565b5f604051808303815f87803b158015612a09575f5ffd5b505af1158015612a1b573d5f5f3e3d5ffd5b50505050612a2a84865f6123dd565b61237b565b612a3885612778565b861115612bc1575f612a49866120d3565b6001600160a01b031614612ba45786612b02575f612a66866120d3565b9050612aa7816001600160a01b03166338af3eed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e5c573d5f5f3e3d5ffd5b60405161495560e01b81526001600160a01b0382169061495590612acf905f90600401613dea565b5f604051808303815f87803b158015612ae6575f5ffd5b505af1158015612af8573d5f5f3e3d5ffd5b5050505050612ba4565b5f612b0c866120d3565b9050612b4d816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e5c573d5f5f3e3d5ffd5b60405161495560e01b81526001600160a01b0382169061495590612b75905f90600401613dea565b5f604051808303815f87803b158015612b8c575f5ffd5b505af1158015612b9e573d5f5f3e3d5ffd5b50505050505b612bb685612bb187612778565b6136a7565b612a2a858288613819565b612bca85612da0565b861115612c0357612bdb85876136a7565b60405161495560e01b81526001600160a01b03821690614955906129f2905f90600401613dea565b60405161495560e01b81526001600160a01b0382169061495590612c2b905f90600401613dea565b5f604051808303815f87803b158015612c42575f5ffd5b505af1158015612c54573d5f5f3e3d5ffd5b5050505061237b84865f6123dd565b5f9081526002602052604090205460b01c67ffffffffffff00001690565b6001600160a01b0383165f9081526020818152604080832085845290915290205461241c906001600160501b0316600160501b600160f01b03605084901b1661403f565b612d186006612cd384610945565b6006811115612ce457612ce4613d5e565b148015612cf95750612cf583612446565b4210155b604051806040016040528060018152602001606560f81b8152506120ed565b612d22825f6136a7565b612d2d825f5f613819565b60405161495560e01b81526001600160a01b0382169061495590612d55905f90600401613dea565b5f604051808303815f87803b158015612d6c575f5ffd5b505af1158015612d7e573d5f5f3e3d5ffd5b505050505050565b5f908152600260205260409020546001600160a01b031690565b5f908152600360205260409020546001600160501b031690565b5f7f000000000000000000000000afe96ad86a9b10834cb02ebe083c4044e27be6236001600160a01b0316633f15457f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e17573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e3b9190614052565b6001600160a01b031663f79fe5387f000000000000000000000000afe96ad86a9b10834cb02ebe083c4044e27be6236001600160a01b031663bffbe61c856040518263ffffffff1660e01b8152600401612e959190613dea565b602060405180830381865afa158015612eb0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed4919061417a565b6040518263ffffffff1660e01b8152600401612ef291815260200190565b602060405180830381865afa158015612f0d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061148091906141a4565b5f5f826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f939190614052565b9050612fcd5f6001600160a01b0316826001600160a01b03161415604051806040016040528060018152602001600d60fb1b8152506120ed565b604051631aae8f7360e11b81526001600160a01b03828116600483015284169063355d1ee690602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611044919061417a565b606081604051806040016040528060148152602001731d195c9b985b0b591959590b9d5b99dc985d995b60621b815250600660405160200161307993929190614200565b6040516020818303038152906040529050919050565b5f816001600160a01b0316630378d9b16040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130f09190614052565b905061312d6130fe8361220c565b801561310e575061310e8261220c565b604051806040016040528060018152602001605560f81b8152506120ed565b919050565b5f5f826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613170573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131949190614052565b90506131ce5f6001600160a01b0316826001600160a01b03161415604051806040016040528060018152602001600b60fb1b8152506120ed565b806001600160a01b03166336aaedbe6131e685612f31565b6040518263ffffffff1660e01b815260040161320491815260200190565b602060405180830381865afa158015611020573d5f5f3e3d5ffd5b5f5f826001600160a01b03166327a58be76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561325d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132819190614052565b90506132bb5f6001600160a01b0316826001600160a01b03161415604051806040016040528060018152602001603360f91b8152506120ed565b5f816001600160a01b0316633f15457f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132f8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061331c9190614052565b90505f5f61332986613852565b909250905061337b6001600160a01b0384161580159061335157506001600160a01b03831615155b801561335c57508115155b604051806040016040528060018152602001601560f91b8152506120ed565b5f61338687836139bc565b90505f61339288612f31565b90505f80805b806133a2816142b0565b9150506133b76133b28683613a3c565b613a5a565b8051602091820120604080519283018790528201819052935060600160408051808303601f19018152908290528051602090910120631ef3fca760e31b82526004820181905292506001600160a01b0389169063f79fe53890602401602060405180830381865afa15801561342e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061345291906141a4565b801561345f5750601a8111155b61339857604051631ef3fca760e31b8152600481018390526001600160a01b0389169063f79fe53890602401602060405180830381865afa1580156134a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ca91906141a4565b613576575f6001600160a01b0316896001600160a01b03166347c5da986040518163ffffffff1660e01b8152600401602060405180830381865afa158015613514573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135389190614052565b6001600160a01b0316036135555750909998505050505050505050565b6135676135628683613a3c565b613bf8565b9b9a5050505050505050505050565b61359a5f60405180604001604052806002815260200161313160f11b8152506120ed565b505050505050505050919050565b6135c86001600160501b038216605084901b637fffffff60501b1661403f565b5f93845260036020526040909320929092555050565b5f828152600160205260409020546136109060a083901b600160a01b600160f01b0316906001600160a01b031661403f565b5f928352600160205260409092209190915550565b5f82156136335750600160bf1b5b65ffffffffffff60c01b60b083901b168161366460a087901b637fffffff60a01b166001600160a01b03891661403f565b61366e919061403f565b613678919061403f565b5f96875260026020526040909620959095555050505050565b5f8183106136a0575081611480565b5080611480565b5f828152600360205260409020546136d3906001600160501b038316906001600160501b03191661403f565b5f928352600360205260409092209190915550565b6136f18261220c565b6136f9575050565b5f61370383613132565b90506137476001600160a01b0383161580159061372857506001600160a01b03821615155b604051806040016040528060018152602001600760fc1b8152506120ed565b6040516370a0823160e01b81525f906001600160a01b038316906370a0823190613775903090600401613dea565b602060405180830381865afa158015613790573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137b4919061417a565b90508015610ada5760405161c77160e01b81526001600160a01b0383169061c771906137e69086908590600401614161565b5f604051808303815f87803b1580156137fd575f5ffd5b505af115801561380f573d5f5f3e3d5ffd5b5050505050505050565b61383c60a082901b600160a01b600160f01b03166001600160a01b03841661403f565b5f93845260016020526040909320929092555050565b5f5f5f5f846001600160a01b031663578cb8f96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613892573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138b6919061417a565b90506138de815f1415604051806040016040528060018152602001600360fc1b8152506120ed565b806138e8816142c8565b604051631aae8f7360e11b8152600481018290529092506001600160a01b038716915063355d1ee690602401602060405180830381865afa15801561392f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613953919061417a565b9150801580159061396357508115155b80156139755750600f60fc1b80831614155b6138de576040805180820190915260018152603760f91b60208201526139a7906001600160a01b0384163014906120ed565b6001600160a01b039190911694909350915050565b604051631aae8f7360e11b8152600481018290525f906030906001600160a01b0385169063355d1ee690602401602060405180830381865afa158015613a04573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a28919061417a565b65ffffffffffff60a01b16901b9392505050565b5f600883901c60f8613a4f84606061403f565b61147d92911b61403f565b6040805160208082528183019092526060915f91906020820181803683370190505090505f805b848260208110613a9357613a936140a4565b1a60f81b6001600160f81b03191615613ae957848260208110613ab857613ab86140a4565b1a60f81b838381518110613ace57613ace6140a4565b60200101906001600160f81b03191690815f1a905350613aec565b50805b81613af6816142b0565b925050602082108015613b07575080155b613a81575f816001600160401b03811115613b2457613b246142dd565b6040519080825280601f01601f191660200182016040528015613b4e576020820181803683370190505b5090505f92505b838381518110613b6757613b676140a4565b01602001516001600160f81b03191615613bc157838381518110613b8d57613b8d6140a4565b602001015160f81c60f81b818481518110613baa57613baa6140a4565b60200101906001600160f81b03191690815f1a9053505b81613bcb816142c8565b9250508280613bd9906142b0565b935050602083108015613beb57508115155b613b555795945050505050565b5f613c0a613c0583613a5a565b613c1b565b6114809060ff1660ff19841661403f565b80515f906001838101918401015b80821015613cce57815160ff166080811015613c5157613c4a60018461403f565b9250613cbb565b60e08160ff161015613c6857613c4a60028461403f565b60f08160ff161015613c7f57613c4a60038461403f565b60f88160ff161015613c9657613c4a60048461403f565b60fc8160ff161015613cad57613c4a60058461403f565b613cb860068461403f565b92505b5082613cc6816142b0565b935050613c29565b5050919050565b6103f8806142f283390190565b6040518060a001604052806005906020820280368337509192915050565b610897806146ea83390190565b61032380614f8183390190565b610c4b806152a483390190565b5f60208284031215613d37575f5ffd5b5035919050565b5f5f60408385031215613d4f575f5ffd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b60078110613d8e57634e487b7160e01b5f52602160045260245ffd5b9052565b602081016114808284613d72565b6001600160a01b038116811461138d575f5ffd5b5f5f5f60608486031215613dc6575f5ffd5b83359250602084013591506040840135613ddf81613da0565b809150509250925092565b6001600160a01b0391909116815260200190565b5f5f5f5f60808587031215613e11575f5ffd5b843593506020850135613e2381613da0565b93969395505050506040820135916060013590565b6101008101613e47828b613d72565b6001600160a01b0398909816602082015260408101969096526060860194909452608085019290925260a084015260c083015260e090910152919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215613eca575f5ffd5b813561104481613da0565b5f5f60408385031215613ee6575f5ffd5b8235613ef181613da0565b946020939093013593505050565b5f5f60408385031215613f10575f5ffd5b823591506020830135613f2281613da0565b809150509250929050565b5f5f5f60608486031215613f3f575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f60608486031215613f68575f5ffd5b8335613f7381613da0565b95602085013595506040909401359392505050565b5f5f5f5f5f5f60a08789031215613f9d575f5ffd5b8635613fa881613da0565b95506020870135613fb881613da0565b9450604087013593506060870135925060808701356001600160401b03811115613fe0575f5ffd5b8701601f81018913613ff0575f5ffd5b80356001600160401b03811115614005575f5ffd5b896020828401011115614016575f5ffd5b60208201935080925050509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b808201808211156114805761148061402b565b5f60208284031215614062575f5ffd5b815161104481613da0565b818103818111156114805761148061402b565b9384526001600160a01b039290921660208401526040830152606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806140cc57607f821691505b6020821081036109bc57634e487b7160e01b5f52602260045260245ffd5b80820281158282048414176114805761148061402b565b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0383168061412d5761412d614101565b806001600160401b0384160491505092915050565b6001600160401b0381811683821601908111156114805761148061402b565b6001600160a01b03929092168252602082015260400190565b5f6020828403121561418a575f5ffd5b5051919050565b5f8261419f5761419f614101565b500490565b5f602082840312156141b4575f5ffd5b81518015158114611044575f5ffd5b5f602082840312156141d3575f5ffd5b81516001600160401b0381168114611044575f5ffd5b5f81518060208401855e5f93019283525090919050565b5f61421461420e83876141e9565b856141e9565b83545f90600181811c9082168061422c57607f821691505b60208210810361424a57634e487b7160e01b5f52602260045260245ffd5b80801561425e5760018114614273576142a1565b60ff19841686528215158302860194506142a1565b5f898152602090205f5b848110156142995781548882015260019091019060200161427d565b505082860194505b50929998505050505050505050565b5f600182016142c1576142c161402b565b5060010190565b5f816142d6576142d661402b565b505f190190565b634e487b7160e01b5f52604160045260245ffdfe60806040526040516103f83803806103f8833981016040819052610022916100ba565b5f80546001600160a01b0319166001600160a01b03858116919091178255600280549185166001600160e01b031990921691909117600160a01b426001600160401b031602179055600182905560405130917ff8c55061664758367c865dbb9bc7769b0b38a15fa32b8c62322bd1efc567b8f491a25050506100f3565b80516001600160a01b03811681146100b5575f5ffd5b919050565b5f5f5f606084860312156100cc575f5ffd5b6100d58461009f565b92506100e36020850161009f565b9150604084015190509250925092565b6102f8806101005f395ff3fe608060405260043610610042575f3560e01c806305b34410146101bb57806323491869146101fe5780638da5cb5b14610221578063a619486e146102585761016b565b3661016b575f5f5f9054906101000a90046001600160a01b03166001600160a01b031663c546e5fb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610097573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100bb9190610276565b9050336001600160a01b0382161461013a5760015460405163e9a4aed160e01b815260048101919091526001600160a01b0382169063e9a4aed190602401602060405180830381865afa158015610114573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061013891906102a3565b505b604051365f82375f80548190369084906001600160a01b03165af490503d5f5f3e80610166576102045ffd5b503d5ff35b5f5f5f9054906101000a90046001600160a01b03166001600160a01b031663c546e5fb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610097573d5f5f3e3d5ffd5b3480156101c6575f5ffd5b506002546101e190600160a01b90046001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b348015610209575f5ffd5b5061021360015481565b6040519081526020016101f5565b34801561022c575f5ffd5b50600254610240906001600160a01b031681565b6040516001600160a01b0390911681526020016101f5565b348015610263575f5ffd5b505f54610240906001600160a01b031681565b5f60208284031215610286575f5ffd5b81516001600160a01b038116811461029c575f5ffd5b9392505050565b5f602082840312156102b3575f5ffd5b8151801515811461029c575f5ffdfea2646970667358221220b295b3f6e6c0cc4cf8ccfe8de48eae83acd6c91f9176b6b90580d220aa953ba664736f6c6343000821003360a0604052600160035560405161089738038061089783398101604081905261002791610184565b5f8054336001600160a01b0319909116811782556002805460808390526001600160e01b031916600160a01b600160e01b031990921691909117600160a01b426001600160401b03160217905560405130917f2baf35b00b455d039e283ce7101a4fe2fa96bac02567a4b74fee70b12efdfaa291a26080516001600160a01b03166370b228eb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100da573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100fe9190610234565b6001600160a01b031663c47f0027826040518263ffffffff1660e01b81526004016101299190610261565b6020604051808303815f875af1158015610145573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101699190610296565b50506102ad565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215610194575f5ffd5b81516001600160401b038111156101a9575f5ffd5b8201601f810184136101b9575f5ffd5b80516001600160401b038111156101d2576101d2610170565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020057610200610170565b604052818152828201602001861015610217575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215610244575f5ffd5b81516001600160a01b038116811461025a575f5ffd5b9392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156102a6575f5ffd5b5051919050565b6080516105c46102d35f395f818161015b015281816101d1015261035901526105c45ff3fe608060405260043610610068575f3560e01c806149551461006c57806304e80e901461008157806305b34410146100b657806323491869146100f45780632b20e397146101175780638da5cb5b1461012b578063c546e5fb1461014a578063f959e1ad1461017d575b5f5ffd5b61007f61007a3660046104aa565b610190565b005b34801561008c575f5ffd5b505f546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100c1575f5ffd5b506002546100dc90600160a01b90046001600160401b031681565b6040516001600160401b0390911681526020016100ad565b3480156100ff575f5ffd5b5061010960015481565b6040519081526020016100ad565b348015610122575f5ffd5b5061009961029f565b348015610136575f5ffd5b50600254610099906001600160a01b031681565b348015610155575f5ffd5b506100997f000000000000000000000000000000000000000000000000000000000000000081565b61007f61018b3660046104cc565b610318565b600160035f8282546101a291906104f7565b90915550506003546040805180820190915260018152600f60fb1b60208201526101f890336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016149061040d565b61023c6001600160a01b03831661021a576002546001600160a01b031661021c565b825b47604051806040016040528060018152602001604960f81b815250610431565b6040516001600160a01b0383169030907f871b8ea19b142db889ef4176d14f1bbcf494f76d7f8511a562c5cd713071b446905f90a3600354811461029b5760405162461bcd60e51b815260040161029290610510565b60405180910390fd5b5050565b5f5f5f9054906101000a90046001600160a01b03166001600160a01b031663c546e5fb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102ef573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610313919061052b565b905090565b600160035f82825461032a91906104f7565b90915550506003546040805180820190915260018152600f60fb1b602082015261038090336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016149061040d565b814711156103ec576002546103c1906001600160a01b03166103a28447610546565b604051806040016040528060018152602001604760f81b815250610431565b60405182907f9cd50fb5a4a96a214119847d663c370c93f98014b556d088357240d7c3b68557905f90a25b600354811461029b5760405162461bcd60e51b815260040161029290610510565b808261042c5760405162461bcd60e51b81526004016102929190610559565b505050565b5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f811461047a576040519150601f19603f3d011682016040523d82523d5f602084013e61047f565b606091505b5050905061048d818361040d565b50505050565b6001600160a01b03811681146104a7575f5ffd5b50565b5f602082840312156104ba575f5ffd5b81356104c581610493565b9392505050565b5f602082840312156104dc575f5ffd5b5035919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561050a5761050a6104e3565b92915050565b6020808252600190820152603960f91b604082015260600190565b5f6020828403121561053b575f5ffd5b81516104c581610493565b8181038181111561050a5761050a6104e3565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea264697066735822122047ddf20c2fd5dbed9e416c5b2e511da90454308d6dcb85536d76a1d6294aab2264736f6c6343000821003360806040526040516103233803806103238339810160408190526020916095565b5f8054600180546001600160a01b031916331790556001600160401b034216600160a01b026001600160e01b03199091166001600160a01b038516171781556002829055604051829130917fecaa63b23826d6939c8b3b3dd2e3e8b25aaa4bf2b4738d699883b6d7e6414f8c9190a3505060ca565b5f5f6040838503121560a5575f5ffd5b82516001600160a01b038116811460ba575f5ffd5b6020939093015192949293505050565b61024c806100d75f395ff3fe60806040526004361061004d575f3560e01c806305b344101461013457806323491869146101765780632b20e3971461019957806338af3eed146101c5578063a619486e146101e4576100f2565b366100f2576001546001600160a01b031633146100c157600154604051631a78c6fb60e11b81526001600160a01b03909116906334f18df690610094903390600401610202565b5f6040518083038186803b1580156100aa575f5ffd5b505afa1580156100bc573d5f5f3e3d5ffd5b505050505b604051365f82375f80548190369084906001600160a01b03165af490503d5f5f3e806100ed576102045ffd5b503d5ff35b6001546001600160a01b031633146100c157600154604051631a78c6fb60e11b81526001600160a01b03909116906334f18df690610094903390600401610202565b34801561013f575f5ffd5b505f5461015990600160a01b90046001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b348015610181575f5ffd5b5061018b60025481565b60405190815260200161016d565b3480156101a4575f5ffd5b506001546101b8906001600160a01b031681565b60405161016d9190610202565b3480156101d0575f5ffd5b506003546101b8906001600160a01b031681565b3480156101ef575f5ffd5b505f546101b8906001600160a01b031681565b6001600160a01b039190911681526020019056fea26469706673582212204d40397025600675ea42d70bd6e173369d7cd0b68462ce4d66f79620f23c3de664736f6c6343000821003360806040526001600455604051610c4b380380610c4b83398101604081905261002791610191565b5f805460018054336001600160a01b031990911681179091556001600160e01b0319909116600160a01b600160e01b031990911617600160a01b426001600160401b03160217815560405130917f2baf35b00b455d039e283ce7101a4fe2fa96bac02567a4b74fee70b12efdfaa291a260015f9054906101000a90046001600160a01b03166001600160a01b03166370b228eb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061010b9190610241565b6001600160a01b031663c47f0027826040518263ffffffff1660e01b8152600401610136919061026e565b6020604051808303815f875af1158015610152573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017691906102a3565b50506102ba565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156101a1575f5ffd5b81516001600160401b038111156101b6575f5ffd5b8201601f810184136101c6575f5ffd5b80516001600160401b038111156101df576101df61017d565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020d5761020d61017d565b604052818152828201602001861015610224575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215610251575f5ffd5b81516001600160a01b0381168114610267575f5ffd5b9392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156102b3575f5ffd5b5051919050565b610984806102c75f395ff3fe608060405260043610610060575f3560e01c806149551461055257806304e80e901461056557806305b344101461059357806323491869146105d05780632b20e397146105f357806338af3eed14610612578063f959e1ad14610631575f5ffd5b3661054e57600160045f828254610077919061085e565b909155505060048054600154604051631a78c6fb60e11b815291926001600160a01b03909116916334f18df6916100b091339101610877565b5f6040518083038186803b1580156100c6575f5ffd5b505afa1580156100d8573d5f5f3e3d5ffd5b505060015460025460405161185560e21b815260048101919091525f93506001600160a01b03909116915061615490602401602060405180830381865afa158015610125573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610149919061088b565b9050343347600184900361024d57600254610195901580159061016b57508315155b801561017657508382145b604051806040016040528060018152602001604360f81b815250610644565b600380546001600160a01b0319166001600160a01b038481169182179092556001546002546040516335c32b3360e21b815260048101939093526024830152604482018690529091169063d70caccc906064015f604051808303815f87803b1580156101ff575f5ffd5b505af1158015610211573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507f1c10a18fffb6543afbf4d75ce6f3cfa56c73dd74e56fdc8c9474f30fc271238691505f90a2610521565b6002546102989015801590610260575083155b801561027957506003546001600160a01b038481169116145b604051806040016040528060018152602001601160fa1b815250610644565b836004036103365760015460025460405161824d60e01b81526001600160a01b039092169161824d916102d19160040190815260200190565b5f604051808303815f87803b1580156102e8575f5ffd5b505af11580156102fa573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507fbb7f5ee433a2b38a41220afcf3d0bbd4859aac783c1b4897c742776030ca19e291505f90a2610521565b836002036103d45760015460025460405161248160e21b81526001600160a01b03909216916192049161036f9160040190815260200190565b5f604051808303815f87803b158015610386575f5ffd5b505af1158015610398573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507f578b9d29c44553b0f8fbdc6a93dfa736178942272a13103688b05b6ccd9cb81491505f90a2610521565b836006036104c9576001546002546003546040805160208101939093526001600160a01b0391821690830152606082018490527f4db45745d63e3d3fca02d388bb6d96a256b72fa6a5ca7e7b2c10c90c84130f3b608083015290911690616a269060a001604051602081830303815290604052805190602001206002546040518363ffffffff1660e01b8152600401610477929190918252602082015260400190565b5f604051808303815f87803b15801561048e575f5ffd5b505af11580156104a0573d5f5f3e3d5ffd5b50506040516001600160a01b03851692505f51602061092f5f395f51905f5291505f90a2610521565b835f03610521576003546040805180820190915260018152604560f81b6020820152610500916001600160a01b0316908390610671565b6040516001600160a01b038316905f51602061092f5f395f51905f52905f90a25b5050505061054c6004548214604051806040016040528060018152602001601d60fa1b815250610644565b005b5f5ffd5b61054c6105603660046108a2565b6106d3565b348015610570575f5ffd5b505f546001600160a01b03165b60405161058a9190610877565b60405180910390f35b34801561059e575f5ffd5b505f546105b890600160a01b90046001600160401b031681565b6040516001600160401b03909116815260200161058a565b3480156105db575f5ffd5b506105e560025481565b60405190815260200161058a565b3480156105fe575f5ffd5b5060015461057d906001600160a01b031681565b34801561061d575f5ffd5b5060035461057d906001600160a01b031681565b61054c61063f3660046108cf565b610781565b808261066c5760405162461bcd60e51b815260040161066391906108e6565b60405180910390fd5b505050565b5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f81146106ba576040519150601f19603f3d011682016040523d82523d5f602084013e6106bf565b606091505b505090506106cd8183610644565b50505050565b6001805460408051808201909152918252606f60f81b6020830152610705916001600160a01b03909116331490610644565b6107496001600160a01b038216610727576003546001600160a01b0316610729565b815b47604051806040016040528060018152602001602160f91b815250610671565b6040516001600160a01b0382169030907f871b8ea19b142db889ef4176d14f1bbcf494f76d7f8511a562c5cd713071b446905f90a350565b6001805460408051808201909152918252606f60f81b60208301526107b3916001600160a01b03909116331490610644565b6107d9475f1415604051806040016040528060018152602001606160f81b815250610644565b804711156108475760035461081a906001600160a01b03166107fb834761091b565b604051806040016040528060018152602001604160f81b815250610671565b604051819047907f365811741d37a3bf942e4c23d8e38cfbedcb4f029d42238bb81c87325cbd007c905f90a35b50565b634e487b7160e01b5f52601160045260245ffd5b808201808211156108715761087161084a565b92915050565b6001600160a01b0391909116815260200190565b5f6020828403121561089b575f5ffd5b5051919050565b5f602082840312156108b2575f5ffd5b81356001600160a01b03811681146108c8575f5ffd5b9392505050565b5f602082840312156108df575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b818103818111156108715761087161084a56fee71ef3bfd4185ae19262ec51a940e1f049287182a6ab8eb8a2d8fde2ca3f1527a2646970667358221220dff328b39f4f1ed7c1ce0745e669f06fb4dac7820244e03d7dedd3de5d335f3f64736f6c634300082100334db45745d63e3d3fca02d388bb6d96a256b72fa6a5ca7e7b2c10c90c84130f3ba2646970667358221220fbe6f9285e18a93f2fce469911264b3dea22ae6282f79ccc421e3c2893a7087164736f6c63430008210033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000102 | $0 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xd53608…267d5e | deployIntDeedMaster | 3,175,237 | 42 days agoMon, 06 Jul 2026 15:02:29 UTC | 0x9f88…1cab | IN | AuctionMaster | $0.000 ETH | 0.00001081 | |
| 0xedebc2…fc9302 | deployExtDeedMaster | 3,175,229 | 42 days agoMon, 06 Jul 2026 15:02:27 UTC | 0x9f88…1cab | IN | AuctionMaster | $0.000 ETH | 0.00001470 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x2985cde8…5a79a5 | Transfer | 19,072,741 | 23 days agoSat, 25 Jul 2026 14:13:45 UTC | 0xcaf7…5d11 | IN | 0xcc53…035e | $0.001 DIH |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xd53608…267d5e | 42 days agoMon, 06 Jul 2026 15:02:29 UTC | 0x689687…d4ef | [0] 0x000000000000…74e8c81f |
| 0xedebc2…fc9302 | 42 days agoMon, 06 Jul 2026 15:02:27 UTC | 0xac68b1…ba8d | [0] 0x000000000000…adbc7ad9 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 3,175,237 | 42 days agoMon, 06 Jul 2026 15:02:29 UTC | 0xd53608…267d5e | CREATE | deployIntDeedMaster | 0xcc53…035e | OUT | 0xad88…c81f | 0 ETH |
| 3,175,229 | 42 days agoMon, 06 Jul 2026 15:02:27 UTC | 0xedebc2…fc9302 | CREATE | deployExtDeedMaster | 0xcc53…035e | OUT | 0x5e63…7ad9 | 0 ETH |