tx · YjUvJ7T6i71pM9ZnS1cskNSyt55uLPdiDgmQaQQxHCV

3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX:  -0.05000000 Waves

2019.10.29 08:40 [741024] smart account 3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX > SELF 0.00000000 Waves

{ "type": 13, "id": "YjUvJ7T6i71pM9ZnS1cskNSyt55uLPdiDgmQaQQxHCV", "fee": 5000000, "feeAssetId": null, "timestamp": 1572327655515, "version": 1, "sender": "3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX", "senderPublicKey": "ACfUG5PwG2GssMuyEwVEhkYAbbbP1geSHR8XoNxLyu6V", "proofs": [ "4dWSeeH7PycrT13M8msoDkkpwXgKTD8XhEP6DS2BC9y19H3wT6cgD342cgajkZuusN8Um1ps9y3kdopEorrFK7YX" ], "script": "base64:AAIDAAAAAAAAAA0IARIDCgEIEgQKAggCAAAAIgAAAAAJUlNBUFVCTElDCQACWwAAAAECAAABj2Jhc2U2NDpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWc0ZEFSNlhiQkRBUzloci9FajNkSnY2RmZjNDY2eC9tT0dNV1UzbHJBQnMzcWE4QkhtdUpHbmtmYnBFZjJ2QXdZVE9XUHZ2emZNMTBPQmJmbG9TeXEzYzlNS3Z5VGUxbHVCTEdxVzR2WlVYSXl2U2d6MWxpeVVWZWZJUXkzZHlGOWpiZVRaYkMwYmJjVC83TzNERUwrMDF6NkErckRDYWNTWjBsR29sU1E2QW5oTHh6SWtWcE9RSmJyQm1DK3grWnVaUENNV3pKeW5kNWFlT243amFqL21rUlZ5eGU2Zy8wT2hXejROaWlaWGV1TVJCKzhtS3kwZldEL1VsSWxaV0hzQVMyWm1ya1hLcWpMcTAvMHdyOElMSmt6bmpTcWRuSTVJYmpnM3VRcmovNEFOK2k5cjI4YVE3My9aa1B0WTVTYncwQU9pQUJCdTdnSG1xOWF5VnhaUUlEQVFBQgAAAAAPR0FNRVNDT1VOVEVSS0VZAgAAAAkkR0FNRV9OVU0AAAAABFdCRVQBAAAAIA+bi6xab2gnOR9SbfiMgOxiQKrNdZOH+I5+YI04ouDJAAAAAAtGRUVXQVZFU0JFVAAAAAAAAAAABAAAAAAJRkVFTUNBRkVFAAAAAAAAAAACAAAAAAdXQVZFTEVUAAAAAAAF9eEAAAAAAA5TVEFURVNVQk1JVFRFRAIAAAAJU1VCTUlUVEVEAAAAAA1TVEFURUFDQ0VQVEVEAgAAAAhBQ0NFUFRFRAAAAAANU1RBVEVGSU5JU0hFRAIAAAAIRklOSVNIRUQAAAAADVNUQVRFQ0FOQ0VMRUQCAAAACENBTkNFTEVEAAAAAAdDT0lOUkVEAgAAAANSRUQAAAAACENPSU5CTFVFAgAAAARCTFVFAAAAAAtCRVRNSU5XQVZFUwkAAGkAAAACCQAAaAAAAAIAAAAAAAAAAAEFAAAAB1dBVkVMRVQAAAAAAAAAAAIAAAAACkJFVE1JTldCRVQJAABoAAAAAgAAAAAAAAAAZAUAAAAHV0FWRUxFVAAAAAAMSWR4R2FtZVN0YXRlAAAAAAAA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AGQAAAACAAAAAWkBAAAACHBsYXlDb2luAAAAAQAAAAZwYUNvaW4EAAAABmdhbWVJZAkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBAAAAApnYW1lSWRVc2VkCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAR0aGlzBQAAAAZnYW1lSWQEAAAAB3BheW1lbnQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAKZmVlQXNzZXRJZAkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFpAAAACmZlZUFzc2V0SWQDAwkBAAAAAiE9AAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAkAA+wAAAABAQAAAAQTq9kzCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAARXQkVUBwkAAAIAAAABAgAAADFQYXltZW50IHNob3VsZCBiZSBpbiBXYmV0IG9yIFdhdmVzLiBHYW1lIGFib3J0ZWQuAwUAAAAKZmVlQXNzZXRJZAkAAAIAAAABAgAAADFUcmFuc2FjdGlvbidzIGZlZSBtdXN0IGJlIGluIFdhdmVzLiBHYW1lIGFib3J0ZWQuAwUAAAAKZ2FtZUlkVXNlZAkAAAIAAAABAgAAADFQYXNzZWQgZ2FtZUlkIGhhZCBiZWVuIHVzZWQgYmVmb3JlLiBHYW1lIGFib3J0ZWQuBAAAAApuZXdHYW1lTnVtCQEAAAAQSW5jcmVtZW50R2FtZU51bQAAAAAEAAAAD3BsYXllckFQdWJLZXk1OAkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAB3BheVR5cGUJAQAAAAtwYXltZW50VHlwZQAAAAEFAAAAB3BheW1lbnQEAAAABndpbkFtdAkBAAAAGlZhbGlkYXRlQmV0QW5kRGVmaW5lV2luQW10AAAAAwgFAAAAB3BheW1lbnQAAAAGYW1vdW50BQAAAAZwYUNvaW4FAAAAB3BheVR5cGUEAAAAC2dhbWVEYXRhU3RyCQEAAAARRm9ybWF0R2FtZURhdGFTdHIAAAAJBQAAAA5TVEFURVNVQk1JVFRFRAUAAAAGcGFDb2luBQAAAA9wbGF5ZXJBUHViS2V5NTgFAAAAB3BheVR5cGUIBQAAAAdwYXltZW50AAAABmFtb3VudAUAAAAGd2luQW10AgAAAAACAAAAAAIAAAAACQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAPR0FNRVNDT1VOVEVSS0VZBQAAAApuZXdHYW1lTnVtCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAZnYW1lSWQFAAAAC2dhbWVEYXRhU3RyBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEFAAAAA25pbAAAAAFpAQAAAA9hY2NlcHRDaGFsbGVuZ2UAAAACAAAABmdhbWVJZAAAAAZyc2FTaWcEAAAADGdhbWVEYXRhTGlzdAkBAAAAE0V4dHJhY3RHYW1lRGF0YUxpc3QAAAABBQAAAAZnYW1lSWQEAAAACWdhbWVTdGF0ZQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAADElkeEdhbWVTdGF0ZQQAAAAGcGFDb2luCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAOSWR4UGxheWVyQUNvaW4EAAAACnBhUHViS2V5NTgJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAABJJZHhQbGF5ZXJBUHViS2V5NTgEAAAAB3BheVR5cGUJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAApJZHhQYXlUeXBlBAAAAAZwYXlBbXQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAACUlkeFBheUFtdAQAAAAGd2luQW10CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAAlJZHhXaW5BbXQEAAAAB3BheW1lbnQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAKZmVlQXNzZXRJZAkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFpAAAACmZlZUFzc2V0SWQEAAAACnBiUHViS2V5NTgJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAhwYXlUeXBlQgkBAAAAC3BheW1lbnRUeXBlAAAAAQUAAAAHcGF5bWVudAMDCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAD7AAAAAEBAAAABBOr2TMJAQAAAAIhPQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAABFdCRVQHCQAAAgAAAAECAAAAMVBheW1lbnQgc2hvdWxkIGJlIGluIFdiZXQgb3IgV2F2ZXMuIEdhbWUgYWJvcnRlZC4DBQAAAApmZWVBc3NldElkCQAAAgAAAAECAAAAMVRyYW5zYWN0aW9uJ3MgZmVlIG11c3QgYmUgaW4gV2F2ZXMuIEdhbWUgYWJvcnRlZC4DCQAAAAAAAAIFAAAACnBhUHViS2V5NTgFAAAACnBiUHViS2V5NTgJAAACAAAAAQIAAAA/WW91IGNhbid0IGFjY2VwdCBhIGNoYWxsZW5nZSBjcmVhdGVkIGJ5IHlvdXJzZWxmLiBHYW1lIGFib3J0ZWQuAwkBAAAAAiE9AAAAAgUAAAAHcGF5VHlwZQUAAAAIcGF5VHlwZUIJAAACAAAAAQIAAABjUGF5bWVudCBtdXN0IGJlIG1hZGUgaW4gdGhlIHNhbWUgY3VycmVuY3kgdG9rZW4gYXMgdGhlIGJldCwgV0JFVC9XQkVUIG9yIFdBVkVTL1dBVkVTLiBHYW1lIGFib3J0ZWQuAwkBAAAAAiE9AAAAAgUAAAAGcGF5QW10CAUAAAAHcGF5bWVudAAAAAZhbW91bnQJAAACAAAAAQIAAABAUGF5b3V0IG11c3QgYmUgZXF1YWwgdG8gdGhlIGNoYWxsZW5nZXIgYmV0IGFtb3VudC4gR2FtZSBhYm9ydGVkLgMJAQAAAAIhPQAAAAIFAAAACWdhbWVTdGF0ZQUAAAAOU1RBVEVTVUJNSVRURUQJAAACAAAAAQIAAAAzSW52YWxpZCBnYW1lIHN0YXRlIGZvciBwYXNzZWQgZ2FtZUlkLiBHYW1lIGFib3J0ZWQuBAAAAARyYW5kCQEAAAAOZ2VuZXJhdGVOdW1iZXIAAAADBQAAAAFpAAAAAAAAAABkAAAAAAAAAAAABAAAAAlsdWNreUNvaW4DCQAAZgAAAAIFAAAABHJhbmQAAAAAAAAAADIFAAAAB0NPSU5SRUQFAAAACENPSU5CTFVFBAAAAAZwYkNvaW4DCQAAAAAAAAIFAAAABnBhQ29pbgUAAAAHQ09JTlJFRAUAAAAIQ09JTkJMVUUFAAAAB0NPSU5SRUQEAAAADm5ld0dhbWVEYXRhU3RyCQEAAAARRm9ybWF0R2FtZURhdGFTdHIAAAAJBQAAAA1TVEFURUFDQ0VQVEVEBQAAAAZwYUNvaW4FAAAACnBhUHViS2V5NTgFAAAAB3BheVR5cGUFAAAABnBheUFtdAUAAAAGd2luQW10BQAAAAZwYkNvaW4FAAAACnBiUHViS2V5NTgFAAAACWx1Y2t5Q29pbgkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAABmdhbWVJZAUAAAAObmV3R2FtZURhdGFTdHIFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQUAAAADbmlsAAAAAMvtVNA=", "chainId": 84, "height": 741024, "spentComplexity": 0 } View: original | compacted Prev: FrUPKwuFKN7giTMsRpQaio9Fb9FxKbon8MPThsPpN561 Next: CVLKcmD8iQbsasBJhd4Bf48m9Foexvm8FFGXD1PoUQQt Diff:
OldNewDifferences
4444 let IdxPlayerBCoin = 6
4545
4646 let IdxPlayerBPubKey58 = 7
47+
48+let IdxLuckyCoin = 8
4749
4850 func IncrementGameNum () = {
4951 let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
9294 }
9395
9496
95-func FormatGameDataStr (gameState,playerACoin,playerAPubKey58,payType,payAmount,winAmt,playerBCoin,playerBPubKey58) = {
97+func FormatGameDataStr (gameState,playerACoin,playerAPubKey58,payType,payAmount,winAmt,playerBCoin,playerBPubKey58,luckyCoin) = {
9698 let fullStateStr = ((((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerACoin)) + "_") + FormatGameDataParam(playerAPubKey58)) + "_") + FormatGameDataParam(payType)) + "_") + FormatGameDataParam(toString(payAmount))) + "_") + FormatGameDataParam(toString(winAmt)))
97- if (if ((playerBCoin == ""))
99+ if (if (if ((playerBCoin == ""))
98100 then true
99101 else (playerBPubKey58 == ""))
102+ then true
103+ else (luckyCoin == ""))
100104 then fullStateStr
101- else ((((fullStateStr + "_") + FormatGameDataParam(playerBCoin)) + "_") + FormatGameDataParam(playerBPubKey58))
105+ else ((((((fullStateStr + "_") + FormatGameDataParam(playerBCoin)) + "_") + FormatGameDataParam(playerBPubKey58)) + "_") + FormatGameDataParam(luckyCoin))
106+ }
107+
108+
109+func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
110+ then drop(remaining, 1)
111+ else remaining
112+
113+
114+func ParseNextAttribute (remaining) = {
115+ let s = size(remaining)
116+ if ((s > 0))
117+ then {
118+ let nn = parseIntValue(take(remaining, 2))
119+ let v = take(drop(remaining, 2), nn)
120+ let tmpRemaining = drop(remaining, (nn + 2))
121+ let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
122+[v, remainingState]
123+ }
124+ else throw("Empty string was passed into parseNextAttribute func")
125+ }
126+
127+
128+func ParseGameRawDataStr (rawStateStr) = {
129+ let gameState = ParseNextAttribute(rawStateStr)
130+ let paCoin = ParseNextAttribute(gameState[1])
131+ let paPubKey58 = ParseNextAttribute(paCoin[1])
132+ let payType = ParseNextAttribute(paPubKey58[1])
133+ let payAmt = ParseNextAttribute(payType[1])
134+ let winAmt = ParseNextAttribute(payAmt[1])
135+[gameState[0], paCoin[0], paPubKey58[0], payType[0], payAmt[0], winAmt[0]]
136+ }
137+
138+
139+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)
102147 }
103148
104149
136181 let playerAPubKey58 = toBase58String(i.callerPublicKey)
137182 let payType = paymentType(payment)
138183 let winAmt = ValidateBetAndDefineWinAmt(payment.amount, paCoin, payType)
139- let gameDataStr = FormatGameDataStr(STATESUBMITTED, paCoin, playerAPubKey58, payType, payment.amount, winAmt, "", "")
184+ let gameDataStr = FormatGameDataStr(STATESUBMITTED, paCoin, playerAPubKey58, payType, payment.amount, winAmt, "", "", "")
140185 ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
141186 }
187+ }
188+
189+
190+
191+@Callable(i)
192+func acceptChallenge (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+ }
142229 }
143230
144231
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
47+
48+let IdxLuckyCoin = 8
4749
4850 func IncrementGameNum () = {
4951 let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
5052 case num: Int =>
5153 num
5254 case _ =>
5355 0
5456 }
5557 (gameNum + 1)
5658 }
5759
5860
5961 func generateNumber (inv,max,min) = {
6062 let lastPlay = match getBinary(this, "lastPlay") {
6163 case s: ByteVector =>
6264 s
6365 case a: Unit =>
6466 base58'2ee4oFDYriWJ9EMeR'
6567 case _ =>
6668 throw()
6769 }
6870 let rand = (((((lastPlay + inv.transactionId) + inv.callerPublicKey) + lastBlock.generationSignature) + toBytes(lastBlock.timestamp)) + toBytes(lastBlock.height))
6971 (((toInt(sha256(rand)) % 1000) % ((max - min) + 1)) + 1)
7072 }
7173
7274
7375 func paymentType (payment) = if ((payment.assetId == WBET))
7476 then "WBET"
7577 else "WAVES"
7678
7779
7880 func tokenType (token) = if ((token == "WBET"))
7981 then WBET
8082 else unit
8183
8284
8385 func FormatGameDataParam (p) = {
8486 let s = size(p)
8587 if ((s == 0))
8688 then throw("Parameter size must be greater then 0")
8789 else if ((s > 99))
8890 then throw("Parameter size must be less then 100")
8991 else if ((10 > s))
9092 then (("0" + toString(s)) + p)
9193 else (toString(s) + p)
9294 }
9395
9496
95-func FormatGameDataStr (gameState,playerACoin,playerAPubKey58,payType,payAmount,winAmt,playerBCoin,playerBPubKey58) = {
97+func FormatGameDataStr (gameState,playerACoin,playerAPubKey58,payType,payAmount,winAmt,playerBCoin,playerBPubKey58,luckyCoin) = {
9698 let fullStateStr = ((((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerACoin)) + "_") + FormatGameDataParam(playerAPubKey58)) + "_") + FormatGameDataParam(payType)) + "_") + FormatGameDataParam(toString(payAmount))) + "_") + FormatGameDataParam(toString(winAmt)))
97- if (if ((playerBCoin == ""))
99+ if (if (if ((playerBCoin == ""))
98100 then true
99101 else (playerBPubKey58 == ""))
102+ then true
103+ else (luckyCoin == ""))
100104 then fullStateStr
101- else ((((fullStateStr + "_") + FormatGameDataParam(playerBCoin)) + "_") + FormatGameDataParam(playerBPubKey58))
105+ else ((((((fullStateStr + "_") + FormatGameDataParam(playerBCoin)) + "_") + FormatGameDataParam(playerBPubKey58)) + "_") + FormatGameDataParam(luckyCoin))
106+ }
107+
108+
109+func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
110+ then drop(remaining, 1)
111+ else remaining
112+
113+
114+func ParseNextAttribute (remaining) = {
115+ let s = size(remaining)
116+ if ((s > 0))
117+ then {
118+ let nn = parseIntValue(take(remaining, 2))
119+ let v = take(drop(remaining, 2), nn)
120+ let tmpRemaining = drop(remaining, (nn + 2))
121+ let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
122+[v, remainingState]
123+ }
124+ else throw("Empty string was passed into parseNextAttribute func")
125+ }
126+
127+
128+func ParseGameRawDataStr (rawStateStr) = {
129+ let gameState = ParseNextAttribute(rawStateStr)
130+ let paCoin = ParseNextAttribute(gameState[1])
131+ let paPubKey58 = ParseNextAttribute(paCoin[1])
132+ let payType = ParseNextAttribute(paPubKey58[1])
133+ let payAmt = ParseNextAttribute(payType[1])
134+ let winAmt = ParseNextAttribute(payAmt[1])
135+[gameState[0], paCoin[0], paPubKey58[0], payType[0], payAmt[0], winAmt[0]]
136+ }
137+
138+
139+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)
102147 }
103148
104149
105150 func ValidateBetAndDefineWinAmt (amount,playerCoin,paymentType) = if (if ((playerCoin != COINRED))
106151 then (playerCoin != COINBLUE)
107152 else false)
108153 then throw("Invalid play, change your bet to RED or BLUE coin. Game aborted.")
109154 else if (if ((paymentType == "WBET"))
110155 then (BETMINWBET > amount)
111156 else false)
112157 then throw(("The minimum bet on Wbet is " + toString((BETMINWBET / WAVELET))))
113158 else if (if ((paymentType == "WAVES"))
114159 then (BETMINWAVES > amount)
115160 else false)
116161 then throw(("The minimum bet on Waves is " + toString((BETMINWAVES / WAVELET))))
117162 else (((amount * 2) * (100 - (FEEWAVESBET + FEEMCAFEE))) / 100)
118163
119164
120165 @Callable(i)
121166 func playCoin (paCoin) = {
122167 let gameId = toBase58String(i.transactionId)
123168 let gameIdUsed = isDefined(getString(this, gameId))
124169 let payment = extract(i.payment)
125170 let feeAssetId = isDefined(i.feeAssetId)
126171 if (if ((payment.assetId != assetInfo(base58'WAVES')))
127172 then (payment.assetId != WBET)
128173 else false)
129174 then throw("Payment should be in Wbet or Waves. Game aborted.")
130175 else if (feeAssetId)
131176 then throw("Transaction's fee must be in Waves. Game aborted.")
132177 else if (gameIdUsed)
133178 then throw("Passed gameId had been used before. Game aborted.")
134179 else {
135180 let newGameNum = IncrementGameNum()
136181 let playerAPubKey58 = toBase58String(i.callerPublicKey)
137182 let payType = paymentType(payment)
138183 let winAmt = ValidateBetAndDefineWinAmt(payment.amount, paCoin, payType)
139- let gameDataStr = FormatGameDataStr(STATESUBMITTED, paCoin, playerAPubKey58, payType, payment.amount, winAmt, "", "")
184+ let gameDataStr = FormatGameDataStr(STATESUBMITTED, paCoin, playerAPubKey58, payType, payment.amount, winAmt, "", "", "")
140185 ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
141186 }
187+ }
188+
189+
190+
191+@Callable(i)
192+func acceptChallenge (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+ }
142229 }
143230
144231

github/deemru/w8io/873ac7e 
30.30 ms