tx · 9Cc9HGmzP6dFUoN385r1pR34P1f7dtT2bQ5jhmTCJwdM

3N3HtdnBkqSSc16DaydiwtrMBUv3DfqKjSW:  -0.01000000 Waves

2021.11.12 12:25 [1787601] smart account 3N3HtdnBkqSSc16DaydiwtrMBUv3DfqKjSW > SELF 0.00000000 Waves

{ "type": 13, "id": "9Cc9HGmzP6dFUoN385r1pR34P1f7dtT2bQ5jhmTCJwdM", "fee": 1000000, "feeAssetId": null, "timestamp": 1636709234795, "version": 2, "chainId": 84, "sender": "3N3HtdnBkqSSc16DaydiwtrMBUv3DfqKjSW", "senderPublicKey": "Aw1UftaEn1LLmCdG6VwWAuVtaSpcmPw18uZ4x2mvd9Wr", "proofs": [ "2ysyjFJfCPHWKEe6LRSy4DCneMSRn4Z5xZVcn6qmhYgxYy6NBmfnrXb6w6NdMHSSwfb753vR4m8L6wriwyrLXn6R" ], "script": "base64:AAIFAAAAAAAAAA4IAhIECgIIARIECgIRGAAAAA0AAAAAEGtleUFjaGlldmVtZW50SWQCAAAAA2lkXwAAAAAGb3JhY2xlCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU6UWqHpAvOq7xug7mLpqSXxqYhOHzYrMIAAAAAA9rZXlBZG1pblB1YktleTECAAAAC2FkbWluX3B1Yl8xAAAAAA9rZXlBZG1pblB1YktleTICAAAAC2FkbWluX3B1Yl8yAAAAAA9rZXlBZG1pblB1YktleTMCAAAAC2FkbWluX3B1Yl8zAQAAAAtnZXRBZG1pblB1YgAAAAEAAAALa2V5QWRtaW5QdWIEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAGb3JhY2xlBQAAAAtrZXlBZG1pblB1YgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAZzdHJpbmcFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAAGc3RyaW5nBAAAAAdub3RoaW5nBQAAAAckbWF0Y2gwCQAAAgAAAAECAAAAGUFkbWluIHB1YmxpYyBrZXkgaXMgZW1wdHkAAAAADGFkbWluUHViS2V5MQkBAAAAC2dldEFkbWluUHViAAAAAQUAAAAPa2V5QWRtaW5QdWJLZXkxAAAAAAxhZG1pblB1YktleTIJAQAAAAtnZXRBZG1pblB1YgAAAAEFAAAAD2tleUFkbWluUHViS2V5MgAAAAAMYWRtaW5QdWJLZXkzCQEAAAALZ2V0QWRtaW5QdWIAAAABBQAAAA9rZXlBZG1pblB1YktleTMAAAAAEmFkbWluUHViS2V5U3Rha2luZwEAAAAgBM915WTQwQ9OZ7kfE2TEGg3qhCRCMX0zkF1AWAqdk0oAAAAAFmtleUFjaGlldmVtZW50c1dyaXRlcnMCAAAAFGFjaGlldmVtZW50c193cml0ZXJzAAAAABNhY2hpZXZlbWVudHNXcml0ZXJzCQAEtQAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAGb3JhY2xlBQAAABZrZXlBY2hpZXZlbWVudHNXcml0ZXJzAgAAAAACAAAAASwBAAAAB3ppcE5leHQAAAACAAAAA2FjYwAAAAxsaXN0MkVsZW1lbnQEAAAACSR0MDkyMDk0OAUAAAADYWNj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", "height": 1787601, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 9w66HneWdEhJBYUc3pmgP4yfjuejFtCfpTr9a3TLJvkZ Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let keyAchievementId = "id_"
5+
6+let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
7+
8+let keyAdminPubKey1 = "admin_pub_1"
9+
10+let keyAdminPubKey2 = "admin_pub_2"
11+
12+let keyAdminPubKey3 = "admin_pub_3"
13+
14+func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
15+ case string: String =>
16+ fromBase58String(string)
17+ case nothing =>
18+ throw("Admin public key is empty")
19+}
20+
21+
22+let adminPubKey1 = getAdminPub(keyAdminPubKey1)
23+
24+let adminPubKey2 = getAdminPub(keyAdminPubKey2)
25+
26+let adminPubKey3 = getAdminPub(keyAdminPubKey3)
27+
28+let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
29+
30+let keyAchievementsWriters = "achievements_writers"
31+
32+let achievementsWriters = split(valueOrElse(getString(oracle, keyAchievementsWriters), ""), ",")
33+
34+func zipNext (acc,list2Element) = {
35+ let $t0920948 = acc
36+ let list1 = $t0920948._1
37+ let i = $t0920948._2
38+ let result = $t0920948._3
39+ $Tuple3(list1, (i + 1), (result :+ StringEntry((keyAchievementId + toString(list1[i])), list2Element)))
40+ }
41+
42+
43+@Callable(i)
44+func add (achievementId,amount) = if (!(containsElement(achievementsWriters, toString(this))))
45+ then throw("Only achievment writer can call this function")
46+ else {
47+ let userAddress = toString(i.originCaller)
48+ let amountOld = valueOrElse(getInteger(this, ((userAddress + "_") + achievementId)), 0)
49+[IntegerEntry(((userAddress + "_") + achievementId), (amountOld + amount))]
50+ }
51+
52+
53+
54+@Callable(i)
55+func addAchievements (achievementIds,achievementNames) = if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
56+ then throw("Only admin can call this function")
57+ else {
58+ let achievementsEtries = {
59+ let $l = achievementNames
60+ let $s = size($l)
61+ let $acc0 = $Tuple3(achievementIds, 0, nil)
62+ func 1 ($a,$i) = if (($i >= $s))
63+ then $a
64+ else zipNext($a, $l[$i])
65+
66+ func 2 ($a,$i) = if (($i >= $s))
67+ then $a
68+ else throw("List size exceeds 20")
69+
70+ 2(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
71+ }
72+ achievementsEtries._3
73+ }
74+
75+
76+@Verifier(tx)
77+func verify () = {
78+ let multiSignedByAdmins = {
79+ let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
80+ then 1
81+ else 0
82+ let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
83+ then 1
84+ else 0
85+ let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
86+ then 1
87+ else 0
88+ (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
89+ }
90+ let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
91+ then true
92+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
93+ then true
94+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
95+ then true
96+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
97+ match tx {
98+ case _ =>
99+ multiSignedByAdmins
100+ }
101+ }
102+

github/deemru/w8io/873ac7e 
30.36 ms