tx · 4B8RqB1MKxCxzkzbi3iy4zr4WFq2PFsahEiXreSF8M82

3N8M61KCm8G72mK8PjacFbnnxdbFsyqQDeT:  -0.01400000 Waves

2019.06.30 12:52 [564702] smart account 3N8M61KCm8G72mK8PjacFbnnxdbFsyqQDeT > SELF 0.00000000 Waves

{ "type": 13, "id": "4B8RqB1MKxCxzkzbi3iy4zr4WFq2PFsahEiXreSF8M82", "fee": 1400000, "feeAssetId": null, "timestamp": 1561888368310, "version": 1, "sender": "3N8M61KCm8G72mK8PjacFbnnxdbFsyqQDeT", "senderPublicKey": "Bhyvkx4xdbEi4KPJNZSzx9gZgzgyLEsavuj2kYSt7SST", "proofs": [ "EkwdtSKbXQ91k2vpt7kRTrJPQTpR49bxDgfmRmzB28S3QzBZ7MX7k2i3kfamVCxobdxW3Tz8pB17c9rJ4CTRCeZ" ], "script": "base64:AAIDAAAAAAAAAAAAAAAbAAAAAA9TZXJ2ZXJQdWJsaWNLZXkBAAAAIL79hxhmqWX34iA/RS9p36FY3qCJjLclClmAz4vj6GlBAAAAAA1TZXJ2ZXJBZGRyZXNzCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAECAAAAIzNNdThvS1NjV0N3UjMzWW9tVDV1a1U3M1A3akxyeVpUazRzAAAAABBSb3VsZXR0ZVNlY3Rpb25zAAAAAAAAAAAVAAAAABFEYXRhR2FtZU51bWJlcktleQIAAAALQVBQX0dBTUVfSUQAAAAADURhdGFBbW91bnRLZXkCAAAABkFNT1VOVAAAAAAORGF0YVNlY3Rpb25LZXkCAAAAB1NFQ1RJT04AAAAADURhdGFTdGF0dXNLZXkCAAAABlNUQVRVUwAAAAANRGF0YVJlc3VsdEtleQIAAAAGUkVTVUxUAAAAAA1EYXRhU3RhdHVzTmV3AgAAAANORVcAAAAADURhdGFTdGF0dXNXaW4CAAAAA1dJTgAAAAAPRGF0YVN0YXR1c0xvb3NlAgAAAAVMT09TRQAAAAAHV0FWRUxFVAkAAGgAAAACCQAAaAAAAAIAAAAAAAAAAGQAAAAAAAAAA+gAAAAAAAAAA+gAAAAACkNPTU1JU1NJT04JAABpAAAAAgkAAGgAAAACAAAAAAAAAAAFBQAAAAdXQVZFTEVUAAAAAAAAAAPoAAAAABZFcnJvck9ubHlXYXZlc0FjY2VwdGVkAgAAABNPbmx5IHdhdmVzIGFjY2VwdGVkAAAAABVFcnJvck11c3RHcmVhdGVyVGhhbjACAAAAJVBhcmFtZXRlciBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAAAAAAFEVycm9yTXVzdExlc3NUaGFuMTAwAgAAACRQYXJhbWV0ZXIgc2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiAxMDAAAAAAFUVycm9yQmV0TXVzdEJlSW5XYXZlcwIAAAAbQmV0IGFtb3VudCBtdXN0IGJlIGluIFdhdmVzAAAAAB1FcnJvclRyYW5zYWN0aW9uTXVzdEJlSW5XYXZlcwIAAAAiVHJhbnNhY3Rpb24ncyBmZWUgbXVzdCBiZSBpbiBXYXZlcwAAAAAURXJyb3JUcmFuc2FjdGlvblVzZWQCAAAAL1Bh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AAAAA3BtdAAAAAZhbW91bnQDBQAAAA1iZXROb3RJbldhdmVzCQAAAgAAAAEFAAAAFUVycm9yQmV0TXVzdEJlSW5XYXZlcwMFAAAADWZlZU5vdEluV2F2ZXMJAAACAAAAAQUAAAAdRXJyb3JUcmFuc2FjdGlvbk11c3RCZUluV2F2ZXMDBQAAAAh0eElkVXNlZAkAAAIAAAABBQAAABRFcnJvclRyYW5zYWN0aW9uVXNlZAkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEWdhbWVUcmFuc2FjdGlvbklkBQAAAAdhZGRyZXNzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABFEYXRhR2FtZU51bWJlcktleQUAAAAKZ2FtZU51bWJlcgkABEwAAAACCQEAAAAMU3RvcmVEYXRhSW50AAAAAwUAAAARZ2FtZVRyYW5zYWN0aW9uSWQFAAAADURhdGFBbW91bnRLZXkFAAAABmFtb3VudAkABEwAAAACCQEAAAAMU3RvcmVEYXRhSW50AAAAAwUAAAARZ2FtZVRyYW5zYWN0aW9uSWQFAAAADkRhdGFTZWN0aW9uS2V5BQAAAA5leHBlY3RlZFJlc3VsdAkABEwAAAACCQEAAAAJU3RvcmVEYXRhAAAAAwUAAAARZ2FtZVRyYW5zYWN0aW9uSWQFAAAADURhdGFTdGF0dXNLZXkFAAAADURhdGFTdGF0dXNOZXcFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA1TZXJ2ZXJBZGRyZXNzBQAAAApDT01NSVNTSU9OBQAAAAR1bml0BQAAAANuaWwAAAABaQEAAAAGcmVzdWx0AAAAAgAAABFnYW1lVHJhbnNhY3Rpb25JZAAAAANyc2EEAAAABHJhbmQJAQAAAA9HZW5lcmF0ZVJhbmRJbnQAAAACBQAAABFnYW1lVHJhbnNhY3Rpb25JZAUAAAADcnNhBAAAAA9zZWxlY3RlZFNlY3Rpb24JAQAAAApHZXREYXRhSW50AAAAAgUAAAARZ2FtZVRyYW5zYWN0aW9uSWQFAAAADkRhdGFTZWN0aW9uS2V5BAAAAAZzdGF0dXMJAQAAAA1HZXREYXRhU3RyaW5nAAAAAgUAAAARZ2FtZVRyYW5zYWN0aW9uSWQFAAAADURhdGFTdGF0dXNLZXkDCQAAAAAAAAIFAAAABnN0YXR1cwUAAAANRGF0YVN0YXR1c05ldwQAAAAFaXNXaW4JAAAAAAAAAgUAAAAEcmFuZAUAAAAPc2VsZWN0ZWRTZWN0aW9uBAAAAAh3cml0ZVNldAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJU3RvcmVEYXRhAAAAAwUAAAARZ2FtZVRyYW5zYWN0aW9uSWQFAAAADURhdGFTdGF0dXNLZXkJAAGlAAAAAQUAAAAFaXNXaW4JAARMAAAAAgkBAAAADFN0b3JlRGF0YUludAAAAAMFAAAAEWdhbWVUcmFuc2FjdGlvbklkBQAAAA1EYXRhUmVzdWx0S2V5BQAAAARyYW5kBQAAAANuaWwDBQAAAAVpc1dpbgkBAAAADFNjcmlwdFJlc3VsdAAAAAIFAAAACHdyaXRlU2V0CQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAADVNlcnZlckFkZHJlc3MFAAAACkNPTU1JU1NJT04FAAAABHVuaXQFAAAAA25pbAUAAAAId3JpdGVTZXQJAAACAAAAAQkAASwAAAACBQAAAA1FcnJvckdhbWVPdmVyBQAAAAZzdGF0dXMAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABRTZXRTY3JpcHRUcmFuc2FjdGlvbgQAAAADc3R4BQAAAAckbWF0Y2gwBgcHpkBsCA==", "chainId": 84, "height": 564702, "spentComplexity": 0 } View: original | compacted Prev: C9dqVAdzvnoKxh1hkB3A6LKonAUh48xmwyj6hPFkqyuA Next: EwVUvZRsrSG7vs6RhtUGcsVEwjuzurjkbsAdyVTa6KWV Diff:
OldNewDifferences
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let ServerPublicKey = base58'DrYgfD7j6AKD1iXtn9uhMka95ATZB42B1kGKCUATP2UG'
5+
6+let ServerAddress = addressFromStringValue("3Mu8oKScWCwR33YomT5ukU73P7jLryZTk4s")
57
68 let RouletteSections = 21
79
1315
1416 let DataStatusKey = "STATUS"
1517
18+let DataResultKey = "RESULT"
19+
1620 let DataStatusNew = "NEW"
1721
1822 let DataStatusWin = "WIN"
1923
2024 let DataStatusLoose = "LOOSE"
25+
26+let WAVELET = ((100 * 1000) * 1000)
27+
28+let COMMISSION = ((5 * WAVELET) / 1000)
2129
2230 let ErrorOnlyWavesAccepted = "Only waves accepted"
2331
103111 then throw(ErrorTransactionMustBeInWaves)
104112 else if (txIdUsed)
105113 then throw(ErrorTransactionUsed)
106- else WriteSet([DataEntry(gameTransactionId, address), DataEntry(DataGameNumberKey, gameNumber), StoreDataInt(gameTransactionId, DataAmountKey, amount), StoreDataInt(gameTransactionId, DataSectionKey, expectedResult), StoreData(gameTransactionId, DataStatusKey, DataStatusNew)])
114+ else ScriptResult(WriteSet([DataEntry(gameTransactionId, address), DataEntry(DataGameNumberKey, gameNumber), StoreDataInt(gameTransactionId, DataAmountKey, amount), StoreDataInt(gameTransactionId, DataSectionKey, expectedResult), StoreData(gameTransactionId, DataStatusKey, DataStatusNew)]), TransferSet([ScriptTransfer(ServerAddress, COMMISSION, unit)]))
107115 }
108116
109117
116124 if ((status == DataStatusNew))
117125 then {
118126 let isWin = (rand == selectedSection)
127+ let writeSet = WriteSet([StoreData(gameTransactionId, DataStatusKey, toString(isWin)), StoreDataInt(gameTransactionId, DataResultKey, rand)])
119128 if (isWin)
120- then WriteSet([StoreData(gameTransactionId, DataStatusKey, DataStatusWin)])
121- else WriteSet([StoreData(gameTransactionId, DataStatusKey, DataStatusLoose)])
129+ then ScriptResult(writeSet, TransferSet([ScriptTransfer(ServerAddress, COMMISSION, unit)]))
130+ else writeSet
122131 }
123132 else throw((ErrorGameOver + status))
124133 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let ServerPublicKey = base58'DrYgfD7j6AKD1iXtn9uhMka95ATZB42B1kGKCUATP2UG'
5+
6+let ServerAddress = addressFromStringValue("3Mu8oKScWCwR33YomT5ukU73P7jLryZTk4s")
57
68 let RouletteSections = 21
79
810 let DataGameNumberKey = "APP_GAME_ID"
911
1012 let DataAmountKey = "AMOUNT"
1113
1214 let DataSectionKey = "SECTION"
1315
1416 let DataStatusKey = "STATUS"
1517
18+let DataResultKey = "RESULT"
19+
1620 let DataStatusNew = "NEW"
1721
1822 let DataStatusWin = "WIN"
1923
2024 let DataStatusLoose = "LOOSE"
25+
26+let WAVELET = ((100 * 1000) * 1000)
27+
28+let COMMISSION = ((5 * WAVELET) / 1000)
2129
2230 let ErrorOnlyWavesAccepted = "Only waves accepted"
2331
2432 let ErrorMustGreaterThan0 = "Parameter size must be greater than 0"
2533
2634 let ErrorMustLessThan100 = "Parameter size must be less than 100"
2735
2836 let ErrorBetMustBeInWaves = "Bet amount must be in Waves"
2937
3038 let ErrorTransactionMustBeInWaves = "Transaction's fee must be in Waves"
3139
3240 let ErrorTransactionUsed = "Passed txId had been used before. Game aborted."
3341
3442 let ErrorKeyNotFound = "Key not found: "
3543
3644 let ErrorGameOver = "Game already is over"
3745
3846 func StoreData (transactionId,key,value) = DataEntry(((transactionId + "_") + key), value)
3947
4048
4149 func StoreDataInt (transactionId,key,value) = DataEntry(((transactionId + "_") + key), value)
4250
4351
4452 func GetDataString (transactionId,key) = {
4553 let fullKey = ((transactionId + "_") + key)
4654 match getString(this, fullKey) {
4755 case str: String =>
4856 str
4957 case _ =>
5058 throw((ErrorKeyNotFound + fullKey))
5159 }
5260 }
5361
5462
5563 func GetDataInt (transactionId,key) = {
5664 let fullKey = ((transactionId + "_") + key)
5765 match getInteger(this, fullKey) {
5866 case str: Int =>
5967 str
6068 case _ =>
6169 throw((ErrorKeyNotFound + fullKey))
6270 }
6371 }
6472
6573
6674 func NewGameId () = {
6775 let gameNum = match getInteger(this, DataGameNumberKey) {
6876 case num: Int =>
6977 num
7078 case _ =>
7179 0
7280 }
7381 (gameNum + 1)
7482 }
7583
7684
7785 func GenerateRandInt (gameId,rsaSign) = {
7886 let rsaSigValid = sigVerify(fromBase58String(gameId), fromBase58String(rsaSign), ServerPublicKey)
7987 if (rsaSigValid)
8088 then {
8189 let rand = (toInt(sha256(toBytes(rsaSign))) % RouletteSections)
8290 if ((0 > rand))
8391 then (-1 * rand)
8492 else rand
8593 }
8694 else throw("Invalid RSA signature")
8795 }
8896
8997
9098 @Callable(i)
9199 func bet (expectedResult) = {
92100 let gameNumber = NewGameId()
93101 let gameTransactionId = toBase58String(i.transactionId)
94102 let address = toBase58String(i.caller.bytes)
95103 let pmt = extract(i.payment)
96104 let txIdUsed = isDefined(getString(this, gameTransactionId))
97105 let betNotInWaves = isDefined(pmt.assetId)
98106 let feeNotInWaves = isDefined(pmt.assetId)
99107 let amount = pmt.amount
100108 if (betNotInWaves)
101109 then throw(ErrorBetMustBeInWaves)
102110 else if (feeNotInWaves)
103111 then throw(ErrorTransactionMustBeInWaves)
104112 else if (txIdUsed)
105113 then throw(ErrorTransactionUsed)
106- else WriteSet([DataEntry(gameTransactionId, address), DataEntry(DataGameNumberKey, gameNumber), StoreDataInt(gameTransactionId, DataAmountKey, amount), StoreDataInt(gameTransactionId, DataSectionKey, expectedResult), StoreData(gameTransactionId, DataStatusKey, DataStatusNew)])
114+ else ScriptResult(WriteSet([DataEntry(gameTransactionId, address), DataEntry(DataGameNumberKey, gameNumber), StoreDataInt(gameTransactionId, DataAmountKey, amount), StoreDataInt(gameTransactionId, DataSectionKey, expectedResult), StoreData(gameTransactionId, DataStatusKey, DataStatusNew)]), TransferSet([ScriptTransfer(ServerAddress, COMMISSION, unit)]))
107115 }
108116
109117
110118
111119 @Callable(i)
112120 func result (gameTransactionId,rsa) = {
113121 let rand = GenerateRandInt(gameTransactionId, rsa)
114122 let selectedSection = GetDataInt(gameTransactionId, DataSectionKey)
115123 let status = GetDataString(gameTransactionId, DataStatusKey)
116124 if ((status == DataStatusNew))
117125 then {
118126 let isWin = (rand == selectedSection)
127+ let writeSet = WriteSet([StoreData(gameTransactionId, DataStatusKey, toString(isWin)), StoreDataInt(gameTransactionId, DataResultKey, rand)])
119128 if (isWin)
120- then WriteSet([StoreData(gameTransactionId, DataStatusKey, DataStatusWin)])
121- else WriteSet([StoreData(gameTransactionId, DataStatusKey, DataStatusLoose)])
129+ then ScriptResult(writeSet, TransferSet([ScriptTransfer(ServerAddress, COMMISSION, unit)]))
130+ else writeSet
122131 }
123132 else throw((ErrorGameOver + status))
124133 }
125134
126135
127136 @Verifier(tx)
128137 func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
129138 then match tx {
130139 case stx: SetScriptTransaction =>
131140 true
132141 case _ =>
133142 false
134143 }
135144 else false
136145

github/deemru/w8io/873ac7e 
38.58 ms