tx · 3WEmqgysufzFTUVPdfqWdQdgsrhhr6kZ6K6TdhzPvP8G

3P4R8Av1KVfby1jWjdEqokGia51jJzTJrNN:  -0.01400000 Waves

2020.08.17 12:12 [2199812] smart account 3P4R8Av1KVfby1jWjdEqokGia51jJzTJrNN > SELF 0.00000000 Waves

{ "type": 13, "id": "3WEmqgysufzFTUVPdfqWdQdgsrhhr6kZ6K6TdhzPvP8G", "fee": 1400000, "feeAssetId": null, "timestamp": 1597655826482, "version": 1, "sender": "3P4R8Av1KVfby1jWjdEqokGia51jJzTJrNN", "senderPublicKey": "4YzSQxjz8tahQ62bgcKLxoh9424EYDiYdZUzUtQVCzks", "proofs": [ "4YQ17PnvZaUXZ8sPNYUDkorNcmzCMQ9MHHBd2GRZQKkLCsaNoiPbtkExCt6Tdk4GLD9czhigivzyayupnPwaE9qq" ], "script": "base64:AAIDAAAAAAAAAAIIAQAAAAAAAAAAAAAAAJK+SnE=", "chainId": 87, "height": 2199812, "spentComplexity": 0 } View: original | compacted Prev: 5zh7AVxtTiyCS5RLyf57UV12Uui4dYASF1r8evW4x9c3 Next: none Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let dragonFruitPub = fromBase58String("2o1waDCX67ArC4iV4WWHa41MHbCKS4na7KWDJmcKNAQ3")
5-
6-let divProgramPub = fromBase58String("4YzSQxjz8tahQ62bgcKLxoh9424EYDiYdZUzUtQVCzks")
7-
8-let adminPub = fromBase58String("BuKYJ7VTkqha8jon5UdXdXMvbuYs1PL89mFJhmfrhsm9")
9-
10-let wavesAssetId = unit
11-
12-let btcAssetId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
13-
14-let ethAssetId = base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu'
15-
16-let ltcAssetId = base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk'
17-
18-let westAssetId = base58'4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8'
19-
20-let wctAssetId = base58'DHgwrRvVyqJsepd32YbBqUeDH4GJ1N984X8QoekjgH8J'
21-
22-let usdtAssetId = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
23-
24-let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
25-
26-func assetNameCheck (assetName) = if ((assetName == "WAVES"))
27- then true
28- else if ((assetName == "BTC"))
29- then true
30- else if ((assetName == "ETH"))
31- then true
32- else if ((assetName == "LTC"))
33- then true
34- else if ((assetName == "WEST"))
35- then true
36- else if ((assetName == "WCT"))
37- then true
38- else if ((assetName == "USDT"))
39- then true
40- else if ((assetName == "USDN"))
41- then true
42- else throw("Incorrect asset name")
434
445
45-func depositOwnerCheck (assetName) = {
46- let val = getString(this, (assetName + "_DepositOwner"))
47- match val {
48- case a: String =>
49- fromBase58String(a)
50- case _ =>
51- throw("Counldn't find deposit owner public key")
52- }
53- }
54-
55-
56-func depositCreatedCheck (assetName) = {
57- let key = (assetName + "_DepositOwner")
58- let val = getString(this, key)
59- match val {
60- case a: String =>
61- true
62- case _ =>
63- false
64- }
65- }
66-
67-
68-func amountCheck (assetName,pmtAmount) = {
69- let key = (assetName + "_DepositAmount")
70- let val = getInteger(this, key)
71- let depositAmount = match val {
72- case a: Int =>
73- a
74- case _ =>
75- throw("Couldn't find deposit amount")
76- }
77- if ((pmtAmount == depositAmount))
78- then pmtAmount
79- else throw("Amount is incorrect")
80- }
81-
82-
83-func assetBase58ToName (assetId) = if (!(isDefined(assetId)))
84- then "WAVES"
85- else if ((assetId == btcAssetId))
86- then "BTC"
87- else if ((assetId == ethAssetId))
88- then "ETH"
89- else if ((assetId == ltcAssetId))
90- then "LTC"
91- else if ((assetId == westAssetId))
92- then "WEST"
93- else if ((assetId == wctAssetId))
94- then "WCT"
95- else if ((assetId == usdtAssetId))
96- then "USDT"
97- else if ((assetId == usdnAssetId))
98- then "USDN"
99- else throw("AssetId is incorrect")
100-
101-
102-func assetNameToBase58 (assetName) = if ((assetName == "WAVES"))
103- then wavesAssetId
104- else if ((assetName == "BTC"))
105- then btcAssetId
106- else if ((assetName == "ETH"))
107- then ethAssetId
108- else if ((assetName == "LTC"))
109- then ltcAssetId
110- else if ((assetName == "WEST"))
111- then westAssetId
112- else if ((assetName == "WCT"))
113- then wctAssetId
114- else if ((assetName == "USDT"))
115- then usdtAssetId
116- else if ((assetName == "USDN"))
117- then usdnAssetId
118- else throw("Asset name is incorrect")
119-
120-
121-func getDividendsPercent (assetName) = {
122- let key = (assetName + "_DividendPercent")
123- let val = getInteger(this, key)
124- match val {
125- case a: Int =>
126- a
127- case _ =>
128- throw("Couldn't Find dividend percent")
129- }
130- }
131-
132-
133-func getDividendsWithdrawnByUser (assetName) = {
134- let val = getInteger(this, (assetName + "_DividendWithdrawnByUser"))
135- match val {
136- case a: Int =>
137- a
138- case _ =>
139- 0
140- }
141- }
142-
143-
144-func getDividendsWithdrawnByAdmin (assetName) = {
145- let val = getInteger(this, (assetName + "_DividendWithdrawnByAdmin"))
146- match val {
147- case a: Int =>
148- a
149- case _ =>
150- 0
151- }
152- }
153-
154-
155-func getTotalDividendBalance (assetId,getDividendsWithdrawnByUser,getDividendsWithdrawnByAdmin) = {
156- let dividendsTotalBalance = ((assetBalance(this, assetId) + getDividendsWithdrawnByUser) + getDividendsWithdrawnByAdmin)
157- dividendsTotalBalance
158- }
159-
160-
161-func getUserDividendBalance (assetId,totalDividendBalance,dividendsWithdrawnByUser,dividendsPercent) = {
162- let stake = ((totalDividendBalance * dividendsPercent) / 100)
163- (stake - dividendsWithdrawnByUser)
164- }
165-
166-
167-func getAdminDividendBalance (assetId,totalDividendBalance,dividendsWithdrawnByAdmin,dividendsPercent) = {
168- let stake = ((totalDividendBalance * (100 - dividendsPercent)) / 100)
169- (stake - dividendsWithdrawnByAdmin)
170- }
171-
172-
173-@Callable(i)
174-func createDeposit (assetName,amount,dividendPercent,startHeight,durationBlocks,startTimestamp) = {
175- let callerIsAdmin = (i.callerPublicKey == adminPub)
176- let assetCorrect = assetNameCheck(assetName)
177- let depositAlreadyCreated = depositCreatedCheck(assetName)
178- if (callerIsAdmin)
179- then if (depositAlreadyCreated)
180- then throw("Deposit is already created")
181- else WriteSet([DataEntry((assetName + "_DepositState"), "Created"), DataEntry((assetName + "_DepositAmount"), amount), DataEntry((assetName + "_DividendPercent"), dividendPercent), DataEntry((assetName + "_DepositStartBlock"), startHeight), DataEntry((assetName + "_DepositStartTimestamp"), startTimestamp), DataEntry((assetName + "_DepositDurationBlock"), durationBlocks)])
182- else throw("Only admin can create deposits")
183- }
184-
185-
186-
187-@Callable(i)
188-func deposit () = {
189- let callerPub = toBase58String(i.callerPublicKey)
190- let pmt = extract(i.payment)
191- let assetName = assetBase58ToName(pmt.assetId)
192- let amount = amountCheck(assetName, pmt.amount)
193- let depositState = getString(this, (assetName + "_DepositState"))
194- if ((depositState == "Created"))
195- then ScriptResult(WriteSet([DataEntry("_Operation", height), DataEntry((assetName + "_DepositOwner"), callerPub), DataEntry((assetName + "_DepositState"), "Active"), DataEntry((assetName + "_DividendWithdrawn"), 0)]), TransferSet([ScriptTransfer(addressFromPublicKey(dragonFruitPub), amount, pmt.assetId)]))
196- else throw("Deposit is unavailable")
197- }
198-
199-
200-
201-@Callable(i)
202-func withdrawDividends (assetName) = {
203- let assetId = assetNameToBase58(assetName)
204- let depositOwner = depositOwnerCheck(assetName)
205- let callerIsDepositOwner = (i.callerPublicKey == depositOwner)
206- let callerIsAdmin = (i.callerPublicKey == adminPub)
207- let dividendsPercent = getDividendsPercent(assetName)
208- let totalDividends = getTotalDividendBalance(assetId, getDividendsWithdrawnByUser(assetName), getDividendsWithdrawnByAdmin(assetName))
209- if (callerIsDepositOwner)
210- then {
211- let dividendsAvaliable = getUserDividendBalance(assetId, totalDividends, getDividendsWithdrawnByUser(assetName), dividendsPercent)
212- if ((dividendsAvaliable > 0))
213- then ScriptResult(WriteSet([DataEntry((assetName + "_DividendWithdrawnByUser"), (getDividendsWithdrawnByUser(assetName) + dividendsAvaliable))]), TransferSet([ScriptTransfer(addressFromPublicKey(depositOwner), dividendsAvaliable, assetId)]))
214- else throw("You have no dividends available")
215- }
216- else if (callerIsAdmin)
217- then {
218- let dividendsAvaliable = getAdminDividendBalance(assetId, totalDividends, getDividendsWithdrawnByAdmin(assetName), dividendsPercent)
219- if ((dividendsAvaliable > 0))
220- then ScriptResult(WriteSet([DataEntry((assetName + "_DividendWithdrawnByAdmin"), (getDividendsWithdrawnByAdmin(assetName) + dividendsAvaliable))]), TransferSet([ScriptTransfer(addressFromPublicKey(adminPub), dividendsAvaliable, assetId)]))
221- else throw("You have no dividends available")
222- }
223- else throw("You have no rights to call this function")
224- }
225-
226-
227-@Verifier(tx)
228-func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], divProgramPub))
229- then match tx {
230- case sstx: SetScriptTransaction =>
231- true
232- case _ =>
233- false
234- }
235- else false
2366

github/deemru/w8io/6500d08 
49.49 ms