tx · EGiRnhZ2zb6ppaNAcbGuqtdcXPPQGh8Edt8NcUDywvB6

3N8M61KCm8G72mK8PjacFbnnxdbFsyqQDeT:  -0.01400000 Waves

2019.06.24 15:27 [556166] smart account 3N8M61KCm8G72mK8PjacFbnnxdbFsyqQDeT > SELF 0.00000000 Waves

{ "type": 13, "id": "EGiRnhZ2zb6ppaNAcbGuqtdcXPPQGh8Edt8NcUDywvB6", "fee": 1400000, "feeAssetId": null, "timestamp": 1561379230365, "version": 1, "sender": "3N8M61KCm8G72mK8PjacFbnnxdbFsyqQDeT", "senderPublicKey": "Bhyvkx4xdbEi4KPJNZSzx9gZgzgyLEsavuj2kYSt7SST", "proofs": [ "4oYXNyaKL55TsrCvNQcjQzha2QMpRuWYJA4pJAF9vuW99kxeDUkPvTzDnKDg2PdgcCTPzG13ZPUXFMQ4bm4xHnLK" ], "script": "base64:AAIDAAAAAAAAAAAAAAAPAAAAAA9TZXJ2ZXJQdWJsaWNLZXkBAAAAIAQ1/gW4L6VUuKyMox3deX07Tu0dL8x1obg+vYqfUuwTAAAAABBSb3VsZXR0ZVNlY3Rpb25zAAAAAAAAAAAVAAAAABFEYXRhR2FtZU51bWJlcktleQIAAAALQVBQX0dBTUVfSUQAAAAADURhdGFBbW91bnRLZXkCAAAABkFNT1VOVAAAAAAORGF0YVNlY3Rpb25LZXkCAAAAB1NFQ1RJT04AAAAADURhdGFTdGF0dXNLZXkCAAAABlNUQVRVUwAAAAANRGF0YVN0YXR1c05ldwIAAAADTkVXAAAAABZFcnJvck9ubHlXYXZlc0FjY2VwdGVkAgAAABllcnJvcl9vbmx5X3dhdmVzX2FjY2VwdGVkAAAAABVFcnJvck11c3RHcmVhdGVyVGhhbjACAAAAJVBhcmFtZXRlciBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAAAAAAFEVycm9yTXVzdExlc3NUaGFuMTAwAgAAACRQYXJhbWV0ZXIgc2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiAxMDAAAAAAFUVycm9yQmV0TXVzdEJlSW5XYXZlcwIAAAAbQmV0IGFtb3VudCBtdXN0IGJlIGluIFdhdmVzAAAAAB1FcnJvclRyYW5zYWN0aW9uTXVzdEJlSW5XYXZlcwIAAAAiVHJhbnNhY3Rpb24ncyBmZWUgbXVzdCBiZSBpbiBXYXZlcwAAAAAURXJyb3JUcmFuc2FjdGlvblVzZWQCAAAAL1Bhc3NlZCB0eElkIGhhZCBiZWVuIHVzZWQgYmVmb3JlLiBHYW1lIGFib3J0ZWQuAQAAAAlTdG9yZURhdGEAAAADAAAADXRyYW5zYWN0aW9uSWQAAAADa2V5AAAABXZhbHVlCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIFAAAADXRyYW5zYWN0aW9uSWQCAAAAAV8FAAAAA2tleQUAAAAFdmFsdWUBAAAACU5ld0dhbWVJZAAAAAAEAAAAB2dhbWVOdW0EAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAARRGF0YUdhbWVOdW1iZXJLZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAADbnVtBQAAAAckbWF0Y2gwBQAAAANudW0AAAAAAAAAAAAJAABkAAAAAgUAAAAHZ2FtZU51bQAAAAAAAAAAAQAAAAMAAAABaQEAAAAPR2VuZXJhdGVSYW5kSW50AAAAAgAAAAZnYW1lSWQAAAAHcnNhU2lnbgQAAAALcnNhU2lnVmFsaWQJAAH0AAAAAwkAAlkAAAABBQAAAAZnYW1lSWQJAAJZAAAAAQUAAAAHcnNhU2lnbgUAAAAPU2VydmVyUHVibGljS2V5AwUAAAALcnNhU2lnVmFsaWQEAAAABHJhbmQJAABqAAAAAgkABLEAAAABCQAB9wAAAAEJAAGbAAAAAQUAAAAHcnNhU2lnbgUAAAAQUm91bGV0dGVTZWN0aW9ucwkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAEb3JpZwkABLEAAAABCQAB9wAAAAEJAAGbAAAAAQUAAAAHcnNhU2lnbgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAEcmFuZAUAAAAEcmFuZAUAAAADbmlsCQAAAgAAAAECAAAAFUludmFsaWQgUlNBIHNpZ25hdHVyZQAAAAFpAQAAAANiZXQAAAABAAAADmV4cGVjdGVkUmVzdWx0BAAAAApnYW1lTnVtYmVyCQEAAAAJTmV3R2FtZUlkAAAAAAQAAAARZ2FtZVRyYW5zYWN0aW9uSWQJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAQAAAAHYWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAANwbXQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAIdHhJZFVzZWQJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAAEWdhbWVUcmFuc2FjdGlvbklkBAAAAA1iZXROb3RJbldhdmVzCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAAA1mZWVOb3RJbldhdmVzCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAAAZhbW91bnQIBQAAAANwbXQAAAAGYW1vdW50AwUAAAANYmV0Tm90SW5XYXZlcwkAAAIAAAABBQAAABVFcnJvckJldE11c3RCZUluV2F2ZXMDBQAAAA1mZWVOb3RJbldhdmVzCQAAAgAAAAEFAAAAHUVycm9yVHJhbnNhY3Rpb25NdXN0QmVJbldhdmVzAwUAAAAIdHhJZFVzZWQJAAACAAAAAQUAAAAURXJyb3JUcmFuc2FjdGlvblVzZWQJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEWdhbWVUcmFuc2FjdGlvbklkBQAAAAdhZGRyZXNzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABFEYXRhR2FtZU51bWJlcktleQkAAaQAAAABBQAAAApnYW1lTnVtYmVyCQAETAAAAAIJAQAAAAlTdG9yZURhdGEAAAADBQAAABFnYW1lVHJhbnNhY3Rpb25JZAUAAAANRGF0YUFtb3VudEtleQkAAaQAAAABBQAAAAZhbW91bnQJAARMAAAAAgkBAAAACVN0b3JlRGF0YQAAAAMFAAAAEWdhbWVUcmFuc2FjdGlvbklkBQAAAA5EYXRhU2VjdGlvbktleQkAAaQAAAABBQAAAA5leHBlY3RlZFJlc3VsdAkABEwAAAACCQEAAAAJU3RvcmVEYXRhAAAAAwUAAAARZ2FtZVRyYW5zYWN0aW9uSWQFAAAADURhdGFTdGF0dXNLZXkFAAAADURhdGFTdGF0dXNOZXcFAAAAA25pbAAAAAFpAQAAAAZiZXQxMTEAAAABAAAADmV4cGVjdGVkUmVzdWx0BAAAABBsYXN0QXVjdGlvbklkS2V5AgAAAA9sYXN0X2F1Y3Rpb25faWQEAAAADWxhc3RBdWN0aW9uSWQEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAAQbGFzdEF1Y3Rpb25JZEtleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAABAAAAAJpZAkAAGQAAAACBQAAAA1sYXN0QXVjdGlvbklkAAAAAAAAAAABBAAAAAxuZXdBdWN0aW9uSWQJAAGkAAAAAQUAAAACaWQEAAAAC293bmVyV2FsbGV0CQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAAA3BtdAkBAAAABXZhbHVlAAAAAQgFAAAAAWkAAAAHcGF5bWVudAMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQJAAACAAAAAQUAAAAWRXJyb3JPbmx5V2F2ZXNBY2NlcHRlZAQAAAAHYXNzZXRJZAkAAlgAAAABCQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQEAAAAEmF1Y3Rpb25EdXJhdGlvbktleQkAASwAAAACCQABLAAAAAICAAAACGF1Y3Rpb25fBQAAAAxuZXdBdWN0aW9uSWQCAAAACV9kdXJhdGlvbgQAAAAQYXVjdGlvbk1pbkJpZEtleQkAASwAAAACCQABLAAAAAICAAAACGF1Y3Rpb25fBQAAAAxuZXdBdWN0aW9uSWQCAAAACF9taW5fYmlkBAAAABFhdWN0aW9uTGFzdEJpZEtleQkAASwAAAACCQABLAAAAAICAAAACGF1Y3Rpb25fBQAAAAxuZXdBdWN0aW9uSWQCAAAACV9sYXN0X2JpZAQAAAAWYXVjdGlvbkxhc3RCaWRPd25lcktleQkAASwAAAACCQABLAAAAAICAAAACGF1Y3Rpb25fBQAAAAxuZXdBdWN0aW9uSWQCAAAAD19sYXN0X2JpZF9vd25lcgQAAAAPYXVjdGlvbk93bmVyS2V5CQABLAAAAAIJAAEsAAAAAgIAAAAIYXVjdGlvbl8FAAAADG5ld0F1Y3Rpb25JZAIAAAAGX293bmVyBAAAABBhdWN0aW9uQW1vdW50S2V5CQABLAAAAAIJAAEsAAAAAgIAAAAIYXVjdGlvbl8FAAAADG5ld0F1Y3Rpb25JZAIAAAAHX2Ftb3VudAQAAAARYXVjdGlvbkFzc2V0SWRLZXkJAAEsAAAAAgkAASwAAAACAgAAAAhhdWN0aW9uXwUAAAAMbmV3QXVjdGlvbklkAgAAAAlfYXNzZXRfaWQEAAAAEmF1Y3Rpb25Jc0FjdGl2ZUtleQkAASwAAAACCQABLAAAAAICAAAACGF1Y3Rpb25fBQAAAAxuZXdBdWN0aW9uSWQCAAAACl9pc19hY3RpdmUEAAAADnVzZXJCYWxhbmNlS2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhiYWxhbmNlXwUAAAALb3duZXJXYWxsZXQCAAAAAV8FAAAAB2Fzc2V0SWQEAAAADWN1cnJlbnRBbW91bnQEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAAOdXNlckJhbGFuY2VLZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAQAAAAJbmV3QW1vdW50CQAAZAAAAAIFAAAADWN1cnJlbnRBbW91bnQIBQAAAANwbXQAAAAGYW1vdW50CQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABFhdWN0aW9uTGFzdEJpZEtleQAAAAAAAAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAPYXVjdGlvbk93bmVyS2V5BQAAAAtvd25lcldhbGxldAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAQYXVjdGlvbkFtb3VudEtleQgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEWF1Y3Rpb25Bc3NldElkS2V5BQAAAAdhc3NldElkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA51c2VyQmFsYW5jZUtleQUAAAAJbmV3QW1vdW50CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABJhdWN0aW9uSXNBY3RpdmVLZXkGCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABZhdWN0aW9uTGFzdEJpZE93bmVyS2V5AgAAAAAJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEGxhc3RBdWN0aW9uSWRLZXkFAAAAAmlkBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABRTZXRTY3JpcHRUcmFuc2FjdGlvbgQAAAADc3R4BQAAAAckbWF0Y2gwBgcHaUNugw==", "chainId": 84, "height": 556166, "spentComplexity": 0 } View: original | compacted Prev: 5tHV3wuijJHDsAixUxdf6yqZMs5kA1eFjWPLFtVoUUM3 Next: 7mVp76F4UpMeDWKvdDEYANqpQt8Ve2z29SWPoeifPe8m Diff:
OldNewDifferences
55
66 let RouletteSections = 21
77
8-let DataGameIdKey = "APP_GAME_ID"
8+let DataGameNumberKey = "APP_GAME_ID"
9+
10+let DataAmountKey = "AMOUNT"
11+
12+let DataSectionKey = "SECTION"
13+
14+let DataStatusKey = "STATUS"
15+
16+let DataStatusNew = "NEW"
917
1018 let ErrorOnlyWavesAccepted = "error_only_waves_accepted"
1119
20+let ErrorMustGreaterThan0 = "Parameter size must be greater than 0"
21+
22+let ErrorMustLessThan100 = "Parameter size must be less than 100"
23+
24+let ErrorBetMustBeInWaves = "Bet amount must be in Waves"
25+
26+let ErrorTransactionMustBeInWaves = "Transaction's fee must be in Waves"
27+
28+let ErrorTransactionUsed = "Passed txId had been used before. Game aborted."
29+
30+func StoreData (transactionId,key,value) = DataEntry(((transactionId + "_") + key), value)
31+
32+
1233 func NewGameId () = {
13- let gameNum = match getInteger(this, DataGameIdKey) {
34+ let gameNum = match getInteger(this, DataGameNumberKey) {
1435 case num: Int =>
1536 num
1637 case _ =>
3657 @Callable(i)
3758 func bet (expectedResult) = {
3859 let gameNumber = NewGameId()
39- let gameId = toBase58String(i.transactionId)
60+ let gameTransactionId = toBase58String(i.transactionId)
61+ let address = toBase58String(i.caller.bytes)
4062 let pmt = extract(i.payment)
41- WriteSet([DataEntry("orig", ""), DataEntry("rand", "")])
63+ let txIdUsed = isDefined(getString(this, gameTransactionId))
64+ let betNotInWaves = isDefined(pmt.assetId)
65+ let feeNotInWaves = isDefined(pmt.assetId)
66+ let amount = pmt.amount
67+ if (betNotInWaves)
68+ then throw(ErrorBetMustBeInWaves)
69+ else if (feeNotInWaves)
70+ then throw(ErrorTransactionMustBeInWaves)
71+ else if (txIdUsed)
72+ then throw(ErrorTransactionUsed)
73+ else WriteSet([DataEntry(gameTransactionId, address), DataEntry(DataGameNumberKey, toString(gameNumber)), StoreData(gameTransactionId, DataAmountKey, toString(amount)), StoreData(gameTransactionId, DataSectionKey, toString(expectedResult)), StoreData(gameTransactionId, DataStatusKey, DataStatusNew)])
4274 }
4375
4476
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let ServerPublicKey = base58'HSP9V7edVKjfLJUfRkEF6vfV9Tyz4Us4yqH9rkwqnHY'
55
66 let RouletteSections = 21
77
8-let DataGameIdKey = "APP_GAME_ID"
8+let DataGameNumberKey = "APP_GAME_ID"
9+
10+let DataAmountKey = "AMOUNT"
11+
12+let DataSectionKey = "SECTION"
13+
14+let DataStatusKey = "STATUS"
15+
16+let DataStatusNew = "NEW"
917
1018 let ErrorOnlyWavesAccepted = "error_only_waves_accepted"
1119
20+let ErrorMustGreaterThan0 = "Parameter size must be greater than 0"
21+
22+let ErrorMustLessThan100 = "Parameter size must be less than 100"
23+
24+let ErrorBetMustBeInWaves = "Bet amount must be in Waves"
25+
26+let ErrorTransactionMustBeInWaves = "Transaction's fee must be in Waves"
27+
28+let ErrorTransactionUsed = "Passed txId had been used before. Game aborted."
29+
30+func StoreData (transactionId,key,value) = DataEntry(((transactionId + "_") + key), value)
31+
32+
1233 func NewGameId () = {
13- let gameNum = match getInteger(this, DataGameIdKey) {
34+ let gameNum = match getInteger(this, DataGameNumberKey) {
1435 case num: Int =>
1536 num
1637 case _ =>
1738 0
1839 }
1940 (gameNum + 1)
2041 }
2142
2243
2344 @Callable(i)
2445 func GenerateRandInt (gameId,rsaSign) = {
2546 let rsaSigValid = sigVerify(fromBase58String(gameId), fromBase58String(rsaSign), ServerPublicKey)
2647 if (rsaSigValid)
2748 then {
2849 let rand = (toInt(sha256(toBytes(rsaSign))) % RouletteSections)
2950 WriteSet([DataEntry("orig", toInt(sha256(toBytes(rsaSign)))), DataEntry("rand", rand)])
3051 }
3152 else throw("Invalid RSA signature")
3253 }
3354
3455
3556
3657 @Callable(i)
3758 func bet (expectedResult) = {
3859 let gameNumber = NewGameId()
39- let gameId = toBase58String(i.transactionId)
60+ let gameTransactionId = toBase58String(i.transactionId)
61+ let address = toBase58String(i.caller.bytes)
4062 let pmt = extract(i.payment)
41- WriteSet([DataEntry("orig", ""), DataEntry("rand", "")])
63+ let txIdUsed = isDefined(getString(this, gameTransactionId))
64+ let betNotInWaves = isDefined(pmt.assetId)
65+ let feeNotInWaves = isDefined(pmt.assetId)
66+ let amount = pmt.amount
67+ if (betNotInWaves)
68+ then throw(ErrorBetMustBeInWaves)
69+ else if (feeNotInWaves)
70+ then throw(ErrorTransactionMustBeInWaves)
71+ else if (txIdUsed)
72+ then throw(ErrorTransactionUsed)
73+ else WriteSet([DataEntry(gameTransactionId, address), DataEntry(DataGameNumberKey, toString(gameNumber)), StoreData(gameTransactionId, DataAmountKey, toString(amount)), StoreData(gameTransactionId, DataSectionKey, toString(expectedResult)), StoreData(gameTransactionId, DataStatusKey, DataStatusNew)])
4274 }
4375
4476
4577
4678 @Callable(i)
4779 func bet111 (expectedResult) = {
4880 let lastAuctionIdKey = "last_auction_id"
4981 let lastAuctionId = match getInteger(this, lastAuctionIdKey) {
5082 case a: Int =>
5183 a
5284 case _ =>
5385 0
5486 }
5587 let id = (lastAuctionId + 1)
5688 let newAuctionId = toString(id)
5789 let ownerWallet = toBase58String(i.caller.bytes)
5890 let pmt = value(i.payment)
5991 if (isDefined(pmt.assetId))
6092 then throw(ErrorOnlyWavesAccepted)
6193 else {
6294 let assetId = toBase58String(value(pmt.assetId))
6395 let auctionDurationKey = (("auction_" + newAuctionId) + "_duration")
6496 let auctionMinBidKey = (("auction_" + newAuctionId) + "_min_bid")
6597 let auctionLastBidKey = (("auction_" + newAuctionId) + "_last_bid")
6698 let auctionLastBidOwnerKey = (("auction_" + newAuctionId) + "_last_bid_owner")
6799 let auctionOwnerKey = (("auction_" + newAuctionId) + "_owner")
68100 let auctionAmountKey = (("auction_" + newAuctionId) + "_amount")
69101 let auctionAssetIdKey = (("auction_" + newAuctionId) + "_asset_id")
70102 let auctionIsActiveKey = (("auction_" + newAuctionId) + "_is_active")
71103 let userBalanceKey = ((("balance_" + ownerWallet) + "_") + assetId)
72104 let currentAmount = match getInteger(this, userBalanceKey) {
73105 case a: Int =>
74106 a
75107 case _ =>
76108 0
77109 }
78110 let newAmount = (currentAmount + pmt.amount)
79111 WriteSet([DataEntry(auctionLastBidKey, 0), DataEntry(auctionOwnerKey, ownerWallet), DataEntry(auctionAmountKey, pmt.amount), DataEntry(auctionAssetIdKey, assetId), DataEntry(userBalanceKey, newAmount), DataEntry(auctionIsActiveKey, true), DataEntry(auctionLastBidOwnerKey, ""), DataEntry(lastAuctionIdKey, id)])
80112 }
81113 }
82114
83115
84116 @Verifier(tx)
85117 func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
86118 then match tx {
87119 case stx: SetScriptTransaction =>
88120 true
89121 case _ =>
90122 false
91123 }
92124 else false
93125

github/deemru/w8io/873ac7e 
85.51 ms