import { storage, logging, PersistentSet, Context, persist } from "near-sdk-as" @nearBindgen class Singleton { private visitors: PersistentSet = new PersistentSet("v"); private _owner: string = defaultValue(); private last_visited: string = "NULL"; constructor(owner: string) { this._owner = owner; } owner(): string { return this._owner; } @mutateState() visit(): void { if (!this.visitors.has(Context.sender)) { logging.log("Visited the first time by " + Context.sender); this.visitors.add(Context.sender); } this.last_visited = Context.sender; } visit_without_updated_decorator(): void { this.visit(); persist(this); } visit_without_change(): void { this.visit(); } hasVisited(visitor: string): bool { return this.visitors.has(visitor); } lastVisited(): string { return this.last_visited || ""; } storageCheck(): void { storage.hasKey("key"); } private hasNotVisited(visitor: string): boolean { return !this.hasNotVisited(visitor); } decode<_V = Uint8Array>(buf: _V): Singleton { let json: JSON.Obj; if (buf instanceof Uint8Array) { json = JSON.parse(buf); } else { assert(buf instanceof JSON.Obj, "argument must be Uint8Array or Json Object"); json = buf; } return this._decode(json); } static decode(buf: Uint8Array): Singleton { return decode(buf); } private _decode(obj: JSON.Obj): Singleton { this.visitors = obj.has("visitors") ? decode, JSON.Obj>(obj, "visitors"): new PersistentSet("v"); this._owner = obj.has("_owner") ? decode(obj, "_owner"): defaultValue(); this.last_visited = obj.has("last_visited") ? decode(obj, "last_visited"): "NULL"; return this; } _encode(name: string | null = "", _encoder: JSONEncoder | null = null): JSONEncoder { let encoder = _encoder == null ? new JSONEncoder() : _encoder; encoder.pushObject(name); encode, JSONEncoder>(this.visitors, "visitors", encoder); encode(this._owner, "_owner", encoder); encode(this.last_visited, "last_visited", encoder); encoder.popObject(); return encoder; } encode(): Uint8Array { return this._encode().serialize(); } serialize(): Uint8Array { return this.encode(); } toJSON(): string { return this._encode().toString(); } } let __contract: Singleton if (__checkState()) { __contract = __getState(); } @exportAs("new") function init(owner: string): void { assert(isNull(__contract), "contract is already initialized"); __contract = new Singleton(owner); __setState(__contract); } function owner(): string { assert(!isNull(__contract), "contract is not initialized"); let res = __contract.owner(); return res; } @mutateState() export function visit(): void { assert(!isNull(__contract), "contract is not initialized"); __contract.visit(); __setState(__contract); } export function visit_without_updated_decorator(): void { assert(!isNull(__contract), "contract is not initialized"); __contract.visit_without_updated_decorator(); } export function visit_without_change(): void { assert(!isNull(__contract), "contract is not initialized"); __contract.visit_without_change(); } function hasVisited(visitor: string): bool { assert(!isNull(__contract), "contract is not initialized"); let res = __contract.hasVisited(visitor); return res; } function lastVisited(): string { assert(!isNull(__contract), "contract is not initialized"); let res = __contract.lastVisited(); return res; } export function storageCheck(): void { assert(!isNull(__contract), "contract is not initialized"); __contract.storageCheck(); } @exportAs("new") function __wrapper_init(): void { const obj = getInput(); init(obj.has('owner') ? decode(obj, "owner") : requireParameter("owner")); } export { __wrapper_init as init } function __wrapper_owner(): void { let result: string = owner(); const val = encode(result); value_return(val.byteLength, val.dataStart); } export { __wrapper_owner as owner } function __wrapper_hasVisited(): void { const obj = getInput(); let result: bool = hasVisited(obj.has('visitor') ? decode(obj, "visitor") : requireParameter("visitor")); const val = encode(result); value_return(val.byteLength, val.dataStart); } export { __wrapper_hasVisited as hasVisited } function __wrapper_lastVisited(): void { let result: string = lastVisited(); const val = encode(result); value_return(val.byteLength, val.dataStart); } export { __wrapper_lastVisited as lastVisited }