tx · 7rDU1YAPsmdNaRdEd2bLeaSq1gnBqi95MQRZsJEvBYVo

3PMXJ1EhpYFvBFQ2mHjrTCqd28Zem1YuSeN:  -0.01400000 Waves

2020.01.26 11:07 [1901572] smart account 3PMXJ1EhpYFvBFQ2mHjrTCqd28Zem1YuSeN > SELF 0.00000000 Waves

{ "type": 13, "id": "7rDU1YAPsmdNaRdEd2bLeaSq1gnBqi95MQRZsJEvBYVo", "fee": 1400000, "feeAssetId": null, "timestamp": 1580025833319, "version": 1, "sender": "3PMXJ1EhpYFvBFQ2mHjrTCqd28Zem1YuSeN", "senderPublicKey": "2o1waDCX67ArC4iV4WWHa41MHbCKS4na7KWDJmcKNAQ3", "proofs": [ "3sHVrkQPu79FVFRiNFGLDavHVsvLCsnaB64x42RfLEYZcTQiLDjfnNp3zix93dr5hfkwhmkAe67Co5GbiEthPAQ3" ], "script": "base64:AAIDAAAAAAAAABcIARIAEgYKBAgCAgISAwoBCBIECgIICAAAADYAAAAAFmRpdmlkZW5kUHJvZ3JhbUFkZHJlc3MJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQIAAAAsNFl6U1F4ano4dGFoUTYyYmdjS0x4b2g5NDI0RVlEaVlkWlV6VXRRVkN6a3MAAAAADWdhbWVQdWJsaWNLZXkJAAJZAAAAAQIAAAAsMm8xd2FEQ1g2N0FyQzRpVjRXV0hhNDFNSGJDS1M0bmE3S1dESm1jS05BUTMAAAAAFnJlZmVycmFsUHJvZ3JhbUFkZHJlc3MJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQIAAAABMQAAAAANcnNhUHVibGljS2V5MQkAAlsAAAABAgAAAIBNRnd3RFFZSktvWklodmNOQVFFQkJRQURTd0F3U0FKQkFPa2l1ei9CVjRFam94R2hUbU5DYnQyVGdrYlNQSC93NjliM0YxckttRDYxSmlQWHZ2RjhMMnBJOXhPWWNXNEZtb0VaVkhsUlF0QWxhSnlrbDMrcnNyRUNBd0VBQVE9PQAAAAANcnNhUHVibGljS2V5MgkAAlsAAAABAgAAAIBNRnd3RFFZSktvWklodmNOQVFFQkJRQURTd0F3U0FKQkFKblh6Yk0vVjJzRFYxVUxiUFNPbEhrbGRPVFdSckhpNWZ4SWtCbXVldnJDbE1QVkg3cnFjY3dpckROY01kSWR3WEhJOUFkaGo5Rldqd0dJd2ZVL0s2TUNBd0VBQVE9PQAAAAANcnNhUHVibGljS2V5MwkAAlsAAAABAgAAAIBNRnd3RFFZSktvWklodmNOQVFFQkJRQURTd0F3U0FKQkFPUkRldnkwcjRrekxxT3lTbG9CNjNIdXYyZTR6ZUhLSGpDc3k1dnRGS21XWmJYSmE4Z1pZdDQrRWtsRklvMUs5b3F1NUJBUFZmSjNGT3pzMlUxQStnMENBd0VBQVE9PQAAAAAFZHJ1bTEJAARMAAAAAgIAAAABMgkABEwAAAACAgAAAAExCQAETAAAAAICAAAAATMJAARMAAAAAgIAAAABNQkABEwAAAACAgAAAAE3CQAETAAAAAICAAAAATMJAARMAAAAAgIAAAABMwkABEwAAAACAgAAAAExCQAETAAAAAICAAAAATQJAARMAAAAAgIAAAABMQkABEwAAAACAgAAAAEzCQAETAAAAAICAAAAATUJAARMAAAAAgIAAAABMgkABEwAAAACAgAAAAE0CQAETAAAAAICAAAAATIJAARMAAAAAgIAAAABNgkABEwAAAACAgAAAAE1CQAETAAAAAICAAAAATIJAARMAAAAAgIAAAABMQkABEwAAAACAgAAAAE0BQAAAANuaWwAAAAABWRydW0yCQAETAAAAAICAAAAATQJAARMAAAAAgIAAAABMgkABEwAAAACAgAAAAEzCQAETAAAAAICAAAAATEJAARMAAAAAgIAAAABNgkABEwAAAACAgAAAAE0CQAETAAAAAICAAAAATIJAARMAAAAAgIAAAABMQkABEwAAAACAgAAAAE0CQAETAAAAAICAAAAATIJAARMAAAAAgIAAAABMQkABEwAAAACAgAAAAE2CQAETAAAAAICAAAAATMJAARMAAAAAgIAAAABMQkABEwAAAACAgAAAAEyCQAETAAAAAICAAAAATUJAARMAAAAAgIAAAABMQkABEwAAAACAgAAAAE1CQAETAAAAAICAAAAATMJAARMAAAAAgIAAAABNwUAAAADbmlsAAAAAAVkcnVtMwkABEwAAAACAgAAAAEzCQAETAAAAAICAAAAATIJAARMAAAAAgIAAAABNwkABEwAAAACAgAAAAE0CQAETAAAAAICAAAAATEJAARMAAAAAgIAAAABNgkABEwAAAACAgAAAAE0CQAETAAAAAICAAAAATIJAARMAAAAAgIAAAABMwkABEwAAAACAgAAAAExCQAETAAAAAICAAAAATQJAARMAAAAAgIAAAABMQkABEwAAAACAgAAAAE1CQAETAAAAAICAAAAATUJAARMAAAAAgIAAAABMQkABEwAAAACAgAAAAEzCQAETAAAAAICAAAAATcJAARMAAAAAgIAAAABMQkABEwAAAACAgAAAAEyCQAETAAAAAICAAAAATYFAAAAA25pbAAAAAANZ2FtZVRpbWVGcmFtZQAAAAAAAAALQAAAAAAKY29tbWlzc2lvbgAAAAAAAAehIAAAAAAIc3RhdGVBY2MCAAAACEFjY2VwdGVkAAAAAAhzdGF0ZVdpbgIAAAADV2luAAAAAAxzdGF0ZVRpbWVvdXQCAAAADFdpbkJ5VGltZW91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cnZlZEJhbGFuY2UEAAAAFHZhbHVlUmVzZXJ2ZWRCYWxhbmNlCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAMcG10QXNzZXROYW1lAgAAAAlfUmVzZXJ2ZWQEAAAAByRtYXRjaDAFAAAAFHZhbHVlUmVzZXJ2ZWRCYWxhbmNlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAAEAAAAEm5ld1Jlc2VydmVkQmFsYW5jZQkAAGQAAAACBQAAABZjdXJyZW50UmVzZXJ2ZWRCYWxhbmNlCQAAaAAAAAIFAAAABnBtdEFtdAAAAAAAAAABBAMJAABnAAAAAgkAA+sAAAACBQAAAAR0aGlzBQAAAAlhc3NldElkNTgFAAAAEm5ld1Jlc2VydmVkQmFsYW5jZQUAAAASbmV3UmVzZXJ2ZWRCYWxhbmNlCQAAAgAAAAECAAAANUJldCB3YXMgcmVqZWN0ZWQuIEluc3VmZmljaWVudCBmdW5kcyBvbiBnYW1lIGFjY291bnQuAQAAABdkZWNyZWFzZVJlc2VydmVkQmFsYW5jZQAAAAIAAAAGYmV0QW10AAAAB2Fzc2V0SWQEAAAAFHZhbHVlUmVzZXJ2ZWRCYWxhbmNlCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAHYXNzZXRJZAIAAAAJX1Jlc2VydmVkBAAAABZleHRyYWN0UmVzZXJ2ZWRCYWxhbmNlBAAAAAckbWF0Y2gwBQAAABR2YWx1ZVJlc2VydmVkQmFsYW5jZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAABAAAABdkZWNyZWFzZVJlc2VydmVkQmFsYW5jZQkAAGUAAAACBQAAABZleHRyYWN0UmVzZXJ2ZWRCYWxhbmNlCQAAaAAAAAIFAAAABmJldEFtdAAAAAAAAAABBAMJAABnAAAAAgUAAAAXZGVjcmVhc2VSZXNlcnZlZEJhbGFuY2UAAAAAAAAAAAAFAAAAF2RlY3JlYXNlUmVzZXJ2ZWRCYWxhbmNlCQAAAgAAAAECAAAAKFJlc2VydmVkIGJhbGFuY2UgY291bGRuJ3QgYmUgbGVzcyB0aGFu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dmVkQmFsYW5jZQUAAAADbmlsCQAAAgAAAAECAAAAFGFzc2V0SWQgaXMgaW5jb3JyZWN0AAAAAWkBAAAACHBsYXlHYW1lAAAABAAAAAZnYW1lSWQAAAAIcnNhU2lnbjEAAAAIcnNhU2lnbjIAAAAIcnNhU2lnbjMEAAAACGRhdGFMaXN0CQEAAAALZ2V0RGF0YUxpc3QAAAABBQAAAAZnYW1lSWQEAAAACWdhbWVTdGF0ZQkAAZEAAAACBQAAAAhkYXRhTGlzdAAAAAAAAAAAAAQAAAANcGxheWVyQWRkcmVzcwkAAZEAAAACBQAAAAhkYXRhTGlzdAAAAAAAAAAAAQQAAAAGYmV0QW10CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIZGF0YUxpc3QAAAAAAAAAAAIEAAAACWFzc2V0TmFtZQkAAZEAAAACBQAAAAhkYXRhTGlzdAAAAAAAAAAAAwQAAAAJZ2FtZVN0YXJ0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIZGF0YUxpc3QAAAAAAAAAAAQEAAAACWFzc2V0SWQ1OAkBAAAAEWFzc2V0TmFtZVRvQmFzZTU4AAAAAQUAAAAJYXNzZXROYW1lBAAAABJzZXRSZXNlcnZlZEJhbGFuY2UJAQAAABdkZWNyZWFzZVJlc2VydmVkQmFsYW5jZQAAAAIFAAAABmJldEFtdAUAAAAJYXNzZXROYW1lBAAAAAhkcnVtMUludAkBAAAACHJzYVRvSW50AAAAAwUAAAAGZ2FtZUlkBQAAAAhyc2FTaWduMQUAAAANcnNhUHVibGljS2V5MQQAAAAIZHJ1bTJJbnQJAQAAAAhyc2FUb0ludAAAAAMFAAAABmdhbWVJZAUAAAAIcnNhU2lnbjIFAAAADXJzYVB1YmxpY0tleTIEAAAACGRydW0zSW50CQEAAAAIcnNhVG9JbnQAAAADBQAAAAZnYW1lSWQFAAAACHJzYVNpZ24zBQAAAA1yc2FQdWJsaWNLZXkzBAAAAAl0d29JbkFSb3cJAAEsAAAAAgkAAZEAAAACBQAAAAVkcnVtMQUAAAAIZHJ1bTFJbnQJAAGRAAAAAgUAAAAFZHJ1bTIFAAAACGRydW0ySW50BAAAAAt0aHJlZUluQVJvdwkAASwAAAACBQAAAAl0d29JbkFSb3cJAAGRAAAAAgUAAAAFZHJ1bTMFAAAACGRydW0zSW50BAAAABVkcm9wcGVkRWxlbWVudHNTdHJpbmcJAAEsAAAAAgkAASwAAAACCQEAAAAPZHJ1bUludFRvU3RyaW5nAAAAAQUAAAAIZHJ1bTFJbnQJAQAAAA9kcnVtSW50VG9TdHJpbmcAAAABBQAAAAhkcnVtMkludAkBAAAAD2RydW1JbnRUb1N0cmluZwAAAAEFAAAACGRydW0zSW50BAAAAAZ3aW5BbXQJAABpAAAAAgkAAGgAAAACBQAAAAZiZXRBbXQJAQAAABBkZWZpbmVNdWx0aXBsaWVyAAAAAgUAAAALdGhyZWVJbkFSb3cFAAAACXR3b0luQVJvdwAAAAAAAAAACgQAAAAMcmVmZXJBZGRyZXNzCQEAAAAPZ2V0UmVmZXJBZGRyZXNzAAAAAQUAAAANcGxheWVyQWRkcmVzcwQAAAALcmVmZXJSZXdhcmQJAQAAAA9zZXROZXdSZWZSZXdhcmQAAAADBQAAAAxyZWZlckFkZHJlc3MFAAAABmJldEFtdAUAAAAGd2luQW10AwkAAAAAAAACBQAAAAlnYW1lU3RhdGUFAAAACHN0YXRlQWNjAwkAAGYAAAACBQAAAA1nYW1lVGltZUZyYW1lCQAAZQAAAAIFAAAABmhlaWdodAUAAAAJZ2FtZVN0YXJ0AwkAAAAAAAACBQAAAAZ3aW5BbXQAAAAAAAAAAAAEAAAAEmF2YWlsYWJsZURpdmlkZW5kcwQAAAAJZGl2aWRlbmRzCQAAZAAAAAIJAQAAAA5nZXRDdXJyZW50RGVidAAAAAEFAAAACWFzc2V0TmFtZQUAAAAGYmV0QW10AwkAAGYAAAACBQAAAAlkaXZpZGVuZHMAAAAAAAAAAAAFAAAACWRpdmlkZW5kcwAAAAAAAAAAAAQAAAAEZGVidAQAAAAJZGl2aWRlbmRzCQAAZAAAAAIJAQAAAA5nZXRDdXJyZW50RGVidAAAAAEFAAAACWFzc2V0TmFtZQUAAAAGYmV0QW10AwkAAGYAAAACBQAAAAlkaXZpZGVuZHMAAAAAAAAAAAAAAAAAAAAAAAAFAAAACWRpdmlkZW5kcwMJAAAAAAAAAgUAAAAMcmVmZXJBZGRyZXNzAgAAAAROb25lCQEAAAAMU2NyaXB0UmVzdWx0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AAACAAAAAQIAAAAXR2FtZSBzdGF0ZSBpcyBpbmNvcnJlY3QAAAABaQEAAAAPd2l0aGRyYXdEZXBvc2l0AAAAAQAAAAlhc3NldE5hbWUEAAAACWFzc2V0SWQ1OAkBAAAAEWFzc2V0TmFtZVRvQmFzZTU4AAAAAQUAAAAJYXNzZXROYW1lBAAAAAljYWxsZXJQdWIJAQAAABRjYWxsZXJJc0RlcG9zaXRPd25lcgAAAAIFAAAACWFzc2V0TmFtZQkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAE2RpdmlkZW5kU3RhcnRIZWlnaHQJAQAAAA5nZXREZXBvc2l0RGF0YQAAAAIFAAAACWFzc2V0TmFtZQIAAAASX0RlcG9zaXRTdGFydEJsb2NrBAAAAA9kZXBvc2l0RHVyYXRpb24JAQAAAA5nZXREZXBvc2l0RGF0YQAAAAIFAAAACWFzc2V0TmFtZQIAAAAVX0RlcG9zaXREdXJhdGlvbkJsb2NrBAAAAA1kZXBvc2l0QW1vdW50CQEAAAAOZ2V0RGVwb3NpdERhdGEAAAACBQAAAAlhc3NldE5hbWUCAAAADl9EZXBvc2l0QW1vdW50AwkAAGcAAAACCQAAZQAAAAIFAAAABmhlaWdodAUAAAATZGl2aWRlbmRTdGFydEhlaWdodAUAAAAPZGVwb3NpdER1cmF0aW9uCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhc3NldE5hbWUCAAAAHV9EZXBvc2l0V2l0aGRyYXdUcmFuc2FjdGlvbklkCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAAljYWxsZXJQdWIFAAAADWRlcG9zaXRBbW91bnQFAAAACWFzc2V0SWQ1OAUAAAADbmlsCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABpEZXBvc2l0IHRpbWUgaXMgbm90IG92ZXIuIAkAAaQAAAABCQAAZQAAAAIFAAAABmhlaWdodAkAAGQAAAACBQAAABNkaXZpZGVuZFN0YXJ0SGVpZ2h0BQAAAA9kZXBvc2l0RHVyYXRpb24CAAAADSBibG9ja3MgbGVmdC4AAAABaQEAAAARd2l0aGRyYXdSZWZSZXdhcmQAAAACAAAAB2FkZHJlc3MAAAAJYXNzZXROYW1lBAAAAAlhc3NldElkNTgJAQAAABFhc3NldE5hbWVUb0Jhc2U1OAAAAAEFAAAACWFzc2V0TmFtZQQAAAATcmV3YXJkQW1vdW50Q2hlY2tlZAQAAAAMcmV3YXJkQW1vdW50BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAHYWRkcmVzcwIAAAAMX1JlZmVyUmV3YXJkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAuQ291bGRuJ3QgZmluZCByZWZlcnJhbCByZXdhcmQgZm9yIHRoaXMgYWRkcmVzcwQAAAATcmV3YXJkQW1vdW50Q29ycmVjdAMJAAAAAAAAAgUAAAAJYXNzZXRJZDU4BQAAAAd3YXZlc0lkAwkAAGYAAAACBQAAAAxyZXdhcmRBbW91bnQAAAAAAAX14QAGBwMJAAAAAAAAAgUAAAAJYXNzZXRJZDU4BQAAAAVidGNJZAMJAABmAAAAAgUAAAAMcmV3YXJkQW1vdW50AAAAAAAF9eEABgcDCQAAAAAAAAIFAAAACWFzc2V0SWQ1OAUAAAAFZXRoSWQDCQAAZgAAAAIFAAAADHJld2FyZEFtb3VudAAAAAAABfXhAAYHAwkAAAAAAAACBQAAAAlhc3NldElkNTgFAAAABndlc3RJZAMJAABmAAAAAgUAAAAMcmV3YXJkQW1vdW50AAAAAAAF9eEABgcDCQAAAAAAAAIFAAAACWFzc2V0SWQ1OAUAAAAFd2N0SWQDCQAAZgAAAAIFAAAADHJld2FyZEFtb3VudAAAAAAABfXhAAYHAwkAAGYAAAACBQAAAAxyZXdhcmRBbW91bnQAAAAAAAX14QAGBwMFAAAAE3Jld2FyZEFtb3VudENvcnJlY3QFAAAADHJld2FyZEFtb3VudAkAAAIAAAABAgAAACRSZXdhcmQgQW1vdW50IGlzIHRvbyBsb3cgdG8gd2l0aGRyYXcJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAB2FkZHJlc3MCAAAADF9SZWZlclJld2FyZAAAAAAAAAAAAAUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAHYWRkcmVzcwUAAAATcmV3YXJkQW1vdW50Q2hlY2tlZAUAAAAJYXNzZXRJZDU4BQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAADWdhbWVQdWJsaWNLZXkEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABRTZXRTY3JpcHRUcmFuc2FjdGlvbgQAAAAEc3N0eAUAAAAHJG1hdGNoMAYHByE9GvU=", "chainId": 87, "height": 1901572, "spentComplexity": 0 } View: original | compacted Prev: C7EQg9tj4hfg6oFD8Mq9dHsXwKjLT3QhMCGPV3R94GkG Next: 2oQbY7i8T5Ct4KLEXKXnWj86QFUA2spdumz9fWwvwwt9 Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let dividendProgramAddress = addressFromPublicKey(fromBase58String("4YzSQxjz8tahQ62bgcKLxoh9424EYDiYdZUzUtQVCzks"))
5+
6+let gamePublicKey = fromBase58String("2o1waDCX67ArC4iV4WWHa41MHbCKS4na7KWDJmcKNAQ3")
7+
8+let referralProgramAddress = addressFromPublicKey(fromBase58String("1"))
9+
410 let rsaPublicKey1 = fromBase64String("MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOkiuz/BV4EjoxGhTmNCbt2TgkbSPH/w69b3F1rKmD61JiPXvvF8L2pI9xOYcW4FmoEZVHlRQtAlaJykl3+rsrECAwEAAQ==")
511
612 let rsaPublicKey2 = fromBase64String("MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJnXzbM/V2sDV1ULbPSOlHkldOTWRrHi5fxIkBmuevrClMPVH7rqccwirDNcMdIdwXHI9Adhj9FWjwGIwfU/K6MCAwEAAQ==")
1319
1420 let drum3 = ["3", "2", "7", "4", "1", "6", "4", "2", "3", "1", "4", "1", "5", "5", "1", "3", "7", "1", "2", "6"]
1521
16-let gameTimeFrame = (1440 * 2)
22+let gameTimeFrame = 2880
1723
1824 let commission = 500000
1925
2733
2834 let wavesId = unit
2935
30-let btcId = base58'Gt4HLkHunts7bWbtYP5UCsAPW7TUA4gmQEnjgjbZ2NqB'
36+let btcId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
3137
32-let ethId = base58'6A79GDQj8bdHqUaoJQ3qE1TCPnBc3wFirNCSsAY5RKry'
38+let ethId = base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu'
3339
34-let ltcId = base58'7oRhs4zoufHM4KiBDuJwRXUWb9JQaFt98N8ubpmytMmw'
40+let ltcId = base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk'
3541
36-let vstId = base58'5UyDjBMx1Q8UWhJj1r7JuA6h4aCkKrHE1J19HvMXRpRd'
42+let westId = base58'4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8'
3743
38-let wctId = base58'Ae5W927iuKSLLT6Sdt3bqWze6ZUbYHDWzPY6dLKQusZv'
44+let wctId = base58'DHgwrRvVyqJsepd32YbBqUeDH4GJ1N984X8QoekjgH8J'
3945
40-let divider = 1000
46+let usdtId = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
4147
42-let WavesMinAmt = (100000000 / divider)
48+let usdnId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
4349
44-let WavesMaxAmt = (WavesMinAmt * 10)
50+let wavesMinAmt = 20000000
4551
46-let BtcMinAmt = (10000 / divider)
52+let wavesMaxAmt = (wavesMinAmt * 10)
4753
48-let BtcMaxAmt = (BtcMinAmt * 10)
54+let btcMinAmt = 2000
4955
50-let EthMinAmt = (1000000 / divider)
56+let btcMaxAmt = (btcMinAmt * 10)
5157
52-let EthMaxAmt = (EthMinAmt * 10)
58+let ethMinAmt = 100000
5359
54-let LtcMinAmt = (2000000 / divider)
60+let ethMaxAmt = (ethMinAmt * 10)
5561
56-let LtcMaxAmt = (LtcMinAmt * 10)
62+let ltcMinAmt = 200000
5763
58-let WctMinAmt = (500000000 / divider)
64+let ltcMaxAmt = (ltcMinAmt * 10)
5965
60-let WctMaxAmt = (WctMinAmt * 10)
66+let wctMinAmt = 200000000
6167
62-let VstMinAmt = (500000000 / divider)
68+let wctMaxAmt = (wctMinAmt * 10)
6369
64-let VstMaxAmt = (VstMinAmt * 10)
70+let westMinAmt = 200000000
71+
72+let westMaxAmt = (westMinAmt * 10)
73+
74+let usdtMinAmt = 200000
75+
76+let usdtMaxAmt = (usdtMinAmt * 10)
77+
78+let usdnMinAmt = 200000
79+
80+let usdnMaxAmt = (usdnMinAmt * 10)
6581
6682 func pmtAmtCheck (pmtAssetId,betAmount) = if ((pmtAssetId == "WAVES"))
67- then if (if ((betAmount >= WavesMinAmt))
68- then (WavesMaxAmt >= betAmount)
83+ then if (if ((betAmount >= wavesMinAmt))
84+ then (wavesMaxAmt >= betAmount)
6985 else false)
7086 then true
7187 else throw("Bet amount is not in range")
7288 else if ((pmtAssetId == "BTC"))
73- then if (if ((betAmount >= BtcMinAmt))
74- then (BtcMaxAmt >= betAmount)
89+ then if (if ((betAmount >= btcMinAmt))
90+ then (btcMaxAmt >= betAmount)
7591 else false)
7692 then true
7793 else throw("Bet amount is not in range")
7894 else if ((pmtAssetId == "ETH"))
79- then if (if ((betAmount >= EthMinAmt))
80- then (EthMaxAmt >= betAmount)
95+ then if (if ((betAmount >= ethMinAmt))
96+ then (ethMaxAmt >= betAmount)
8197 else false)
8298 then true
8399 else throw("Bet amount is not in range")
84100 else if ((pmtAssetId == "LTC"))
85- then if (if ((betAmount >= LtcMinAmt))
86- then (LtcMaxAmt >= betAmount)
101+ then if (if ((betAmount >= ltcMinAmt))
102+ then (ltcMaxAmt >= betAmount)
87103 else false)
88104 then true
89105 else throw("Bet amount is not in range")
90- else if ((pmtAssetId == "WCT"))
91- then if (if ((betAmount >= WctMinAmt))
92- then (WctMaxAmt >= betAmount)
106+ else if ((pmtAssetId == "WEST"))
107+ then if (if ((betAmount >= westMinAmt))
108+ then (westMaxAmt >= betAmount)
93109 else false)
94110 then true
95111 else throw("Bet amount is not in range")
96- else if (if ((betAmount >= VstMinAmt))
97- then (VstMaxAmt >= betAmount)
98- else false)
99- then true
100- else throw("Bet amount is not in range")
112+ else if ((pmtAssetId == "USDT"))
113+ then if (if ((betAmount >= usdtMinAmt))
114+ then (usdtMaxAmt >= betAmount)
115+ else false)
116+ then true
117+ else throw("Bet amount is not in range")
118+ else if ((pmtAssetId == "USDN"))
119+ then if (if ((betAmount >= usdnMinAmt))
120+ then (usdnMaxAmt >= betAmount)
121+ else false)
122+ then true
123+ else throw("Bet amount is not in range")
124+ else if (if ((betAmount >= wctMinAmt))
125+ then (wctMaxAmt >= betAmount)
126+ else false)
127+ then true
128+ else throw("Bet amount is not in range")
101129
102130
103131 func getDataList (gameId) = {
130158 0
131159 }
132160 }
133- let newReservedBalance = (currentReservedBalance + pmtAmt)
161+ let newReservedBalance = (currentReservedBalance + (pmtAmt * 260))
134162 if ((assetBalance(this, assetId58) >= newReservedBalance))
135163 then newReservedBalance
136164 else throw("Bet was rejected. Insufficient funds on game account.")
145173 case _ =>
146174 0
147175 }
148- let decreaseReservedBalance = (extractReservedBalance - betAmt)
176+ let decreaseReservedBalance = (extractReservedBalance - (betAmt * 260))
149177 if ((decreaseReservedBalance >= 0))
150178 then decreaseReservedBalance
151179 else throw("Reserved balance couldn't be less than 0")
188216 else 0
189217
190218
191-func AssetNameToBase58 (assetName) = if ((assetName == "WAVES"))
219+func assetNameToBase58 (assetName) = if ((assetName == "WAVES"))
192220 then wavesId
193221 else if ((assetName == "BTC"))
194222 then btcId
196224 then ethId
197225 else if ((assetName == "LTC"))
198226 then ltcId
199- else if ((assetName == "VST"))
200- then vstId
227+ else if ((assetName == "WEST"))
228+ then westId
201229 else if ((assetName == "WCT"))
202230 then wctId
203- else throw("Asset name is incorrect")
231+ else if ((assetName == "USDT"))
232+ then usdtId
233+ else if ((assetName == "USDN"))
234+ then usdnId
235+ else throw("Asset name is incorrect")
204236
205237
206238 func assetBase58ToName (assetId) = if (!(isDefined(assetId)))
211243 then "ETH"
212244 else if ((assetId == ltcId))
213245 then "LTC"
214- else if ((assetId == wctId))
215- then "WCT"
216- else if ((assetId == vstId))
217- then "VST"
218- else throw("AssetId is incorrect")
246+ else if ((assetId == westId))
247+ then "WEST"
248+ else if ((assetId == wctId))
249+ then "WCT"
250+ else if ((assetId == usdtId))
251+ then "USDT"
252+ else if ((assetId == usdnId))
253+ then "USDN"
254+ else throw("AssetId is incorrect")
255+
256+
257+func getReferAddress (address) = {
258+ let referAddress = getString(referralProgramAddress, (address + "_Refer"))
259+ match referAddress {
260+ case a: String =>
261+ a
262+ case _ =>
263+ "None"
264+ }
265+ }
266+
267+
268+func setNewRefReward (referAddress,betAmt,winAmt) = if ((referAddress == "None"))
269+ then 0
270+ else {
271+ let valueRefReward = getInteger(this, (referAddress + "_RefReward"))
272+ let currentRefReward = match valueRefReward {
273+ case a: Int =>
274+ a
275+ case _ =>
276+ throw("Couldn't find refer reward for this address")
277+ }
278+ let refKoeff = {
279+ let a = match getInteger(this, (referAddress + "_GamesPlayedByRef")) {
280+ case a: Int =>
281+ a
282+ case _ =>
283+ throw("Couldn't find games played number by referrals for this address")
284+ }
285+ if ((a > 10000))
286+ then 30
287+ else if ((a > 1000))
288+ then 20
289+ else if ((a > 100))
290+ then 10
291+ else 5
292+ }
293+ let gameIncome = (betAmt - winAmt)
294+ let rewardForThisGame = ((gameIncome * refKoeff) / 100)
295+ (currentRefReward + rewardForThisGame)
296+ }
297+
298+
299+func setNewGamesPlayedNum (address) = {
300+ let valueGamesPlayedNum = getInteger(this, (address + "_GamesPlayed"))
301+ let currentGamesPlayedNum = match valueGamesPlayedNum {
302+ case a: Int =>
303+ a
304+ case _ =>
305+ 0
306+ }
307+ (currentGamesPlayedNum + 1)
308+ }
309+
310+
311+func getCurrentDebt (assetName) = {
312+ let val = getInteger(this, (assetName + "_Debt"))
313+ match val {
314+ case a: Int =>
315+ a
316+ case _ =>
317+ 0
318+ }
319+ }
320+
321+
322+func callerIsDepositOwner (assetName,callerPublicKey) = {
323+ let depositOwner = getString(dividendProgramAddress, (assetName + "_DepositOwner"))
324+ if ((callerPublicKey == depositOwner))
325+ then callerPublicKey
326+ else throw("Only deposit owner can withdrawal deposit")
327+ }
328+
329+
330+func getDepositData (assetName,keySuffix) = {
331+ let key = (assetName + keySuffix)
332+ let val = getInteger(dividendProgramAddress, key)
333+ match val {
334+ case a: Int =>
335+ a
336+ case _ =>
337+ throw("Couldn't find dividend program start height")
338+ }
339+ }
219340
220341
221342 @Callable(i)
242363 func playGame (gameId,rsaSign1,rsaSign2,rsaSign3) = {
243364 let dataList = getDataList(gameId)
244365 let gameState = dataList[0]
245- let playerAddress = addressFromStringValue(dataList[1])
366+ let playerAddress = dataList[1]
246367 let betAmt = parseIntValue(dataList[2])
247368 let assetName = dataList[3]
248369 let gameStart = parseIntValue(dataList[4])
249- let assetId58 = AssetNameToBase58(assetName)
370+ let assetId58 = assetNameToBase58(assetName)
250371 let setReservedBalance = decreaseReservedBalance(betAmt, assetName)
251372 let drum1Int = rsaToInt(gameId, rsaSign1, rsaPublicKey1)
252373 let drum2Int = rsaToInt(gameId, rsaSign2, rsaPublicKey2)
255376 let threeInARow = (twoInARow + drum3[drum3Int])
256377 let droppedElementsString = ((drumIntToString(drum1Int) + drumIntToString(drum2Int)) + drumIntToString(drum3Int))
257378 let winAmt = ((betAmt * defineMultiplier(threeInARow, twoInARow)) / 10)
258- let winPmtAmt = {
259- let balance = assetBalance(this, assetId58)
260- if ((winAmt > balance))
261- then (betAmt * 2)
262- else winAmt
263- }
264- let gameTimeCheck = (gameTimeFrame > (height - gameStart))
265- let stateCorrect = (gameState == stateAcc)
266- if (stateCorrect)
267- then if (gameTimeCheck)
379+ let referAddress = getReferAddress(playerAddress)
380+ let referReward = setNewRefReward(referAddress, betAmt, winAmt)
381+ if ((gameState == stateAcc))
382+ then if ((gameTimeFrame > (height - gameStart)))
268383 then if ((winAmt == 0))
269- then WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateLose + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString(winAmt)) + "_") + threeInARow) + "_") + droppedElementsString)), DataEntry((assetName + "_Reserved"), setReservedBalance)])
270- else ScriptResult(WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateWin + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString(winAmt)) + "_") + threeInARow) + "_") + droppedElementsString)), DataEntry((assetName + "_Reserved"), setReservedBalance)]), TransferSet([ScriptTransfer(playerAddress, winPmtAmt, assetId58)]))
271- else ScriptResult(WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateTimeout + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString((betAmt * 2))) + "_") + "000") + "_") + "000000")), DataEntry((assetName + "_Reserved"), setReservedBalance)]), TransferSet([ScriptTransfer(playerAddress, betAmt, assetId58)]))
384+ then {
385+ let availableDividends = {
386+ let dividends = (getCurrentDebt(assetName) + betAmt)
387+ if ((dividends > 0))
388+ then dividends
389+ else 0
390+ }
391+ let debt = {
392+ let dividends = (getCurrentDebt(assetName) + betAmt)
393+ if ((dividends > 0))
394+ then 0
395+ else dividends
396+ }
397+ if ((referAddress == "None"))
398+ then ScriptResult(WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateLose + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString(winAmt)) + "_") + threeInARow) + "_") + droppedElementsString)), DataEntry((assetName + "_Reserved"), setReservedBalance), DataEntry((assetName + "_Debt"), debt), DataEntry((playerAddress + "_GamesPlayed"), setNewGamesPlayedNum(referAddress))]), TransferSet([ScriptTransfer(dividendProgramAddress, availableDividends, assetId58)]))
399+ else ScriptResult(WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateLose + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString(winAmt)) + "_") + threeInARow) + "_") + droppedElementsString)), DataEntry((assetName + "_Reserved"), setReservedBalance), DataEntry((assetName + "_Debt"), debt), DataEntry((referAddress + "_GamesPlayedByRef"), setNewGamesPlayedNum(referAddress)), DataEntry((referAddress + "_ReferReward"), referReward)]), TransferSet([ScriptTransfer(dividendProgramAddress, availableDividends, assetId58)]))
400+ }
401+ else ScriptResult(WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateWin + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString(winAmt)) + "_") + threeInARow) + "_") + droppedElementsString)), DataEntry((assetName + "_Reserved"), setReservedBalance), DataEntry((assetName + "_Debt"), (getCurrentDebt(assetName) - winAmt)), DataEntry((referAddress + "_GamesPlayedByRef"), setNewGamesPlayedNum(referAddress))]), TransferSet([ScriptTransfer(addressFromStringValue(playerAddress), winAmt, assetId58)]))
402+ else ScriptResult(WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateTimeout + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString((betAmt * 2))) + "_") + "000") + "_") + "000000")), DataEntry((assetName + "_Reserved"), setReservedBalance), DataEntry((assetName + "_Debt"), (getCurrentDebt(assetName) - (betAmt * 2))), DataEntry((referAddress + "_GamesPlayedByRef"), setNewGamesPlayedNum(referAddress))]), TransferSet([ScriptTransfer(addressFromStringValue(playerAddress), (betAmt * 2), assetId58)]))
272403 else throw("Game state is incorrect")
273404 }
274405
275406
407+
408+@Callable(i)
409+func withdrawDeposit (assetName) = {
410+ let assetId58 = assetNameToBase58(assetName)
411+ let callerPub = callerIsDepositOwner(assetName, toBase58String(i.callerPublicKey))
412+ let dividendStartHeight = getDepositData(assetName, "_DepositStartBlock")
413+ let depositDuration = getDepositData(assetName, "_DepositDurationBlock")
414+ let depositAmount = getDepositData(assetName, "_DepositAmount")
415+ if (((height - dividendStartHeight) >= depositDuration))
416+ then ScriptResult(WriteSet([DataEntry((assetName + "_DepositWithdrawTransactionId"), i.transactionId)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(callerPub)), depositAmount, assetId58)]))
417+ else throw((("Deposit time is not over. " + toString((height - (dividendStartHeight + depositDuration)))) + " blocks left."))
418+ }
419+
420+
421+
422+@Callable(i)
423+func withdrawRefReward (address,assetName) = {
424+ let assetId58 = assetNameToBase58(assetName)
425+ let rewardAmountChecked = {
426+ let rewardAmount = match getInteger(this, (address + "_ReferReward")) {
427+ case a: Int =>
428+ a
429+ case _ =>
430+ throw("Couldn't find referral reward for this address")
431+ }
432+ let rewardAmountCorrect = if ((assetId58 == wavesId))
433+ then if ((rewardAmount > 100000000))
434+ then true
435+ else false
436+ else if ((assetId58 == btcId))
437+ then if ((rewardAmount > 100000000))
438+ then true
439+ else false
440+ else if ((assetId58 == ethId))
441+ then if ((rewardAmount > 100000000))
442+ then true
443+ else false
444+ else if ((assetId58 == westId))
445+ then if ((rewardAmount > 100000000))
446+ then true
447+ else false
448+ else if ((assetId58 == wctId))
449+ then if ((rewardAmount > 100000000))
450+ then true
451+ else false
452+ else if ((rewardAmount > 100000000))
453+ then true
454+ else false
455+ if (rewardAmountCorrect)
456+ then rewardAmount
457+ else throw("Reward Amount is too low to withdraw")
458+ }
459+ ScriptResult(WriteSet([DataEntry((address + "_ReferReward"), 0)]), TransferSet([ScriptTransfer(addressFromStringValue(address), rewardAmountChecked, assetId58)]))
460+ }
461+
462+
276463 @Verifier(tx)
277-func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
464+func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], gamePublicKey))
278465 then match tx {
279- case ttx: TransferTransaction =>
280- let valueReservedBalance = getInteger(this, "WAVES_Reserved")
281- let reservedBalance = match valueReservedBalance {
282- case a: Int =>
283- a
284- case _ =>
285- 0
286- }
287- let availableBalance = (wavesBalance(this) - reservedBalance)
288- let availibleAmount = (availableBalance >= ttx.amount)
289- availibleAmount
290466 case sstx: SetScriptTransaction =>
291- true
292- case istx: InvokeScriptTransaction =>
293- true
294- case dtx: DataTransaction =>
295467 true
296468 case _ =>
297469 false
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let dividendProgramAddress = addressFromPublicKey(fromBase58String("4YzSQxjz8tahQ62bgcKLxoh9424EYDiYdZUzUtQVCzks"))
5+
6+let gamePublicKey = fromBase58String("2o1waDCX67ArC4iV4WWHa41MHbCKS4na7KWDJmcKNAQ3")
7+
8+let referralProgramAddress = addressFromPublicKey(fromBase58String("1"))
9+
410 let rsaPublicKey1 = fromBase64String("MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOkiuz/BV4EjoxGhTmNCbt2TgkbSPH/w69b3F1rKmD61JiPXvvF8L2pI9xOYcW4FmoEZVHlRQtAlaJykl3+rsrECAwEAAQ==")
511
612 let rsaPublicKey2 = fromBase64String("MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJnXzbM/V2sDV1ULbPSOlHkldOTWRrHi5fxIkBmuevrClMPVH7rqccwirDNcMdIdwXHI9Adhj9FWjwGIwfU/K6MCAwEAAQ==")
713
814 let rsaPublicKey3 = fromBase64String("MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAORDevy0r4kzLqOySloB63Huv2e4zeHKHjCsy5vtFKmWZbXJa8gZYt4+EklFIo1K9oqu5BAPVfJ3FOzs2U1A+g0CAwEAAQ==")
915
1016 let drum1 = ["2", "1", "3", "5", "7", "3", "3", "1", "4", "1", "3", "5", "2", "4", "2", "6", "5", "2", "1", "4"]
1117
1218 let drum2 = ["4", "2", "3", "1", "6", "4", "2", "1", "4", "2", "1", "6", "3", "1", "2", "5", "1", "5", "3", "7"]
1319
1420 let drum3 = ["3", "2", "7", "4", "1", "6", "4", "2", "3", "1", "4", "1", "5", "5", "1", "3", "7", "1", "2", "6"]
1521
16-let gameTimeFrame = (1440 * 2)
22+let gameTimeFrame = 2880
1723
1824 let commission = 500000
1925
2026 let stateAcc = "Accepted"
2127
2228 let stateWin = "Win"
2329
2430 let stateTimeout = "WinByTimeout"
2531
2632 let stateLose = "Lose"
2733
2834 let wavesId = unit
2935
30-let btcId = base58'Gt4HLkHunts7bWbtYP5UCsAPW7TUA4gmQEnjgjbZ2NqB'
36+let btcId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
3137
32-let ethId = base58'6A79GDQj8bdHqUaoJQ3qE1TCPnBc3wFirNCSsAY5RKry'
38+let ethId = base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu'
3339
34-let ltcId = base58'7oRhs4zoufHM4KiBDuJwRXUWb9JQaFt98N8ubpmytMmw'
40+let ltcId = base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk'
3541
36-let vstId = base58'5UyDjBMx1Q8UWhJj1r7JuA6h4aCkKrHE1J19HvMXRpRd'
42+let westId = base58'4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8'
3743
38-let wctId = base58'Ae5W927iuKSLLT6Sdt3bqWze6ZUbYHDWzPY6dLKQusZv'
44+let wctId = base58'DHgwrRvVyqJsepd32YbBqUeDH4GJ1N984X8QoekjgH8J'
3945
40-let divider = 1000
46+let usdtId = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
4147
42-let WavesMinAmt = (100000000 / divider)
48+let usdnId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
4349
44-let WavesMaxAmt = (WavesMinAmt * 10)
50+let wavesMinAmt = 20000000
4551
46-let BtcMinAmt = (10000 / divider)
52+let wavesMaxAmt = (wavesMinAmt * 10)
4753
48-let BtcMaxAmt = (BtcMinAmt * 10)
54+let btcMinAmt = 2000
4955
50-let EthMinAmt = (1000000 / divider)
56+let btcMaxAmt = (btcMinAmt * 10)
5157
52-let EthMaxAmt = (EthMinAmt * 10)
58+let ethMinAmt = 100000
5359
54-let LtcMinAmt = (2000000 / divider)
60+let ethMaxAmt = (ethMinAmt * 10)
5561
56-let LtcMaxAmt = (LtcMinAmt * 10)
62+let ltcMinAmt = 200000
5763
58-let WctMinAmt = (500000000 / divider)
64+let ltcMaxAmt = (ltcMinAmt * 10)
5965
60-let WctMaxAmt = (WctMinAmt * 10)
66+let wctMinAmt = 200000000
6167
62-let VstMinAmt = (500000000 / divider)
68+let wctMaxAmt = (wctMinAmt * 10)
6369
64-let VstMaxAmt = (VstMinAmt * 10)
70+let westMinAmt = 200000000
71+
72+let westMaxAmt = (westMinAmt * 10)
73+
74+let usdtMinAmt = 200000
75+
76+let usdtMaxAmt = (usdtMinAmt * 10)
77+
78+let usdnMinAmt = 200000
79+
80+let usdnMaxAmt = (usdnMinAmt * 10)
6581
6682 func pmtAmtCheck (pmtAssetId,betAmount) = if ((pmtAssetId == "WAVES"))
67- then if (if ((betAmount >= WavesMinAmt))
68- then (WavesMaxAmt >= betAmount)
83+ then if (if ((betAmount >= wavesMinAmt))
84+ then (wavesMaxAmt >= betAmount)
6985 else false)
7086 then true
7187 else throw("Bet amount is not in range")
7288 else if ((pmtAssetId == "BTC"))
73- then if (if ((betAmount >= BtcMinAmt))
74- then (BtcMaxAmt >= betAmount)
89+ then if (if ((betAmount >= btcMinAmt))
90+ then (btcMaxAmt >= betAmount)
7591 else false)
7692 then true
7793 else throw("Bet amount is not in range")
7894 else if ((pmtAssetId == "ETH"))
79- then if (if ((betAmount >= EthMinAmt))
80- then (EthMaxAmt >= betAmount)
95+ then if (if ((betAmount >= ethMinAmt))
96+ then (ethMaxAmt >= betAmount)
8197 else false)
8298 then true
8399 else throw("Bet amount is not in range")
84100 else if ((pmtAssetId == "LTC"))
85- then if (if ((betAmount >= LtcMinAmt))
86- then (LtcMaxAmt >= betAmount)
101+ then if (if ((betAmount >= ltcMinAmt))
102+ then (ltcMaxAmt >= betAmount)
87103 else false)
88104 then true
89105 else throw("Bet amount is not in range")
90- else if ((pmtAssetId == "WCT"))
91- then if (if ((betAmount >= WctMinAmt))
92- then (WctMaxAmt >= betAmount)
106+ else if ((pmtAssetId == "WEST"))
107+ then if (if ((betAmount >= westMinAmt))
108+ then (westMaxAmt >= betAmount)
93109 else false)
94110 then true
95111 else throw("Bet amount is not in range")
96- else if (if ((betAmount >= VstMinAmt))
97- then (VstMaxAmt >= betAmount)
98- else false)
99- then true
100- else throw("Bet amount is not in range")
112+ else if ((pmtAssetId == "USDT"))
113+ then if (if ((betAmount >= usdtMinAmt))
114+ then (usdtMaxAmt >= betAmount)
115+ else false)
116+ then true
117+ else throw("Bet amount is not in range")
118+ else if ((pmtAssetId == "USDN"))
119+ then if (if ((betAmount >= usdnMinAmt))
120+ then (usdnMaxAmt >= betAmount)
121+ else false)
122+ then true
123+ else throw("Bet amount is not in range")
124+ else if (if ((betAmount >= wctMinAmt))
125+ then (wctMaxAmt >= betAmount)
126+ else false)
127+ then true
128+ else throw("Bet amount is not in range")
101129
102130
103131 func getDataList (gameId) = {
104132 let getDataString = getString(this, (gameId + "_GameId"))
105133 let a = match getDataString {
106134 case a: String =>
107135 a
108136 case _ =>
109137 throw("GameId was not found")
110138 }
111139 split(a, "_")
112140 }
113141
114142
115143 func rsaToInt (gameId,rsaSign,rsaPublicKey) = {
116144 let rsaCheck = rsaVerify(SHA256, toBytes(gameId), rsaSign, rsaPublicKey)
117145 if (rsaCheck)
118146 then (toInt(sha256(rsaSign)) % 19)
119147 else throw("Rsa Signature is invalid")
120148 }
121149
122150
123151 func increaseReservedBalance (pmtAmt,pmtAssetName,assetId58) = {
124152 let currentReservedBalance = {
125153 let valueReservedBalance = getInteger(this, (pmtAssetName + "_Reserved"))
126154 match valueReservedBalance {
127155 case a: Int =>
128156 a
129157 case _ =>
130158 0
131159 }
132160 }
133- let newReservedBalance = (currentReservedBalance + pmtAmt)
161+ let newReservedBalance = (currentReservedBalance + (pmtAmt * 260))
134162 if ((assetBalance(this, assetId58) >= newReservedBalance))
135163 then newReservedBalance
136164 else throw("Bet was rejected. Insufficient funds on game account.")
137165 }
138166
139167
140168 func decreaseReservedBalance (betAmt,assetId) = {
141169 let valueReservedBalance = getInteger(this, (assetId + "_Reserved"))
142170 let extractReservedBalance = match valueReservedBalance {
143171 case a: Int =>
144172 a
145173 case _ =>
146174 0
147175 }
148- let decreaseReservedBalance = (extractReservedBalance - betAmt)
176+ let decreaseReservedBalance = (extractReservedBalance - (betAmt * 260))
149177 if ((decreaseReservedBalance >= 0))
150178 then decreaseReservedBalance
151179 else throw("Reserved balance couldn't be less than 0")
152180 }
153181
154182
155183 func drumIntToString (drumInt) = if ((10 > drumInt))
156184 then ("0" + toString(drumInt))
157185 else toString(drumInt)
158186
159187
160188 func defineMultiplier (threeInARow,twoInARow) = if ((threeInARow == "777"))
161189 then 2600
162190 else if ((threeInARow == "666"))
163191 then 1300
164192 else if ((threeInARow == "555"))
165193 then 450
166194 else if ((threeInARow == "444"))
167195 then 200
168196 else if ((threeInARow == "333"))
169197 then 150
170198 else if ((threeInARow == "222"))
171199 then 110
172200 else if ((threeInARow == "111"))
173201 then 50
174202 else if ((twoInARow == "77"))
175203 then 270
176204 else if ((twoInARow == "66"))
177205 then 130
178206 else if ((twoInARow == "55"))
179207 then 45
180208 else if ((twoInARow == "44"))
181209 then 30
182210 else if ((twoInARow == "33"))
183211 then 20
184212 else if ((twoInARow == "22"))
185213 then 17
186214 else if ((twoInARow == "11"))
187215 then 13
188216 else 0
189217
190218
191-func AssetNameToBase58 (assetName) = if ((assetName == "WAVES"))
219+func assetNameToBase58 (assetName) = if ((assetName == "WAVES"))
192220 then wavesId
193221 else if ((assetName == "BTC"))
194222 then btcId
195223 else if ((assetName == "ETH"))
196224 then ethId
197225 else if ((assetName == "LTC"))
198226 then ltcId
199- else if ((assetName == "VST"))
200- then vstId
227+ else if ((assetName == "WEST"))
228+ then westId
201229 else if ((assetName == "WCT"))
202230 then wctId
203- else throw("Asset name is incorrect")
231+ else if ((assetName == "USDT"))
232+ then usdtId
233+ else if ((assetName == "USDN"))
234+ then usdnId
235+ else throw("Asset name is incorrect")
204236
205237
206238 func assetBase58ToName (assetId) = if (!(isDefined(assetId)))
207239 then "WAVES"
208240 else if ((assetId == btcId))
209241 then "BTC"
210242 else if ((assetId == ethId))
211243 then "ETH"
212244 else if ((assetId == ltcId))
213245 then "LTC"
214- else if ((assetId == wctId))
215- then "WCT"
216- else if ((assetId == vstId))
217- then "VST"
218- else throw("AssetId is incorrect")
246+ else if ((assetId == westId))
247+ then "WEST"
248+ else if ((assetId == wctId))
249+ then "WCT"
250+ else if ((assetId == usdtId))
251+ then "USDT"
252+ else if ((assetId == usdnId))
253+ then "USDN"
254+ else throw("AssetId is incorrect")
255+
256+
257+func getReferAddress (address) = {
258+ let referAddress = getString(referralProgramAddress, (address + "_Refer"))
259+ match referAddress {
260+ case a: String =>
261+ a
262+ case _ =>
263+ "None"
264+ }
265+ }
266+
267+
268+func setNewRefReward (referAddress,betAmt,winAmt) = if ((referAddress == "None"))
269+ then 0
270+ else {
271+ let valueRefReward = getInteger(this, (referAddress + "_RefReward"))
272+ let currentRefReward = match valueRefReward {
273+ case a: Int =>
274+ a
275+ case _ =>
276+ throw("Couldn't find refer reward for this address")
277+ }
278+ let refKoeff = {
279+ let a = match getInteger(this, (referAddress + "_GamesPlayedByRef")) {
280+ case a: Int =>
281+ a
282+ case _ =>
283+ throw("Couldn't find games played number by referrals for this address")
284+ }
285+ if ((a > 10000))
286+ then 30
287+ else if ((a > 1000))
288+ then 20
289+ else if ((a > 100))
290+ then 10
291+ else 5
292+ }
293+ let gameIncome = (betAmt - winAmt)
294+ let rewardForThisGame = ((gameIncome * refKoeff) / 100)
295+ (currentRefReward + rewardForThisGame)
296+ }
297+
298+
299+func setNewGamesPlayedNum (address) = {
300+ let valueGamesPlayedNum = getInteger(this, (address + "_GamesPlayed"))
301+ let currentGamesPlayedNum = match valueGamesPlayedNum {
302+ case a: Int =>
303+ a
304+ case _ =>
305+ 0
306+ }
307+ (currentGamesPlayedNum + 1)
308+ }
309+
310+
311+func getCurrentDebt (assetName) = {
312+ let val = getInteger(this, (assetName + "_Debt"))
313+ match val {
314+ case a: Int =>
315+ a
316+ case _ =>
317+ 0
318+ }
319+ }
320+
321+
322+func callerIsDepositOwner (assetName,callerPublicKey) = {
323+ let depositOwner = getString(dividendProgramAddress, (assetName + "_DepositOwner"))
324+ if ((callerPublicKey == depositOwner))
325+ then callerPublicKey
326+ else throw("Only deposit owner can withdrawal deposit")
327+ }
328+
329+
330+func getDepositData (assetName,keySuffix) = {
331+ let key = (assetName + keySuffix)
332+ let val = getInteger(dividendProgramAddress, key)
333+ match val {
334+ case a: Int =>
335+ a
336+ case _ =>
337+ throw("Couldn't find dividend program start height")
338+ }
339+ }
219340
220341
221342 @Callable(i)
222343 func makeBet () = {
223344 let pmt = extract(i.payment)
224345 let betAmount = (pmt.amount - commission)
225346 let assetId = pmt.assetId
226347 let gameId = toBase58String(i.transactionId)
227348 let playerAddress = extract(i.caller)
228349 let pmtAssetName = assetBase58ToName(assetId)
229350 let setReservedBalance = increaseReservedBalance(betAmount, pmtAssetName, pmt.assetId)
230351 let pmtAmtCorrect = pmtAmtCheck(pmtAssetName, betAmount)
231352 if (pmtAmtCorrect)
232353 then {
233354 let dataString = ((((((((stateAcc + "_") + toString(playerAddress)) + "_") + toString(betAmount)) + "_") + pmtAssetName) + "_") + toString(height))
234355 WriteSet([DataEntry((gameId + "_GameId"), dataString), DataEntry((pmtAssetName + "_Reserved"), setReservedBalance)])
235356 }
236357 else throw("assetId is incorrect")
237358 }
238359
239360
240361
241362 @Callable(i)
242363 func playGame (gameId,rsaSign1,rsaSign2,rsaSign3) = {
243364 let dataList = getDataList(gameId)
244365 let gameState = dataList[0]
245- let playerAddress = addressFromStringValue(dataList[1])
366+ let playerAddress = dataList[1]
246367 let betAmt = parseIntValue(dataList[2])
247368 let assetName = dataList[3]
248369 let gameStart = parseIntValue(dataList[4])
249- let assetId58 = AssetNameToBase58(assetName)
370+ let assetId58 = assetNameToBase58(assetName)
250371 let setReservedBalance = decreaseReservedBalance(betAmt, assetName)
251372 let drum1Int = rsaToInt(gameId, rsaSign1, rsaPublicKey1)
252373 let drum2Int = rsaToInt(gameId, rsaSign2, rsaPublicKey2)
253374 let drum3Int = rsaToInt(gameId, rsaSign3, rsaPublicKey3)
254375 let twoInARow = (drum1[drum1Int] + drum2[drum2Int])
255376 let threeInARow = (twoInARow + drum3[drum3Int])
256377 let droppedElementsString = ((drumIntToString(drum1Int) + drumIntToString(drum2Int)) + drumIntToString(drum3Int))
257378 let winAmt = ((betAmt * defineMultiplier(threeInARow, twoInARow)) / 10)
258- let winPmtAmt = {
259- let balance = assetBalance(this, assetId58)
260- if ((winAmt > balance))
261- then (betAmt * 2)
262- else winAmt
263- }
264- let gameTimeCheck = (gameTimeFrame > (height - gameStart))
265- let stateCorrect = (gameState == stateAcc)
266- if (stateCorrect)
267- then if (gameTimeCheck)
379+ let referAddress = getReferAddress(playerAddress)
380+ let referReward = setNewRefReward(referAddress, betAmt, winAmt)
381+ if ((gameState == stateAcc))
382+ then if ((gameTimeFrame > (height - gameStart)))
268383 then if ((winAmt == 0))
269- then WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateLose + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString(winAmt)) + "_") + threeInARow) + "_") + droppedElementsString)), DataEntry((assetName + "_Reserved"), setReservedBalance)])
270- else ScriptResult(WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateWin + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString(winAmt)) + "_") + threeInARow) + "_") + droppedElementsString)), DataEntry((assetName + "_Reserved"), setReservedBalance)]), TransferSet([ScriptTransfer(playerAddress, winPmtAmt, assetId58)]))
271- else ScriptResult(WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateTimeout + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString((betAmt * 2))) + "_") + "000") + "_") + "000000")), DataEntry((assetName + "_Reserved"), setReservedBalance)]), TransferSet([ScriptTransfer(playerAddress, betAmt, assetId58)]))
384+ then {
385+ let availableDividends = {
386+ let dividends = (getCurrentDebt(assetName) + betAmt)
387+ if ((dividends > 0))
388+ then dividends
389+ else 0
390+ }
391+ let debt = {
392+ let dividends = (getCurrentDebt(assetName) + betAmt)
393+ if ((dividends > 0))
394+ then 0
395+ else dividends
396+ }
397+ if ((referAddress == "None"))
398+ then ScriptResult(WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateLose + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString(winAmt)) + "_") + threeInARow) + "_") + droppedElementsString)), DataEntry((assetName + "_Reserved"), setReservedBalance), DataEntry((assetName + "_Debt"), debt), DataEntry((playerAddress + "_GamesPlayed"), setNewGamesPlayedNum(referAddress))]), TransferSet([ScriptTransfer(dividendProgramAddress, availableDividends, assetId58)]))
399+ else ScriptResult(WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateLose + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString(winAmt)) + "_") + threeInARow) + "_") + droppedElementsString)), DataEntry((assetName + "_Reserved"), setReservedBalance), DataEntry((assetName + "_Debt"), debt), DataEntry((referAddress + "_GamesPlayedByRef"), setNewGamesPlayedNum(referAddress)), DataEntry((referAddress + "_ReferReward"), referReward)]), TransferSet([ScriptTransfer(dividendProgramAddress, availableDividends, assetId58)]))
400+ }
401+ else ScriptResult(WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateWin + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString(winAmt)) + "_") + threeInARow) + "_") + droppedElementsString)), DataEntry((assetName + "_Reserved"), setReservedBalance), DataEntry((assetName + "_Debt"), (getCurrentDebt(assetName) - winAmt)), DataEntry((referAddress + "_GamesPlayedByRef"), setNewGamesPlayedNum(referAddress))]), TransferSet([ScriptTransfer(addressFromStringValue(playerAddress), winAmt, assetId58)]))
402+ else ScriptResult(WriteSet([DataEntry((gameId + "_GameId"), ((((((((((((((stateTimeout + "_") + dataList[1]) + "_") + dataList[2]) + "_") + dataList[3]) + "_") + toString(height)) + "_") + toString((betAmt * 2))) + "_") + "000") + "_") + "000000")), DataEntry((assetName + "_Reserved"), setReservedBalance), DataEntry((assetName + "_Debt"), (getCurrentDebt(assetName) - (betAmt * 2))), DataEntry((referAddress + "_GamesPlayedByRef"), setNewGamesPlayedNum(referAddress))]), TransferSet([ScriptTransfer(addressFromStringValue(playerAddress), (betAmt * 2), assetId58)]))
272403 else throw("Game state is incorrect")
273404 }
274405
275406
407+
408+@Callable(i)
409+func withdrawDeposit (assetName) = {
410+ let assetId58 = assetNameToBase58(assetName)
411+ let callerPub = callerIsDepositOwner(assetName, toBase58String(i.callerPublicKey))
412+ let dividendStartHeight = getDepositData(assetName, "_DepositStartBlock")
413+ let depositDuration = getDepositData(assetName, "_DepositDurationBlock")
414+ let depositAmount = getDepositData(assetName, "_DepositAmount")
415+ if (((height - dividendStartHeight) >= depositDuration))
416+ then ScriptResult(WriteSet([DataEntry((assetName + "_DepositWithdrawTransactionId"), i.transactionId)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(callerPub)), depositAmount, assetId58)]))
417+ else throw((("Deposit time is not over. " + toString((height - (dividendStartHeight + depositDuration)))) + " blocks left."))
418+ }
419+
420+
421+
422+@Callable(i)
423+func withdrawRefReward (address,assetName) = {
424+ let assetId58 = assetNameToBase58(assetName)
425+ let rewardAmountChecked = {
426+ let rewardAmount = match getInteger(this, (address + "_ReferReward")) {
427+ case a: Int =>
428+ a
429+ case _ =>
430+ throw("Couldn't find referral reward for this address")
431+ }
432+ let rewardAmountCorrect = if ((assetId58 == wavesId))
433+ then if ((rewardAmount > 100000000))
434+ then true
435+ else false
436+ else if ((assetId58 == btcId))
437+ then if ((rewardAmount > 100000000))
438+ then true
439+ else false
440+ else if ((assetId58 == ethId))
441+ then if ((rewardAmount > 100000000))
442+ then true
443+ else false
444+ else if ((assetId58 == westId))
445+ then if ((rewardAmount > 100000000))
446+ then true
447+ else false
448+ else if ((assetId58 == wctId))
449+ then if ((rewardAmount > 100000000))
450+ then true
451+ else false
452+ else if ((rewardAmount > 100000000))
453+ then true
454+ else false
455+ if (rewardAmountCorrect)
456+ then rewardAmount
457+ else throw("Reward Amount is too low to withdraw")
458+ }
459+ ScriptResult(WriteSet([DataEntry((address + "_ReferReward"), 0)]), TransferSet([ScriptTransfer(addressFromStringValue(address), rewardAmountChecked, assetId58)]))
460+ }
461+
462+
276463 @Verifier(tx)
277-func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
464+func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], gamePublicKey))
278465 then match tx {
279- case ttx: TransferTransaction =>
280- let valueReservedBalance = getInteger(this, "WAVES_Reserved")
281- let reservedBalance = match valueReservedBalance {
282- case a: Int =>
283- a
284- case _ =>
285- 0
286- }
287- let availableBalance = (wavesBalance(this) - reservedBalance)
288- let availibleAmount = (availableBalance >= ttx.amount)
289- availibleAmount
290466 case sstx: SetScriptTransaction =>
291- true
292- case istx: InvokeScriptTransaction =>
293- true
294- case dtx: DataTransaction =>
295467 true
296468 case _ =>
297469 false
298470 }
299471 else false
300472

github/deemru/w8io/3ef1775 
83.52 ms