| 1 | [ |
| 2 | "autonomous agent", |
| 3 | { |
| 4 | "doc_url": "https://city.obyte.org/random.json", |
| 5 | "getters": "{ |
| 6 | |
| 7 | |
| 8 | |
| 9 | }", |
| 10 | "init": "{ |
| 11 | |
| 12 | }", |
| 13 | "messages": { |
| 14 | "cases": [ |
| 15 | { |
| 16 | "if": "{ trigger.data.req_id AND trigger.data.proof AND trigger.data.consumer_aa }", |
| 17 | "init": "{ |
| 18 | $req_id = trigger.data.req_id; |
| 19 | $consumer_aa = trigger.data.consumer_aa; |
| 20 | $seed = $consumer_aa || '-' || $req_id; |
| 21 | $proof = trigger.data.proof; |
| 22 | $pub_key = params.vrf_providers[trigger.address]; |
| 23 | require($pub_key, "you are not a VRF provider"); |
| 24 | $req = $consumer_aa#2.$get_randomness_request($req_id); |
| 25 | require(vrf_verify($seed, $proof, $pub_key), "bad proof"); |
| 26 | $proof_key = 'proof_hashes_'||$seed||'_'||trigger.address; |
| 27 | require(!var[$proof_key], "already submitted"); |
| 28 | require(!var['finished_'||$seed], "already finished"); |
| 29 | $proof_hash = sha256($proof); |
| 30 | if (trigger.address == params.finishing_provider){ |
| 31 | $acc = {count_missing: 0, proofs: ''}; |
| 32 | foreach(params.vrf_providers, 10, ($address, $pk) => { |
| 33 | if ($address == trigger.address) |
| 34 | $acc.proofs = $acc.proofs || $proof_hash; |
| 35 | else{ |
| 36 | $ph = var['proof_hashes_'||$seed||'_'||$address]; |
| 37 | if ($ph) |
| 38 | $acc.proofs = $acc.proofs || $ph; |
| 39 | else |
| 40 | $acc.count_missing = $acc.count_missing + 1; |
| 41 | } |
| 42 | }); |
| 43 | $bFinished = $acc.count_missing == 0 OR !$req.want_max_security; |
| 44 | if ($bFinished) |
| 45 | $rand = sha256($acc.proofs); |
| 46 | else |
| 47 | bounce("too early"); |
| 48 | } |
| 49 | }", |
| 50 | "messages": [ |
| 51 | { |
| 52 | "if": "{$bFinished}", |
| 53 | "app": "payment", |
| 54 | "payload": { |
| 55 | "asset": "base", |
| 56 | "outputs": [ |
| 57 | { |
| 58 | "address": "{$consumer_aa}", |
| 59 | "amount": 500 |
| 60 | } |
| 61 | ] |
| 62 | } |
| 63 | }, |
| 64 | { |
| 65 | "if": "{$bFinished}", |
| 66 | "app": "data", |
| 67 | "payload": { |
| 68 | "req_id": "{$req_id}", |
| 69 | "rand": "{$rand}" |
| 70 | } |
| 71 | }, |
| 72 | { |
| 73 | "app": "state", |
| 74 | "state": "{ |
| 75 | if ($bFinished){ |
| 76 | var['finished_'||$seed] = 1; |
| 77 | |
| 78 | foreach(params.vrf_providers, 10, ($address, $pk) => { |
| 79 | var['proof_hashes_'||$seed||'_'||$address] = false; |
| 80 | }); |
| 81 | } |
| 82 | else |
| 83 | var[$proof_key] = $proof_hash; |
| 84 | var['bounce_fees_'||trigger.address] += 10000; |
| 85 | var['total_bounce_fees'] += 10000; |
| 86 | }" |
| 87 | } |
| 88 | ] |
| 89 | }, |
| 90 | { |
| 91 | "if": "{ trigger.data.withdraw AND trigger.data.asset }", |
| 92 | "init": "{ |
| 93 | $asset = trigger.data.asset; |
| 94 | $balance = balance[$asset] - ($asset == 'base' ? var['total_bounce_fees'] : 0); |
| 95 | $count_nonfinishing = length(params.vrf_providers) - 1; |
| 96 | $outputs = map(keys(params.vrf_providers), 10, ($address) => ({ |
| 97 | address: $address, |
| 98 | amount: floor($address == params.finishing_provider ? $balance/($count_nonfinishing == 0 ? 1 : 2) : $balance/2/$count_nonfinishing) |
| 99 | })); |
| 100 | $payload = {asset: $asset, outputs: $outputs}; |
| 101 | }", |
| 102 | "messages": [ |
| 103 | { |
| 104 | "app": "payment", |
| 105 | "payload": "{$payload}" |
| 106 | } |
| 107 | ] |
| 108 | }, |
| 109 | { |
| 110 | "if": "{ trigger.data.withdraw_bounce_fees }", |
| 111 | "init": "{ |
| 112 | $pub_key = params.vrf_providers[trigger.address]; |
| 113 | require($pub_key, "you are not a VRF provider"); |
| 114 | $balance = var['bounce_fees_'||trigger.address]; |
| 115 | }", |
| 116 | "messages": [ |
| 117 | { |
| 118 | "app": "payment", |
| 119 | "payload": { |
| 120 | "asset": "base", |
| 121 | "outputs": [ |
| 122 | { |
| 123 | "address": "{trigger.address}", |
| 124 | "amount": "{floor($balance * 0.8)}" |
| 125 | } |
| 126 | ] |
| 127 | } |
| 128 | }, |
| 129 | { |
| 130 | "app": "state", |
| 131 | "state": "{ |
| 132 | var['bounce_fees_'||trigger.address] = 0; |
| 133 | var['total_bounce_fees'] -= $balance; |
| 134 | }" |
| 135 | } |
| 136 | ] |
| 137 | }, |
| 138 | { |
| 139 | "messages": [ |
| 140 | { |
| 141 | "app": "state", |
| 142 | "state": "{ |
| 143 | response['message'] = 'Accepted'; |
| 144 | }" |
| 145 | } |
| 146 | ] |
| 147 | } |
| 148 | ] |
| 149 | } |
| 150 | } |
| 151 | ] |