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-25T18:37:37.209186Z
Constructor Arguments
contracts/UORSRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/access/Ownable.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 {
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 ────────────────────────────────────
function addUORS(address uors) external onlyOwner {
require(uors != address(0), "Zero address");
require(!authorizedUORS[uors], "Already added");
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;
}
}
@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;
}
}
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":"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":"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":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"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":"nonpayable","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":"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"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50338061003757604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61004081610046565b50610096565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610ffd806100a56000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806372263e5f11610097578063dedfdd3411610066578063dedfdd3414610241578063f239336414610254578063f2fde38b1461025c578063f64099d41461026f57600080fd5b806372263e5f146101ea5780638da5cb5b1461020a578063c23ead6f1461021b578063d78cfae81461022e57600080fd5b806334461067116100d357806334461067146101745780634fa061e21461019a578063704c1796146101af578063715018a6146101e257600080fd5b806303e9e609146101055780630d3eafd61461012e57806317d1342d146101405780632a5a4dd214610149575b600080fd5b610118610113366004610c0d565b610282565b6040516101259190610c6c565b60405180910390f35b6002545b604051908152602001610125565b61013260065481565b61015c610157366004610c0d565b6103c2565b6040516001600160a01b039091168152602001610125565b610187610182366004610c0d565b6103ec565b6040516101259796959493929190610ce1565b6101ad6101a8366004610c0d565b6104c2565b005b6101d26101bd366004610d53565b60036020526000908152604090205460ff1681565b6040519015158152602001610125565b6101ad61060f565b6101326101f8366004610d53565b60056020526000908152604090205481565b6000546001600160a01b031661015c565b6101ad610229366004610d53565b610623565b61013261023c366004610c0d565b610755565b6101ad61024f366004610d75565b610776565b600454610132565b6101ad61026a366004610d53565b610aad565b6101ad61027d366004610d53565b610aeb565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c0810191909152600082815260016020818152604092839020835160e08101855281548152928101546001600160a01b0390811692840192909252600281015490911692820192909252600382015460608201526004820154608082015260058201805491929160a08401919061032990610e09565b80601f016020809104026020016040519081016040528092919081815260200182805461035590610e09565b80156103a25780601f10610377576101008083540402835291602001916103a2565b820191906000526020600020905b81548152906001019060200180831161038557829003601f168201915b50505091835250506006919091015460ff16151560209091015292915050565b600481815481106103d257600080fd5b6000918252602090912001546001600160a01b0316905081565b60016020819052600091825260409091208054918101546002820154600383015460048401546005850180546001600160a01b039586169694909516949293919261043690610e09565b80601f016020809104026020016040519081016040528092919081815260200182805461046290610e09565b80156104af5780601f10610484576101008083540402835291602001916104af565b820191906000526020600020905b81548152906001019060200180831161049257829003601f168201915b5050506006909301549192505060ff1687565b3360009081526003602052604090205460ff1661051c5760405162461bcd60e51b81526020600482015260136024820152724e6f7420617574686f72697a656420554f525360681b60448201526064015b60405180910390fd5b600081815260016020526040812060040154900361056b5760405162461bcd60e51b815260206004820152600c60248201526b139bdd081c9958dbdc99195960a21b6044820152606401610513565b6000818152600160205260409020600201546001600160a01b031633146105c65760405162461bcd60e51b815260206004820152600f60248201526e139bdd081e5bdd5c881c9958dbdc99608a1b6044820152606401610513565b6000818152600160208190526040808320600601805460ff19169092179091555182917ff6c4766647704532b75863743d92939c86dc2095e7f51e412f9fbd3ca341189b91a250565b610617610b90565b6106216000610bbd565b565b61062b610b90565b6001600160a01b0381166106705760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610513565b6001600160a01b03811660009081526003602052604090205460ff16156106c95760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481859191959609a1b6044820152606401610513565b6001600160a01b038116600081815260036020526040808220805460ff1916600190811790915560048054918201815583527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191684179055517f43af16aba35dcf6aa5c53f46c7e28043a06f981d9c596cfad77718223cd02c839190a250565b6002818154811061076557600080fd5b600091825260209091200154905081565b3360009081526003602052604090205460ff166107cb5760405162461bcd60e51b81526020600482015260136024820152724e6f7420617574686f72697a656420554f525360681b6044820152606401610513565b8460000361080d5760405162461bcd60e51b815260206004820152600f60248201526e16995c9bc818dbdb5b5a5d1b595b9d608a1b6044820152606401610513565b6001600160a01b0384166108505760405162461bcd60e51b815260206004820152600a6024820152692d32b937903830bcb2b960b11b6044820152606401610513565b6000831161088e5760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606401610513565b600085815260016020526040902060040154156108e05760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c9958dbdc99195960821b6044820152606401610513565b6040518060e00160405280868152602001856001600160a01b03168152602001336001600160a01b0316815260200184815260200142815260200183838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060209182018190528781526001808352604091829020845181559284015190830180546001600160a01b03199081166001600160a01b0393841617909155918401516002840180549093169116179055606082015160038201556080820151600482015560a082015160058201906109cb9082610eaa565b5060c091909101516006909101805460ff191691151591909117905560028054600181019091557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace018590553360009081526005602052604081208054859290610a36908490610f6a565b925050819055508260066000828254610a4f9190610f6a565b92505081905550336001600160a01b0316846001600160a01b0316867f4270fa444b7d1b06de2e68a58d95db2c37fab4a4f890bc21115277af41f053f5868686604051610a9e93929190610f91565b60405180910390a45050505050565b610ab5610b90565b6001600160a01b038116610adf57604051631e4fbdf760e01b815260006004820152602401610513565b610ae881610bbd565b50565b610af3610b90565b6001600160a01b03811660009081526003602052604090205460ff16610b475760405162461bcd60e51b8152602060048201526009602482015268139bdd08199bdd5b9960ba1b6044820152606401610513565b6001600160a01b038116600081815260036020526040808220805460ff19169055517fbfea339225f93f559bd3c7c4e998f2c2c5fad1afa68feae6122c19e66e5774519190a250565b6000546001600160a01b031633146106215760405163118cdaa760e01b8152336004820152602401610513565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215610c1f57600080fd5b5035919050565b6000815180845260005b81811015610c4c57602081850181015186830182015201610c30565b506000602082860101526020601f19601f83011685010191505092915050565b60208152815160208201526000602083015160018060a01b038082166040850152806040860151166060850152505060608301516080830152608083015160a083015260a083015160e060c0840152610cc9610100840182610c26565b905060c0840151151560e08401528091505092915050565b8781526001600160a01b03878116602083015286166040820152606081018590526080810184905260e060a08201819052600090610d2190830185610c26565b905082151560c083015298975050505050505050565b80356001600160a01b0381168114610d4e57600080fd5b919050565b600060208284031215610d6557600080fd5b610d6e82610d37565b9392505050565b600080600080600060808688031215610d8d57600080fd5b85359450610d9d60208701610d37565b935060408601359250606086013567ffffffffffffffff80821115610dc157600080fd5b818801915088601f830112610dd557600080fd5b813581811115610de457600080fd5b896020828501011115610df657600080fd5b9699959850939650602001949392505050565b600181811c90821680610e1d57607f821691505b602082108103610e3d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b601f821115610ea5576000816000526020600020601f850160051c81016020861015610e825750805b601f850160051c820191505b81811015610ea157828155600101610e8e565b5050505b505050565b815167ffffffffffffffff811115610ec457610ec4610e43565b610ed881610ed28454610e09565b84610e59565b602080601f831160018114610f0d5760008415610ef55750858301515b600019600386901b1c1916600185901b178555610ea1565b600085815260208120601f198616915b82811015610f3c57888601518255948401946001909101908401610f1d565b5085821015610f5a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610f8b57634e487b7160e01b600052601160045260246000fd5b92915050565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f191601019291505056fea2646970667358221220d058a797b00ca2f4bc9718ce6538c277171db9b1bbcc17f1a6ee6aeffd881fde64736f6c63430008180033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c806372263e5f11610097578063dedfdd3411610066578063dedfdd3414610241578063f239336414610254578063f2fde38b1461025c578063f64099d41461026f57600080fd5b806372263e5f146101ea5780638da5cb5b1461020a578063c23ead6f1461021b578063d78cfae81461022e57600080fd5b806334461067116100d357806334461067146101745780634fa061e21461019a578063704c1796146101af578063715018a6146101e257600080fd5b806303e9e609146101055780630d3eafd61461012e57806317d1342d146101405780632a5a4dd214610149575b600080fd5b610118610113366004610c0d565b610282565b6040516101259190610c6c565b60405180910390f35b6002545b604051908152602001610125565b61013260065481565b61015c610157366004610c0d565b6103c2565b6040516001600160a01b039091168152602001610125565b610187610182366004610c0d565b6103ec565b6040516101259796959493929190610ce1565b6101ad6101a8366004610c0d565b6104c2565b005b6101d26101bd366004610d53565b60036020526000908152604090205460ff1681565b6040519015158152602001610125565b6101ad61060f565b6101326101f8366004610d53565b60056020526000908152604090205481565b6000546001600160a01b031661015c565b6101ad610229366004610d53565b610623565b61013261023c366004610c0d565b610755565b6101ad61024f366004610d75565b610776565b600454610132565b6101ad61026a366004610d53565b610aad565b6101ad61027d366004610d53565b610aeb565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c0810191909152600082815260016020818152604092839020835160e08101855281548152928101546001600160a01b0390811692840192909252600281015490911692820192909252600382015460608201526004820154608082015260058201805491929160a08401919061032990610e09565b80601f016020809104026020016040519081016040528092919081815260200182805461035590610e09565b80156103a25780601f10610377576101008083540402835291602001916103a2565b820191906000526020600020905b81548152906001019060200180831161038557829003601f168201915b50505091835250506006919091015460ff16151560209091015292915050565b600481815481106103d257600080fd5b6000918252602090912001546001600160a01b0316905081565b60016020819052600091825260409091208054918101546002820154600383015460048401546005850180546001600160a01b039586169694909516949293919261043690610e09565b80601f016020809104026020016040519081016040528092919081815260200182805461046290610e09565b80156104af5780601f10610484576101008083540402835291602001916104af565b820191906000526020600020905b81548152906001019060200180831161049257829003601f168201915b5050506006909301549192505060ff1687565b3360009081526003602052604090205460ff1661051c5760405162461bcd60e51b81526020600482015260136024820152724e6f7420617574686f72697a656420554f525360681b60448201526064015b60405180910390fd5b600081815260016020526040812060040154900361056b5760405162461bcd60e51b815260206004820152600c60248201526b139bdd081c9958dbdc99195960a21b6044820152606401610513565b6000818152600160205260409020600201546001600160a01b031633146105c65760405162461bcd60e51b815260206004820152600f60248201526e139bdd081e5bdd5c881c9958dbdc99608a1b6044820152606401610513565b6000818152600160208190526040808320600601805460ff19169092179091555182917ff6c4766647704532b75863743d92939c86dc2095e7f51e412f9fbd3ca341189b91a250565b610617610b90565b6106216000610bbd565b565b61062b610b90565b6001600160a01b0381166106705760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610513565b6001600160a01b03811660009081526003602052604090205460ff16156106c95760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481859191959609a1b6044820152606401610513565b6001600160a01b038116600081815260036020526040808220805460ff1916600190811790915560048054918201815583527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191684179055517f43af16aba35dcf6aa5c53f46c7e28043a06f981d9c596cfad77718223cd02c839190a250565b6002818154811061076557600080fd5b600091825260209091200154905081565b3360009081526003602052604090205460ff166107cb5760405162461bcd60e51b81526020600482015260136024820152724e6f7420617574686f72697a656420554f525360681b6044820152606401610513565b8460000361080d5760405162461bcd60e51b815260206004820152600f60248201526e16995c9bc818dbdb5b5a5d1b595b9d608a1b6044820152606401610513565b6001600160a01b0384166108505760405162461bcd60e51b815260206004820152600a6024820152692d32b937903830bcb2b960b11b6044820152606401610513565b6000831161088e5760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606401610513565b600085815260016020526040902060040154156108e05760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c9958dbdc99195960821b6044820152606401610513565b6040518060e00160405280868152602001856001600160a01b03168152602001336001600160a01b0316815260200184815260200142815260200183838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060209182018190528781526001808352604091829020845181559284015190830180546001600160a01b03199081166001600160a01b0393841617909155918401516002840180549093169116179055606082015160038201556080820151600482015560a082015160058201906109cb9082610eaa565b5060c091909101516006909101805460ff191691151591909117905560028054600181019091557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace018590553360009081526005602052604081208054859290610a36908490610f6a565b925050819055508260066000828254610a4f9190610f6a565b92505081905550336001600160a01b0316846001600160a01b0316867f4270fa444b7d1b06de2e68a58d95db2c37fab4a4f890bc21115277af41f053f5868686604051610a9e93929190610f91565b60405180910390a45050505050565b610ab5610b90565b6001600160a01b038116610adf57604051631e4fbdf760e01b815260006004820152602401610513565b610ae881610bbd565b50565b610af3610b90565b6001600160a01b03811660009081526003602052604090205460ff16610b475760405162461bcd60e51b8152602060048201526009602482015268139bdd08199bdd5b9960ba1b6044820152606401610513565b6001600160a01b038116600081815260036020526040808220805460ff19169055517fbfea339225f93f559bd3c7c4e998f2c2c5fad1afa68feae6122c19e66e5774519190a250565b6000546001600160a01b031633146106215760405163118cdaa760e01b8152336004820152602401610513565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215610c1f57600080fd5b5035919050565b6000815180845260005b81811015610c4c57602081850181015186830182015201610c30565b506000602082860101526020601f19601f83011685010191505092915050565b60208152815160208201526000602083015160018060a01b038082166040850152806040860151166060850152505060608301516080830152608083015160a083015260a083015160e060c0840152610cc9610100840182610c26565b905060c0840151151560e08401528091505092915050565b8781526001600160a01b03878116602083015286166040820152606081018590526080810184905260e060a08201819052600090610d2190830185610c26565b905082151560c083015298975050505050505050565b80356001600160a01b0381168114610d4e57600080fd5b919050565b600060208284031215610d6557600080fd5b610d6e82610d37565b9392505050565b600080600080600060808688031215610d8d57600080fd5b85359450610d9d60208701610d37565b935060408601359250606086013567ffffffffffffffff80821115610dc157600080fd5b818801915088601f830112610dd557600080fd5b813581811115610de457600080fd5b896020828501011115610df657600080fd5b9699959850939650602001949392505050565b600181811c90821680610e1d57607f821691505b602082108103610e3d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b601f821115610ea5576000816000526020600020601f850160051c81016020861015610e825750805b601f850160051c820191505b81811015610ea157828155600101610e8e565b5050505b505050565b815167ffffffffffffffff811115610ec457610ec4610e43565b610ed881610ed28454610e09565b84610e59565b602080601f831160018114610f0d5760008415610ef55750858301515b600019600386901b1c1916600185901b178555610ea1565b600085815260208120601f198616915b82811015610f3c57888601518255948401946001909101908401610f1d565b5085821015610f5a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610f8b57634e487b7160e01b600052601160045260246000fd5b92915050565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f191601019291505056fea2646970667358221220d058a797b00ca2f4bc9718ce6538c277171db9b1bbcc17f1a6ee6aeffd881fde64736f6c63430008180033