Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- UORSRegistry
- Optimization enabled
- false
- Compiler version
- v0.8.24+commit.e11b9ed9
- EVM Version
- Verified at
- 2026-08-25T19:40:50.256953Z
Constructor Arguments
contracts/UORSRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/access/Ownable.sol";
import "./AdminZamik.sol";
/**
* @title UORSRegistry
* @notice On-chain log notarskih registracij — vsak UORS operator je avtonomen.
*
* Model:
* - Platforma (owner) registrira UORS operatorje (addUORS)
* - Vsak UORS operator si sam uredi plačilo s stranko (fiat/crypto/gotovina)
* - Ko potrdi plačilo → pokliče recordPayment() → on-chain zapis
* - Platforma prejme 0.5% mint fee prek ZKVerifier (ločen kontrakt)
*
* Tok:
* 1. UORS potrdi plačilo stranke (off-chain)
* 2. UORS pokliče recordPayment(commitment, payer, amountEurCents, paymentRef)
* 3. UORS pokliče ZKVerifier.registerCommitment(commitment)
* 4. Stranka minta v UORS portalu → 0.5% fee → platforma
*/
contract UORSRegistry is Ownable, AdminZamik {
struct ServiceRecord {
uint256 commitment; // Poseidon(privateKey, entropyNonce)
address payer; // strankina denarnica
address uorsOperator; // UORS ki je potrdil plačilo
uint256 amountEurCents; // znesek v euro centih (5000 = €50.00)
uint256 timestamp; // block.timestamp
string paymentRef; // referenca plačila (poljubno: račun, txHash, SEPA ref...)
bool mintReady; // true po registerCommitment v ZKVerifier
}
// commitment → ServiceRecord
mapping(uint256 => ServiceRecord) public records;
// seznam vseh commitmentov
uint256[] public commitmentList;
// pooblaščeni UORS operatorji (platforma jih doda/odstrani)
mapping(address => bool) public authorizedUORS;
address[] public uorsList;
// skupni zaslužek po UORS operatorju (informativno, v euro centih)
mapping(address => uint256) public revenueByUORS;
uint256 public totalRevenueEurCents;
event PaymentRecorded(
uint256 indexed commitment,
address indexed payer,
address indexed uorsOperator,
uint256 amountEurCents,
string paymentRef
);
event MintReadySet(uint256 indexed commitment);
event UORSAdded(address indexed uors);
event UORSRemoved(address indexed uors);
modifier onlyUORS() {
require(authorizedUORS[msg.sender], "Not authorized UORS");
_;
}
constructor() Ownable(msg.sender) {}
// ── Platforma upravlja UORS operatorje ────────────────────────────────────
/**
* PODELITEV MOCI GRE SKOZI ZAMIK, ODVZEM NE.
* Nov UORS operater sme potrjevati placila in oznacevati mintReady.
* removeUORS ostaja takojsen — glej AdminZamik.sol.
*/
function napoviAddUORS(address uors) external onlyOwner {
require(uors != address(0), "Zero address");
require(!authorizedUORS[uors], "Already added");
_napovej(keccak256(abi.encode("addUORS", uors)), "UORSRegistry.addUORS");
}
function addUORS(address uors) external onlyOwner {
require(uors != address(0), "Zero address");
require(!authorizedUORS[uors], "Already added");
_porabi(keccak256(abi.encode("addUORS", uors)), "UORSRegistry.addUORS");
authorizedUORS[uors] = true;
uorsList.push(uors);
emit UORSAdded(uors);
}
function removeUORS(address uors) external onlyOwner {
require(authorizedUORS[uors], "Not found");
authorizedUORS[uors] = false;
emit UORSRemoved(uors);
}
// ── UORS operator potrdi plačilo ──────────────────────────────────────────
/**
* @notice UORS operator zapiše potrjeno plačilo stranke.
* @param commitment Poseidon hash asseta (iz UORS portala)
* @param payer Strankina denarnica
* @param amountEurCents Znesek v centih (€50 = 5000)
* @param paymentRef Referenca plačila (račun, SEPA ref, Stripe ID, TxHash...)
*/
function recordPayment(
uint256 commitment,
address payer,
uint256 amountEurCents,
string calldata paymentRef
) external onlyUORS {
require(commitment != 0, "Zero commitment");
require(payer != address(0), "Zero payer");
require(amountEurCents > 0, "Zero amount");
require(records[commitment].timestamp == 0, "Already recorded");
records[commitment] = ServiceRecord({
commitment: commitment,
payer: payer,
uorsOperator: msg.sender,
amountEurCents: amountEurCents,
timestamp: block.timestamp,
paymentRef: paymentRef,
mintReady: false
});
commitmentList.push(commitment);
revenueByUORS[msg.sender] += amountEurCents;
totalRevenueEurCents += amountEurCents;
emit PaymentRecorded(commitment, payer, msg.sender, amountEurCents, paymentRef);
}
/**
* @notice UORS označi commitment kot mint-ready po registerCommitment v ZKVerifier.
*/
function setMintReady(uint256 commitment) external onlyUORS {
require(records[commitment].timestamp != 0, "Not recorded");
require(records[commitment].uorsOperator == msg.sender, "Not your record");
records[commitment].mintReady = true;
emit MintReadySet(commitment);
}
// ── View funkcije ─────────────────────────────────────────────────────────
function getRecord(uint256 commitment) external view returns (ServiceRecord memory) {
return records[commitment];
}
function registrationCount() external view returns (uint256) {
return commitmentList.length;
}
function uorsCount() external view returns (uint256) {
return uorsList.length;
}
/// @notice Onemogoceno: renounceOwnership() bi trajno onemogocil
/// dodajanje/odstranjevanje UORS operatorjev.
function renounceOwnership() public pure override {
revert("Renounce onemogocen");
}
}
@openzeppelin/contracts/access/Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
contracts/AdminZamik.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/access/Ownable.sol";
/**
* @title AdminZamik
* @notice Casovni zamik na nevarne admin spremembe.
*
* ZAKAJ TO OBSTAJA
* ----------------
* Owner kljuc na tej platformi NE more krasti: ne more kovati zetonov, ne more
* premikati tujih zetonov in ne more v escrow. Kar PA lahko, je tiho zamenjati
* nastavitve pod nogami uporabnikov — KYC listo, placilni token, prijavljeno
* vrednost sredstva.
*
* Vsi trije so napadi, ki jih je mogoce VIDETI VNAPREJ. Zato jih ne branimo z
* multisigom (ki varuje lastnika kljuca), ampak s casovnim zamikom (ki varuje
* UPORABNIKA): sprememba se mora najprej javno napovedati, sele po zamiku jo je
* mogoce izvesti. Uporabnik ima ves ta cas, da spremembo vidi in izstopi.
*
* Namenoma NI zunanje timelock pogodbe kot lastnika. Tak vzorec doda tveganje
* nedosegljivosti: ce lastniku kdaj ne uspe sestaviti transakcije skozi tujo
* pogodbo, so kontrakti zamrznjeni za vedno. Tu je zamik vgrajen, lastnik pa
* ostane navadna denarnica.
*
* KAJ ZAMIK NE POKRIVA (namerno)
* ------------------------------
* - pause() — zasilna zavora mora biti takojsnja, sicer ni zavora
* - unpause() — vrnitev v obratovanje naj bo hitra
* - odvzem pravice zaustavljalca — ob razkritem kljucu ga moras vreci TAKOJ
* Nevarnost caka, zasilna zavora ne.
*/
abstract contract AdminZamik is Ownable {
/// @notice Rok, v katerem je napoved uporabna. Po njem potece.
/// @dev Brez tega bi stara napoved lezala na verigi kot nabita puska:
/// napoves nekaj neopaznega danes, izvedes cez pol leta, ko nihce vec
/// ne gleda. Napoved, ki ni bila izvedena v roku, je treba ponoviti.
uint256 public constant ROK = 7 days;
/// @notice id napovedi → cas, od katerega je izvedljiva (0 = ni napovedi)
mapping(bytes32 => uint256) public izvedljivoOd;
event SpremembaNapovedana(bytes32 indexed id, string kaj, uint256 izvedljivoOd, uint256 potece);
event SpremembaIzvedena(bytes32 indexed id, string kaj);
event SpremembaPreklicana(bytes32 indexed id, string kaj);
/// @notice Koliko casa mora sprememba cakati.
///
/// ⚠️⚠️ TRENUTNO 10 MINUT — RAZVOJNA VREDNOST ZA TESTNET (943).
/// Nastavljeno 24. 8. 2026 po Juretovi odlocitvi. Projekt se razvija
/// izkljucno na testnetu; mainnet je na pavzi.
///
/// PRED KAKRSNIMKOLI DEPLOYEM NA MAINNET (369) VRNI NA 48 ur.
/// Deset minut zamika na mainnetu pomeni, da napadalec z admin
/// kljucem izvede spremembo, preden jo utegnes opaziti — zamik je
/// takrat videti prisoten, a je brez ucinka.
///
/// @dev virtual ostaja, da lahko posamezna pogodba vrednost se povozi
/// (MarketplaceTestnet to pocne).
function zamik() public view virtual returns (uint256) {
return 10 minutes;
}
// ── Notranje ────────────────────────────────────────────────────────────
/// @dev id MORA vsebovati tocne parametre spremembe, sicer bi lahko
/// napovedal nedolzno vrednost in izvedel skodljivo.
function _napovej(bytes32 id, string memory kaj) internal {
require(izvedljivoOd[id] == 0, "Ze napovedano");
uint256 od = block.timestamp + zamik();
izvedljivoOd[id] = od;
emit SpremembaNapovedana(id, kaj, od, od + ROK);
}
function _porabi(bytes32 id, string memory kaj) internal {
uint256 od = izvedljivoOd[id];
require(od != 0, "Ni napovedano");
require(block.timestamp >= od, "Zamik se ni potekel");
require(block.timestamp <= od + ROK, "Napoved je potekla");
delete izvedljivoOd[id];
emit SpremembaIzvedena(id, kaj);
}
// ── Javno ───────────────────────────────────────────────────────────────
/// @notice Preklic napovedane spremembe. Takojsen — premisliti se mora biti
/// mogoce hitreje, kot se izvede.
function prekliciSpremembo(bytes32 id, string calldata kaj) external onlyOwner {
require(izvedljivoOd[id] != 0, "Ni napovedano");
delete izvedljivoOd[id];
emit SpremembaPreklicana(id, kaj);
}
/// @notice Stanje napovedi — da ga stran in nadzorni sistem lahko prikazeta.
function stanjeNapovedi(bytes32 id)
external
view
returns (bool napovedana, uint256 od, uint256 potece, bool izvedljivaZdaj)
{
uint256 t = izvedljivoOd[id];
if (t == 0) return (false, 0, 0, false);
return (true, t, t + ROK, block.timestamp >= t && block.timestamp <= t + ROK);
}
}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"event","name":"MintReadySet","inputs":[{"type":"uint256","name":"commitment","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"PaymentRecorded","inputs":[{"type":"uint256","name":"commitment","internalType":"uint256","indexed":true},{"type":"address","name":"payer","internalType":"address","indexed":true},{"type":"address","name":"uorsOperator","internalType":"address","indexed":true},{"type":"uint256","name":"amountEurCents","internalType":"uint256","indexed":false},{"type":"string","name":"paymentRef","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"SpremembaIzvedena","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32","indexed":true},{"type":"string","name":"kaj","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"SpremembaNapovedana","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32","indexed":true},{"type":"string","name":"kaj","internalType":"string","indexed":false},{"type":"uint256","name":"izvedljivoOd","internalType":"uint256","indexed":false},{"type":"uint256","name":"potece","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SpremembaPreklicana","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32","indexed":true},{"type":"string","name":"kaj","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"UORSAdded","inputs":[{"type":"address","name":"uors","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"UORSRemoved","inputs":[{"type":"address","name":"uors","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"ROK","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addUORS","inputs":[{"type":"address","name":"uors","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"authorizedUORS","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"commitmentList","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct UORSRegistry.ServiceRecord","components":[{"type":"uint256","name":"commitment","internalType":"uint256"},{"type":"address","name":"payer","internalType":"address"},{"type":"address","name":"uorsOperator","internalType":"address"},{"type":"uint256","name":"amountEurCents","internalType":"uint256"},{"type":"uint256","name":"timestamp","internalType":"uint256"},{"type":"string","name":"paymentRef","internalType":"string"},{"type":"bool","name":"mintReady","internalType":"bool"}]}],"name":"getRecord","inputs":[{"type":"uint256","name":"commitment","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"izvedljivoOd","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"napoviAddUORS","inputs":[{"type":"address","name":"uors","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"prekliciSpremembo","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32"},{"type":"string","name":"kaj","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"recordPayment","inputs":[{"type":"uint256","name":"commitment","internalType":"uint256"},{"type":"address","name":"payer","internalType":"address"},{"type":"uint256","name":"amountEurCents","internalType":"uint256"},{"type":"string","name":"paymentRef","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"commitment","internalType":"uint256"},{"type":"address","name":"payer","internalType":"address"},{"type":"address","name":"uorsOperator","internalType":"address"},{"type":"uint256","name":"amountEurCents","internalType":"uint256"},{"type":"uint256","name":"timestamp","internalType":"uint256"},{"type":"string","name":"paymentRef","internalType":"string"},{"type":"bool","name":"mintReady","internalType":"bool"}],"name":"records","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"registrationCount","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeUORS","inputs":[{"type":"address","name":"uors","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"revenueByUORS","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMintReady","inputs":[{"type":"uint256","name":"commitment","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"napovedana","internalType":"bool"},{"type":"uint256","name":"od","internalType":"uint256"},{"type":"uint256","name":"potece","internalType":"uint256"},{"type":"bool","name":"izvedljivaZdaj","internalType":"bool"}],"name":"stanjeNapovedi","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalRevenueEurCents","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"uorsCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"uorsList","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"zamik","inputs":[]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50338061003757604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61004081610046565b50610096565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61164a806100a56000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063776528cd116100b8578063dedfdd341161007c578063dedfdd34146102f9578063e826f69a1461030c578063f239336414610316578063f2fde38b1461031e578063f4d579ae14610331578063f64099d41461034457600080fd5b8063776528cd146102835780638da5cb5b146102ba578063c23ead6f146102cb578063d48693d1146102de578063d78cfae8146102e657600080fd5b8063344610671161010a57806334461067146101da5780634fa061e214610200578063704c179614610215578063715018a61461024857806372263e5f1461025057806376e382c81461027057600080fd5b806303e9e609146101475780630854eef5146101705780630d3eafd61461019e57806317d1342d146101a65780632a5a4dd2146101af575b600080fd5b61015a610155366004611155565b610357565b60405161016791906111b4565b60405180910390f35b61019061017e366004611155565b60016020526000908152604090205481565b604051908152602001610167565b600354610190565b61019060075481565b6101c26101bd366004611155565b610497565b6040516001600160a01b039091168152602001610167565b6101ed6101e8366004611155565b6104c1565b6040516101679796959493929190611229565b61021361020e366004611155565b610597565b005b61023861022336600461129b565b60046020526000908152604090205460ff1681565b6040519015158152602001610167565b6102136106e2565b61019061025e36600461129b565b60066020526000908152604090205481565b61021361027e366004611306565b610720565b610296610291366004611155565b6107c7565b60408051941515855260208501939093529183015215156060820152608001610167565b6000546001600160a01b03166101c2565b6102136102d936600461129b565b610834565b610258610190565b6101906102f4366004611155565b6109c2565b610213610307366004611352565b6109e3565b61019062093a8081565b600554610190565b61021361032c36600461129b565b610d1b565b61021361033f36600461129b565b610d59565b61021361035236600461129b565b610e5b565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c0810191909152600082815260026020818152604092839020835160e0810185528154815260018201546001600160a01b03908116938201939093529281015490911692820192909252600382015460608201526004820154608082015260058201805491929160a0840191906103fe906113ba565b80601f016020809104026020016040519081016040528092919081815260200182805461042a906113ba565b80156104775780601f1061044c57610100808354040283529160200191610477565b820191906000526020600020905b81548152906001019060200180831161045a57829003601f168201915b50505091835250506006919091015460ff16151560209091015292915050565b600581815481106104a757600080fd5b6000918252602090912001546001600160a01b0316905081565b600260208190526000918252604090912080546001820154928201546003830154600484015460058501805494966001600160a01b03908116969416949293919261050b906113ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610537906113ba565b80156105845780601f1061055957610100808354040283529160200191610584565b820191906000526020600020905b81548152906001019060200180831161056757829003601f168201915b5050506006909301549192505060ff1687565b3360009081526004602052604090205460ff166105f15760405162461bcd60e51b81526020600482015260136024820152724e6f7420617574686f72697a656420554f525360681b60448201526064015b60405180910390fd5b60008181526002602052604081206004015490036106405760405162461bcd60e51b815260206004820152600c60248201526b139bdd081c9958dbdc99195960a21b60448201526064016105e8565b600081815260026020819052604090912001546001600160a01b0316331461069c5760405162461bcd60e51b815260206004820152600f60248201526e139bdd081e5bdd5c881c9958dbdc99608a1b60448201526064016105e8565b600081815260026020526040808220600601805460ff191660011790555182917ff6c4766647704532b75863743d92939c86dc2095e7f51e412f9fbd3ca341189b91a250565b60405162461bcd60e51b81526020600482015260136024820152722932b737bab731b29037b732b6b7b3b7b1b2b760691b60448201526064016105e8565b610728610f00565b60008381526001602052604081205490036107755760405162461bcd60e51b815260206004820152600d60248201526c4e69206e61706f766564616e6f60981b60448201526064016105e8565b600083815260016020526040808220919091555183907f72003eda7c2c39777210bccbf69141a92bbe56d746914a16f5ee3aaf5e6f7a83906107ba908590859061141d565b60405180910390a2505050565b6000818152600160205260408120548190819081908082036107f75760008060008094509450945094505061082d565b60018161080762093a8082611439565b834210158015610823575061081f62093a8085611439565b4211155b9450945094509450505b9193509193565b61083c610f00565b6001600160a01b0381166108815760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064016105e8565b6001600160a01b03811660009081526004602052604090205460ff16156108da5760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481859191959609a1b60448201526064016105e8565b610936816040516020016108ee9190611460565b6040516020818303038152906040528051906020012060405180604001604052806014815260200173554f525352656769737472792e616464554f525360601b815250610f2f565b6001600160a01b038116600081815260046020526040808220805460ff1916600190811790915560058054918201815583527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191684179055517f43af16aba35dcf6aa5c53f46c7e28043a06f981d9c596cfad77718223cd02c839190a250565b600381815481106109d257600080fd5b600091825260209091200154905081565b3360009081526004602052604090205460ff16610a385760405162461bcd60e51b81526020600482015260136024820152724e6f7420617574686f72697a656420554f525360681b60448201526064016105e8565b84600003610a7a5760405162461bcd60e51b815260206004820152600f60248201526e16995c9bc818dbdb5b5a5d1b595b9d608a1b60448201526064016105e8565b6001600160a01b038416610abd5760405162461bcd60e51b815260206004820152600a6024820152692d32b937903830bcb2b960b11b60448201526064016105e8565b60008311610afb5760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b60448201526064016105e8565b60008581526002602052604090206004015415610b4d5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c9958dbdc99195960821b60448201526064016105e8565b6040518060e00160405280868152602001856001600160a01b03168152602001336001600160a01b0316815260200184815260200142815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509385525050506020918201819052878152600280835260409182902084518155928401516001840180546001600160a01b03199081166001600160a01b03938416179091559285015191840180549093169116179055606082015160038201556080820151600482015560a08201516005820190610c3890826114f9565b5060c091909101516006918201805460ff191691151591909117905560038054600181019091557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01869055336000908152602091909152604081208054859290610ca4908490611439565b925050819055508260076000828254610cbd9190611439565b92505081905550336001600160a01b0316846001600160a01b0316867f4270fa444b7d1b06de2e68a58d95db2c37fab4a4f890bc21115277af41f053f5868686604051610d0c939291906115b9565b60405180910390a45050505050565b610d23610f00565b6001600160a01b038116610d4d57604051631e4fbdf760e01b8152600060048201526024016105e8565b610d5681611058565b50565b610d61610f00565b6001600160a01b038116610da65760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064016105e8565b6001600160a01b03811660009081526004602052604090205460ff1615610dff5760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481859191959609a1b60448201526064016105e8565b610d5681604051602001610e139190611460565b6040516020818303038152906040528051906020012060405180604001604052806014815260200173554f525352656769737472792e616464554f525360601b8152506110a8565b610e63610f00565b6001600160a01b03811660009081526004602052604090205460ff16610eb75760405162461bcd60e51b8152602060048201526009602482015268139bdd08199bdd5b9960ba1b60448201526064016105e8565b6001600160a01b038116600081815260046020526040808220805460ff19169055517fbfea339225f93f559bd3c7c4e998f2c2c5fad1afa68feae6122c19e66e5774519190a250565b6000546001600160a01b03163314610f2d5760405163118cdaa760e01b81523360048201526024016105e8565b565b60008281526001602052604081205490819003610f7e5760405162461bcd60e51b815260206004820152600d60248201526c4e69206e61706f766564616e6f60981b60448201526064016105e8565b80421015610fc45760405162461bcd60e51b815260206004820152601360248201527216985b5a5ac81cd9481b9a481c1bdd195ad95b606a1b60448201526064016105e8565b610fd162093a8082611439565b4211156110155760405162461bcd60e51b81526020600482015260126024820152714e61706f766564206a6520706f74656b6c6160701b60448201526064016105e8565b600083815260016020526040808220919091555183907ffac4537038ebc9eaa00d86a88a6c2e268012d306f6442966aab36014a1954323906107ba9085906115dc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082815260016020526040902054156110f45760405162461bcd60e51b815260206004820152600d60248201526c5a65206e61706f766564616e6f60981b60448201526064016105e8565b600061110261025842611439565b60008481526001602052604090208190559050827f63a0d065f46e07e30a4f246d28eb53f839982100439173db92dbd5700ab37c15838361114662093a8082611439565b6040516107ba939291906115ef565b60006020828403121561116757600080fd5b5035919050565b6000815180845260005b8181101561119457602081850181015186830182015201611178565b506000602082860101526020601f19601f83011685010191505092915050565b60208152815160208201526000602083015160018060a01b038082166040850152806040860151166060850152505060608301516080830152608083015160a083015260a083015160e060c084015261121161010084018261116e565b905060c0840151151560e08401528091505092915050565b8781526001600160a01b03878116602083015286166040820152606081018590526080810184905260e060a082018190526000906112699083018561116e565b905082151560c083015298975050505050505050565b80356001600160a01b038116811461129657600080fd5b919050565b6000602082840312156112ad57600080fd5b6112b68261127f565b9392505050565b60008083601f8401126112cf57600080fd5b50813567ffffffffffffffff8111156112e757600080fd5b6020830191508360208285010111156112ff57600080fd5b9250929050565b60008060006040848603121561131b57600080fd5b83359250602084013567ffffffffffffffff81111561133957600080fd5b611345868287016112bd565b9497909650939450505050565b60008060008060006080868803121561136a57600080fd5b8535945061137a6020870161127f565b935060408601359250606086013567ffffffffffffffff81111561139d57600080fd5b6113a9888289016112bd565b969995985093965092949392505050565b600181811c908216806113ce57607f821691505b6020821081036113ee57634e487b7160e01b600052602260045260246000fd5b50919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260006114316020830184866113f4565b949350505050565b8082018082111561145a57634e487b7160e01b600052601160045260246000fd5b92915050565b604080825260079082015266616464554f525360c81b60608201526001600160a01b0391909116602082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f8211156114f4576000816000526020600020601f850160051c810160208610156114d15750805b601f850160051c820191505b818110156114f0578281556001016114dd565b5050505b505050565b815167ffffffffffffffff81111561151357611513611492565b6115278161152184546113ba565b846114a8565b602080601f83116001811461155c57600084156115445750858301515b600019600386901b1c1916600185901b1785556114f0565b600085815260208120601f198616915b8281101561158b5788860151825594840194600190910190840161156c565b50858210156115a95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8381526040602082015260006115d36040830184866113f4565b95945050505050565b6020815260006112b6602083018461116e565b606081526000611602606083018661116e565b6020830194909452506040015291905056fea2646970667358221220460cfb9cb86c8a39aefbd8f68c63414341fc8089a7924cd0b35c86b1367761fe64736f6c63430008180033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063776528cd116100b8578063dedfdd341161007c578063dedfdd34146102f9578063e826f69a1461030c578063f239336414610316578063f2fde38b1461031e578063f4d579ae14610331578063f64099d41461034457600080fd5b8063776528cd146102835780638da5cb5b146102ba578063c23ead6f146102cb578063d48693d1146102de578063d78cfae8146102e657600080fd5b8063344610671161010a57806334461067146101da5780634fa061e214610200578063704c179614610215578063715018a61461024857806372263e5f1461025057806376e382c81461027057600080fd5b806303e9e609146101475780630854eef5146101705780630d3eafd61461019e57806317d1342d146101a65780632a5a4dd2146101af575b600080fd5b61015a610155366004611155565b610357565b60405161016791906111b4565b60405180910390f35b61019061017e366004611155565b60016020526000908152604090205481565b604051908152602001610167565b600354610190565b61019060075481565b6101c26101bd366004611155565b610497565b6040516001600160a01b039091168152602001610167565b6101ed6101e8366004611155565b6104c1565b6040516101679796959493929190611229565b61021361020e366004611155565b610597565b005b61023861022336600461129b565b60046020526000908152604090205460ff1681565b6040519015158152602001610167565b6102136106e2565b61019061025e36600461129b565b60066020526000908152604090205481565b61021361027e366004611306565b610720565b610296610291366004611155565b6107c7565b60408051941515855260208501939093529183015215156060820152608001610167565b6000546001600160a01b03166101c2565b6102136102d936600461129b565b610834565b610258610190565b6101906102f4366004611155565b6109c2565b610213610307366004611352565b6109e3565b61019062093a8081565b600554610190565b61021361032c36600461129b565b610d1b565b61021361033f36600461129b565b610d59565b61021361035236600461129b565b610e5b565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c0810191909152600082815260026020818152604092839020835160e0810185528154815260018201546001600160a01b03908116938201939093529281015490911692820192909252600382015460608201526004820154608082015260058201805491929160a0840191906103fe906113ba565b80601f016020809104026020016040519081016040528092919081815260200182805461042a906113ba565b80156104775780601f1061044c57610100808354040283529160200191610477565b820191906000526020600020905b81548152906001019060200180831161045a57829003601f168201915b50505091835250506006919091015460ff16151560209091015292915050565b600581815481106104a757600080fd5b6000918252602090912001546001600160a01b0316905081565b600260208190526000918252604090912080546001820154928201546003830154600484015460058501805494966001600160a01b03908116969416949293919261050b906113ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610537906113ba565b80156105845780601f1061055957610100808354040283529160200191610584565b820191906000526020600020905b81548152906001019060200180831161056757829003601f168201915b5050506006909301549192505060ff1687565b3360009081526004602052604090205460ff166105f15760405162461bcd60e51b81526020600482015260136024820152724e6f7420617574686f72697a656420554f525360681b60448201526064015b60405180910390fd5b60008181526002602052604081206004015490036106405760405162461bcd60e51b815260206004820152600c60248201526b139bdd081c9958dbdc99195960a21b60448201526064016105e8565b600081815260026020819052604090912001546001600160a01b0316331461069c5760405162461bcd60e51b815260206004820152600f60248201526e139bdd081e5bdd5c881c9958dbdc99608a1b60448201526064016105e8565b600081815260026020526040808220600601805460ff191660011790555182917ff6c4766647704532b75863743d92939c86dc2095e7f51e412f9fbd3ca341189b91a250565b60405162461bcd60e51b81526020600482015260136024820152722932b737bab731b29037b732b6b7b3b7b1b2b760691b60448201526064016105e8565b610728610f00565b60008381526001602052604081205490036107755760405162461bcd60e51b815260206004820152600d60248201526c4e69206e61706f766564616e6f60981b60448201526064016105e8565b600083815260016020526040808220919091555183907f72003eda7c2c39777210bccbf69141a92bbe56d746914a16f5ee3aaf5e6f7a83906107ba908590859061141d565b60405180910390a2505050565b6000818152600160205260408120548190819081908082036107f75760008060008094509450945094505061082d565b60018161080762093a8082611439565b834210158015610823575061081f62093a8085611439565b4211155b9450945094509450505b9193509193565b61083c610f00565b6001600160a01b0381166108815760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064016105e8565b6001600160a01b03811660009081526004602052604090205460ff16156108da5760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481859191959609a1b60448201526064016105e8565b610936816040516020016108ee9190611460565b6040516020818303038152906040528051906020012060405180604001604052806014815260200173554f525352656769737472792e616464554f525360601b815250610f2f565b6001600160a01b038116600081815260046020526040808220805460ff1916600190811790915560058054918201815583527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191684179055517f43af16aba35dcf6aa5c53f46c7e28043a06f981d9c596cfad77718223cd02c839190a250565b600381815481106109d257600080fd5b600091825260209091200154905081565b3360009081526004602052604090205460ff16610a385760405162461bcd60e51b81526020600482015260136024820152724e6f7420617574686f72697a656420554f525360681b60448201526064016105e8565b84600003610a7a5760405162461bcd60e51b815260206004820152600f60248201526e16995c9bc818dbdb5b5a5d1b595b9d608a1b60448201526064016105e8565b6001600160a01b038416610abd5760405162461bcd60e51b815260206004820152600a6024820152692d32b937903830bcb2b960b11b60448201526064016105e8565b60008311610afb5760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b60448201526064016105e8565b60008581526002602052604090206004015415610b4d5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c9958dbdc99195960821b60448201526064016105e8565b6040518060e00160405280868152602001856001600160a01b03168152602001336001600160a01b0316815260200184815260200142815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509385525050506020918201819052878152600280835260409182902084518155928401516001840180546001600160a01b03199081166001600160a01b03938416179091559285015191840180549093169116179055606082015160038201556080820151600482015560a08201516005820190610c3890826114f9565b5060c091909101516006918201805460ff191691151591909117905560038054600181019091557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01869055336000908152602091909152604081208054859290610ca4908490611439565b925050819055508260076000828254610cbd9190611439565b92505081905550336001600160a01b0316846001600160a01b0316867f4270fa444b7d1b06de2e68a58d95db2c37fab4a4f890bc21115277af41f053f5868686604051610d0c939291906115b9565b60405180910390a45050505050565b610d23610f00565b6001600160a01b038116610d4d57604051631e4fbdf760e01b8152600060048201526024016105e8565b610d5681611058565b50565b610d61610f00565b6001600160a01b038116610da65760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064016105e8565b6001600160a01b03811660009081526004602052604090205460ff1615610dff5760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481859191959609a1b60448201526064016105e8565b610d5681604051602001610e139190611460565b6040516020818303038152906040528051906020012060405180604001604052806014815260200173554f525352656769737472792e616464554f525360601b8152506110a8565b610e63610f00565b6001600160a01b03811660009081526004602052604090205460ff16610eb75760405162461bcd60e51b8152602060048201526009602482015268139bdd08199bdd5b9960ba1b60448201526064016105e8565b6001600160a01b038116600081815260046020526040808220805460ff19169055517fbfea339225f93f559bd3c7c4e998f2c2c5fad1afa68feae6122c19e66e5774519190a250565b6000546001600160a01b03163314610f2d5760405163118cdaa760e01b81523360048201526024016105e8565b565b60008281526001602052604081205490819003610f7e5760405162461bcd60e51b815260206004820152600d60248201526c4e69206e61706f766564616e6f60981b60448201526064016105e8565b80421015610fc45760405162461bcd60e51b815260206004820152601360248201527216985b5a5ac81cd9481b9a481c1bdd195ad95b606a1b60448201526064016105e8565b610fd162093a8082611439565b4211156110155760405162461bcd60e51b81526020600482015260126024820152714e61706f766564206a6520706f74656b6c6160701b60448201526064016105e8565b600083815260016020526040808220919091555183907ffac4537038ebc9eaa00d86a88a6c2e268012d306f6442966aab36014a1954323906107ba9085906115dc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082815260016020526040902054156110f45760405162461bcd60e51b815260206004820152600d60248201526c5a65206e61706f766564616e6f60981b60448201526064016105e8565b600061110261025842611439565b60008481526001602052604090208190559050827f63a0d065f46e07e30a4f246d28eb53f839982100439173db92dbd5700ab37c15838361114662093a8082611439565b6040516107ba939291906115ef565b60006020828403121561116757600080fd5b5035919050565b6000815180845260005b8181101561119457602081850181015186830182015201611178565b506000602082860101526020601f19601f83011685010191505092915050565b60208152815160208201526000602083015160018060a01b038082166040850152806040860151166060850152505060608301516080830152608083015160a083015260a083015160e060c084015261121161010084018261116e565b905060c0840151151560e08401528091505092915050565b8781526001600160a01b03878116602083015286166040820152606081018590526080810184905260e060a082018190526000906112699083018561116e565b905082151560c083015298975050505050505050565b80356001600160a01b038116811461129657600080fd5b919050565b6000602082840312156112ad57600080fd5b6112b68261127f565b9392505050565b60008083601f8401126112cf57600080fd5b50813567ffffffffffffffff8111156112e757600080fd5b6020830191508360208285010111156112ff57600080fd5b9250929050565b60008060006040848603121561131b57600080fd5b83359250602084013567ffffffffffffffff81111561133957600080fd5b611345868287016112bd565b9497909650939450505050565b60008060008060006080868803121561136a57600080fd5b8535945061137a6020870161127f565b935060408601359250606086013567ffffffffffffffff81111561139d57600080fd5b6113a9888289016112bd565b969995985093965092949392505050565b600181811c908216806113ce57607f821691505b6020821081036113ee57634e487b7160e01b600052602260045260246000fd5b50919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260006114316020830184866113f4565b949350505050565b8082018082111561145a57634e487b7160e01b600052601160045260246000fd5b92915050565b604080825260079082015266616464554f525360c81b60608201526001600160a01b0391909116602082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f8211156114f4576000816000526020600020601f850160051c810160208610156114d15750805b601f850160051c820191505b818110156114f0578281556001016114dd565b5050505b505050565b815167ffffffffffffffff81111561151357611513611492565b6115278161152184546113ba565b846114a8565b602080601f83116001811461155c57600084156115445750858301515b600019600386901b1c1916600185901b1785556114f0565b600085815260208120601f198616915b8281101561158b5788860151825594840194600190910190840161156c565b50858210156115a95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8381526040602082015260006115d36040830184866113f4565b95945050505050565b6020815260006112b6602083018461116e565b606081526000611602606083018661116e565b6020830194909452506040015291905056fea2646970667358221220460cfb9cb86c8a39aefbd8f68c63414341fc8089a7924cd0b35c86b1367761fe64736f6c63430008180033