tx · AqcfcjinWSqSNbvVxE1a3QMdi27d8KV53gEk88JwBBgC 3PMSUpFkaCwVobF57gkNgQMtpz9hnRMaY3G: -0.01000000 Waves 2022.12.21 17:39 [3435645] smart account 3PMSUpFkaCwVobF57gkNgQMtpz9hnRMaY3G > SELF 0.00000000 Waves
{ "type": 13, "id": "AqcfcjinWSqSNbvVxE1a3QMdi27d8KV53gEk88JwBBgC", "fee": 1000000, "feeAssetId": null, "timestamp": 1671633584880, "version": 2, "chainId": 87, "sender": "3PMSUpFkaCwVobF57gkNgQMtpz9hnRMaY3G", "senderPublicKey": "24RfWVqC3utDSKA5GoSKJCJo5mFErm1aABFhpavJYbpW", "proofs": [ "2ZJBrGaQpNwqKUAZRZZwvgYvq8jmrmUQuNL88zNAqohoKqRB9UYN8MWSfikekHWvBKZrM8rAASfPQyktvtgvPKU8" ], "script": "base64:AAIFAAAAAAAAAA4IAhIECgIICBIECgIIAQAAAAsBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAxDYW4ndCByZWFkICcFAAAAA2tleQIAAAANJyBhdCBhZGRyZXNzIAkABCUAAAABBQAAAAdhZGRyZXNzAQAAABFnZXRJbnRlZ2VyT3JUaHJvdwAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADENhbid0IHJlYWQgJwUAAAADa2V5AgAAAA0nIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAAB2FkZHJlc3MBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABAAAADG1heWJlQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEFAAAADG1heWJlQWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAGkNhbid0IHBhcnNlIGFkZHJlc3MgZnJvbSAnBQAAAAxtYXliZUFkZHJlc3MCAAAAAScBAAAACmtleV9lbnRpdHkAAAADAAAABG5hbWUAAAACcGsAAAAIcHJvcGVydHkJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAEbmFtZQIAAAABXwUAAAACcGsCAAAAAV8FAAAACHByb3BlcnR5AQAAAA5rZXlfTmFtZV90b2tlbgAAAAEAAAAEbmFtZQkBAAAACmtleV9lbnRpdHkAAAADAgAAAAROYW1lBQAAAARuYW1lAgAAAAV0b2tlbgAAAAARa2V5X21lZWR1c0FkZHJlc3MCAAAADW1lZWR1c0FkZHJlc3MAAAAAFGtleV9yZWdpc3RyYXJBZGRyZXNzAgAAABByZWdpc3RyYXJBZGRyZXNzAAAAAA1tZWVkdXNBZGRyZXNzCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMFAAAAEWtleV9tZWVkdXNBZGRyZXNzAAAAAAZtZWVkdXMJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQUAAAANbWVlZHVzQWRkcmVzcwAAAAAQcmVnaXN0cmFyQWRkcmVzcwkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzBQAAABRrZXlfcmVnaXN0cmFyQWRkcmVzcwAAAAAJcmVnaXN0cmFyCQEAAAATcGFyc2VBZGRyZXNzT3JUaHJvdwAAAAEFAAAAEHJlZ2lzdHJhckFkZHJlc3MAAAACAAAAA2ludgEAAAAEaW5pdAAAAAIAAAANbWVlZHVzQWRkcmVzcwAAABByZWdpc3RyYXJBZGRyZXNzAwkBAAAAAiE9AAAAAggFAAAAA2ludgAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAbT25seSBzZWxmIGNhbGxzIGFyZSBhbGxvd2VkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAEWtleV9tZWVkdXNBZGRyZXNzBQAAAA1tZWVkdXNBZGRyZXNzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAFGtleV9yZWdpc3RyYXJBZGRyZXNzBQAAABByZWdpc3RyYXJBZGRyZXNzBQAAAANuaWwAAAADaW52AQAAAAdyZXNlcnZlAAAAAgAAAARuYW1lAAAADWluaXRUaW1lc3RhbXAEAAAABmNhbGxlcggFAAAAA2ludgAAAAZjYWxsZXIEAAAACWNhbGxlclN0cgkABCUAAAABBQAAAAZjYWxsZXIDCQEAAAACIT0AAAACBQAAAAR0aGlzBQAAAAZjYWxsZXIJAAACAAAAAQIAAAAbT25seSBzZWxmIGNhbGxzIGFyZSBhbGxvd2VkBAAAAAtyZXNlcnZhdGlvbgkAA/wAAAAEBQAAAAlyZWdpc3RyYXICAAAACHJlZ2lzdGVyCQAETAAAAAIFAAAABG5hbWUJAARMAAAAAgUAAAAJY2FsbGVyU3RyCQAETAAAAAIFAAAADWluaXRUaW1lc3RhbXAFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAtyZXNlcnZhdGlvbgUAAAALcmVzZXJ2YXRpb24FAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAAAttYXliZU9yYWNsZQkABCYAAAABCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMCAAAABk9yYWNsZQIAAAAABAAAAA5tYXliZUFkbWluS2V5cwMJAQAAAAlpc0RlZmluZWQAAAABBQAAAAttYXliZU9yYWNsZQkABB0AAAACCQEAAAAFdmFsdWUAAAABBQAAAAttYXliZU9yYWNsZQIAAAAJQWRtaW5LZXlzBQAAAAR1bml0BAAAAAckbWF0Y2gwBQAAAA5tYXliZUFkbWluS2V5cwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAxhZG1pbktleXNTdHIFAAAAByRtYXRjaDAEAAAACWFkbWluS2V5cwQAAAAKc3RyaW5nS2V5cwkABLUAAAACBQAAAAxhZG1pbktleXNTdHICAAAAASwJAARMAAAAAgkAAlkAAAABCQABkQAAAAIFAAAACnN0cmluZ0tleXMAAAAAAAAAAAAJAARMAAAAAgkAAlkAAAABCQABkQAAAAIFAAAACnN0cmluZ0tleXMAAAAAAAAAAAEJAARMAAAAAgkAAlkAAAABCQABkQAAAAIFAAAACnN0cmluZ0tleXMAAAAAAAAAAAIFAAAAA25pbAoBAAAAD3ZlcmlmeUJ5QWxsS2V5cwAAAAEAAAAFcHJvb2YDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMFAAAABXByb29mCQABkQAAAAIFAAAACWFkbWluS2V5cwAAAAAAAAAAAAAAAAAAAAAAAQMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwUAAAAFcHJvb2YJAAGRAAAAAgUAAAAJYWRtaW5LZXlzAAAAAAAAAAABAAAAAAAAAAAKAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzBQAAAAVwcm9vZgkAAZEAAAACBQAAAAlhZG1pbktleXMAAAAAAAAAAAIAAAAAAAAAAGQAAAAAAAAAAAAJAQAAAA9jb250YWluc0VsZW1lbnQAAAACCQAETAAAAAIAAAAAAAAAAG4JAARMAAAAAgAAAAAAAAAAZQkABEwAAAACAAAAAAAAAAALBQAAAANuaWwJAABkAAAAAgkBAAAAD3ZlcmlmeUJ5QWxsS2V5cwAAAAEJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAkBAAAAD3ZlcmlmeUJ5QWxsS2V5cwAAAAEJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAQkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkvLL4+", "height": 3435645, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CejLubHCxZXbtwKSGUgkzXrShVsJ7gPungDxajsbFHWE Next: 3mWcGnJ3aCzp2G2XAFqr6j6oToAnhcrgDb9txwMeX1oR Diff:
Old | New | Differences | |
---|---|---|---|
50 | 50 | } | |
51 | 51 | ||
52 | 52 | ||
53 | + | @Verifier(tx) | |
54 | + | func verify () = { | |
55 | + | let maybeOracle = addressFromString(valueOrElse(getString(this, "Oracle"), "")) | |
56 | + | let maybeAdminKeys = if (isDefined(maybeOracle)) | |
57 | + | then getString(value(maybeOracle), "AdminKeys") | |
58 | + | else unit | |
59 | + | match maybeAdminKeys { | |
60 | + | case adminKeysStr: String => | |
61 | + | let adminKeys = { | |
62 | + | let stringKeys = split(adminKeysStr, ",") | |
63 | + | [fromBase58String(stringKeys[0]), fromBase58String(stringKeys[1]), fromBase58String(stringKeys[2])] | |
64 | + | } | |
65 | + | func verifyByAllKeys (proof) = if (sigVerify(tx.bodyBytes, proof, adminKeys[0])) | |
66 | + | then 1 | |
67 | + | else if (sigVerify(tx.bodyBytes, proof, adminKeys[1])) | |
68 | + | then 10 | |
69 | + | else if (sigVerify(tx.bodyBytes, proof, adminKeys[2])) | |
70 | + | then 100 | |
71 | + | else 0 | |
72 | + | ||
73 | + | containsElement([110, 101, 11], (verifyByAllKeys(tx.proofs[0]) + verifyByAllKeys(tx.proofs[1]))) | |
74 | + | case _ => | |
75 | + | sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
76 | + | } | |
77 | + | } | |
78 | + |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func getStringOrThrow (address,key) = valueOrErrorMessage(getString(address, key), ((("Can't read '" + key) + "' at address ") + toString(address))) | |
5 | 5 | ||
6 | 6 | ||
7 | 7 | func getIntegerOrThrow (address,key) = valueOrErrorMessage(getInteger(address, key), ((("Can't read '" + key) + "' at address ") + toString(address))) | |
8 | 8 | ||
9 | 9 | ||
10 | 10 | func parseAddressOrThrow (maybeAddress) = valueOrErrorMessage(addressFromString(maybeAddress), (("Can't parse address from '" + maybeAddress) + "'")) | |
11 | 11 | ||
12 | 12 | ||
13 | 13 | func key_entity (name,pk,property) = ((((name + "_") + pk) + "_") + property) | |
14 | 14 | ||
15 | 15 | ||
16 | 16 | func key_Name_token (name) = key_entity("Name", name, "token") | |
17 | 17 | ||
18 | 18 | ||
19 | 19 | let key_meedusAddress = "meedusAddress" | |
20 | 20 | ||
21 | 21 | let key_registrarAddress = "registrarAddress" | |
22 | 22 | ||
23 | 23 | let meedusAddress = getStringOrThrow(this, key_meedusAddress) | |
24 | 24 | ||
25 | 25 | let meedus = parseAddressOrThrow(meedusAddress) | |
26 | 26 | ||
27 | 27 | let registrarAddress = getStringOrThrow(this, key_registrarAddress) | |
28 | 28 | ||
29 | 29 | let registrar = parseAddressOrThrow(registrarAddress) | |
30 | 30 | ||
31 | 31 | @Callable(inv) | |
32 | 32 | func init (meedusAddress,registrarAddress) = if ((inv.caller != this)) | |
33 | 33 | then throw("Only self calls are allowed") | |
34 | 34 | else [StringEntry(key_meedusAddress, meedusAddress), StringEntry(key_registrarAddress, registrarAddress)] | |
35 | 35 | ||
36 | 36 | ||
37 | 37 | ||
38 | 38 | @Callable(inv) | |
39 | 39 | func reserve (name,initTimestamp) = { | |
40 | 40 | let caller = inv.caller | |
41 | 41 | let callerStr = toString(caller) | |
42 | 42 | if ((this != caller)) | |
43 | 43 | then throw("Only self calls are allowed") | |
44 | 44 | else { | |
45 | 45 | let reservation = invoke(registrar, "register", [name, callerStr, initTimestamp], nil) | |
46 | 46 | if ((reservation == reservation)) | |
47 | 47 | then nil | |
48 | 48 | else throw("Strict value is not equal to itself.") | |
49 | 49 | } | |
50 | 50 | } | |
51 | 51 | ||
52 | 52 | ||
53 | + | @Verifier(tx) | |
54 | + | func verify () = { | |
55 | + | let maybeOracle = addressFromString(valueOrElse(getString(this, "Oracle"), "")) | |
56 | + | let maybeAdminKeys = if (isDefined(maybeOracle)) | |
57 | + | then getString(value(maybeOracle), "AdminKeys") | |
58 | + | else unit | |
59 | + | match maybeAdminKeys { | |
60 | + | case adminKeysStr: String => | |
61 | + | let adminKeys = { | |
62 | + | let stringKeys = split(adminKeysStr, ",") | |
63 | + | [fromBase58String(stringKeys[0]), fromBase58String(stringKeys[1]), fromBase58String(stringKeys[2])] | |
64 | + | } | |
65 | + | func verifyByAllKeys (proof) = if (sigVerify(tx.bodyBytes, proof, adminKeys[0])) | |
66 | + | then 1 | |
67 | + | else if (sigVerify(tx.bodyBytes, proof, adminKeys[1])) | |
68 | + | then 10 | |
69 | + | else if (sigVerify(tx.bodyBytes, proof, adminKeys[2])) | |
70 | + | then 100 | |
71 | + | else 0 | |
72 | + | ||
73 | + | containsElement([110, 101, 11], (verifyByAllKeys(tx.proofs[0]) + verifyByAllKeys(tx.proofs[1]))) | |
74 | + | case _ => | |
75 | + | sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
76 | + | } | |
77 | + | } | |
78 | + |
github/deemru/w8io/3ef1775 39.55 ms ◑