tx · E9K8M7KeZ2xZ9DLpZBrZHq5cygVAmtNXsJgVPkfNx88A

3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX:  -0.05000000 Waves

2019.10.29 15:37 [741438] smart account 3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX > SELF 0.00000000 Waves

{ "type": 13, "id": "E9K8M7KeZ2xZ9DLpZBrZHq5cygVAmtNXsJgVPkfNx88A", "fee": 5000000, "feeAssetId": null, "timestamp": 1572352661583, "version": 1, "sender": "3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX", "senderPublicKey": "ACfUG5PwG2GssMuyEwVEhkYAbbbP1geSHR8XoNxLyu6V", "proofs": [ "3yPDDoWdpq7ePYfh3DRXqeA3aSQoxVjJb3FxMaAQbYQsAiR3SCrpNhLX1ykqrmFbPAQjwCThdsY7eUzdoE1NapdA" ], "script": "base64:AAIDAAAAAAAAAAwIARIDCgEIEgMKAQgAAAAiAAAAAAlSU0FQVUJMSUMJAAJbAAAAAQIAAAGPYmFzZTY0Ok1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBZzRkQVI2WGJCREFTOWhyL0VqM2RKdjZGZmM0NjZ4L21PR01XVTNsckFCczNxYThCSG11Skdua2ZicEVmMnZBd1lUT1dQdnZ6Zk0xME9CYmZsb1N5cTNjOU1LdnlUZTFsdUJMR3FXNHZaVVhJeXZTZ3oxbGl5VVZlZklReTNkeUY5amJlVFpiQzBiYmNULzdPM0RFTCswMXo2QStyRENhY1NaMGxHb2xTUTZBbmhMeHpJa1ZwT1FKYnJCbUMreCtadVpQQ01Xekp5bmQ1YWVPbjdqYWovbWtSVnl4ZTZnLzBPaFd6NE5paVpYZXVNUkIrOG1LeTBmV0QvVWxJbFpXSHNBUzJabXJrWEtxakxxMC8wd3I4SUxKa3pualNxZG5JNUliamczdVFyai80QU4raTlyMjhhUTczL1prUHRZNVNidzBBT2lBQkJ1N2dIbXE5YXlWeFpRSURBUUFCAAAAAA9HQU1FU0NPVU5URVJLRVkCAAAACSRHQU1FX05VTQAAAAAEV0JFVAEAAAAgD5uLrFpvaCc5H1Jt+IyA7GJAqs11k4f4jn5gjTii4MkAAAAAC0ZFRVdBVkVTQkVUAAAAAAAAAAAEAAAAAAlGRUVNQ0FGRUUAAAAAAAAAAAIAAAAAB1dBVkVMRVQAAAAAAAX14QAAAAAADlNUQVRFU1VCTUlUVEVEAgAAAAlTVUJNSVRURUQAAAAADVNUQVRFQUNDRVBURUQCAAAACEFDQ0VQVEVEAAAAAA1TVEFURUZJTklTSEVEAgAAAAhGSU5JU0hFRAAAAAANU1RBVEVDQU5DRUxFRAIAAAAIQ0FOQ0VMRUQAAAAAB0NPSU5SRUQCAAAAA1JFRAAAAAAIQ09JTkJMVUUCAAAABEJMVUUAAAAAC0JFVE1JTldBVkVTCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAAAQUAAAAHV0FWRUxFVAAAAAAAAAAAAgAAAAAKQkVUTUlOV0JFVAkAAGgAAAACAAAAAAAAAABkBQAAAAdXQVZFTEVUAAAAAAxJZHhHYW1lU3RhdGUAAAAAAAAA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aGlzBQAAAAZnYW1lSWQEAAAAB3BheW1lbnQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAKZmVlQXNzZXRJZAkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFpAAAACmZlZUFzc2V0SWQDAwkBAAAAAiE9AAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAkAA+wAAAABAQAAAAQTq9kzCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAARXQkVUBwkAAAIAAAABAgAAADFQYXltZW50IHNob3VsZCBiZSBpbiBXYmV0IG9yIFdhdmVzLiBHYW1lIGFib3J0ZWQuAwUAAAAKZmVlQXNzZXRJZAkAAAIAAAABAgAAADFUcmFuc2FjdGlvbidzIGZlZSBtdXN0IGJlIGluIFdhdmVzLiBHYW1lIGFib3J0ZWQuAwUAAAAKZ2FtZUlkVXNlZAkAAAIAAAABAgAAADFQYXNzZWQgZ2FtZUlkIGhhZCBiZWVuIHVzZWQgYmVmb3JlLiBHYW1lIGFib3J0ZWQuBAAAAApuZXdHYW1lTnVtCQEAAAAQSW5jcmVtZW50R2FtZU51bQAAAAAEAAAAD3BsYXllckFQdWJLZXk1OAkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAB3BheVR5cGUJAQAAAAtwYXltZW50VHlwZQAAAAEFAAAAB3BheW1lbnQEAAAABndpbkFtdAkBAAAAGlZhbGlkYXRlQmV0QW5kRGVmaW5lV2luQW10AAAAAwgFAAAAB3BheW1lbnQAAAAGYW1vdW50BQAAAAZwYUNvaW4FAAAAB3BheVR5cGUEAAAAC2dhbWVEYXRhU3RyCQEAAAARRm9ybWF0R2FtZURhdGFTdHIAAAAJBQAAAA5TVEFURVNVQk1JVFRFRAUAAAAGcGFDb2luBQAAAA9wbGF5ZXJBUHViS2V5NTgFAAAAB3BheVR5cGUIBQAAAAdwYXltZW50AAAABmFtb3VudAUAAAAGd2luQW10AgAAAAACAAAAAAIAAAAACQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAPR0FNRVNDT1VOVEVSS0VZBQAAAApuZXdHYW1lTnVtCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAZnYW1lSWQFAAAAC2dhbWVEYXRhU3RyBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEFAAAAA25pbAAAAAFpAQAAABNjYW5jZWxDb2luQ2hhbGxlbmdlAAAAAQAAAAZnYW1lSWQEAAAADGdhbWVEYXRhTGlzdAkBAAAAE0V4dHJhY3RHYW1lRGF0YUxpc3QAAAABBQAAAAZnYW1lSWQJAAACAAAAAQIAAAAGYXNkYXNkAAAAAHY19PI=", "chainId": 84, "height": 741438, "spentComplexity": 0 } View: original | compacted Prev: HSXCuSBoqLK2amHT72gN7Lt2UARLmaLP1hiD74hHfEXW Next: CBf5MMqUGzr2W74fyEG1D7ERGR6V8RST6qRAejNtfMCb Diff:
OldNewDifferences
137137
138138
139139 func ExtractGameDataList (gameId) = {
140- let rawDataStr = match getString(this, gameId) {
141- case str: String =>
142- str
143- case _ =>
144- throw(("Couldn't find game by " + gameId))
145- }
146- ParseGameRawDataStr(rawDataStr)
140+ let rawDataStr = getStringValue(this, gameId)
141+ throw(rawDataStr)
147142 }
148143
149144
189184
190185
191186 @Callable(i)
192-func acceptCoinChallenge (gameId,rsaSig) = {
193- let gameDataList = ExtractGameDataList(gameId)
194- let gameState = gameDataList[IdxGameState]
195- let paCoin = gameDataList[IdxPlayerACoin]
196- let paPubKey58 = gameDataList[IdxPlayerAPubKey58]
197- let payType = gameDataList[IdxPayType]
198- let payAmt = parseIntValue(gameDataList[IdxPayAmt])
199- let winAmt = parseIntValue(gameDataList[IdxWinAmt])
200- let payment = extract(i.payment)
201- let feeAssetId = isDefined(i.feeAssetId)
202- let pbPubKey58 = toBase58String(i.callerPublicKey)
203- let payTypeB = paymentType(payment)
204- if (if ((payment.assetId != assetInfo(base58'WAVES')))
205- then (payment.assetId != WBET)
206- else false)
207- then throw("Payment should be in Wbet or Waves. Game aborted.")
208- else if (feeAssetId)
209- then throw("Transaction's fee must be in Waves. Game aborted.")
210- else if ((paPubKey58 == pbPubKey58))
211- then throw("You can't accept a challenge created by yourself. Game aborted.")
212- else if ((payType != payTypeB))
213- then throw("Payment must be made in the same currency token as the bet, WBET/WBET or WAVES/WAVES. Game aborted.")
214- else if ((payAmt != payment.amount))
215- then throw("Payout must be equal to the challenger bet amount. Game aborted.")
216- else if ((gameState != STATESUBMITTED))
217- then throw("Invalid game state for passed gameId. Game aborted.")
218- else {
219- let rand = generateNumber(i, 100, 0)
220- let luckyCoin = if ((rand > 50))
221- then COINRED
222- else COINBLUE
223- let pbCoin = if ((paCoin == COINRED))
224- then COINBLUE
225- else COINRED
226- let newGameDataStr = FormatGameDataStr(STATEACCEPTED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
227- ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet(nil))
228- }
229- }
230-
231-
232-
233-@Callable(i)
234187 func cancelCoinChallenge (gameId) = {
235188 let gameDataList = ExtractGameDataList(gameId)
236189 throw("asdasd")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg4dAR6XbBDAS9hr/Ej3dJv6Ffc466x/mOGMWU3lrABs3qa8BHmuJGnkfbpEf2vAwYTOWPvvzfM10OBbfloSyq3c9MKvyTe1luBLGqW4vZUXIyvSgz1liyUVefIQy3dyF9jbeTZbC0bbcT/7O3DEL+01z6A+rDCacSZ0lGolSQ6AnhLxzIkVpOQJbrBmC+x+ZuZPCMWzJynd5aeOn7jaj/mkRVyxe6g/0OhWz4NiiZXeuMRB+8mKy0fWD/UlIlZWHsAS2ZmrkXKqjLq0/0wr8ILJkznjSqdnI5Ibjg3uQrj/4AN+i9r28aQ73/ZkPtY5Sbw0AOiABBu7gHmq9ayVxZQIDAQAB")
55
66 let GAMESCOUNTERKEY = "$GAME_NUM"
77
88 let WBET = base58'23vgV9p9pD83A7CFbsDEc4zjanep7UeFo4ZRS6oGorhv'
99
1010 let FEEWAVESBET = 4
1111
1212 let FEEMCAFEE = 2
1313
1414 let WAVELET = 100000000
1515
1616 let STATESUBMITTED = "SUBMITTED"
1717
1818 let STATEACCEPTED = "ACCEPTED"
1919
2020 let STATEFINISHED = "FINISHED"
2121
2222 let STATECANCELED = "CANCELED"
2323
2424 let COINRED = "RED"
2525
2626 let COINBLUE = "BLUE"
2727
2828 let BETMINWAVES = ((1 * WAVELET) / 2)
2929
3030 let BETMINWBET = (100 * WAVELET)
3131
3232 let IdxGameState = 0
3333
3434 let IdxPlayerACoin = 1
3535
3636 let IdxPlayerAPubKey58 = 2
3737
3838 let IdxPayType = 3
3939
4040 let IdxPayAmt = 4
4141
4242 let IdxWinAmt = 5
4343
4444 let IdxPlayerBCoin = 6
4545
4646 let IdxPlayerBPubKey58 = 7
4747
4848 let IdxLuckyCoin = 8
4949
5050 func IncrementGameNum () = {
5151 let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
5252 case num: Int =>
5353 num
5454 case _ =>
5555 0
5656 }
5757 (gameNum + 1)
5858 }
5959
6060
6161 func generateNumber (inv,max,min) = {
6262 let lastPlay = match getBinary(this, "lastPlay") {
6363 case s: ByteVector =>
6464 s
6565 case a: Unit =>
6666 base58'2ee4oFDYriWJ9EMeR'
6767 case _ =>
6868 throw()
6969 }
7070 let rand = (((((lastPlay + inv.transactionId) + inv.callerPublicKey) + lastBlock.generationSignature) + toBytes(lastBlock.timestamp)) + toBytes(lastBlock.height))
7171 (((toInt(sha256(rand)) % 1000) % ((max - min) + 1)) + 1)
7272 }
7373
7474
7575 func paymentType (payment) = if ((payment.assetId == WBET))
7676 then "WBET"
7777 else "WAVES"
7878
7979
8080 func tokenType (token) = if ((token == "WBET"))
8181 then WBET
8282 else unit
8383
8484
8585 func FormatGameDataParam (p) = {
8686 let s = size(p)
8787 if ((s == 0))
8888 then throw("Parameter size must be greater then 0")
8989 else if ((s > 99))
9090 then throw("Parameter size must be less then 100")
9191 else if ((10 > s))
9292 then (("0" + toString(s)) + p)
9393 else (toString(s) + p)
9494 }
9595
9696
9797 func FormatGameDataStr (gameState,playerACoin,playerAPubKey58,payType,payAmount,winAmt,playerBCoin,playerBPubKey58,luckyCoin) = {
9898 let fullStateStr = ((((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerACoin)) + "_") + FormatGameDataParam(playerAPubKey58)) + "_") + FormatGameDataParam(payType)) + "_") + FormatGameDataParam(toString(payAmount))) + "_") + FormatGameDataParam(toString(winAmt)))
9999 if (if (if ((playerBCoin == ""))
100100 then true
101101 else (playerBPubKey58 == ""))
102102 then true
103103 else (luckyCoin == ""))
104104 then fullStateStr
105105 else ((((((fullStateStr + "_") + FormatGameDataParam(playerBCoin)) + "_") + FormatGameDataParam(playerBPubKey58)) + "_") + FormatGameDataParam(luckyCoin))
106106 }
107107
108108
109109 func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
110110 then drop(remaining, 1)
111111 else remaining
112112
113113
114114 func ParseNextAttribute (remaining) = {
115115 let s = size(remaining)
116116 if ((s > 0))
117117 then {
118118 let nn = parseIntValue(take(remaining, 2))
119119 let v = take(drop(remaining, 2), nn)
120120 let tmpRemaining = drop(remaining, (nn + 2))
121121 let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
122122 [v, remainingState]
123123 }
124124 else throw("Empty string was passed into parseNextAttribute func")
125125 }
126126
127127
128128 func ParseGameRawDataStr (rawStateStr) = {
129129 let gameState = ParseNextAttribute(rawStateStr)
130130 let paCoin = ParseNextAttribute(gameState[1])
131131 let paPubKey58 = ParseNextAttribute(paCoin[1])
132132 let payType = ParseNextAttribute(paPubKey58[1])
133133 let payAmt = ParseNextAttribute(payType[1])
134134 let winAmt = ParseNextAttribute(payAmt[1])
135135 [gameState[0], paCoin[0], paPubKey58[0], payType[0], payAmt[0], winAmt[0]]
136136 }
137137
138138
139139 func ExtractGameDataList (gameId) = {
140- let rawDataStr = match getString(this, gameId) {
141- case str: String =>
142- str
143- case _ =>
144- throw(("Couldn't find game by " + gameId))
145- }
146- ParseGameRawDataStr(rawDataStr)
140+ let rawDataStr = getStringValue(this, gameId)
141+ throw(rawDataStr)
147142 }
148143
149144
150145 func ValidateBetAndDefineWinAmt (amount,playerCoin,paymentType) = if (if ((playerCoin != COINRED))
151146 then (playerCoin != COINBLUE)
152147 else false)
153148 then throw("Invalid play, change your bet to RED or BLUE coin. Game aborted.")
154149 else if (if ((paymentType == "WBET"))
155150 then (BETMINWBET > amount)
156151 else false)
157152 then throw(("The minimum bet on Wbet is " + toString((BETMINWBET / WAVELET))))
158153 else if (if ((paymentType == "WAVES"))
159154 then (BETMINWAVES > amount)
160155 else false)
161156 then throw(("The minimum bet on Waves is " + toString((BETMINWAVES / WAVELET))))
162157 else (((amount * 2) * (100 - (FEEWAVESBET + FEEMCAFEE))) / 100)
163158
164159
165160 @Callable(i)
166161 func playCoin (paCoin) = {
167162 let gameId = toBase58String(i.transactionId)
168163 let gameIdUsed = isDefined(getString(this, gameId))
169164 let payment = extract(i.payment)
170165 let feeAssetId = isDefined(i.feeAssetId)
171166 if (if ((payment.assetId != assetInfo(base58'WAVES')))
172167 then (payment.assetId != WBET)
173168 else false)
174169 then throw("Payment should be in Wbet or Waves. Game aborted.")
175170 else if (feeAssetId)
176171 then throw("Transaction's fee must be in Waves. Game aborted.")
177172 else if (gameIdUsed)
178173 then throw("Passed gameId had been used before. Game aborted.")
179174 else {
180175 let newGameNum = IncrementGameNum()
181176 let playerAPubKey58 = toBase58String(i.callerPublicKey)
182177 let payType = paymentType(payment)
183178 let winAmt = ValidateBetAndDefineWinAmt(payment.amount, paCoin, payType)
184179 let gameDataStr = FormatGameDataStr(STATESUBMITTED, paCoin, playerAPubKey58, payType, payment.amount, winAmt, "", "", "")
185180 ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
186181 }
187182 }
188183
189184
190185
191186 @Callable(i)
192-func acceptCoinChallenge (gameId,rsaSig) = {
193- let gameDataList = ExtractGameDataList(gameId)
194- let gameState = gameDataList[IdxGameState]
195- let paCoin = gameDataList[IdxPlayerACoin]
196- let paPubKey58 = gameDataList[IdxPlayerAPubKey58]
197- let payType = gameDataList[IdxPayType]
198- let payAmt = parseIntValue(gameDataList[IdxPayAmt])
199- let winAmt = parseIntValue(gameDataList[IdxWinAmt])
200- let payment = extract(i.payment)
201- let feeAssetId = isDefined(i.feeAssetId)
202- let pbPubKey58 = toBase58String(i.callerPublicKey)
203- let payTypeB = paymentType(payment)
204- if (if ((payment.assetId != assetInfo(base58'WAVES')))
205- then (payment.assetId != WBET)
206- else false)
207- then throw("Payment should be in Wbet or Waves. Game aborted.")
208- else if (feeAssetId)
209- then throw("Transaction's fee must be in Waves. Game aborted.")
210- else if ((paPubKey58 == pbPubKey58))
211- then throw("You can't accept a challenge created by yourself. Game aborted.")
212- else if ((payType != payTypeB))
213- then throw("Payment must be made in the same currency token as the bet, WBET/WBET or WAVES/WAVES. Game aborted.")
214- else if ((payAmt != payment.amount))
215- then throw("Payout must be equal to the challenger bet amount. Game aborted.")
216- else if ((gameState != STATESUBMITTED))
217- then throw("Invalid game state for passed gameId. Game aborted.")
218- else {
219- let rand = generateNumber(i, 100, 0)
220- let luckyCoin = if ((rand > 50))
221- then COINRED
222- else COINBLUE
223- let pbCoin = if ((paCoin == COINRED))
224- then COINBLUE
225- else COINRED
226- let newGameDataStr = FormatGameDataStr(STATEACCEPTED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
227- ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet(nil))
228- }
229- }
230-
231-
232-
233-@Callable(i)
234187 func cancelCoinChallenge (gameId) = {
235188 let gameDataList = ExtractGameDataList(gameId)
236189 throw("asdasd")
237190 }
238191
239192

github/deemru/w8io/873ac7e 
27.10 ms