| 1 | [ |
| 2 | "autonomous agent", |
| 3 | { |
| 4 | "doc_url": "https://raw.githubusercontent.com/jldevelops/aa-len/master/description.json", |
| 5 | "getters": "{ |
| 6 | $OSWAP_FACT = 'B22543LKSS35Z55ROU4GDN26RT6MDKWU'; |
| 7 | $chechAddr = $addr =>{ |
| 8 | if(!is_valid_address($addr)) |
| 9 | bounce('not valid '||$addr); |
| 10 | if(!var[$OSWAP_FACT]['pools.'||$addr||'.asset']) |
| 11 | bounce('not oswap pool'||$addr); |
| 12 | true |
| 13 | }; |
| 14 | $chechAddresses = $addr =>{ |
| 15 | if(!is_array($addr)) |
| 16 | bounce('addresses invalid'); |
| 17 | if(array_length($addr)<2 OR array_length($addr)>4) |
| 18 | bounce('min 2 max 4 addresses'); |
| 19 | foreach($addr,4,$ad => $chechAddr($ad)); |
| 20 | true |
| 21 | }; |
| 22 | $getPool = $ass => { |
| 23 | if(!$ass) |
| 24 | bounce('asset param not found'); |
| 25 | if($ass != 'base' AND !asset[$ass].exists) |
| 26 | bounce('asset invalid'); |
| 27 | $data = {}; |
| 28 | $data.asset = $ass; |
| 29 | $data.tokens = 0; |
| 30 | $data.t_lm = 0; |
| 31 | $data.t_lm_upd = 0; |
| 32 | var[$ass] OTHERWISE $data |
| 33 | }; |
| 34 | $getPoolAmount = $ass => balance[$ass]-($ass == 'base'?storage_size:0); |
| 35 | $getInterestAmount= $inp,$pool =>{ |
| 36 | $pct = $inp /(($pool.t_lm_upd+(60*60*48) < timestamp)?$pool.t_lm:$pool.t_llm); |
| 37 | round($getPoolAmount($pool.asset)*$pct)-$inp |
| 38 | }; |
| 39 | }", |
| 40 | "init": "{ |
| 41 | $loan_fee = 1.01; |
| 42 | $month = 60*60*24*31; |
| 43 | $today = split(timestamp_to_string(timestamp,'date'),'-'); |
| 44 | $day_one = $today[2] == '01'; |
| 45 | if(trigger.output[[asset!=base]].asset != 'none'){ |
| 46 | $asset = trigger.output[[asset!=base]].asset; |
| 47 | if($asset and $asset == 'ambiguous') |
| 48 | bounce('Only 1 asset per tx'); |
| 49 | } |
| 50 | else |
| 51 | $asset = 'base'; |
| 52 | $to = is_valid_address(trigger.data.to)?trigger.data.to:trigger.address; |
| 53 | }", |
| 54 | "messages": { |
| 55 | "cases": [ |
| 56 | { |
| 57 | "if": "{var['addresses']}", |
| 58 | "init": "{ |
| 59 | $end = var['index'] == var['last_index']; |
| 60 | if($end){ |
| 61 | $pool = var['pool']; |
| 62 | if($pool.asset != $asset) |
| 63 | bounce('failed, not same asset returned'); |
| 64 | $diff = trigger.output[[asset=$asset]]-round(var['amount']*$loan_fee); |
| 65 | if($diff <= 0) |
| 66 | bounce('failed, not enough funds'); |
| 67 | } |
| 68 | else |
| 69 | $addrs = var['addresses']; |
| 70 | }", |
| 71 | "messages": [ |
| 72 | { |
| 73 | "if": "{!$end}", |
| 74 | "app": "payment", |
| 75 | "payload": { |
| 76 | "asset": "{$asset}", |
| 77 | "outputs": [ |
| 78 | { |
| 79 | "address": "{$addrs[var['index']]}", |
| 80 | "amount": "{trigger.output[[asset=$asset]]}" |
| 81 | } |
| 82 | ] |
| 83 | } |
| 84 | }, |
| 85 | { |
| 86 | "if": "{!$end}", |
| 87 | "app": "data", |
| 88 | "payload": { |
| 89 | "to": "{this_address}" |
| 90 | } |
| 91 | }, |
| 92 | { |
| 93 | "if": "{$end}", |
| 94 | "app": "payment", |
| 95 | "payload": { |
| 96 | "asset": "{$asset}", |
| 97 | "outputs": [ |
| 98 | { |
| 99 | "address": "{var['to']}", |
| 100 | "amount": "{$diff}" |
| 101 | } |
| 102 | ] |
| 103 | } |
| 104 | }, |
| 105 | { |
| 106 | "app": "state", |
| 107 | "state": "{ |
| 108 | if($end){ |
| 109 | var['pool'] = false; |
| 110 | var['amount'] = false; |
| 111 | var['addresses'] = false; |
| 112 | var['index'] = false; |
| 113 | var['to'] = false; |
| 114 | var['last_index'] = false; |
| 115 | response['event'] = 'end_loan'; |
| 116 | } |
| 117 | else{ |
| 118 | var['index'] += 1; |
| 119 | response['event'] = 'loan'; |
| 120 | } |
| 121 | |
| 122 | }" |
| 123 | } |
| 124 | ] |
| 125 | }, |
| 126 | { |
| 127 | "if": "{trigger.data.interest and $day_one}", |
| 128 | "init": "{ |
| 129 | $pool = $getPool(trigger.data.asset); |
| 130 | if(var[trigger.address||'_t'||$pool.asset]+$month > timestamp) |
| 131 | bounce('31 days min since last deposit to accrue interest'); |
| 132 | if(var[trigger.address||'i_'||$pool.asset] AND var[trigger.address||'i_'||$pool.asset]+(60*60*48)>timestamp) |
| 133 | bounce('already triggered'); |
| 134 | $tot = $getInterestAmount(var[trigger.address||'_'||$pool.asset]+0,$pool); |
| 135 | $act = trigger.data.withdraw == 1; |
| 136 | }", |
| 137 | "messages": [ |
| 138 | { |
| 139 | "if": "{$act}", |
| 140 | "app": "payment", |
| 141 | "payload": { |
| 142 | "asset": "{$pool.asset}", |
| 143 | "outputs": [ |
| 144 | { |
| 145 | "address": "{$to}", |
| 146 | "amount": "{$tot}" |
| 147 | } |
| 148 | ] |
| 149 | } |
| 150 | }, |
| 151 | { |
| 152 | "app": "state", |
| 153 | "state": "{ |
| 154 | if($pool.t_lm == 0){ |
| 155 | $pool.t_lm = $pool.tokens; |
| 156 | $pool.t_llm = $pool.tokens; |
| 157 | $pool.t_lm_upd = timestamp; |
| 158 | } |
| 159 | else{ |
| 160 | if($pool.t_lm_upd+(60*60*48) < timestamp){ |
| 161 | $pool.t_llm = $pool.t_lm; |
| 162 | $pool.t_lm = $pool.tokens; |
| 163 | $pool.t_lm_upd = timestamp; |
| 164 | } |
| 165 | } |
| 166 | if(!$act){ |
| 167 | $pool.tokens = $pool.tokens + $tot; |
| 168 | var[trigger.address||'_'||$pool.asset] += $tot; |
| 169 | } |
| 170 | var[$pool.asset] = $pool; |
| 171 | var[trigger.address||'i_'||$pool.asset] = timestamp; |
| 172 | response['event'] = 'interest'; |
| 173 | }" |
| 174 | } |
| 175 | ] |
| 176 | }, |
| 177 | { |
| 178 | "if": "{trigger.data.withdraw}", |
| 179 | "init": "{ |
| 180 | $pool = $getPool(trigger.data.asset); |
| 181 | $inp = var[trigger.address||'_'||$pool.asset]; |
| 182 | if(trigger.data.amount) |
| 183 | $am = trigger.data.amount < $inp?trigger.data.amount:$inp; |
| 184 | else |
| 185 | $am = $inp; |
| 186 | }", |
| 187 | "messages": [ |
| 188 | { |
| 189 | "app": "payment", |
| 190 | "payload": { |
| 191 | "asset": "{$pool.asset}", |
| 192 | "outputs": [ |
| 193 | { |
| 194 | "address": "{$to}", |
| 195 | "amount": "{$inp}" |
| 196 | } |
| 197 | ] |
| 198 | } |
| 199 | }, |
| 200 | { |
| 201 | "app": "state", |
| 202 | "state": "{ |
| 203 | $pool.tokens = $pool.tokens - $inp; |
| 204 | var[trigger.address||'_'||$pool.asset] = false; |
| 205 | var[trigger.address||'_t'||$pool.asset] = false; |
| 206 | var[trigger.address||'i_'||$pool.asset] = false; |
| 207 | var[$pool.asset] = $pool; |
| 208 | response['event'] = 'withdraw'; |
| 209 | }" |
| 210 | } |
| 211 | ] |
| 212 | }, |
| 213 | { |
| 214 | "if": "{trigger.data.deposit}", |
| 215 | "init": "{ |
| 216 | $data = $getPool($asset); |
| 217 | }", |
| 218 | "messages": [ |
| 219 | { |
| 220 | "app": "state", |
| 221 | "state": "{ |
| 222 | $data.tokens = $data.tokens + trigger.output[[asset=$asset]]; |
| 223 | var[trigger.address||'_'||$asset] += trigger.output[[asset=$asset]]; |
| 224 | var[$asset] = $data; |
| 225 | var[trigger.address||'_t'||$asset] = timestamp; |
| 226 | response['event'] = 'deposit'; |
| 227 | }" |
| 228 | } |
| 229 | ] |
| 230 | }, |
| 231 | { |
| 232 | "init": "{ |
| 233 | if($asset != 'base') |
| 234 | bounce('no assets here'); |
| 235 | if(trigger.data.asset) |
| 236 | $pool = $getPool(trigger.data.asset); |
| 237 | else |
| 238 | $pool = $getPool('base'); |
| 239 | if(trigger.data.amount) |
| 240 | $am = trigger.data.amount < $getPoolAmount($pool.asset)?trigger.data.amount:$getPoolAmount($pool.asset); |
| 241 | else |
| 242 | $am = $getPoolAmount($pool.asset); |
| 243 | if($am < 100) |
| 244 | bounce('min loan 100'); |
| 245 | $addresses = json_parse(trigger.data.addresses); |
| 246 | $shallnopass = $chechAddresses($addresses); |
| 247 | |
| 248 | }", |
| 249 | "messages": [ |
| 250 | { |
| 251 | "app": "payment", |
| 252 | "payload": { |
| 253 | "asset": "{$pool.asset}", |
| 254 | "outputs": [ |
| 255 | { |
| 256 | "address": "{$addresses[0]}", |
| 257 | "amount": "{$am}" |
| 258 | } |
| 259 | ] |
| 260 | } |
| 261 | }, |
| 262 | { |
| 263 | "app": "data", |
| 264 | "payload": { |
| 265 | "to": "{this_address}" |
| 266 | } |
| 267 | }, |
| 268 | { |
| 269 | "app": "state", |
| 270 | "state": "{ |
| 271 | var['addresses'] = $addresses; |
| 272 | var['index'] = 1; |
| 273 | var['last_index'] = array_length($addresses); |
| 274 | var['pool'] = $pool; |
| 275 | var['amount'] = $am; |
| 276 | var['to'] = is_valid_address(trigger.data.to)?trigger.data.to:trigger.initial_address; |
| 277 | response['event'] = 'start_loan'; |
| 278 | }" |
| 279 | } |
| 280 | ] |
| 281 | } |
| 282 | ] |
| 283 | } |
| 284 | } |
| 285 | ] |