| 1 | [ |
| 2 | "autonomous agent", |
| 3 | { |
| 4 | "getters": "{ |
| 5 | |
| 6 | $x = ()=>params.x; |
| 7 | $y = ()=>params.y; |
| 8 | |
| 9 | |
| 10 | $rt = ()=>"Bx0MWol5P4jWKfqkl38KkGOgaKKA/Jwxz4k1if1V2T4="; |
| 11 | $gt = ()=>"PuQix92btvdVs8hYu0PDZ0iUNN6JcDpETgSQcnhEhZw="; |
| 12 | $bt = ()=>"UHkxLRnDP6WCrIzoqnqYr+bKwuyvP/JIamop6K6uGx4="; |
| 13 | $vt = ()=>"c8QUsXz0oYki50q7J8ylE3k47PDAss1U5YTgDlZlR6M="; |
| 14 | |
| 15 | |
| 16 | $r = ()=>balance[$rt()] OTHERWISE 0; |
| 17 | $g = ()=>var[$gt()] OTHERWISE 0; |
| 18 | $b = ()=>var[$bt()] OTHERWISE 0; |
| 19 | $v = ()=>balance[$vt()] OTHERWISE 0; |
| 20 | |
| 21 | |
| 22 | |
| 23 | |
| 24 | |
| 25 | |
| 26 | |
| 27 | $shares = ()=>var["shares"] OTHERWISE 0; |
| 28 | $patternAddress = ()=>definition[this_address][1].base_aa ? this_address : definition[this_address][1].base_aa; |
| 29 | $name = ()=>params.name; |
| 30 | $sharesOf = ($address)=>var["shares_" || $address]; |
| 31 | $immortalizeCost = ()=>max($v()*2, (params.immortalizeCost OTHERWISE 0)); |
| 32 | $isImmortalized = ()=>var["immortalized"]; |
| 33 | $getTokenId = ()=>var["tokenId"]; |
| 34 | $getUpdatedPixels = ()=>var["lifetime_updates"] OTHERWISE 0; |
| 35 | $getMemo = ()=>var["memo"]; |
| 36 | $getOwner = ()=>params.owner; |
| 37 | $canDraw = ($address)=>{ |
| 38 | if (NOT params.whitelist) |
| 39 | return true; |
| 40 | return in_data_feed[[oracles=params.whitelist, feed_name=this_address, feed_value=$address]]; |
| 41 | }; |
| 42 | }", |
| 43 | "init": "{ |
| 44 | $METHOD = trigger.data.method; |
| 45 | $PATTERN_ADDRESS = $patternAddress(); |
| 46 | $SIZE_X = params.x; |
| 47 | $SIZE_Y = params.y; |
| 48 | |
| 49 | |
| 50 | |
| 51 | |
| 52 | $TOKEN_RED = $rt(); |
| 53 | $TOKEN_GREEN = $gt(); |
| 54 | $TOKEN_BLUE = $bt(); |
| 55 | $TOKEN_VARNISH = $vt(); |
| 56 | $R = $r(); |
| 57 | $G = $g(); |
| 58 | $B = $b(); |
| 59 | $VARNISH = balance[$TOKEN_VARNISH]; |
| 60 | $SHARES = $shares(); |
| 61 | $SHARES_OF_CALLER = $sharesOf(trigger.address); |
| 62 | $IMMORTALIZED = $isImmortalized(); |
| 63 | $IS_ALLOWED_TO_DRAW = $canDraw(trigger.address); |
| 64 | $OWNER = $getOwner(); |
| 65 | response["method"] = $METHOD; |
| 66 | response["who"] = trigger.address; |
| 67 | }", |
| 68 | "messages": { |
| 69 | "cases": [ |
| 70 | { |
| 71 | "if": "{this_address != $patternAddress()}", |
| 72 | "messages": { |
| 73 | "cases": [ |
| 74 | { |
| 75 | "if": "{$METHOD == "paint"}", |
| 76 | "init": "{ |
| 77 | require(NOT $IMMORTALIZED, "This canvas has been immortalized and is now read-only"); |
| 78 | require($IS_ALLOWED_TO_DRAW, "You are not allowed to draw on this canvas"); |
| 79 | $red = trigger.output[[asset=$TOKEN_RED]] OTHERWISE 0; |
| 80 | $green = trigger.output[[asset=$TOKEN_GREEN]] OTHERWISE 0; |
| 81 | $blue = trigger.output[[asset=$TOKEN_BLUE]] OTHERWISE 0; |
| 82 | $varnish = trigger.output[[asset=$TOKEN_VARNISH]] OTHERWISE 0; |
| 83 | |
| 84 | $area = length(trigger.data.x); |
| 85 | $color = trigger.data.color; |
| 86 | require($area == length(trigger.data.y), "x and y arrays must be of the same size"); |
| 87 | require(is_integer($color[0]) AND $color[0] > 0 AND $color[0] <= 255, "Invalid color component (red)"); |
| 88 | require(is_integer($color[1]) AND $color[1] > 0 AND $color[1] <= 255, "Invalid color (green)"); |
| 89 | require(is_integer($color[2]) AND $color[2] > 0 AND $color[2] <= 255, "Invalid color (blue)"); |
| 90 | |
| 91 | require($area <= 40, "You can paint at most 40 pixels per call"); |
| 92 | require($red >= $area * $color[0], "Not enough red paint"); |
| 93 | require($green >= $area * $color[1], "Not enough green paint"); |
| 94 | require($blue >= $area * $color[2], "Not enough blue paint"); |
| 95 | require($varnish >= floor($VARNISH / ($SIZE_X*$SIZE_Y)) * $area, "You need at least " || floor($VARNISH / ($SIZE_X*$SIZE_Y) * $area || " varnish to edit this painting")); |
| 96 | response["area"] = $area; |
| 97 | response["color"] = json_stringify([$red, $green, $blue]); |
| 98 | response["varnish"] = $varnish; |
| 99 | response["pixels"] = json_stringify({x: trigger.data.x, y: trigger.data.y}); |
| 100 | }", |
| 101 | "messages": [ |
| 102 | { |
| 103 | "app": "state", |
| 104 | "state": "{ |
| 105 | foreach(trigger.data.x, 40, ($xx, $i)=>{ |
| 106 | require(is_integer($xx) AND $xx >= 0 AND $xx <= $SIZE_X, "Invalid pixel X coordination"); |
| 107 | require(is_integer(trigger.data.y[$i]) AND trigger.data.y[$i] >= 0 AND trigger.data.y[$i] <= $SIZE_Y, "Invalid pixel Y coordinate"); |
| 108 | var["p_" || $xx || "_" || trigger.data.y[$i]] = [$red, $green, $blue]; |
| 109 | }); |
| 110 | $created_shares = $red+$green+$blue; |
| 111 | |
| 112 | var["shares"] += $created_shares; |
| 113 | var["shares_" || trigger.address] += $created_shares; |
| 114 | var["lifetime_updates"] += $area; |
| 115 | }" |
| 116 | } |
| 117 | ] |
| 118 | }, |
| 119 | { |
| 120 | "if": "{$METHOD == "stake"}", |
| 121 | "init": "{ |
| 122 | require($IS_ALLOWED_TO_DRAW, "Only allowed painters can stake varnish"); |
| 123 | require(NOT $IMMORTALIZED, "This canvas has been immortalized and is now read-only"); |
| 124 | require(trigger.output[[asset!=base]].asset == $TOKEN_VARNISH, "You can only stake varnish"); |
| 125 | response["amount"] = trigger.output[[asset!=base]]; |
| 126 | }", |
| 127 | "messages": [ |
| 128 | { |
| 129 | "app": "state", |
| 130 | "state": "{ |
| 131 | var["v"] +=trigger.output[[asset=$TOKEN_VARNISH]]; |
| 132 | }" |
| 133 | } |
| 134 | ] |
| 135 | }, |
| 136 | { |
| 137 | "if": "{$METHOD == "claim"}", |
| 138 | "init": "{ |
| 139 | require($IMMORTALIZED, "You cannot claim anything until the canvas has been immortalized"); |
| 140 | require($SHARES_OF_CALLER > 0, "You don't have any shares"); |
| 141 | $share_percent = floor($SHARES_OF_CALLER/$SHARES); |
| 142 | $claimed_red = var["claimable_r"] OTHERWISE 0; |
| 143 | $claimed_green = var["claimable_g"] OTHERWISE 0; |
| 144 | $claimed_blue = var["claimable_b"] OTHERWISE 0; |
| 145 | $claimed_varnish = var["claimable_v"] OTHERWISE 0; |
| 146 | response["red"] = $claimed_red; |
| 147 | response["green"] = $claimed_green; |
| 148 | response["blue"] = $claimed_blue; |
| 149 | response["varnish"] = $claimed_varnish; |
| 150 | }", |
| 151 | "messages": [ |
| 152 | { |
| 153 | "app": "payment", |
| 154 | "payload": { |
| 155 | "asset": "{$TOKEN_RED}", |
| 156 | "outputs": [ |
| 157 | { |
| 158 | "address": "{trigger.address}", |
| 159 | "amount": "{floor($share_percent * $claimed_red)}" |
| 160 | } |
| 161 | ] |
| 162 | } |
| 163 | }, |
| 164 | { |
| 165 | "app": "payment", |
| 166 | "payload": { |
| 167 | "asset": "{$TOKEN_GREEN}", |
| 168 | "outputs": [ |
| 169 | { |
| 170 | "address": "{trigger.address}", |
| 171 | "amount": "{floor($share_percent * (var["claimable_g"] OTHERWISE 0))}" |
| 172 | } |
| 173 | ] |
| 174 | } |
| 175 | }, |
| 176 | { |
| 177 | "app": "payment", |
| 178 | "payload": { |
| 179 | "asset": "{$TOKEN_BLUE}", |
| 180 | "outputs": [ |
| 181 | { |
| 182 | "address": "{trigger.address}", |
| 183 | "amount": "{floor($share_percent * (var["claimable_b"] OTHERWISE 0))}" |
| 184 | } |
| 185 | ] |
| 186 | } |
| 187 | }, |
| 188 | { |
| 189 | "app": "payment", |
| 190 | "payload": { |
| 191 | "asset": "{$TOKEN_VARNISH}", |
| 192 | "outputs": [ |
| 193 | { |
| 194 | "address": "{trigger.address}", |
| 195 | "amount": "{floor($share_percent * (var["claimable_v"] OTHERWISE 0))}" |
| 196 | } |
| 197 | ] |
| 198 | } |
| 199 | }, |
| 200 | { |
| 201 | "app": "state", |
| 202 | "state": "{ |
| 203 | var["shares_" || trigger.address] = 0; |
| 204 | var["shares"] -= $SHARES_OF_CALLER; |
| 205 | var["claimable_r"] -= $claimed_red; |
| 206 | var["claimable_g"] -= $claimed_green; |
| 207 | var["claimable_b"] -= $claimed_blue; |
| 208 | var["claimable_v"] -= $claimed_varnish; |
| 209 | }" |
| 210 | } |
| 211 | ] |
| 212 | }, |
| 213 | { |
| 214 | "if": "{$METHOD == "immortalize"}", |
| 215 | "init": "{ |
| 216 | require(NOT $IMMORTALIZED, "This canvas has already been immortalized!"); |
| 217 | $vpayment = trigger.output[[asset=$TOKEN_VARNISH]]; |
| 218 | $requiredVarnish = max(balance[$TOKEN_VARNISH]*2 - $vpayment, (params.immortalizeCost OTHERWISE 0)); |
| 219 | require($vpayment >= $requiredVarnish, "You need to send at least " || $requiredVarnish || " varnish to immortalize the canvas"); |
| 220 | response["at"] = timestamp; |
| 221 | response["for"] = $vpayment; |
| 222 | response["memo"] = trigger.data.memo; |
| 223 | }", |
| 224 | "messages": [ |
| 225 | { |
| 226 | "app": "state", |
| 227 | "state": "{ |
| 228 | var["immortalized"] = timestamp; |
| 229 | var["immortalizedBy"] = trigger.address; |
| 230 | var["immortalizedFor"] = $vpayment; |
| 231 | var["memo"] = trigger.data.memo; |
| 232 | }" |
| 233 | } |
| 234 | ] |
| 235 | } |
| 236 | ] |
| 237 | } |
| 238 | } |
| 239 | ] |
| 240 | } |
| 241 | } |
| 242 | ] |