tx · AZfstWeg3E6hLjCj5yvkJNE35xuDbtPdqMbwAMNxZwB4 3N3JDpKdsH3U36cnofa7gR2rJGn1RskoKp9: -0.01000000 Waves 2019.12.05 16:14 [795475] smart account 3N3JDpKdsH3U36cnofa7gR2rJGn1RskoKp9 > SELF 0.00000000 Waves
{ "type": 13, "id": "AZfstWeg3E6hLjCj5yvkJNE35xuDbtPdqMbwAMNxZwB4", "fee": 1000000, "feeAssetId": null, "timestamp": 1575551682445, "version": 1, "sender": "3N3JDpKdsH3U36cnofa7gR2rJGn1RskoKp9", "senderPublicKey": "3KQGDRDChCU4yc6LEh4He8jVZgZacdMMLXZnEKTHEHyt", "proofs": [ "2Xz2V6zAeAMpZnU1VWp1fhYmEnT1tm964rTbah2wZ7isKAGaCJpmXdYkd8cSC5Pj3VjR7BFjdWV88ZVpC3h2euV8" ], "script": "base64:AAIDAAAAAAAAAA4IARIDCgEIEgMKAQgSAAAAAAYAAAAADG93bmVyQWRkcmVzcwkBAAAAB0FkZHJlc3MAAAABAQAAABoBVCKO49UfdVacf8Y0Qj59HGp7V9voyjFs/QAAAAAJdGlja2V0SHViCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFUBsSN2A60pEr0L803rLgzH70HWvMWeUsrAAAAABNsb3R0ZXJ5QWRtaW5BZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFUf94ftL4Vg1lJrIjOemFa/6T/nk84vWbZAAAAABFkQXBwUmFuZG9tQWRkcmVzcwkBAAAAB0FkZHJlc3MAAAABAQAAABoBVH/eH7S+FYNZSayIznphWv+k/55POL1m2QAAAAAOd2l0aGRyYXdQZXJpb2QAAAAAAAAAqMABAAAAEmV4dHJhY3RSYW5kb21WYWx1ZQAAAAAEAAAAE3JlcXVlc3RDb21taXRlZFR4SWQJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMCAAAAD3JhbmRvbVJlcXVlc3RUeAQAAAAOb3JhY2xlUmVzcG9uc2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAAEWRBcHBSYW5kb21BZGRyZXNzBQAAABNyZXF1ZXN0Q29tbWl0ZWRUeElkBAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMCAAAADHJhbmRvbVJlc3VsdAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFzBQAAAAckbWF0Y2gwCQABpAAAAAEFAAAAAXMJAAGRAAAAAgkABLUAAAACBQAAAA5vcmFjbGVSZXNwb25zZQIAAAACLS0AAAAAAAAAAAEAAAADAAAACmNvbnRleHRPYmoBAAAAF3JlZ2lzdGVyUmFuZG9tUmVxdWVzdFR4AAAAAQAAAA9yYW5kb21SZXF1ZXN0VHgDCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAR0aGlzAgAAAA9yYW5kb21SZXF1ZXN0VHgJAAACAAAAAQIAAAAncmFuZG9tUmVxdWVzdFR4IGlzIGFscmVhZHkgaW4gdGhlIHN0YXRlAwkBAAAACWlzRGVmaW5lZAAAAAEJAAPpAAAAAQkAAlkAAAABBQAAAA9yYW5kb21SZXF1ZXN0VHgJAAACAAAAAQIAAAAyWW91IHRyeSByZWdpc3RlciB0eCB3aGljaCBpcyBhbHJlYWR5IGluIGJsb2NrY2hhaW4DCQAAAAAAAAIIBQAAAApjb250ZXh0T2JqAAAABmNhbGxlcgUAAAATbG90dGVyeUFkbWluQWRkcmVzcwkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAPcmFuZG9tUmVxdWVzdFR4BQAAAA9yYW5kb21SZXF1ZXN0VHgJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAICAAAAC3N0YXJ0SGVpZ2h0BQAAAAZoZWlnaHQFAAAAA25pbAkAAAIAAAABAgAAACZvbmx5IGxvdGVyeU93bmVyIGNhbiBzdGFydCB0aGUgbG90dGVyeQAAAApjb250ZXh0T2JqAQAAAA9kZWZpbmVUaGVXaW5uZXIAAAABAAAAD3RpY2tldHNJbkh1YktleQQAAAAScmFuZG9tUmVzdWx0U3RyaW5nCQEAAAASZXh0cmFjdFJhbmRvbVZhbHVlAAAAAAQAAAAMcmFuZG9tUmVzdWx0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEFAAAAEnJhbmRvbVJlc3VsdFN0cmluZwMJAQAAAAlpc0RlZmluZWQAAAABCQAEGgAAAAIFAAAABHRoaXMCAAAADHdpbm5lclRpY2tldAkAAAIAAAABAgAAABl3aW5uZXIgaXMgYWxyZWFkeSBkZWZpbmVkAwkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAJdGlja2V0SHViCQABLAAAAAICAAAADXdpbm5pbmdUaWNrZXQFAAAAEnJhbmRvbVJlc3VsdFN0cmluZwQAAAAMdGlja2V0QW1vdW50CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAl0aWNrZXRIdWICAAAAEXRpY2tldEFtb3VudFRvdGFsBAAAABJyYW5kb21SZXN1bHRVcGRhdGUDCQAAAAAAAAIFAAAADHJhbmRvbVJlc3VsdAUAAAAMdGlja2V0QW1vdW50AAAAAAAAAAABCQAAZAAAAAIFAAAADHJhbmRvbVJlc3VsdAAAAAAAAAAAAQkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAMcmFuZG9tUmVzdWx0BQAAABJyYW5kb21SZXN1bHRVcGRhdGUFAAAAA25pbAQAAAAKdGlja2V0RnJvbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIJAAS1AAAAAgkAAZEAAAACCQAEtQAAAAIFAAAAD3RpY2tldHNJbkh1YktleQIAAAACVG8AAAAAAAAAAAACAAAAC3RpY2tldHNGcm9tAAAAAAAAAAABBAAAAAh0aWNrZXRUbwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIJAAS1AAAAAgUAAAAPdGlja2V0c0luSHViS2V5AgAAAAJUbwAAAAAAAAAAAQMDCQAAZwAAAAIFAAAADHJhbmRvbVJlc3VsdAUAAAAKdGlja2V0RnJvbQkAAGcAAAACBQAAAAh0aWNrZXRUbwUAAAAMcmFuZG9tUmVzdWx0BwQAAAANd2lubmVyQWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAJdGlja2V0SHViBQAAAA90aWNrZXRzSW5IdWJLZXkJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAICAAAADHdpbm5lclRpY2tldAUAAAAMcmFuZG9tUmVzdWx0CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACAgAAAA13aW5uZXJBZGRyZXNzBQAAAA13aW5uZXJBZGRyZXNzBQAAAANuaWwJAAACAAAAAQIAAAAYdGhlc2UgdGlja2V0cyBkaWRuJ3Qgd2luAAAACmNvbnRleHRPYmoBAAAACHdpdGhkcmF3AAAAAAQAAAANd2lubmVyQWRkcmVzcwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzAgAAAA13aW5uZXJBZGRyZXNzBAAAAAtzdGFydEhlaWdodAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwIAAAALc3RhcnRIZWlnaHQEAAAABW1vbnRoBQAAAA53aXRoZHJhd1BlcmlvZAMDCQAAAAAAAAIIBQAAAApjb250ZXh0T2JqAAAABmNhbGxlcgUAAAANd2lubmVyQWRkcmVzcwkAAGcAAAACCQAAZAAAAAIFAAAAC3N0YXJ0SGVpZ2h0BQAAAAVtb250aAUAAAAGaGVpZ2h0BwkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA13aW5uZXJBZGRyZXNzCQEAAAAMd2F2ZXNCYWxhbmNlAAAAAQUAAAAEdGhpcwUAAAAEdW5pdAUAAAADbmlsAwMDCQAAAAAAAAIIBQAAAApjb250ZXh0T2JqAAAABmNhbGxlcgUAAAATbG90dGVyeUFkbWluQWRkcmVzcwYJAAAAAAAAAggFAAAACmNvbnRleHRPYmoAAAAGY2FsbGVyBQAAAAxvd25lckFkZHJlc3MJAABmAAAAAgUAAAAGaGVpZ2h0CQAAZAAAAAIFAAAAC3N0YXJ0SGVpZ2h0BQAAAAVtb250aAcJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAMb3duZXJBZGRyZXNzCQEAAAAMd2F2ZXNCYWxhbmNlAAAAAQUAAAAEdGhpcwUAAAAEdW5pdAUAAAADbmlsCQAAAgAAAAECAAAAHHlvdSBjYW4ndCB3aXRoZHJhdyB0aGUgZnVuZHMAAAAAEq65xA==", "chainId": 84, "height": 795475, "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 3 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let ownerAddress = Address(base58'3Ms4ovcT1Rtq2BExHqRbBMUeKCYmDSSGGV2') | |
5 | + | ||
6 | + | let ticketHub = Address(base58'3MpXsHtUSpsUJRsUdVfxpcfFQzeoQyP2GHg') | |
7 | + | ||
8 | + | let lotteryAdminAddress = Address(base58'3N1aBgieFCpxDJorNX7i41KWaP974Ci9roS') | |
9 | + | ||
10 | + | let dAppRandomAddress = Address(base58'3N1aBgieFCpxDJorNX7i41KWaP974Ci9roS') | |
11 | + | ||
12 | + | let withdrawPeriod = 43200 | |
13 | + | ||
14 | + | func extractRandomValue () = { | |
15 | + | let requestCommitedTxId = getStringValue(this, "randomRequestTx") | |
16 | + | let oracleResponse = getStringValue(dAppRandomAddress, requestCommitedTxId) | |
17 | + | match getInteger(this, "randomResult") { | |
18 | + | case s: Int => | |
19 | + | toString(s) | |
20 | + | case _ => | |
21 | + | split(oracleResponse, "--")[1] | |
22 | + | } | |
23 | + | } | |
24 | + | ||
25 | + | ||
26 | + | @Callable(contextObj) | |
27 | + | func registerRandomRequestTx (randomRequestTx) = if (isDefined(getString(this, "randomRequestTx"))) | |
28 | + | then throw("randomRequestTx is already in the state") | |
29 | + | else if (isDefined(transactionHeightById(fromBase58String(randomRequestTx)))) | |
30 | + | then throw("You try register tx which is already in blockchain") | |
31 | + | else if ((contextObj.caller == lotteryAdminAddress)) | |
32 | + | then WriteSet([DataEntry("randomRequestTx", randomRequestTx), DataEntry("startHeight", height)]) | |
33 | + | else throw("only loteryOwner can start the lottery") | |
34 | + | ||
35 | + | ||
36 | + | ||
37 | + | @Callable(contextObj) | |
38 | + | func defineTheWinner (ticketsInHubKey) = { | |
39 | + | let randomResultString = extractRandomValue() | |
40 | + | let randomResult = parseIntValue(randomResultString) | |
41 | + | if (isDefined(getInteger(this, "winnerTicket"))) | |
42 | + | then throw("winner is already defined") | |
43 | + | else if (isDefined(getString(ticketHub, ("winningTicket" + randomResultString)))) | |
44 | + | then { | |
45 | + | let ticketAmount = getIntegerValue(ticketHub, "ticketAmountTotal") | |
46 | + | let randomResultUpdate = if ((randomResult == ticketAmount)) | |
47 | + | then 1 | |
48 | + | else (randomResult + 1) | |
49 | + | WriteSet([DataEntry("randomResult", randomResultUpdate)]) | |
50 | + | } | |
51 | + | else { | |
52 | + | let ticketFrom = parseIntValue(split(split(ticketsInHubKey, "To")[0], "ticketsFrom")[1]) | |
53 | + | let ticketTo = parseIntValue(split(ticketsInHubKey, "To")[1]) | |
54 | + | if (if ((randomResult >= ticketFrom)) | |
55 | + | then (ticketTo >= randomResult) | |
56 | + | else false) | |
57 | + | then { | |
58 | + | let winnerAddress = getStringValue(ticketHub, ticketsInHubKey) | |
59 | + | WriteSet([DataEntry("winnerTicket", randomResult), DataEntry("winnerAddress", winnerAddress)]) | |
60 | + | } | |
61 | + | else throw("these tickets didn't win") | |
62 | + | } | |
63 | + | } | |
64 | + | ||
65 | + | ||
66 | + | ||
67 | + | @Callable(contextObj) | |
68 | + | func withdraw () = { | |
69 | + | let winnerAddress = addressFromStringValue(getStringValue(this, "winnerAddress")) | |
70 | + | let startHeight = getIntegerValue(this, "startHeight") | |
71 | + | let month = withdrawPeriod | |
72 | + | if (if ((contextObj.caller == winnerAddress)) | |
73 | + | then ((startHeight + month) >= height) | |
74 | + | else false) | |
75 | + | then TransferSet([ScriptTransfer(winnerAddress, wavesBalance(this), unit)]) | |
76 | + | else if (if (if ((contextObj.caller == lotteryAdminAddress)) | |
77 | + | then true | |
78 | + | else (contextObj.caller == ownerAddress)) | |
79 | + | then (height > (startHeight + month)) | |
80 | + | else false) | |
81 | + | then TransferSet([ScriptTransfer(ownerAddress, wavesBalance(this), unit)]) | |
82 | + | else throw("you can't withdraw the funds") | |
83 | + | } | |
84 | + | ||
85 | + |
github/deemru/w8io/026f985 30.98 ms ◑