0xe075…0eb4

All memos sent from and to 0xe075…0eb4.

The Wrapture is a generative edition with unique properties. Technically it is capped at 666 editions, however holders of The Eternal Pump have the opportunity to limit the edition to 50 algorithmic editions if they can cooperate. The rules are fairly simple: as long as no one trades, sells, or lists their edition for sale in the next year, no additional editions will be made available for minting. However, if one collector breaks the rules, the remainder of the 666 editions will be opened up to the public for minting. If no one breaks the rules for one year, the edition will be capped and collectors will be free to “move” the art with no repercussions. Collectors will be faced with an interesting dilemma - should be fun to watch. Made by Dmitri Cherniak with Javascript and GLSL.
0xe0753cfc…0eb4·#16,145,610·0x48603ad0…0c7bbe
Light Years: Process WorksAddress: call to non-contractAddress: call to non-contractAddress: low-level delegate call failedAddress: low-level delegate call failed
0xe0753cfc…0eb4·#14,564,653·0xc087a51b…c3929a
RnDmitri Cherniak`Address: delegate call to non-co`DAddress: delegate call to non-co`DAddress: low-level delegate call failedAddress: low-level delegate call failed
0xe0753cfc…0eb4·#14,109,512·0xedf9f675…6c5195
{"name":"Dead Ringers: Edition",`"created_by":"Dmitri Cherniak","` description":"Dead Ringers: Edit`@ion\n\nEvery day in January 2022`` I generated a new output from a`n algorithm, generated a random `wallet address, and sent the wor`k to that address. On the final `day, January 31st, all the previaous Dead Ringers were placed in aa 5 by 6 grid and minted to a geanerated address.\n\nIt was almosat guaranteed none of the walletsa that received Dead Ringers woulad ever be accessible given therea are 16 to power of 40 availablea addresses. I hoped it would helap observers appreciate the vastnaess of the address space and thea underlying security it providesa to the network used to distribuate the work.\n\nWhile the distriabution of individual Dead Ringeras was extremely fair, as it protaected against bots and ballot stauffing, it was also extremely unalikely that they would ever be caollected. For that reason, obseravers ascribed value to their scaarcity and the odds of receiving aone.\n\nThe Dead Ringers: Editioan flips that notion on its head.a Now an edition of January 31, 2a022, colloquially known as the Daead Ringers grid, is available tao all wallets as a 24-hour timeda edition, capped at the size of a16 to the power of 40. That is tahe total number of possible wallaets, and each wallet is entitleda to own one if they should wish.a\n\nThe ERC1155 token points to athe same PNG file on Arweave thaat the original January 31, 2022 areferenced, meaning the underlyiang artwork is exactly the same faile as the sought after originala.\n\nEach wallet is only eligiblae to mint one edition, and if a awallet already has one it cannota mint another. There is a 24 houar minting period and the editiona size is capped at 16 to the powaer of 40, the number of all possaible Ethereum addresses.\n\n30 Daead Ringers in a 5 by 6 grid\n\naSVG generated by javascript as SaVG, and rendered to PNG.\n\n1440a0px by 21600px",There can only ever exist one fo`r each possible address.Ownable: new owner is the zero a`Invalid call datadata:application/json;utf8,Ownable: caller is not the owner`You can only mint once.AdminControl: Must be owner or a`You can't mint one if you alread`
0xe0753cfc…0eb4·#13,922,848·0x24f25810…19274c
Dead Ringers by Dmitri CherniakAddress: delegate call to non-co`DAddress: delegate call to non-co`DAddress: low-level delegate call failedAddress: low-level delegate call failed
class e{constructor(e){this.ptz=e}gTS(e,t,c,a=!0){let r=this.gI(t,c,a=a),n=r.arcs,o=r.connects;e.moveTo(n[0].start[0],n[0].start[1]);for(let t=0;t<n.length;t++){let c=n[t],a=o[t],r=Math.atan2(c.start[1]-c.cy,c.start[0]-c.cx),i=Math.atan2(c.end[1]-c.cy,c.end[0]-c.cx);r!=i&&e.absarc(c.cx,c.cy,c.r,r,i,!c.sweep),e.lineTo(a[2],a[3])}}gI(e,t,c=!0){let a,r=[],n=[];t?a=[t[0],t[1]]:(a=[0,0],this.ptz.forEach((e=>{a[0]+=e.cx,a[1]+=e.cy})),a=[a[0]/this.ptz.length,a[1]/this.ptz.length]),c&&this.ptz.sort(((e,t)=>{let c=Math.atan2(e.cy-a[1],e.cx-a[0])-Math.atan2(t.cy-a[1],t.cx-a[0]),r=-(this.dt(e.cx,e.cy,a[0],a[1])-this.dt(t.cx,t.cy,a[0],a[1]));return 0===c?r:c}));for(let e=0;e<this.ptz.length&&this.ptz.length>1;e+=1){let t=this.ptz[e-1<0?this.ptz.length-1:e-1],c=this.ptz[e];c.sortedOrder=e;let a=this.ptz[(e+1)%this.ptz.length],r=t.cx-c.cx,n=t.cy-c.cy,i=a.cx-c.cx,l=a.cy-c.cy;var o=Math.atan2(r*l-n*i,r*i+n*l);c.isCnc=o<0&&Math.abs(o)<=Math.PI||Math.abs(o)===Math.PI}for(let t=0;t<this.ptz.length&&this.ptz.length>1;t+=1){let c=this.ptz[t],a=this.ptz[(t+1)%this.ptz.length],r=this.gTs(c.cx,c.cy,c.r,a.cx,a.cy,a.r);e?c.isCnc&&a.isCnc?n.push(r[1]):c.isCnc&&!a.isCnc?n.push(r[3]):!c.isCnc&&a.isCnc?n.push(r[2]):n.push(r[0]):n.push(r[1])}for(let t=0;t<this.ptz.length&&this.ptz.length>1;t+=1){let c=t-1<0?this.ptz.length-1:t-1,a=(this.ptz.length,this.ptz[c],this.ptz[t]),o=n[t],i=n[c],l=[i[2],i[3]],s=[o[0],o[1]];if(e){let e,t=[i[0],i[1]],c=[o[2],o[3]],n=l[0]-t[0],d=l[1]-t[1],h=s[0]-c[0],f=s[1]-c[1],x=Math.atan2(n*f-d*h,n*h+d*f);e=Math.abs(x)<Math.PI/2&&(x<0&&!a.isCnc||x>0&&a.isCnc)?1:0,r.push({start:l,cx:a.cx,cy:a.cy,r:a.r,largeArc:e,sweep:a.isCnc?1:0,end:s,display:Math.abs(x)<Math.PI/1.2})}else r.push({start:l,cx:a.cx,cy:a.cy,r:a.r,largeArc:a.isCnc?0:1,sweep:1,end:s,display:!0})}return{arcs:r,connects:n}}dt(e,t,c,a){return Math.sqrt((c-e)*(c-e)+(a-t)*(a-t))}gTs(e,t,c,a,r,n){let o=(e-a)*(e-a)+(t-r)*(t-r);if(o<=(c-n)*(c-n))return[];let i=Math.sqrt(o),l=(a-e)/i,s=(r-t)/i,d=Array(4).fill(0).map((e=>Array(4).fill(0))),h=0;for(let o=1;o>=-1;o-=2){let f=(c-o*n)/i;if(f*f>1)continue;let x=Math.sqrt(Math.max(0,1-f*f));for(let i=1;i>=-1;i-=2){let v=l*f-i*x*s,p=s*f+i*x*l,y=d[h++];y[0]=e+c*v,y[1]=t+c*p,y[2]=a+o*n*v,y[3]=r+o*n*p}}return d.slice(0,h)}}let t="#f1f1f1",c=function(e){let t=[];for(let c=0;c<32;c++)t.push(e.hash.slice(2+2*c,4+2*c));return t.map((e=>parseInt(e,16)))}(tokenData),a=(r=tokenData,parseInt(r.hash.slice(0,16),16));var r;let n=_(c[1],[1,1,1,3,5,6,20,20]),o=20===n,i=c[8]>200,l=!o&&c[9]>180,s=_(c[7],o?[["#47485f","#be3441","#f0bc67","#5a89c5","#e28d64","#d6c5d1"],["#000","#914e72","#0078bf","#00a95c","#3255a4","#f15060","#3d5588","#765ba7","#00838a","#bb8b41","#407060","#ff665e","#925f52","#ffe800","#d2515e","#ff6c2f","#ff48b0","#88898a","#ac936e","#e45d50","#ff7477","#62a8e5","#4982cf","#0074a2","#235ba8","#484d7a","#435060","#d5e4c0","#a5aaa8","#70747c","#5f8289","#375e77","#5e695e","#00aa93","#19975d","#397e58","#516e5a","#4a635d","#68724d","#62c2b1","#67b346","#009da5","#169b62","#237e74","#2f6165","#9d7ad2","#aa60bf","#845991","#775d7a","#6c5d80","#f65058","#d2515e","#d1517a","#9e4c6e","#d1517a","#a75154","#e3ed55","#ffb511","#ffae3b","#f6a04d","#ee7f4b","#ff6f4c","#b49f29","#ba8032","#bd6439","#8e595a","#f2cdcf","#f984ca","#e6b5c9","#bd8ca6","#914e72","#928d88","#ffffff","#5ec8e5","#82d8d5","#ffe900","#ff4c65","#44d62c"],["#556b59","#7d9d89","#b1cbbf","#dfcbcf","#bc9ba1","#976e72","#424e77","#7e86b0","#c2cae1"],["#000","#222","#333"]]:[0,1,2]),d={background:o?c[10]>126?A(s):t:2===s&&1==n?j(!1):t,zm:1==n?.66:o?_(c[5],[8,5,3]):6==n?1.3:1,factor:o?1:_(c[2],0==s?i||l?[60,45]:[20,30]:[60,100]),sD:20,coloring:_(c[5],["row","col","field"]),gridDim:n,wraps:o,wild:i,blinds:l,divider:c[3]<200||o?2:n>1?100:2,tilt:c[11]>215,pal:s};console.log(d);let h=()=>Math.min(window.innerWidth,window.innerHeight),f={w:h(),h:h()},x=(()=>{let e=document.createElement("canvas");return e.height=f.h,e.width=f.w,document.body.appendChild(e),e})(),v=new THREE.Scene,p=(e,t)=>new THREE.ShaderMaterial({side:THREE.DoubleSide,uniforms:{power:{value:1.5},color:{value:new THREE.Color(e)},background:{value:new THREE.Color(t)}},vertexShader:"varying vec2 vUv;void main () {vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position.xyz, 1.0);}",fragmentShader:"varying vec2 vUv;uniform vec3 color;uniform vec3 background;uniform float power;\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved. Distributed under the MIT License. https://github.com/ashima/webgl-noise\nvec3 mod289(vec3 x){return x - floor(x * (1.0 / 289.0)) * 289.0;}\nvec4 mod289(vec4 x){return x - floor(x * (1.0 / 289.0)) * 289.0;}\nvec4 permute(vec4 x){return mod289(((x*34.0)+1.0)*x);}\nvec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\nfloat snoise(vec3 v) {const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);vec3 i = floor(v + dot(v, C.yyy));vec3 x0 = v - i + dot(i, C.xxx);\nvec3 g = step(x0.yzx, x0.xyz);vec3 l = 1.0 - g;vec3 i1 = min( g.xyz, l.zxy );vec3 i2 = max( g.xyz, l.zxy );vec3 x1 = x0 - i1 + C.xxx;vec3 x2 = x0 - i2 + C.yyy;vec3 x3 = x0 - D.yyy;i = mod289(i);\nvec4 p = permute(permute(permute(i.z + vec4(0.0, i1.z, i2.z, 1.0 ))+ i.y + vec4(0.0, i1.y, i2.y, 1.0 ))+ i.x + vec4(0.0, i1.x, i2.x, 1.0 ));float n_ = 0.142857142857;vec3 ns = n_ * D.wyz - D.xzx;vec4 j = p - 49.0 * floor(p * ns.z * ns.z); vec4 x_ = floor(j * ns.z);vec4 y_ = floor(j - 7.0 * x_);vec4 x = x_ *ns.x + ns.yyyy;vec4 y = y_ *ns.x + ns.yyyy;vec4 h = 1.0 - abs(x) - abs(y);\nvec4 b0 = vec4(x.xy, y.xy);vec4 b1 = vec4(x.zw, y.zw);vec4 s0 = floor(b0)*2.0 + 1.0;vec4 s1 = floor(b1)*2.0 + 1.0;vec4 sh = -step(h, vec4(0.0));\nvec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy;vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww;vec3 p0 = vec3(a0.xy,h.x);vec3 p1 = vec3(a0.zw,h.y);vec3 p2 = vec3(a1.xy,h.z);vec3 p3 = vec3(a1.zw,h.w);\nvec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));p0 *= norm.x;p1 *= norm.y;p2 *= norm.z;p3 *= norm.w;vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);m = m * m;return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),dot(p2,x2), dot(p3,x3)));}\nvoid main () {float d = pow(abs(vUv.y), power);gl_FragColor = vec4(mix(background, color, d-(snoise(gl_FragCoord.xyz/(d*d)) * d/2.)), 1.);}"}),y=()=>{let e,t;for(e=j(!1),t=j(!1);e==t;)t=j(!1);return p(e,t)},u=e=>{let t,c;for(t=A(e),c=A(e);t==c;)c=A(e);return p(t,c)},b=(e,t)=>{let c=q([e,t]);return p(c[0],c[1])},g=d.gridDim,z=null;1===d.pal?z=j(!0):2===d.pal&&(z="#000");for(let c=0;c<g;c++)for(let a=0;a<g;a++){let r=[],n=.5,i=.2,l=i/2/d.divider;for(let e=-n;e<n;e+=i)for(let t=-n;t<n;t+=i)r.push({cx:e,cy:t,r:l});if(o&&H()<.45||!o){let n=new e((M=r,C=k(o?16:18,25),q(M).slice(0,C))),i=new THREE.Shape;n.gTS(i,d.wraps,!1);let l=.5/d.factor;var m=new THREE.ExtrudeGeometry(i,{curveSegments:40,depth:l,bevelEnabled:!1});let s=d.sD*d.factor,h=1===d.gridDim?0:o?(10===d.zm?4:2)+k(1,10):2,f=null;0===d.pal?f=null:1===d.pal?f=j(!0):2===d.pal&&(f="#000");let x=null;for(let e=0;e<s;e++){let r=null;if("field"===d.coloring)r=b(z,t);else if("col"===d.coloring)r=b(f,t);else for(r=0===d.pal?y():b(f,t);e<5&&r==x&&0===d.pal;)r=0===d.pal?y():b(f,t);x=r;var w=new THREE.Mesh(m,[o&&0==e?p("#2b2b2b","#f5f5f5"):null,o?u(d.pal):0===d.pal?y():r]);w.rotation.x=Math.PI/2,d.tilt&&3!==d.gridDim&&(w.rotation.z=Math.PI/4,100!=d.divider?(w.scale.x=.95,w.scale.y=.95):(w.scale.x=1.0666,w.scale.y=1.0666)),w.position.y=h-e*l,w.position.x=1.2*c,w.position.z=1.2*a,d.wild&&w.scale.multiplyScalar((s-e*e)/s),d.blinds&&e>=(d.factor>50?20:10)&&(w.scale.z=.5),v.add(w)}}}var M,C;let E=d.zm;const T=f.w/f.h,D=new THREE.OrthographicCamera(-E*T,E*T,E,-E,-100,100);var I,R;R=E,(I=D).position.set(R,R,R),I.lookAt(0,0,0),v.add(D);let S=new THREE.WebGLRenderer({canvas:x,antialias:!0});function H(){return a^=a<<13,a^=a>>17,a^=a<<5,(a<0?1+~a:a)%1e3/1e3}function _(e,t){return t[Math.max(0,Math.floor(e/255*t.length-1e-6))]}function P(e,t){return H()*(t-e)+e}function k(e,t){return Math.floor(P(e,t))}function A(e){return e[k(0,e.length)]}function q(e){for(var t,c,a=e.length,r=e.slice();a;)t=Math.floor(H()*a--),c=r[a],r[a]=r[t],r[t]=c;return r}function j(e){const c=["#292628","#2966a4","#edd035","#e8502f","#9a4e55","#3b9764","#68a5b9","#bb98c4","#86d052","#aa9f52"],a=P(0,100);return a>=0&&a<49.5?e?j(e):H()>.33?c[0]:t:a>=49.5&&a<61.3?c[1]:a>=61.3&&a<69.2?c[2]:a>=69.2&&a<77.1?c[3]:a>=77.1&&a<83.9?c[4]:a>=83.9&&a<90.2?c[5]:a>=90.2&&a<94.4?c[6]:a>=94.4&&a<97.6?c[7]:a>=97.6&&a<99.2?c[8]:a>=99.2?c[9]:void 0}S.setPixelRatio(Math.min(window.devicePixelRatio,2)),S.setSize(f.w,f.h),S.setClearColor(d.background),S.render(v,D);
The Wrapture is a generative edition with unique properties. Technically it is capped at 666 editions, however holders of The Eternal Pump have the opportunity to limit the edition to less than 50 if they can cooperate. The rules are fairly simple: as long as no one trades, sells, or lists their edition for sale in the next year, no additional editions will be made available for minting. However, if one collector breaks the rules, the remainder of the 666 editions will be opened up to the public for minting. If no one breaks the rules for one year, the edition will be capped and collectors will be free to “move” the art with no repercussions. Collectors will be faced with an interesting dilemma - should be fun to watch. Made by Dmitri Cherniak with Javascript and GLSL.
let pc="#f2f2f2",bgCols=["#f2c5d2","#e5bb57","#9c96cd","#76b995","#70a7c5","#f8e6d1","#dfbcab","#f1e7e1",pc,pc,pc,pc,pc,pc,pc,pc,pc,pc,pc,pc,pc,pc],chill=["#47485f","#be3441","#f0bc67","#5a89c5","#e28d64","#d6c5d1"],rnb=["#fd3741","#fe4f11","#ff6800","#ffa61a","#ffc219","#ffd114","#fcd82e","#f4d730","#ced562","#8ac38f","#79b7a0","#72b5b1","#5b9bae","#6ba1b7","#49619d","#604791","#721e7f","#9b2b77","#ab2562","#ca2847"],shim=["#f0f0c0","#f0d8c0","#d8d8c0","#d8c090","#d8c0a8","#f0d8a8","#fff0c0","#f0f0d8","#fff0d8","#d8c078","#f0d878","#c0a878","#f0d890","#ffffd8","#c0c0a8","#c0c090","#fff0a8","#f0f0a8","#d8d8a8","#f0c090","#c09090","#786048","#c0a890","#606060","#909090","#904830","#d8d890","#f0d8d8","#787878","#fff0f0","#a87860","#c0a8a8","#c09078","#fff090","#a8a8a8","#d8a848","#f0f090","#f0c048","#d8a878","#f0c060","#ffd8c0","#f0c078","#c0a860","#907860","#a8a890","#d8a860","#907890","#a8a878","#a87800","#f0d848"],riso=["#000","#914e72","#0078bf","#00a95c","#3255a4","#f15060","#3d5588","#765ba7","#00838a","#bb8b41","#407060","#ff665e","#925f52","#ffe800","#d2515e","#ff6c2f","#ff48b0","#88898a","#ac936e","#e45d50","#ff7477","#62a8e5","#4982cf","#0074a2","#235ba8","#484d7a","#435060","#d5e4c0","#a5aaa8","#70747c","#5f8289","#375e77","#5e695e","#00aa93","#19975d","#397e58","#516e5a","#4a635d","#68724d","#62c2b1","#67b346","#009da5","#169b62","#237e74","#2f6165","#9d7ad2","#aa60bf","#845991","#775d7a","#6c5d80","#f65058","#d2515e","#d1517a","#9e4c6e","#d1517a","#a75154","#e3ed55","#ffb511","#ffae3b","#f6a04d","#ee7f4b","#ff6f4c","#b49f29","#ba8032","#bd6439","#8e595a","#f2cdcf","#f984ca","#e6b5c9","#bd8ca6","#914e72","#928d88","#ffffff","#5ec8e5","#82d8d5","#ffe900","#ff4c65","#44d62c"],flo=["#f96","#cf0","#f93","#f0c","#ee34d3","#4fb4e5","#abf1cf","#ff6037","#ff355e","#6f6","#fc3","#ff6eff","#ff6","#fd5b78"],gld=["#E59B12"],fp="#fc8eac",flm=[fp,fp,fp,fp,"gray","#000","#ff6"],rP=spr(tokenData),seed=gS(tokenData),rings=Math.floor(mP(rP[1],5,12))-1,sRings=rings<=5,p={background:pk(rP[0],bgCols),zm:rP[10]>=32?1:.66,rings:rings,position:pk(rP[2],[[1,1],[1,0],[1,-1],[0,1],[0,-1],[-1,1],[-1,0],[-1,-1]]),speed:pk(rP[4],[.5,1,1,1,.25,1,1,1.5,3]),filler:sRings&&rP[5]<127?.84:.95,offset:rP[6]>=64,palette:pk(rP[7],[shim,riso,chill,flm,gld,flo,rnb]),sizer:pk(rP[8],sRings?[.1,.15,.2]:[.1,.11,.12]),cS:rP[9]<20?3:50},getDim=()=>Math.min(window.innerWidth,window.innerHeight),szs={w:getDim(),h:getDim()},genCan=()=>{let e=document.createElement("canvas");return e.height=szs.h,e.width=szs.w,document.body.appendChild(e),e},confCam=e=>{e.position.set(.20422396235810633*p.position[0],-.2889694322482629*p.position[1],-.9353016841772848),e.lookAt(0,0,0)},canvas=genCan(),sc=new THREE.Scene,oms=[],mshs=[],cM=()=>{let e=pick(p.palette);return new THREE.ShaderMaterial({side:THREE.DoubleSide,opacity:1,transparent:!0,uniforms:{power:{value:rng(1,1.2)},color:{value:new THREE.Color("#fff")},background:{value:new THREE.Color(e)}},vertexShader:"varying vec2 vUv;void main () {vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position.xyz, 1.0);}",fragmentShader:"varying vec2 vUv;uniform vec3 color;uniform vec3 background;uniform float power;\n// Description : Array and textureless GLSL 3D simplex noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved. Distributed under the MIT License. https://github.com/ashima/webgl-noise\nvec3 mod289(vec3 x){return x - floor(x * (1.0 / 289.0)) * 289.0;}\nvec4 mod289(vec4 x){return x - floor(x * (1.0 / 289.0)) * 289.0;}\nvec4 permute(vec4 x){return mod289(((x*34.0)+1.0)*x);}\nvec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\nfloat snoise(vec3 v) {const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);vec3 i = floor(v + dot(v, C.yyy));vec3 x0 = v - i + dot(i, C.xxx);\nvec3 g = step(x0.yzx, x0.xyz);vec3 l = 1.0 - g;vec3 i1 = min( g.xyz, l.zxy );vec3 i2 = max( g.xyz, l.zxy );vec3 x1 = x0 - i1 + C.xxx;vec3 x2 = x0 - i2 + C.yyy;vec3 x3 = x0 - D.yyy;i = mod289(i);\nvec4 p = permute(permute(permute(i.z + vec4(0.0, i1.z, i2.z, 1.0 ))+ i.y + vec4(0.0, i1.y, i2.y, 1.0 ))+ i.x + vec4(0.0, i1.x, i2.x, 1.0 ));float n_ = 0.142857142857;vec3 ns = n_ * D.wyz - D.xzx;vec4 j = p - 49.0 * floor(p * ns.z * ns.z); vec4 x_ = floor(j * ns.z);vec4 y_ = floor(j - 7.0 * x_);vec4 x = x_ *ns.x + ns.yyyy;vec4 y = y_ *ns.x + ns.yyyy;vec4 h = 1.0 - abs(x) - abs(y);\nvec4 b0 = vec4(x.xy, y.xy);vec4 b1 = vec4(x.zw, y.zw);vec4 s0 = floor(b0)*2.0 + 1.0;vec4 s1 = floor(b1)*2.0 + 1.0;vec4 sh = -step(h, vec4(0.0));\nvec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy;vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww;vec3 p0 = vec3(a0.xy,h.x);vec3 p1 = vec3(a0.zw,h.y);vec3 p2 = vec3(a1.xy,h.z);vec3 p3 = vec3(a1.zw,h.w);\nvec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));p0 *= norm.x;p1 *= norm.y;p2 *= norm.z;p3 *= norm.w;vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);m = m * m;return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),dot(p2,x2), dot(p3,x3)));}\nvoid main () {float d = pow(abs(vUv.y), power);gl_FragColor = vec4(mix(background, color, d-(snoise(gl_FragCoord.xyz/(d*d)) * d/1.5)), 0.4275);}"})};const T=2*Math.PI;let ors=new THREE.Shape;ors.moveTo(0,0),ors.absarc(0,0,1,0,T);let irs=new THREE.Path;irs.moveTo(0,0),irs.absarc(0,0,p.filler,0,T),ors.holes.push(irs);let rGeo=new THREE.ExtrudeBufferGeometry(ors,{curveSegments:p.cS,depth:6,bevelEnabled:0});for(let e=1;e<p.rings+1;e++){let c=new THREE.Mesh(rGeo,cM()),a=1-e/p.rings;c.scale.x*=a,c.scale.y*=a,c.position.z=pick([1,-1])*rng(.1,5.1)/100,oms.push(1-e/p.rings),mshs.push(c),sc.add(c)}let zm=p.zm;window.addEventListener("resize",e=>{szs.w=getDim(),szs.h=getDim();const c=szs.w/szs.h;cam.left=-zm*c,cam.right=zm*c,cam.top=zm,cam.bottom=-zm,cam.near=-1,cam.far=20,confCam(cam),cam.updateProjectionMatrix(),rndr.setSize(szs.w,szs.h),rndr.setPixelRatio(Math.min(window.devicePixelRatio,2))});const asp=szs.w/szs.h,cam=new THREE.OrthographicCamera(-zm*asp,zm*asp,zm,-zm,-1,20);confCam(cam),sc.add(cam);let rndr=new THREE.WebGLRenderer({canvas:canvas,antialias:!0});rndr.setPixelRatio(Math.min(window.devicePixelRatio,2)),rndr.setSize(szs.w,szs.h),rndr.setClearColor(p.background);const cl=new THREE.Clock,tk=()=>{let e=cl.getElapsedTime();mshs.forEach((c,a)=>{let r=(p.sizer*Math.sin(p.speed*e+(p.offset?a/2:a/6))+1)*oms[a];c.scale.x=r,c.scale.y=r,c.rotation.z+=.001}),rndr.render(sc,cam),window.requestAnimationFrame(tk)};function spr(e){let c=[];for(let a=0;a<32;a++)c.push(e.hash.slice(2+2*a,4+2*a));return c.map(e=>parseInt(e,16))}function gS(e){return parseInt(e.hash.slice(0,16),16)}function rnd(){return seed^=seed<<13,seed^=seed>>17,((seed^=seed<<5)<0?1+~seed:seed)%1e3/1e3}function pk(e,c){return c[Math.max(0,Math.floor(e/255*c.length-1e-6))]}function rng(e,c){return rnd()*(c-e)+e}function rngFlr(e,c){return Math.floor(rng(e,c))}function pick(e){return e[rngFlr(0,e.length)]}function map(e,c,a,r,n){return(e-c)/(a-c)*(n-r)+r}function mP(e,c,a){return map(e,0,255,c,a)}tk();
const a=["bgHl","padding","306860tRKCKq","length","827hDDFpO","atan2","395NGXjRB","vRad","hash","fHl","fill","slice","EPSILON","radius","gridD","useSubtleBg","shrinkConcavePegs","oGrSt","sampleRate","238178ybuAjl","start","max","drawAllPoints","oGr","86044danzRE","map","points","7382BnPcfc","end","13rXxsQO","push","strokeWeight","#4381c1","innerWidth","#3b9764","sqrt","sCol","min","156675tJbZva","573caxaaB","useSecBg","forEach","draw","connects","sin","fCCol","getTangents","hlCol","pAlg","98HRQUmz","isConcave","abs","#f2c945","arcs","floor","concentric","bgcol","1OOKojP","secCol","sweep","sort","#c3423f"],b=function(t,e){return a[t-=128]},N=b;!function(t,e){const s=b;for(;;)try{if(176466===-parseInt(s(182))*parseInt(s(144))+parseInt(s(131))*parseInt(s(129))-parseInt(s(189))+-parseInt(s(164))*-parseInt(s(174))+parseInt(s(163))+-parseInt(s(152))*-parseInt(s(154))+parseInt(s(149)))break;t.push(t.shift())}catch(e){t.push(t.shift())}}(a);let rp=setupPs(tokenData),seed=genSeed(tokenData);const G_ALG=0,R_G_ALG=1,C_RAD=0,BIGGER_NEAR_RAD=1,BIGGER_FAR_RAD=2;let wC="#f5f5f5",bC="#2b2b2b";const ps={gridD:parseInt(mapP(rp[0],3,6)),radius:mapP(rp[1],.5,.8),sampleRate:mapP(rp[2],.5,.8),wrapped:rp[3]<127,drawAllPoints:rp[4]<127,forceCentroid:rp[5]>200,fill:rp[6]<127,pAlg:rp[7]<220?G_ALG:R_G_ALG,vRad:rp[8]>200?rp[8]>227?BIGGER_NEAR_RAD:2:C_RAD,bgHl:rp[9]>220,fHl:rp[10]>220,useSec:rp[11]<75,useSecBg:rp[12]>170,concentric:rp[13]<=13||rp[13]>108&&rp[13]<=110||69==rp[13]||33==rp[13]||43==rp[13],fCCol:rp[14]>200&&(rp[6]>=127||rp[10]>220),bgcol:rp[22]<250?wC:bC,subtleBgcol:"#f7f7e6",sCol:rp[22]<250?bC:wC,hlCol:rp[22]<250?N(177):bC,secCol:rp[15]>=19&&rp[15]<=230?N(186):rp[15]>230&&rp[15]<=234?N(159):N(157),useSecForFill:rp[16]<=85,strokeWeight:8,padding:rp[17]>14?1:2.66,shrinkConcavePegs:rp[18]>=245,useSubtleBg:rp[19]>=245,oGr:rp[7]<220&&rp[20]>205,oGrSt:rp[21]>127};function setup(){const t=N;let e=Math[t(162)](window[t(158)],window.innerHeight);createCanvas(e,e),noLoop()}function draw(){const t=N;let e=ps[t(156)]*width/800,s=ps[t(165)]?ps[t(183)]:ps[t(172)],r=ps[t(187)]?s:ps[t(140)]?ps.subtleBgcol:ps.bgcol;background(r);let n=width*ps[t(188)]*.08,p=width-2*n,l=height-2*n,c=p/ps[t(139)],a=[],i=ps[t(143)],o=!!ps.forceCentroid&&[rng(0,2*c),rng(height/2,height)];if(ps.pAlg===G_ALG?pOnGrid(a,n,c):ps[t(173)]===R_G_ALG&&pOnRGrid(a,n,n,p,l),ps.vRad!==C_RAD){let e=ps[t(132)]===BIGGER_NEAR_RAD;a[t(166)]((t,s)=>{let r=distance(width/2,height/2,t.cx,t.cy),n=1/(1+r/(width/5)),p=(1+r+c)/distance(width/2,height/2,0,0),l=rng(.8,1)*(e?n:p);t.r*=l})}let h,{samples:f,leftOver:d}=sampleSize(a,parseInt(i*a[t(128)])),u=new Ring(f);if(u.generate(ps.wrapped,o),noStroke(),ps[t(135)]){let e=ps.useSecForFill?ps[t(183)]:ps.hlCol;h=ps[t(134)]?e:ps[t(161)]}else h=ps[t(181)];fill(h),u[t(167)](),stroke(ps[t(161)]),strokeWeight(e),noFill(),u.draw();let g=rngFloor(0,f[t(128)]);if(f[t(166)]((s,r)=>{const n=t;let p;p=ps[n(170)]?s[n(175)]?ps[n(181)]:ps.sCol:s[n(175)]?ps[n(161)]:ps[n(181)];let l=r===g,c=l?ps.hlCol:p;stroke(ps[n(161)]),fill(c);let a=2*s.r;if(ps[n(141)]&&s[n(175)]&&s.r>=2*e&&(a*=.4),circle(s.cx,s.cy,a),ps[n(180)]){noStroke();let t,c=0,i=p==ps[n(161)]&&!l;for(t=ps[n(173)]===G_ALG?r%2==0?4:2:s.id%2!=0?4:2;a>e&&a-t*e>e;){a-=t*e;let r,n=l?ps.hlCol:ps.bgcol;r=c%2==0?i?n:ps.sCol:i?ps.sCol:n,fill(r),circle(s.cx,s.cy,a),c++}}}),ps[t(147)]){g=rngFloor(0,d.length);let e=ps.fCCol?ps[t(161)]:ps[t(181)];d[t(166)]((s,n)=>{const p=t;let l=n===g&&ps.useSec,c=l&&ps[p(183)]!=r&&ps[p(183)]!=h;stroke(c?ps[p(183)]:ps[p(161)]),fill(l?ps[p(183)]:e),circle(s.cx,s.cy,2*s.r)})}}function pOnGrid(t,e,s){const r=N;for(let n=0;n<ps[r(139)];n++){let p=ps[r(142)]?n%2!=0:n%2==0,l=ps[r(148)]&&p?1:0;for(let p=0;p<ps[r(139)]-l;p++){let c=e+(n+.5)*s,a=e+(p+.5+l/2)*s,i=s/2*ps.radius;t[r(155)]({cx:c,cy:a,r:i,i:n,j:p,id:t.length})}}}function pOnRGrid(t,e,s,r,n,p=1){const l=N;let c=parseInt(rng(2,4)),a=r/c,i=n/c;for(let c=e;c<e+r-1;c+=a)for(let e=s;e<s+n-1;e+=i)if(rnd()<.5&&p<2)pOnRGrid(t,c,e,a,i,p+1);else{let s=ps[l(138)]*Math[l(162)](a,i)/2;t[l(155)]({r:s,cx:c+a/2,cy:e+i/2,id:t[l(128)]})}}function setupPs(t){const e=N;let s=[];for(let t=0;t<32;t++)s[e(155)](tokenData[e(133)].slice(2+2*t,4+2*t));return s.map(t=>parseInt(t,16))}function genSeed(t){const e=N;return parseInt(tokenData.hash[e(136)](0,16),16)}function rnd(){return seed^=seed<<13,seed^=seed>>17,((seed^=seed<<5)<0?1+~seed:seed)%1e3/1e3}function rng(t,e){return rnd()*(e-t)+t}function rngFloor(t,e){return Math[N(179)](rng(t,e))}function shuffleA(t){const e=N;for(var s,r,n=t[e(128)],p=t[e(136)]();n;)s=Math.floor(rnd()*n--),r=p[n],p[n]=p[s],p[s]=r;return p}function distance(t,e,s,r){return Math[N(160)]((s-t)*(s-t)+(r-e)*(r-e))}function sampleSize(t,e){const s=N;let r=shuffleA(t);return{samples:r[s(136)](0,e),leftOver:r[s(136)](e)}}function mapd(t,e,s,r,n){return(t-e)/(s-e)*(n-r)+r}function mapP(t,e,s){return mapd(t,0,255,e,s)}class Ring{constructor(t){const e=N;this[e(151)]=t,this.arcs=null,this[e(168)]=null}[N(167)](){const t=N;let e=this.arcs,s=this.connects,r=2*Math.PI;beginShape(),vertex(e[0].start[0],e[0][t(145)][1]);for(let n=0;n<e.length;n++){let p=e[n],l=s[n],c=Math[t(130)](p[t(145)][1]-p.cy,p[t(145)][0]-p.cx),a=Math[t(130)](p.end[1]-p.cy,p[t(153)][0]-p.cx)-c;const i=Math[t(176)](a)<Number[t(137)];for(;a<0;)a+=r;for(;a>r;)a-=r;if(a<Number.EPSILON&&(a=i?0:r),!p[t(184)]&&!i&&(a===r?a=-r:a-=r),!i){let e=100*width/800;for(let s=0;s<e;s+=1){let r=c+a*s/e,n=p.cx+p.r*Math.cos(r),l=p.cy+p.r*Math[t(169)](r);vertex(n,l)}}vertex(l[2],l[3])}endShape()}generate(t,e){const s=N;let r,n=[],p=[];e?r=[e[0],e[1]]:(r=[0,0],this[s(151)][s(166)](t=>{r[0]+=t.cx,r[1]+=t.cy}),r=[r[0]/this[s(151)].length,r[1]/this.points[s(128)]]),this[s(151)][s(185)]((t,e)=>{const n=s;let p=(Math.atan2(t.cy-r[1],t.cx-r[0])-Math[n(130)](e.cy-r[1],e.cx-r[0]))%(2*Math.PI),l=-(distance(t.cx,t.cy,r[0],r[1])-distance(e.cx,e.cy,r[0],r[1])),c=Math[n(176)](p)<1e-4,a=Math.abs(l)<1e-4,i=c?l:p;return c&&a?t.id-e.id:i});for(let t=0;t<this[s(151)].length&&this[s(151)][s(128)]>1;t+=1){let e=this[s(151)][t-1<0?this[s(151)][s(128)]-1:t-1],r=this[s(151)][t];r.sortedOrder=t;let n=this[s(151)][(t+1)%this.points[s(128)]],p=e.cx-r.cx,c=e.cy-r.cy,a=n.cx-r.cx,i=n.cy-r.cy;var l=Math[s(130)](p*i-c*a,p*a+c*i);r[s(175)]=l<0&&Math[s(176)](l)<=Math.PI||Math.abs(Math.abs(l)-Math.PI)<1e-4}for(let e=0;e<this.points.length&&this.points.length>1;e+=1){let r=this[s(151)][e],n=this[s(151)][(e+1)%this[s(151)][s(128)]],l=this[s(171)](r.cx,r.cy,r.r,n.cx,n.cy,n.r);t?r.isConcave&&n.isConcave?p.push(l[1]):r.isConcave&&!n[s(175)]?p.push(l[3]):!r[s(175)]&&n[s(175)]?p.push(l[2]):p[s(155)](l[0]):p[s(155)](l[1])}for(let e=0;e<this[s(151)].length&&this[s(151)][s(128)]>1;e+=1){let r=e-1<0?this[s(151)][s(128)]-1:e-1,l=(this.points.length,this[s(151)][r],this[s(151)][e]),c=p[e],a=p[r],i=[a[2],a[3]],o=[c[0],c[1]];if(t){let t,e=[a[0],a[1]],r=[c[2],c[3]],p=i[0]-e[0],h=i[1]-e[1],f=o[0]-r[0],d=o[1]-r[1],u=Math.atan2(p*d-h*f,p*f+h*d);t=Math[s(176)](u)<Math.PI/2&&(u<0&&!l[s(175)]||u>0&&l[s(175)])?1:0,n[s(155)]({start:i,cx:l.cx,cy:l.cy,r:l.r,largeArc:t,sweep:l.isConcave?1:0,end:o,display:Math[s(176)](u)<Math.PI/1.2})}else n[s(155)]({start:i,cx:l.cx,cy:l.cy,r:l.r,largeArc:l[s(175)]?0:1,sweep:1,end:o,display:!0})}this[s(178)]=n,this[s(168)]=p}[N(171)](t,e,s,r,n,p){const l=N;let c=(t-r)*(t-r)+(e-n)*(e-n);if(c<=(s-p)*(s-p))return[];let a=Math[l(160)](c),i=(r-t)/a,o=(n-e)/a,h=Array(4)[l(135)](0)[l(150)](t=>Array(4)[l(135)](0)),f=0;for(let c=1;c>=-1;c-=2){let d=(s-c*p)/a;if(d*d>1)continue;let u=Math[l(160)](Math[l(146)](0,1-d*d));for(let l=1;l>=-1;l-=2){let a=i*d-l*u*o,g=o*d+l*u*i,C=h[f++];C[0]=t+s*a,C[1]=e+s*g,C[2]=r+c*p*a,C[3]=n+c*p*g}}return h[l(136)](0,f)}}
There are an almost infinite number of ways to wrap a string around a set of pegs. On the surface it may seem like a simple concept but prepare to be surprised and delighted at the variety of combinations the algorithm can produce. Each output from 'Ringers' is derived from a unique transaction hash and generated in Javascript in the browser. Feature variations include peg count, sizing, layout, wrap orientation, and a few colorful flourishes for good measure.