tx · GNhFL44CgAcuVgymGrDxheB5adkPs1nZBTF845nS8dUx

3MpVunRPnNPuBCtAb95NPY1Q1aNf43a6Gyh:  -0.01400000 Waves

2019.12.24 14:44 [823043] smart account 3MpVunRPnNPuBCtAb95NPY1Q1aNf43a6Gyh > SELF 0.00000000 Waves

{ "type": 13, "id": "GNhFL44CgAcuVgymGrDxheB5adkPs1nZBTF845nS8dUx", "fee": 1400000, "feeAssetId": null, "timestamp": 1577187897555, "version": 1, "sender": "3MpVunRPnNPuBCtAb95NPY1Q1aNf43a6Gyh", "senderPublicKey": "HMJMUXBatArd2SDvjv3YbtdrY2BAsxDEfWhqv8kYH4Kj", "proofs": [ "5o4dbJhm9EtRPTaR3XWuT5kknwFQB4iH1SLKoX6QReRwtPjGuzKnydPjDa4eGaBBzqrZiwqgk7tcoRkHyeXs2oda" ], "script": "base64:AAIDAAAAAAAAABIIARIHCgUIAQEBARIAEgMKAQgAAAAbAAAAAAd3YXZlbGV0AAAAAAAF9eEAAAAAAA93YXZlc0RlcG9zaXRBbXQJAABoAAAAAgAAAAAAAAAKKAUAAAAHd2F2ZWxldAAAAAANYnRjRGVwb3NpdEFtdAkAAGkAAAACCQAAaAAAAAIAAAAAAAAACigFAAAAB3dhdmVsZXQAAAAAAAAAJxAAAAAADWV0aERlcG9zaXRBbXQJAABoAAAAAgAAAAAAAAAADQUAAAAHd2F2ZWxldAAAAAANbHRjRGVwb3NpdEFtdAkAAGgAAAACAAAAAAAAAAAnBQAAAAd3YXZlbGV0AAAAAA53ZXN0RGVwb3NpdEFtdAkAAGgAAAACAAAAAAAAAGWQBQAAAAd3YXZlbGV0AAAAAA13Y3REZXBvc2l0QW10CQAAaAAAAAIAAAAAAAAAZZAFAAAAB3dhdmVsZXQAAAAAEGRpdmlkZW5kc1BlcmNlbnQAAAAAAAAAAB4AAAAAEmRlcG9zaXRTdGFydEhlaWdodAAAAAAAAAAAAQAAAAASRHJhZ29uRnJ1aXRBZGRyZXNzAgAAACMzTXFwNDUzNjF3Q3V0YUtFcU0ya0NiRlptcmtvZFFHdnBVRQAAAAANZGl2UHJvZ3JhbVB1YgkAAlkAAAABAgAAACxITUpNVVhCYXRBcmQyU0R2anYzWWJ0ZHJZMkJBc3hERWZXaHF2OGtZSDRLagAAAAAIYWRtaW5QdWIJAAJZAAAAAQIAAAABMQAAAAAQZGVwb3NpdFRpbWVGcmFtZQkAAGgAAAACCQAAaAAAAAIAAAAAAAAABaAAAAAAAAAAAB4AAAAAAAAAAAYAAAAADHdhdmVzQXNzZXRJZAUAAAAEdW5pdAAAAAAKYnRjQXNzZXRJZAEAAAABAAAAAAAKZXRoQXNzZXRJZAEAAAABAAAAAAAKbHRjQXNzZXRJZAEAAAABAAAAAAALd2VzdEFzc2V0SWQBAAAAAQAAAAAACndjdEFzc2V0SWQBAAAAAQABAAAADWNhbGxlcklzQWRtaW4AAAABAAAAD2NhbGxlclB1YmxpY0tleQMJAAAAAAAAAgUAAAAPY2FsbGVyUHVibGljS2V5BQAAAAhhZG1pblB1YgUAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAGllvdSBjYW5ub3QgY3JlYXRlIGRlcG9zaXRzAQAAABRjYWxsZXJJc0RlcG9zaXRPd25lcgAAAAIAAAAJYXNzZXROYW1lAAAAD2NhbGxlclB1YmxpY0tleQQAAAAMZGVwb3NpdE93bmVyCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXNzZXROYW1lAgAAAA1fRGVwb3NpdE93bmVyAwkAAAAAAAACBQAAAA9jYWxsZXJQdWJsaWNLZXkFAAAADGRlcG9zaXRPd25lcgUAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAK09ubHkgZGVwb3NpdCBvd25lciBjYW4gd2l0aGRyYXdhbCBkaXZpZGVuZHMBAAAAE2RlcG9zaXRDcmVhdGVkQ2hlY2sAAAABAAAACWFzc2V0TmFtZQQAAAADa2V5CQABLAAAAAIFAAAACWFzc2V0TmFtZQIAAAANX0RlcG9zaXRPd25lcgQAAAADdmFsCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQQAAAAHJG1hdGNoMAUAAAADdmFsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAGBwEAAAALYW1vdW50Q2hlY2sAAAACAAAACWFzc2V0TmFtZQAAAAlwbXRBbW91bnQEAAAAA2tleQkAASwAAAACBQAAAAlhc3NldE5hbWUCAAAADl9EZXBvc2l0QW1vdW50BAAAAAN2YWwJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5BAAAAA1kZXBvc2l0QW1vdW50BAAAAAckbWF0Y2gwBQAAAAN2YWwDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAABxDb3VsZG4ndCBmaW5kIGRlcG9zaXQgYW1vdW50AwkAAAAAAAACBQAAAAlwbXRBbW91bnQFAAAADWRlcG9zaXRBbW91bnQFAAAACXBtdEFtb3VudAkAAAIAAAABAgAAABNBbW91bnQgaXMgaW5jb3JyZWN0AQAAABFhc3NldEJhc2U1OFRvTmFtZQAAAAEAAAAHYXNzZXRJZAMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEFAAAAB2Fzc2V0SWQCAAAABVdBVkVTAwkAAAAAAAACBQAAAAdhc3NldElkBQAAAApidGNBc3NldElkAgAAAANCVEMDCQAAAAAAAAIFAAAAB2Fzc2V0SWQFAAAACmV0aEFzc2V0SWQCAAAAA0VUSAMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAKbHRjQXNzZXRJZAIAAAADTFRDAwkAAAAAAAACBQAAAAdhc3NldElkBQAAAAt3ZXN0QXNzZXRJZAIAAAADVlNUAwkAAAAAAAACBQAAAAdhc3NldElkBQAAAAp3Y3RBc3NldElkAgAAAANXQ1QJAAACAAAAAQIAAAAUQXNzZXRJZCBpcyBpbmNvcnJlY3QBAAAAEWFzc2V0TmFtZVRvQmFzZTU4AAAAAQAAAAlhc3NldE5hbWUDCQAAAAAAAAIFAAAACWFzc2V0TmFtZQIAAAAFV0FWRVMFAAAADHdhdmVzQXNzZXRJZAMJAAAAAAAAAgUAAAAJYXNzZXROYW1lAgAAAANCVEMFAAAACmJ0Y0Fzc2V0SWQDCQAAAAAAAAIFAAAACWFzc2V0TmFtZQIAAAADRVRIBQAAAApldGhBc3NldElkAwkAAAAAAAACBQAAAAlhc3NldE5hbWUCAAAAA0xUQwUAAAAKbHRjQXNzZXRJZAMJAAAAAAAAAgUAAAAJYXNzZXROYW1lAgAAAANWU1QFAAAAC3dlc3RBc3NldElkAwkAAAAAAAACBQAAAAlhc3NldE5hbWUCAAAAA1dDVAUAAAAKd2N0QXNzZXRJZAkAAAIAAAABAgAAABdBc3NldCBuYW1lIGlzIGluY29ycmVjdAEAAAAbZ2V0RGl2aWRlbmRzV2l0aGRyYXduQW1vdW50AAAAAQAAAAlhc3NldE5hbWUEAAAAA3ZhbAkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWFzc2V0TmFtZQIAAAATX0RpdmlkZW5kc1dpdGhkcmF3bgQAAAAHJG1hdGNoMAUAAAADdmFsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAABAAAAEmdldERpdmlkZW5kQmFsYW5jZQAAAAIAAAAHYXNzZXRJZAAAABJkaXZpZGVuZHNXaXRoZHJhd24EAAAAFWRpdmlkZW5kc1RvdGFsQmFsYW5jZQkAAGQAAAACCQAD6wAAAAIFAAAABHRoaXMFAAAAB2Fzc2V0SWQFAAAAEmRpdmlkZW5kc1dpdGhkcmF3bgQAAAAJdXNlclN0YWtlCQAAaQAAAAIJAABoAAAAAgUAAAAVZGl2aWRlbmRzVG90YWxCYWxhbmNlBQAAABBkaXZpZGVuZHNQZXJjZW50AAAAAAAAAABkCQAAZQAAAAIFAAAACXVzZXJTdGFrZQUAAAASZGl2aWRlbmRzV2l0aGRyYXduAAAAAwAAAAFpAQAAAA1jcmVhdGVEZXBvc2l0AAAABQAAAAlhc3NldE5hbWUAAAAGYW1vdW50AAAAEGRlaXZpZGVuZFBlcmNlbnQAAAALaGVpZ2h0U3RhcnQAAAAIZHVyYXRpb24EAAAACWNhbGxlclB1YgkBAAAADWNhbGxlcklzQWRtaW4AAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAFWRlcG9zaXRBbHJlYWR5Q3JlYXRlZAkBAAAAE2RlcG9zaXRDcmVhdGVkQ2hlY2sAAAABBQAAAAlhc3NldE5hbWUDBQAAABVkZXBvc2l0QWxyZWFkeUNyZWF0ZWQJAAACAAAAAQIAAAAaRGVwb3NpdCBpcyBhbHJlYWR5IGNyZWF0ZWQJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXNzZXROYW1lAgAAAA1fRGVwb3NpdFN0YXRlAgAAAAdDcmVhdGVkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWFzc2V0TmFtZQIAAAAOX0RlcG9zaXRBbW91bnQFAAAABmFtb3VudAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhc3NldE5hbWUCAAAAEF9EaXZpZGVuZFBlcmNlbnQFAAAAEGRlaXZpZGVuZFBlcmNlbnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXNzZXROYW1lAgAAAA1fRGVwb3NpdFN0YXJ0BQAAAAtoZWlnaHRTdGFydAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhc3NldE5hbWUCAAAAEF9EZXBvc2l0RHVyYXRpb24FAAAACGR1cmF0aW9uBQAAAANuaWwAAAABaQEAAAAHZGVwb3NpdAAAAAAEAAAACWNhbGxlclB1YgkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAA3BtdAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAAlhc3NldE5hbWUJAQAAABFhc3NldEJhc2U1OFRvTmFtZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAQAAAAGYW1vdW50CQEAAAALYW1vdW50Q2hlY2sAAAACBQAAAAlhc3NldE5hbWUIBQAAAANwbXQAAAAGYW1vdW50BAAAAAxkZXBvc2l0U3RhdGUJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAlhc3NldE5hbWUCAAAADV9EZXBvc2l0U3RhdGUDCQAAAAAAAAIFAAAADGRlcG9zaXRTdGF0ZQIAAAAHQ3JlYXRlZAkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXNzZXROYW1lAgAAAA1fRGVwb3NpdE93bmVyBQAAAAljYWxsZXJQdWIJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXNzZXROYW1lAgAAAA1fRGVwb3NpdFN0YXRlAgAAAAZBY3RpdmUFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAEkRyYWdvbkZydWl0QWRkcmVzcwUAAAAGYW1vdW50CAUAAAADcG10AAAAB2Fzc2V0SWQFAAAAA25pbAkAAAIAAAABAgAAABZEZXBvc2l0IGlzIHVuYXZhaWxhYmxlAAAAAWkBAAAAEXdpdGhkcmF3RGl2aWRlbmRzAAAAAQAAAAlhc3NldE5hbWUEAAAAB2Fzc2V0SWQJAQAAABFhc3NldE5hbWVUb0Jhc2U1OAAAAAEFAAAACWFzc2V0TmFtZQQAAAAMZGVwb3NpdE93bmVyCQEAAAAUY2FsbGVySXNEZXBvc2l0T3duZXIAAAACBQAAAAlhc3NldE5hbWUJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAABJkaXZpZGVuZHNXaXRoZHJhd24JAQAAABtnZXREaXZpZGVuZHNXaXRoZHJhd25BbW91bnQAAAABBQAAAAlhc3NldE5hbWUEAAAAEmRpdmlkZW5kc0F2YWxpYWJsZQkBAAAAEmdldERpdmlkZW5kQmFsYW5jZQAAAAIFAAAAB2Fzc2V0SWQFAAAAEmRpdmlkZW5kc1dpdGhkcmF3bgkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAMZGVwb3NpdE93bmVyAgAAABNfRGl2aWRlbmRzV2l0aGRyYXduCQAAZAAAAAIFAAAAEmRpdmlkZW5kc1dpdGhkcmF3bgUAAAASZGl2aWRlbmRzQXZhbGlhYmxlBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAAxkZXBvc2l0T3duZXIFAAAAEmRpdmlkZW5kc0F2YWxpYWJsZQUAAAAHYXNzZXRJZAUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAA1kaXZQcm9ncmFtUHViBAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAUU2V0U2NyaXB0VHJhbnNhY3Rpb24EAAAABHNzdHgFAAAAByRtYXRjaDAGAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABNUcmFuc2ZlclRyYW5zYWN0aW9uBAAAAAN0dHgFAAAAByRtYXRjaDAEAAAACWFzc2V0TmFtZQkBAAAAEWFzc2V0QmFzZTU4VG9OYW1lAAAAAQgFAAAAA3R0eAAAAAdhc3NldElkBAAAABJkaXZpZGVuZHNXaXRoZHJhd24JAQAAABtnZXREaXZpZGVuZHNXaXRoZHJhd25BbW91bnQAAAABBQAAAAlhc3NldE5hbWUEAAAACWRpdmlkZW5kcwkBAAAAEmdldERpdmlkZW5kQmFsYW5jZQAAAAIIBQAAAAN0dHgAAAAHYXNzZXRJZAUAAAASZGl2aWRlbmRzV2l0aGRyYXduBAAAAA5hY2NvdW50QmFsYW5jZQkAA+sAAAACBQAAAAR0aGlzCAUAAAADdHR4AAAAB2Fzc2V0SWQJAABnAAAAAgkAAGUAAAACBQAAAA5hY2NvdW50QmFsYW5jZQgFAAAAA3R0eAAAAAZhbW91bnQFAAAACWRpdmlkZW5kcwcHknBIhg==", "chainId": 84, "height": 823043, "spentComplexity": 0 } View: original | compacted Prev: HBkjtxwToBwT8ZimyXdAdBBEg3cdpJuivQoge9jh2NG8 Next: ENCiWiwWHwCuz3ZP59Ety2FowdweZZp8xLyQkqDQWBTn Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let WavesPub = fromBase58String("47yVx7y7Q9CP9VbAYgns76YMDmxeeGz2REzmVZsBC83g")
4+let wavelet = 100000000
5+
6+let wavesDepositAmt = (2600 * wavelet)
7+
8+let btcDepositAmt = ((2600 * wavelet) / 10000)
9+
10+let ethDepositAmt = (13 * wavelet)
11+
12+let ltcDepositAmt = (39 * wavelet)
13+
14+let westDepositAmt = (26000 * wavelet)
15+
16+let wctDepositAmt = (26000 * wavelet)
17+
18+let dividendsPercent = 30
19+
20+let depositStartHeight = 1
521
622 let DragonFruitAddress = "3Mqp45361wCutaKEqM2kCbFZmrkodQGvpUE"
723
8-let adminPub = fromBase58String("Cm5aPWtA6PufaZS5keg1ZMnDSzEiwkUHCZsTFkdr8YwP")
24+let divProgramPub = fromBase58String("HMJMUXBatArd2SDvjv3YbtdrY2BAsxDEfWhqv8kYH4Kj")
925
10-let ownerPub = fromBase58String("HMJMUXBatArd2SDvjv3YbtdrY2BAsxDEfWhqv8kYH4Kj")
26+let adminPub = fromBase58String("1")
1127
12-let freezingTime = 1
28+let depositTimeFrame = ((1440 * 30) * 6)
1329
1430 let wavesAssetId = unit
1531
2339
2440 let wctAssetId = base58'1'
2541
26-func callerPubIsPredefined (callerPublicKey) = if ((callerPublicKey == WavesPub))
27- then toBase58String(callerPublicKey)
28- else throw("Only predefined public keys can make deposits")
42+func callerIsAdmin (callerPublicKey) = if ((callerPublicKey == adminPub))
43+ then callerPublicKey
44+ else throw("You cannot create deposits")
45+
46+
47+func callerIsDepositOwner (assetName,callerPublicKey) = {
48+ let depositOwner = getString(this, (assetName + "_DepositOwner"))
49+ if ((callerPublicKey == depositOwner))
50+ then callerPublicKey
51+ else throw("Only deposit owner can withdrawal dividends")
52+ }
53+
54+
55+func depositCreatedCheck (assetName) = {
56+ let key = (assetName + "_DepositOwner")
57+ let val = getString(this, key)
58+ match val {
59+ case a: String =>
60+ true
61+ case _ =>
62+ false
63+ }
64+ }
65+
66+
67+func amountCheck (assetName,pmtAmount) = {
68+ let key = (assetName + "_DepositAmount")
69+ let val = getInteger(this, key)
70+ let depositAmount = match val {
71+ case a: Int =>
72+ a
73+ case _ =>
74+ throw("Couldn't find deposit amount")
75+ }
76+ if ((pmtAmount == depositAmount))
77+ then pmtAmount
78+ else throw("Amount is incorrect")
79+ }
2980
3081
3182 func assetBase58ToName (assetId) = if (!(isDefined(assetId)))
58109 else throw("Asset name is incorrect")
59110
60111
61-func setNewDepositAmount (callerPub,pmtAssetId,amount) = {
62- let a = match getInteger(this, (((callerPub + "_") + pmtAssetId) + "_DepositAmount")) {
63- case a: Int =>
64- a
65- case _ =>
66- 0
67- }
68- (a + amount)
69- }
70-
71-
72-func getDividendsBalance (assetId,callerPub,assetName) = {
73- let totalBalance = assetBalance(this, assetId)
74- let depositedBalance = {
75- let key = (((callerPub + "_") + assetName) + "_DepositAmount")
76- let val = getInteger(this, key)
77- match val {
78- case a: Int =>
79- a
80- case _ =>
81- 0
82- }
83- }
84- ((totalBalance - depositedBalance) / 5)
85- }
86-
87-
88-func callerPubCheck (callerPublicKey,pmtAssetId) = {
89- let key = (((callerPublicKey + "_") + pmtAssetId) + "_DepositAmount")
90- let val = getInteger(this, key)
91- match val {
92- case a: Int =>
93- callerPublicKey
94- case _ =>
95- throw("Couldn't find deposit amount for this user")
96- }
97- }
98-
99-
100-func getDepositHeight (callerPub) = {
101- let key = (callerPub + "_DepositHeight")
102- let val = getInteger(this, key)
103- match val {
104- case a: Int =>
105- a
106- case _ =>
107- throw("Couldn't find deposit height")
108- }
109- }
110-
111-
112-func getDepositBalance (callerPub,pmtAssetId) = {
113- let key = (((callerPub + "_") + pmtAssetId) + "_DepositAmount")
114- let val = getInteger(this, key)
115- match val {
116- case a: Int =>
117- a
118- case _ =>
119- throw("Couldn't find deposit balance")
120- }
121- }
122-
123-
124-func getInvestorDividendBalance () = {
125- let key = (toBase58String(WavesPub) + "_DividendBalance")
126- let val = getInteger(this, key)
112+func getDividendsWithdrawnAmount (assetName) = {
113+ let val = getInteger(this, (assetName + "_DividendsWithdrawn"))
127114 match val {
128115 case a: Int =>
129116 a
133120 }
134121
135122
123+func getDividendBalance (assetId,dividendsWithdrawn) = {
124+ let dividendsTotalBalance = (assetBalance(this, assetId) + dividendsWithdrawn)
125+ let userStake = ((dividendsTotalBalance * dividendsPercent) / 100)
126+ (userStake - dividendsWithdrawn)
127+ }
128+
129+
130+@Callable(i)
131+func createDeposit (assetName,amount,deividendPercent,heightStart,duration) = {
132+ let callerPub = callerIsAdmin(i.callerPublicKey)
133+ let depositAlreadyCreated = depositCreatedCheck(assetName)
134+ if (depositAlreadyCreated)
135+ then throw("Deposit is already created")
136+ else WriteSet([DataEntry((assetName + "_DepositState"), "Created"), DataEntry((assetName + "_DepositAmount"), amount), DataEntry((assetName + "_DividendPercent"), deividendPercent), DataEntry((assetName + "_DepositStart"), heightStart), DataEntry((assetName + "_DepositDuration"), duration)])
137+ }
138+
139+
140+
136141 @Callable(i)
137142 func deposit () = {
138- let callerPub = callerPubIsPredefined(i.callerPublicKey)
143+ let callerPub = toBase58String(i.callerPublicKey)
139144 let pmt = extract(i.payment)
140- let amount = pmt.amount
141- let pmtAssetId = assetBase58ToName(pmt.assetId)
142- let callerNewDepositAmount = setNewDepositAmount(callerPub, pmtAssetId, amount)
143- WriteSet([DataEntry((((callerPub + "_") + pmtAssetId) + "_DepositAmount"), callerNewDepositAmount), DataEntry((callerPub + "_DepositHeight"), height)])
145+ let assetName = assetBase58ToName(pmt.assetId)
146+ let amount = amountCheck(assetName, pmt.amount)
147+ let depositState = getString(this, (assetName + "_DepositState"))
148+ if ((depositState == "Created"))
149+ then ScriptResult(WriteSet([DataEntry((assetName + "_DepositOwner"), callerPub), DataEntry((assetName + "_DepositState"), "Active")]), TransferSet([ScriptTransfer(addressFromStringValue(DragonFruitAddress), amount, pmt.assetId)]))
150+ else throw("Deposit is unavailable")
144151 }
145152
146153
148155 @Callable(i)
149156 func withdrawDividends (assetName) = {
150157 let assetId = assetNameToBase58(assetName)
151- let callerPub = callerPubCheck(toBase58String(i.callerPublicKey), assetName)
152- let dividends = getDividendsBalance(assetId, callerPub, assetName)
153- ScriptResult(WriteSet([DataEntry((callerPub + "_DividendBalance"), 0)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(callerPub)), dividends, assetId)]))
154- }
155-
156-
157-
158-@Callable(i)
159-func withdrawDeposit (assetName) = {
160- let pmtAssetId = assetNameToBase58(assetName)
161- let callerPub = callerPubCheck(toBase58String(i.callerPublicKey), assetName)
162- let dAppBalance = assetBalance(this, pmtAssetId)
163- let depositHeight = getDepositHeight(callerPub)
164- let heightDifference = (height - depositHeight)
165- let depositBalance = getDepositBalance(callerPub, assetName)
166- let avaliableBalance = if (((dAppBalance - depositBalance) >= 0))
167- then depositBalance
168- else dAppBalance
169- if ((heightDifference > freezingTime))
170- then ScriptResult(WriteSet([DataEntry((((callerPub + "_") + assetName) + "_DepositAmount"), (depositBalance - avaliableBalance))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(callerPub)), avaliableBalance, pmtAssetId)]))
171- else throw((("Freezing time is not over. " + toString(heightDifference)) + " blocks left"))
172- }
173-
174-
175-
176-@Callable(i)
177-func sendToGameBalance (recipient,amount,assetName) = {
178- let callerPub = if ((i.callerPublicKey == adminPub))
179- then i.callerPublicKey
180- else throw("You cannot send funds to game accounts")
181- let recipientCheck = if ((recipient == DragonFruitAddress))
182- then recipient
183- else throw("Funds can be sent on to defined game addresses")
184- let assetId = assetNameToBase58(assetName)
185- ScriptResult(WriteSet(nil), TransferSet([ScriptTransfer(addressFromStringValue(recipientCheck), amount, assetId)]))
158+ let depositOwner = callerIsDepositOwner(assetName, toBase58String(i.callerPublicKey))
159+ let dividendsWithdrawn = getDividendsWithdrawnAmount(assetName)
160+ let dividendsAvaliable = getDividendBalance(assetId, dividendsWithdrawn)
161+ ScriptResult(WriteSet([DataEntry((depositOwner + "_DividendsWithdrawn"), (dividendsWithdrawn + dividendsAvaliable))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(depositOwner)), dividendsAvaliable, assetId)]))
186162 }
187163
188164
189165 @Verifier(tx)
190-func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], ownerPub))
166+func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], divProgramPub))
191167 then match tx {
192168 case sstx: SetScriptTransaction =>
193169 true
194170 case ttx: TransferTransaction =>
171+ let assetName = assetBase58ToName(ttx.assetId)
172+ let dividendsWithdrawn = getDividendsWithdrawnAmount(assetName)
173+ let dividends = getDividendBalance(ttx.assetId, dividendsWithdrawn)
195174 let accountBalance = assetBalance(this, ttx.assetId)
196- let investorDividendBalance = getInvestorDividendBalance()
197- ((accountBalance - ttx.amount) >= investorDividendBalance)
175+ ((accountBalance - ttx.amount) >= dividends)
198176 case _ =>
199177 false
200178 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let WavesPub = fromBase58String("47yVx7y7Q9CP9VbAYgns76YMDmxeeGz2REzmVZsBC83g")
4+let wavelet = 100000000
5+
6+let wavesDepositAmt = (2600 * wavelet)
7+
8+let btcDepositAmt = ((2600 * wavelet) / 10000)
9+
10+let ethDepositAmt = (13 * wavelet)
11+
12+let ltcDepositAmt = (39 * wavelet)
13+
14+let westDepositAmt = (26000 * wavelet)
15+
16+let wctDepositAmt = (26000 * wavelet)
17+
18+let dividendsPercent = 30
19+
20+let depositStartHeight = 1
521
622 let DragonFruitAddress = "3Mqp45361wCutaKEqM2kCbFZmrkodQGvpUE"
723
8-let adminPub = fromBase58String("Cm5aPWtA6PufaZS5keg1ZMnDSzEiwkUHCZsTFkdr8YwP")
24+let divProgramPub = fromBase58String("HMJMUXBatArd2SDvjv3YbtdrY2BAsxDEfWhqv8kYH4Kj")
925
10-let ownerPub = fromBase58String("HMJMUXBatArd2SDvjv3YbtdrY2BAsxDEfWhqv8kYH4Kj")
26+let adminPub = fromBase58String("1")
1127
12-let freezingTime = 1
28+let depositTimeFrame = ((1440 * 30) * 6)
1329
1430 let wavesAssetId = unit
1531
1632 let btcAssetId = base58'1'
1733
1834 let ethAssetId = base58'1'
1935
2036 let ltcAssetId = base58'1'
2137
2238 let westAssetId = base58'1'
2339
2440 let wctAssetId = base58'1'
2541
26-func callerPubIsPredefined (callerPublicKey) = if ((callerPublicKey == WavesPub))
27- then toBase58String(callerPublicKey)
28- else throw("Only predefined public keys can make deposits")
42+func callerIsAdmin (callerPublicKey) = if ((callerPublicKey == adminPub))
43+ then callerPublicKey
44+ else throw("You cannot create deposits")
45+
46+
47+func callerIsDepositOwner (assetName,callerPublicKey) = {
48+ let depositOwner = getString(this, (assetName + "_DepositOwner"))
49+ if ((callerPublicKey == depositOwner))
50+ then callerPublicKey
51+ else throw("Only deposit owner can withdrawal dividends")
52+ }
53+
54+
55+func depositCreatedCheck (assetName) = {
56+ let key = (assetName + "_DepositOwner")
57+ let val = getString(this, key)
58+ match val {
59+ case a: String =>
60+ true
61+ case _ =>
62+ false
63+ }
64+ }
65+
66+
67+func amountCheck (assetName,pmtAmount) = {
68+ let key = (assetName + "_DepositAmount")
69+ let val = getInteger(this, key)
70+ let depositAmount = match val {
71+ case a: Int =>
72+ a
73+ case _ =>
74+ throw("Couldn't find deposit amount")
75+ }
76+ if ((pmtAmount == depositAmount))
77+ then pmtAmount
78+ else throw("Amount is incorrect")
79+ }
2980
3081
3182 func assetBase58ToName (assetId) = if (!(isDefined(assetId)))
3283 then "WAVES"
3384 else if ((assetId == btcAssetId))
3485 then "BTC"
3586 else if ((assetId == ethAssetId))
3687 then "ETH"
3788 else if ((assetId == ltcAssetId))
3889 then "LTC"
3990 else if ((assetId == westAssetId))
4091 then "VST"
4192 else if ((assetId == wctAssetId))
4293 then "WCT"
4394 else throw("AssetId is incorrect")
4495
4596
4697 func assetNameToBase58 (assetName) = if ((assetName == "WAVES"))
4798 then wavesAssetId
4899 else if ((assetName == "BTC"))
49100 then btcAssetId
50101 else if ((assetName == "ETH"))
51102 then ethAssetId
52103 else if ((assetName == "LTC"))
53104 then ltcAssetId
54105 else if ((assetName == "VST"))
55106 then westAssetId
56107 else if ((assetName == "WCT"))
57108 then wctAssetId
58109 else throw("Asset name is incorrect")
59110
60111
61-func setNewDepositAmount (callerPub,pmtAssetId,amount) = {
62- let a = match getInteger(this, (((callerPub + "_") + pmtAssetId) + "_DepositAmount")) {
63- case a: Int =>
64- a
65- case _ =>
66- 0
67- }
68- (a + amount)
69- }
70-
71-
72-func getDividendsBalance (assetId,callerPub,assetName) = {
73- let totalBalance = assetBalance(this, assetId)
74- let depositedBalance = {
75- let key = (((callerPub + "_") + assetName) + "_DepositAmount")
76- let val = getInteger(this, key)
77- match val {
78- case a: Int =>
79- a
80- case _ =>
81- 0
82- }
83- }
84- ((totalBalance - depositedBalance) / 5)
85- }
86-
87-
88-func callerPubCheck (callerPublicKey,pmtAssetId) = {
89- let key = (((callerPublicKey + "_") + pmtAssetId) + "_DepositAmount")
90- let val = getInteger(this, key)
91- match val {
92- case a: Int =>
93- callerPublicKey
94- case _ =>
95- throw("Couldn't find deposit amount for this user")
96- }
97- }
98-
99-
100-func getDepositHeight (callerPub) = {
101- let key = (callerPub + "_DepositHeight")
102- let val = getInteger(this, key)
103- match val {
104- case a: Int =>
105- a
106- case _ =>
107- throw("Couldn't find deposit height")
108- }
109- }
110-
111-
112-func getDepositBalance (callerPub,pmtAssetId) = {
113- let key = (((callerPub + "_") + pmtAssetId) + "_DepositAmount")
114- let val = getInteger(this, key)
115- match val {
116- case a: Int =>
117- a
118- case _ =>
119- throw("Couldn't find deposit balance")
120- }
121- }
122-
123-
124-func getInvestorDividendBalance () = {
125- let key = (toBase58String(WavesPub) + "_DividendBalance")
126- let val = getInteger(this, key)
112+func getDividendsWithdrawnAmount (assetName) = {
113+ let val = getInteger(this, (assetName + "_DividendsWithdrawn"))
127114 match val {
128115 case a: Int =>
129116 a
130117 case _ =>
131118 0
132119 }
133120 }
134121
135122
123+func getDividendBalance (assetId,dividendsWithdrawn) = {
124+ let dividendsTotalBalance = (assetBalance(this, assetId) + dividendsWithdrawn)
125+ let userStake = ((dividendsTotalBalance * dividendsPercent) / 100)
126+ (userStake - dividendsWithdrawn)
127+ }
128+
129+
130+@Callable(i)
131+func createDeposit (assetName,amount,deividendPercent,heightStart,duration) = {
132+ let callerPub = callerIsAdmin(i.callerPublicKey)
133+ let depositAlreadyCreated = depositCreatedCheck(assetName)
134+ if (depositAlreadyCreated)
135+ then throw("Deposit is already created")
136+ else WriteSet([DataEntry((assetName + "_DepositState"), "Created"), DataEntry((assetName + "_DepositAmount"), amount), DataEntry((assetName + "_DividendPercent"), deividendPercent), DataEntry((assetName + "_DepositStart"), heightStart), DataEntry((assetName + "_DepositDuration"), duration)])
137+ }
138+
139+
140+
136141 @Callable(i)
137142 func deposit () = {
138- let callerPub = callerPubIsPredefined(i.callerPublicKey)
143+ let callerPub = toBase58String(i.callerPublicKey)
139144 let pmt = extract(i.payment)
140- let amount = pmt.amount
141- let pmtAssetId = assetBase58ToName(pmt.assetId)
142- let callerNewDepositAmount = setNewDepositAmount(callerPub, pmtAssetId, amount)
143- WriteSet([DataEntry((((callerPub + "_") + pmtAssetId) + "_DepositAmount"), callerNewDepositAmount), DataEntry((callerPub + "_DepositHeight"), height)])
145+ let assetName = assetBase58ToName(pmt.assetId)
146+ let amount = amountCheck(assetName, pmt.amount)
147+ let depositState = getString(this, (assetName + "_DepositState"))
148+ if ((depositState == "Created"))
149+ then ScriptResult(WriteSet([DataEntry((assetName + "_DepositOwner"), callerPub), DataEntry((assetName + "_DepositState"), "Active")]), TransferSet([ScriptTransfer(addressFromStringValue(DragonFruitAddress), amount, pmt.assetId)]))
150+ else throw("Deposit is unavailable")
144151 }
145152
146153
147154
148155 @Callable(i)
149156 func withdrawDividends (assetName) = {
150157 let assetId = assetNameToBase58(assetName)
151- let callerPub = callerPubCheck(toBase58String(i.callerPublicKey), assetName)
152- let dividends = getDividendsBalance(assetId, callerPub, assetName)
153- ScriptResult(WriteSet([DataEntry((callerPub + "_DividendBalance"), 0)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(callerPub)), dividends, assetId)]))
154- }
155-
156-
157-
158-@Callable(i)
159-func withdrawDeposit (assetName) = {
160- let pmtAssetId = assetNameToBase58(assetName)
161- let callerPub = callerPubCheck(toBase58String(i.callerPublicKey), assetName)
162- let dAppBalance = assetBalance(this, pmtAssetId)
163- let depositHeight = getDepositHeight(callerPub)
164- let heightDifference = (height - depositHeight)
165- let depositBalance = getDepositBalance(callerPub, assetName)
166- let avaliableBalance = if (((dAppBalance - depositBalance) >= 0))
167- then depositBalance
168- else dAppBalance
169- if ((heightDifference > freezingTime))
170- then ScriptResult(WriteSet([DataEntry((((callerPub + "_") + assetName) + "_DepositAmount"), (depositBalance - avaliableBalance))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(callerPub)), avaliableBalance, pmtAssetId)]))
171- else throw((("Freezing time is not over. " + toString(heightDifference)) + " blocks left"))
172- }
173-
174-
175-
176-@Callable(i)
177-func sendToGameBalance (recipient,amount,assetName) = {
178- let callerPub = if ((i.callerPublicKey == adminPub))
179- then i.callerPublicKey
180- else throw("You cannot send funds to game accounts")
181- let recipientCheck = if ((recipient == DragonFruitAddress))
182- then recipient
183- else throw("Funds can be sent on to defined game addresses")
184- let assetId = assetNameToBase58(assetName)
185- ScriptResult(WriteSet(nil), TransferSet([ScriptTransfer(addressFromStringValue(recipientCheck), amount, assetId)]))
158+ let depositOwner = callerIsDepositOwner(assetName, toBase58String(i.callerPublicKey))
159+ let dividendsWithdrawn = getDividendsWithdrawnAmount(assetName)
160+ let dividendsAvaliable = getDividendBalance(assetId, dividendsWithdrawn)
161+ ScriptResult(WriteSet([DataEntry((depositOwner + "_DividendsWithdrawn"), (dividendsWithdrawn + dividendsAvaliable))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(depositOwner)), dividendsAvaliable, assetId)]))
186162 }
187163
188164
189165 @Verifier(tx)
190-func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], ownerPub))
166+func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], divProgramPub))
191167 then match tx {
192168 case sstx: SetScriptTransaction =>
193169 true
194170 case ttx: TransferTransaction =>
171+ let assetName = assetBase58ToName(ttx.assetId)
172+ let dividendsWithdrawn = getDividendsWithdrawnAmount(assetName)
173+ let dividends = getDividendBalance(ttx.assetId, dividendsWithdrawn)
195174 let accountBalance = assetBalance(this, ttx.assetId)
196- let investorDividendBalance = getInvestorDividendBalance()
197- ((accountBalance - ttx.amount) >= investorDividendBalance)
175+ ((accountBalance - ttx.amount) >= dividends)
198176 case _ =>
199177 false
200178 }
201179 else false
202180

github/deemru/w8io/026f985 
44.57 ms