viewport

Description:

Smart contract deployed on Ethereum.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

// #     #                                                     
// ##   ## # #    # #####  #    # # #      #      ###### ##### 
// # # # # # ##   # #    # #   #  # #      #      #      #    #
// #  #  # # # #  # #    # ####   # #      #      #####  #    #
// #     # # #  # # #    # #  #   # #      #      #      ##### 
// #     # # #   ## #    # #   #  # #      #      #      #   # 
// #     # # #    # #####  #    # # ###### ###### ###### #    #
//
// SPDX-License-Identifier: MIT
// Copyright Han, 2025

pragma solidity ^0.8.25;

contract Mindkiller {
    event ArtpieceCreated(address indexed creator);
    event ArtpieceTransferred(address indexed oldOwner, address indexed newOwner);
    event BidAccepted(uint256 value, address indexed fromAddress, address indexed toAddress);
    event BidPlaced(uint256 value, address indexed fromAddress);
    event BidWithdrawn(uint256 value, address indexed fromAddress);
    event ListedForSale(uint256 value, address indexed fromAddress, address indexed toAddress);
    event SaleCanceled(uint256 value, address indexed fromAddress, address indexed toAddress);
    event SaleCompleted(uint256 value, address indexed fromAddress, address indexed toAddress);

    error FundsTransfer();
    error InsufficientFunds();
    error ListedForSaleToSpecificAddress();
    error NoBid();
    error NotForSale();
    error NotOwner();
    error NotRoyaltyRecipient();
    error NotYourBid();
    error NullAddress();
    error RoyaltyTooHigh();

    string public constant MANIFEST = (
        'Endless pattern.' '
'
    );

    string public constant CORE = (
        '"use strict";const credits="wwwtyro sphere intersect",pr=Math.min(window.devicePixelRatio,1.5);let s={signature:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjE2IiBoZWlnaHQ9IjIxNiIgdmlld0JveD0iMCAwIDIxNiAyMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0yMTYgMjE2SDBWMEgyMTZWMjE2Wk0xMDggOTZDMTAxLjM3MyA5NiA5NiAxMDEuMzczIDk2IDEwOEM5NiAxMTQuNjI3IDEwMS4zNzMgMTIwIDEwOCAxMjBDMTE0LjYyNyAxMjAgMTIwIDExNC42MjcgMTIwIDEwOEMxMjAgMTAxLjM3MyAxMTQuNjI3IDk2IDEwOCA5NloiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=",mouse_sensitivity:1,mouse_limit:0,color_offset_frames:60,frame:0,res:[0,0],save_frames:0},h={newline:String.fromCharCode(10),parser:new URL(window.location)};const mobile=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);let w=window,d=document,b=d.body;d.body.style.touchAction="none",d.body.style.userSelect="none";let c=d.createElement("canvas");c.style.display="block",b.appendChild(c);const image=d.createElement("img");image.src=s.signature.trim(),image.style.cssText="width:40px;z-index:50;position:fixed;bottom:20px;right:20px;",b.appendChild(image);const glOptions={powerPreference:"high-performance"};mobile&&delete glOptions.powerPreference,w.gl=c.getContext("webgl2",glOptions),h.uniform1i=(e,t)=>h.uniform(e,t,"uniform1i"),h.uniform=(e,t,r)=>{s.uniforms||={};(s.uniforms[e]||=(()=>{const i=gl.getUniformLocation(s.current_program,e),o=r||(Array.isArray(t)?"uniform2fv":"uniform1f");return{update:e=>gl[o](i,e)}})()).update(t)},h.resize=()=>{let e,t,r,i=h.ix.mouse.x/s.res[0],o=h.ix.mouse.y/s.res[1];const a=h.parser.searchParams.get("res",t);a?(e=t=a,r=1):(e=w.innerWidth,t=w.innerHeight,s.aspect&&(e>t*s.aspect?e=t*s.aspect:t=e/s.aspect),r=pr),s.res[0]=c.width=e*r,s.res[1]=c.height=t*r,c.style.width=e+"px",c.style.height=t+"px",h.ix.set(c.width*i,c.height*o)},h.ix={start:{x:0,y:0},mouse:{x:0,y:0}},h.ix.set=(e,t)=>{h.ix.mouse={x:e,y:t}},h.ix.start=e=>{h.ix.start.x=e.clientX,h.ix.start.y=e.clientY,d.addEventListener("pointermove",h.ix.move)},h.clamp=(e,t,r)=>Math.max(t,Math.min(r,e)),h.ix.move=e=>{h.ix.mouse.x+=(e.clientX-h.ix.start.x)*pr*s.mouse_sensitivity,h.ix.mouse.y-=(e.clientY-h.ix.start.y)*pr*s.mouse_sensitivity,h.ix.start.x=e.clientX,h.ix.start.y=e.clientY,h.ix.mouse.x=h.clamp(h.ix.mouse.x,s.res[0]*s.mouse_limit,s.res[0]*(1-s.mouse_limit)),h.ix.mouse.y=h.clamp(h.ix.mouse.y,s.res[1]*s.mouse_limit,s.res[1]*(1-s.mouse_limit))},h.ix.stop=e=>{d.removeEventListener("pointermove",h.ix.move)},h.save={},h.save.toImage=()=>{const e=new Date;let t=String(e.getFullYear()).slice(2,4)+"-"+e.getMonth()+"-"+e.getDate()+" ("+s.frame+").png",r=document.createElement("a");r.setAttribute("download",t);let i=c.toDataURL("image/png").replace("data:image/png","data:application/octet-stream");r.setAttribute("href",i),r.click(),r.remove()},h.buildShader=(e,t)=>{let r=gl.createShader(e);return gl.shaderSource(r,t),gl.compileShader(r),r},h.initProgram=(e,t,r)=>{const i=gl.createProgram(),o=h.buildShader(gl.VERTEX_SHADER,t),s=h.buildShader(gl.FRAGMENT_SHADER,e);gl.attachShader(i,o),gl.attachShader(i,s),gl.linkProgram(i),gl.getShaderParameter(o,gl.COMPILE_STATUS)||console.error("V: "+gl.getShaderInfoLog(o)),gl.getShaderParameter(s,gl.COMPILE_STATUS)||console.error("F: "+gl.getShaderInfoLog(s)),gl.getProgramParameter(i,gl.LINK_STATUS)||console.error("P: "+gl.getProgramInfoLog(i));let a=gl.createBuffer(),n=gl.getAttribLocation(i,"p");return gl.bindBuffer(gl.ARRAY_BUFFER,a),gl.bufferData(gl.ARRAY_BUFFER,r,gl.STATIC_DRAW),gl.enableVertexAttribArray(n),gl.vertexAttribPointer(n,2,gl.FLOAT,!1,0,0),i},s.pixel=new Uint8Array(4),h.render=()=>{gl.viewport(0,0,c.width,c.height),gl.useProgram(s.program),s.current_program=s.program,h.uniform("u_time",.001*performance.now()),h.uniform("u_resolution",s.res),h.uniform("u_mouse",[h.ix.mouse.x,h.ix.mouse.y]),gl.drawArrays(gl.TRIANGLE_STRIP,0,4),(h.save.queued||s.frame<s.save_frames&&s.frame>3)&&(h.save.queued=!1,h.save.toImage()),s.frame++,requestAnimationFrame(h.render)};const init=async()=>{if(gl){h.resize(),h.ix.set(c.width/2,c.height/2),d.addEventListener("pointerdown",h.ix.start),d.addEventListener("pointerup",h.ix.stop),w.addEventListener("resize",h.resize),s.save_frames=h.parser.searchParams.get("frames")||0,d.addEventListener("keyup",e=>{if(!(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey))switch(e.key){case"f":const e=prompt("Frames to render",s.save_frames);h.parser.searchParams.set("frames",e),window.location=h.parser.href;break;case"r":const t=prompt("Canvas size in pixels (max 8192)",c.height);t>=8&&t<=8192&&(h.parser.searchParams.set("res",t),window.location=h.parser.href);break;case"s":h.save.queued=!0}});let e=Float32Array.of(-1,1,-1,-1,1,1,1,-1);const t="#version 300 es"+h.newline+"precision highp float; in vec2 p; void main(){ gl_Position =vec4(p,1.0,1.0); }";let r="#version 300 es"+h.newline+"#ifdef GL_ES"+h.newline+"precision highp float;"+h.newline+"#endif"+h.newline+"const int AA=2;uniform vec2 u_resolution;uniform float u_time;uniform vec2 u_mouse;const vec3 v=vec3(.941176470588235),x=vec3(.823529411764706),m=vec3(.941176470588235),n=vec3(0,0,-10);const vec2 y=vec2(.25,-.25);float f=0.;vec3 u=vec3(0);vec2 r=vec2(0);float i=1.,A=0.;vec3 d=vec3(0);"+h.newline+"#define R(a)mat2(cos(a),sin(a),-sin(a),cos(a))"+h.newline+"#define TAU 6.283185307"+h.newline+"#define PI 3.14159"+h.newline+"out vec4 fragColor;vec3 t(){vec3 v=gl_FragCoord.xyy,f;v=vec3(dot(v,vec3(127.1,311.7,74.7)),dot(v,vec3(269.5,183.3,246.1)),dot(v,vec3(113.5,271.9,124.6)));f=-1.+2.*fract(sin(v)*43758.5453123);return fract(555.*sin(777.*f))/256.;}float t(float v){return 1.-abs(mod(v,2.)-1.);}vec2 s(vec3 v){vec3 y=vec3(u.xy*(r-1.5),0);return vec2(length(v-y)-1.5,1);}vec3 e(vec3 v){vec2 d=vec2(.002,0);float f=s(v).x;return normalize(vec3(f-s(v-d.xyy).x,f-s(v-d.yxy).x,f-s(v-d.yyx).x));}vec2 e(vec3 v,vec3 y){float f=0.;vec2 d;vec3 x;for(int r=0;r<128;r++){x=v+y*f;d=s(x);if(f>1e2||abs(d.x)<.01)break;f+=d.x;}f=min(f,1e2);return vec2(f,d.y);}float e(vec3 v,vec3 f,vec3 x){float u=d.y*2.*TAU,r,A,i;vec3 a=n,s;a+=vec3(cos(u+y.x*TAU),-sin(u+y.y*TAU),0)*10.;s=normalize(a-v);r=pow(1.-dot(f,-x),2.);r*=1.;r=max(0.,r);A=max(dot(f,s),0.);A*=1.;i=max(dot(reflect(-s,f),-x),0.);i=pow(i,.001)*0.;return A+r+i;}vec2 s(vec3 v,vec3 f){vec3 d=normalize(vec3((vec2(.5)*(u_resolution.xy/min(u_resolution.x,u_resolution.y))).xy,1./tan(.291456794477867))),x=normalize(f-v),A=normalize(cross(x,vec3(0,1,0))),y=normalize(d.x*A+d.y*cross(A,x)+d.z*x);return(v+-v.z/y.z*y).xy;}vec4 p(vec2 a){float i=d.z;vec2 n=vec2(i)+y,c;n.x=t(n.x)*2.-1.;n.y=t(n.y)*2.-1.;u=vec3(n,0);vec3 G=m,p=vec3(0,0,-38.5+0.*A*f),U=vec3(0),T,z,k;r=abs(s(p,U));T=normalize(U-p);z=normalize(vec3(T.z,0,-T.x));k=normalize(a.x*z+a.y*cross(T,z)+1./tan(.291456794477867)*T);c=e(p,k);if(c.x<1e2){vec3 P=p+k*c.x,C=e(P);G=mix(x,v,e(P,C,k));}return vec4(G,1);}void p(float v,float f){float u=v+3.927;d=vec3((u-0.*f)/7.,(u-0.*f)/7.,u/7.);A=f;i=0.;}void main(){vec4 v=vec4(0,0,0,1);vec2 d=gl_FragCoord.xy,n,x,r;float A=.5+.5*sin(d.x*147.)*sin(d.y*131.),u=u_time,i=u_time/7.,a;i=(u+3.927)/7.;n=vec2(i)+y;x=n;x.x=t(x.x)*2.-1.;x.y=t(x.y)*2.-1.;a=floor(n.x)+floor(n.y);a=mod(a,2.);r=smoothstep(.976,1.,abs(x));f=max(max(r.x,r.y),a);for(int c=0;c<AA;c++)for(int T=0;T<AA;T++){vec2 G=vec2(T,c)/float(AA)-.5,U=(gl_FragCoord.xy+G-.5*u_resolution.xy)/min(u_resolution.x,u_resolution.y);float s=mix(.1,.02,f),k=.5*s*(float(c*AA+T)+A)/float(AA*AA),m=u+k;p(m,-1.);v.x+=p(U).x;p(m,0.);v.yw+=p(U).yw;p(m,1.);v.z+=p(U).z;}v/=float(AA*AA);v.xyz+=t();fragColor=v;}";if(mobile){const e="const int AA = 2";r=r.replace(e,"const int AA=1")}window.program=s.program=h.initProgram(r,t,e),h.render()}else{const e=d.createElement("div");e.style.cssText="align-items:center;background:#969696;color:#fff;display:flex;font-family:monospace;font-size:20px;height:100vh;justify-content:center;left:0;position:fixed;top:0;width:100vw;",e.innerHTML="Your browser does not support WebGL.",b.append(e)}};init();'
    );

    modifier onlyOwner() {
        if (owner != msg.sender) {
            revert NotOwner();
        }

        _;
    }

    modifier onlyRoyaltyRecipient() {
        if (royaltyRecipient != msg.sender) {
            revert NotRoyaltyRecipient();
        }

        _;
    }

    struct Offer {
        bool active;
        uint256 value;
        address toAddress;
    }

    struct Bid {
        bool active;
        uint256 value;
        address fromAddress;
    }

    address public owner;

    Offer public currentOffer;

    Bid public currentBid;

    address public royaltyRecipient;

    uint256 public royaltyPercentage;

    mapping (address => uint256) public pendingWithdrawals;

    constructor(uint256 _royaltyPercentage) {
        if (_royaltyPercentage >= 100) {
            revert RoyaltyTooHigh();
        }

        owner = msg.sender;
        royaltyRecipient = msg.sender;
        royaltyPercentage = _royaltyPercentage;

        emit ArtpieceCreated(msg.sender);
    }

    function name() public view virtual returns (string memory) {
        return 'Mindkiller';
    }

    function symbol() public view virtual returns (string memory) {
        return 'M';
    }

    function artpiece() public view virtual returns (string memory) {
        return string.concat(
            '<!DOCTYPE html>'
            '<html>'
                '<head>'
                    '<title>', 'Mindkiller', '</title>'

                    '<meta name="viewport" content="width=device-width, initial-scale=1" />'

                    '<style>html,body{background:#969696;margin:0;padding:0;overflow:hidden;}</style>'
                '</head>'

                '<body>'
                    '<script type="text/javascript">',
                        CORE,
                    '</script>'
                '</body>'
            '</html>'
        );
    }

    function withdraw() public {
        uint256 amount = pendingWithdrawals[msg.sender];

        pendingWithdrawals[msg.sender] = 0;

        _sendFunds(amount);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        if (newOwner == address(0)) {
            revert NullAddress();
        }

        _transferOwnership(newOwner);

        if (currentBid.fromAddress == newOwner) {
            uint256 amount = currentBid.value;

            currentBid = Bid({ active: false, value: 0, fromAddress: address(0) });

            pendingWithdrawals[newOwner] += amount;
        }

        if (currentOffer.active) {
            currentOffer = Offer({ active: false, value: 0, toAddress: address(0) });
        }
    }

    function listForSale(uint256 salePriceInWei) public onlyOwner {
        currentOffer = Offer({ active: true, value: salePriceInWei, toAddress: address(0) });

        emit ListedForSale(salePriceInWei, msg.sender, address(0));
    }

    function listForSaleToAddress(uint256 salePriceInWei, address toAddress) public onlyOwner {
        currentOffer = Offer({ active: true, value: salePriceInWei, toAddress: toAddress });

        emit ListedForSale(salePriceInWei, msg.sender, toAddress);
    }

    function cancelFromSale() public onlyOwner {
        Offer memory oldOffer = currentOffer;

        currentOffer = Offer({ active: false, value: 0, toAddress: address(0) });

        emit SaleCanceled(oldOffer.value, msg.sender, oldOffer.toAddress);
    }

    function buyNow() public payable {
        if (!currentOffer.active) {
            revert NotForSale();
        }

        if (currentOffer.toAddress != address(0) && currentOffer.toAddress != msg.sender) {
            revert ListedForSaleToSpecificAddress();
        }

        if (msg.value != currentOffer.value) {
            revert InsufficientFunds();
        }

        currentOffer = Offer({ active: false, value: 0, toAddress: address(0) });

        uint256 royaltyAmount = _calcRoyalty(msg.value);

        pendingWithdrawals[owner] += msg.value - royaltyAmount;
        pendingWithdrawals[royaltyRecipient] += royaltyAmount;

        emit SaleCompleted(msg.value, owner, msg.sender);

        _transferOwnership(msg.sender);
    }

    function placeBid() public payable {
        if (msg.value <= currentBid.value) {
            revert InsufficientFunds();
        }

        if (currentBid.value > 0) {
            pendingWithdrawals[currentBid.fromAddress] += currentBid.value;
        }

        currentBid = Bid({ active: true, value: msg.value, fromAddress: msg.sender });

        emit BidPlaced(msg.value, msg.sender);
    }

    function acceptBid() public onlyOwner {
        if (!currentBid.active) {
            revert NoBid();
        }

        uint256 amount = currentBid.value;
        address bidder = currentBid.fromAddress;

        currentOffer = Offer({ active: false, value: 0, toAddress: address(0) });
        currentBid = Bid({ active: false, value: 0, fromAddress: address(0) });

        uint256 royaltyAmount = _calcRoyalty(amount);

        pendingWithdrawals[owner] += amount - royaltyAmount;
        pendingWithdrawals[royaltyRecipient] += royaltyAmount;

        emit BidAccepted(amount, owner, bidder);

        _transferOwnership(bidder);
    }

    function withdrawBid() public {
        if (msg.sender != currentBid.fromAddress) {
            revert NotYourBid();
        }

        uint256 amount = currentBid.value;

        currentBid = Bid({ active: false, value: 0, fromAddress: address(0) });

        _sendFunds(amount);

        emit BidWithdrawn(amount, msg.sender);
    }

    function setRoyaltyRecipient(address newRoyaltyRecipient) public onlyRoyaltyRecipient {
        if (newRoyaltyRecipient == address(0)) {
            revert NullAddress();
        }

        royaltyRecipient = newRoyaltyRecipient;
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = owner;

        owner = newOwner;

        emit ArtpieceTransferred(oldOwner, newOwner);
    }

    function _sendFunds(uint256 amount) internal virtual {
        (bool success, ) = msg.sender.call{value: amount}('');

        if (!success) {
            revert FundsTransfer();
        }
    }

    function _calcRoyalty(uint256 amount) internal virtual returns (uint256) {
        return (amount * royaltyPercentage) / 100;
    }
}

Tags:
addr:0x2ab3f97bea806d762e4c6dba8b305e1bc5450965|verified:true|block:23601932|tx:0xe4ea2b6b5a5456fd718ce0f0e777e6e00f2affcf19e3a19d372da61ead445fe3|first_check:1760777016

Submitted on: 2025-10-18 10:43:38

Comments

Log in to comment.

No comments yet.