| 1 | [ |
| 2 | "autonomous agent", |
| 3 | { |
| 4 | "init": "{ |
| 5 | $CT_ADDRESS = "T2I6RLGGJ25KSJZKRNZZH52VMEAQ3722"; |
| 6 | $OWNER = params.issuer; |
| 7 | $PRICE = var["price"]; |
| 8 | $PRICE_ASSET = var["currency"] OTHERWISE "base"; |
| 9 | $LICENSE_ASSET = var["licenseAsset"]; |
| 10 | $ONE_DAY = 7600; |
| 11 | $CUT = 0.03; |
| 12 | $DEPOSIT_PERCENT = 0.05; |
| 13 | $method = unit[trigger.initial_unit].messages[[.app="data"]].payload["method"]; |
| 14 | $isHelper = var["helper_" || trigger.initial_address]; |
| 15 | if (NOT $method) |
| 16 | bounce("method field is mandatory"); |
| 17 | }", |
| 18 | "messages": { |
| 19 | "cases": [ |
| 20 | { |
| 21 | "if": "{ |
| 22 | trigger.initial_address == $OWNER AND |
| 23 | ($method == "init" OR |
| 24 | $method == "toggleHelper" OR |
| 25 | $method == "payout") |
| 26 | }", |
| 27 | "messages": { |
| 28 | "cases": [ |
| 29 | { |
| 30 | "if": "{$method == "init" AND NOT $LICENSE_ASSET}", |
| 31 | "init": "{ |
| 32 | if (NOT trigger.data["price"]) |
| 33 | bounce("price field is mandatory"); |
| 34 | if (NOT is_valid_amount(trigger.data["price"])) |
| 35 | bounce("price is not a valid amount"); |
| 36 | if (trigger.data["asset"]) |
| 37 | if (NOT asset[trigger.data["asset"]].exists) |
| 38 | bounce("That asset does not exist"); |
| 39 | }", |
| 40 | "messages": [ |
| 41 | { |
| 42 | "app": "asset", |
| 43 | "payload": { |
| 44 | "is_private": false, |
| 45 | "is_transferrable": "{NOT NOT trigger.data["tradeable"]}", |
| 46 | "auto_destroy": false, |
| 47 | "fixed_denominations": false, |
| 48 | "issued_by_definer_only": true, |
| 49 | "cosigned_by_definer": false, |
| 50 | "spender_attested": false |
| 51 | } |
| 52 | }, |
| 53 | { |
| 54 | "app": "state", |
| 55 | "state": "{ |
| 56 | var["price"] = trigger.data["price"]; |
| 57 | var["currency"] = trigger.data["asset"]; |
| 58 | var["licenseAsset"] = response_unit; |
| 59 | }" |
| 60 | } |
| 61 | ] |
| 62 | }, |
| 63 | { |
| 64 | "if": "{$method == "toggleHelper"}", |
| 65 | "init": "{ |
| 66 | if (NOT trigger.data["helper"]) |
| 67 | bounce("helper field is mandatory"); |
| 68 | if (NOT is_valid_address(trigger.data["helper"])) |
| 69 | bounce("The helper address is not a valid address"); |
| 70 | }", |
| 71 | "messages": [ |
| 72 | { |
| 73 | "app": "state", |
| 74 | "state": "{ |
| 75 | var["helper_" || trigger.data["helper"]] = NOT $isHelper; |
| 76 | }" |
| 77 | } |
| 78 | ] |
| 79 | }, |
| 80 | { |
| 81 | "if": "{$method == "payout"}", |
| 82 | "messages": [ |
| 83 | { |
| 84 | "app": "payment", |
| 85 | "payload": { |
| 86 | "asset": "{trigger.data.asset OTHERWISE $PRICE_ASSET}", |
| 87 | "outputs": [ |
| 88 | { |
| 89 | "address": "{$OWNER}" |
| 90 | } |
| 91 | ] |
| 92 | } |
| 93 | } |
| 94 | ] |
| 95 | } |
| 96 | ] |
| 97 | } |
| 98 | }, |
| 99 | { |
| 100 | "if": "{($isHelper OR trigger.initial_address == $OWNER) AND $method == "changePrice"}", |
| 101 | "init": "{ |
| 102 | if (NOT trigger.data["price"]) |
| 103 | bounce("price field is mandatory"); |
| 104 | if (NOT is_valid_amount(trigger.data["price"])) |
| 105 | bounce("price is not a valid amount"); |
| 106 | if (trigger.data["asset"]) |
| 107 | if (NOT asset[trigger.data["asset"]].exists) |
| 108 | bounce("That asset does not exist"); |
| 109 | }", |
| 110 | "messages": [ |
| 111 | { |
| 112 | "app": "state", |
| 113 | "state": "{ |
| 114 | var['price'] = trigger.data["price"]; |
| 115 | if (trigger.data["asset"]) |
| 116 | var["currency"] = trigger.data["asset"]; |
| 117 | }" |
| 118 | } |
| 119 | ] |
| 120 | }, |
| 121 | { |
| 122 | "if": "{$method == "buy"}", |
| 123 | "init": "{ |
| 124 | $copies = floor(trigger.output[[asset=$PRICE_ASSET]]/$PRICE, 0); |
| 125 | if ($copies == 0) |
| 126 | bounce("You cannot buy less than 1 license"); |
| 127 | $hasReferral = (trigger.data["r"] AND is_valid_address(trigger.data["r"])); |
| 128 | $cut = $hasReferral ? $CUT/2 : $CUT; |
| 129 | $cutAmount = round(trigger.output[[asset=$PRICE_ASSET]] * $cut, 0); |
| 130 | }", |
| 131 | "messages": [ |
| 132 | { |
| 133 | "app": "payment", |
| 134 | "payload": { |
| 135 | "asset": "{$LICENSE_ASSET}", |
| 136 | "outputs": [ |
| 137 | { |
| 138 | "address": "{trigger.initial_address}", |
| 139 | "amount": "{$copies}" |
| 140 | } |
| 141 | ] |
| 142 | } |
| 143 | }, |
| 144 | { |
| 145 | "app": "payment", |
| 146 | "payload": { |
| 147 | "asset": "{$PRICE_ASSET}", |
| 148 | "outputs": [ |
| 149 | { |
| 150 | "address": "{$CT_ADDRESS}", |
| 151 | "amount": "{$cutAmount}" |
| 152 | }, |
| 153 | { |
| 154 | "if": "{$hasReferral}", |
| 155 | "address": "{trigger.data["r"]}", |
| 156 | "amount": "{$cutAmount}" |
| 157 | } |
| 158 | ] |
| 159 | } |
| 160 | } |
| 161 | ] |
| 162 | }, |
| 163 | { |
| 164 | "if": "{$method == "lend"}", |
| 165 | "init": "{ |
| 166 | if (NOT trigger.data["address"]) |
| 167 | bounce("address field is mandatory"); |
| 168 | if (trigger.output[[asset=$LICENSE_ASSET]].amount == 0) |
| 169 | bounce("You have to lend at least 1 license unit"); |
| 170 | if (NOT trigger.data["period"]) |
| 171 | bounce("period field is mandatory"); |
| 172 | if (trigger.data["period"] <= 0) |
| 173 | bounce("period must be a positive integer"); |
| 174 | if (NOT trigger.data["price"]) |
| 175 | bounce("price field is mandatory"); |
| 176 | if (NOT is_valid_amount(trigger.data["price"])) |
| 177 | bounce("price field is not a valid amount"); |
| 178 | if (trigger.data["asset"]) |
| 179 | if (NOT asset[trigger.data["asset"]].exists) |
| 180 | bounce("That asset does not exist"); |
| 181 | }", |
| 182 | "messages": [ |
| 183 | { |
| 184 | "app": "state", |
| 185 | "state": "{ |
| 186 | var["lend_" || response_unit] = {price: trigger.data["price"], by: trigger.initial_address, asset: trigger.data["asset"] OTHERWISE "base", period: trigger.data["period"]}; |
| 187 | }" |
| 188 | } |
| 189 | ] |
| 190 | }, |
| 191 | { |
| 192 | "if": "{$method == "loan"}", |
| 193 | "init": "{ |
| 194 | if (NOT trigger.data["id"]) |
| 195 | bounce("id field is mandatory"); |
| 196 | $offer = var["lend_" || trigger.data["id"]]; |
| 197 | if (NOT $offer) |
| 198 | bounce("Offer not found"); |
| 199 | $total = round($offer.price * (1 + $DEPOSIT_PERCENT)); |
| 200 | $deposit = $total - $offer.price; |
| 201 | if (trigger.output[[asset=$offer.asset]].amount < $total) |
| 202 | bounce("You need to pay at least " || $total || " units of asset " || $offer.asset); |
| 203 | if (var[trigger.initial_address] >= timestamp) |
| 204 | bounce("You cannot renew your license yet"); |
| 205 | }", |
| 206 | "messages": [ |
| 207 | { |
| 208 | "app": "payment", |
| 209 | "payload": { |
| 210 | "asset": "{$offer.asset}", |
| 211 | "outputs": [ |
| 212 | { |
| 213 | "address": "{$offer.by}", |
| 214 | "amount": "{$offer.price}" |
| 215 | } |
| 216 | ] |
| 217 | } |
| 218 | }, |
| 219 | { |
| 220 | "app": "state", |
| 221 | "state": "{ |
| 222 | var[trigger.initial_address] = timestamp + $offer.period; |
| 223 | var["loan_" || $offer.by || "_" || trigger.data["id"]] = {deadline: timestamp + $offer.period, rentedBy: trigger.initial_address, deposit: $deposit, asset: $PRICE_ASSET}; |
| 224 | }" |
| 225 | } |
| 226 | ] |
| 227 | }, |
| 228 | { |
| 229 | "if": "{$method == "claim"}", |
| 230 | "init": "{ |
| 231 | if (NOT trigger.data["id"]) |
| 232 | bounce("id field is mandatory"); |
| 233 | $by = trigger.data["by"] OTHERWISE trigger.initial_address; |
| 234 | $offer = var["loan_" || $by || "_" || trigger.data["id"]]; |
| 235 | if (NOT $offer) |
| 236 | bounce("That loan was not found"); |
| 237 | if ($offer.deadline >= timestamp) |
| 238 | bounce("That loan has not ended yet"); |
| 239 | if ($offer.rentedBy != trigger.initial_address) |
| 240 | if ($offer.deadline > timestamp - $ONE_DAY) |
| 241 | bounce("Only the renter can claim that loan until 24 hours have passed"); |
| 242 | }", |
| 243 | "messages": [ |
| 244 | { |
| 245 | "app": "payment", |
| 246 | "payload": { |
| 247 | "asset": "{$LICENSE_ASSET}", |
| 248 | "outputs": [ |
| 249 | { |
| 250 | "address": "{$by}", |
| 251 | "amount": 1 |
| 252 | } |
| 253 | ] |
| 254 | } |
| 255 | }, |
| 256 | { |
| 257 | "app": "payment", |
| 258 | "payload": { |
| 259 | "asset": "{$offer.asset}", |
| 260 | "outputs": [ |
| 261 | { |
| 262 | "address": "{trigger.initial_address}", |
| 263 | "amount": "{$offer.deposit}" |
| 264 | } |
| 265 | ] |
| 266 | } |
| 267 | }, |
| 268 | { |
| 269 | "app": "state", |
| 270 | "state": "{ |
| 271 | var["loan_" || $offer.by || "_" || trigger.data["id"]] = false; |
| 272 | }" |
| 273 | } |
| 274 | ] |
| 275 | } |
| 276 | ] |
| 277 | } |
| 278 | } |
| 279 | ] |