tx · BhoPGBJt5obnarenQzhtQJR1528zzBvmVg1E4yA4nrcn

3N2MgATULesg3Pbc1z77qNaN92FwMGTrFqv:  -0.01000000 Waves

2019.07.04 14:30 [570621] smart account 3N2MgATULesg3Pbc1z77qNaN92FwMGTrFqv > SELF 0.00000000 Waves

{ "type": 13, "id": "BhoPGBJt5obnarenQzhtQJR1528zzBvmVg1E4yA4nrcn", "fee": 1000000, "feeAssetId": null, "timestamp": 1562239830798, "version": 1, "sender": "3N2MgATULesg3Pbc1z77qNaN92FwMGTrFqv", "senderPublicKey": "HPQmkar9cuDjU4jxJnXro8SR4eBzkeSZquwqzEqMQH3i", "proofs": [ "56pL54B9So8wdzr6MhZfWfeVwLjFP3FispFYf4J3GDojaupSYRCFQ7JRf7HUGkUXw2UJkZB9N9ud2Nc6HswRjcBA" ], "script": "base64:AAIDAAAAAAAAAAAAAAAYAAAAAAxkZXBvc2l0VG9rZW4FAAAABHVuaXQAAAAADmdyYWNlUGVyaW9kS2V5AgAAAAtncmFjZVBlcmlvZAAAAAARaW50ZXJlc3RQZXJpb2RLZXkCAAAADmludGVyZXN0UGVyaW9kAAAAABJyZXZlcnNlTGVuZFJhdGVLZXkCAAAABHJhdGUAAAAADWFzc2V0VG9rZW5LZXkCAAAACmFzc2V0VG9rZW4AAAAACG93bmVyS2V5AgAAAAVvd25lcgAAAAANYmVuZWZjaWFyeUtleQIAAAALYmVuZWZpY2lhcnkBAAAAB3N0YXJ0T2YAAAABAAAABnJlbnRlcgkAASwAAAACAgAAAAlzdGFydF9vZl8FAAAABnJlbnRlcgEAAAANZW5kT2ZGcmVlemVPZgAAAAEAAAAGcmVudGVyCQABLAAAAAICAAAAEWVuZF9vZl9mcmVlemVfb2ZfBQAAAAZyZW50ZXIBAAAABnJhdGVPZgAAAAEAAAAGcmVudGVyCQABLAAAAAICAAAACHJhdGVfb2ZfBQAAAAZyZW50ZXIBAAAACWRlcG9zaXRPZgAAAAEAAAAGcmVudGVyCQABLAAAAAICAAAAC2RlcG9zaXRfb2ZfBQAAAAZyZW50ZXIBAAAACmxlbmRBbW91bnQAAAABAAAABnJlbnRlcgkAASwAAAACAgAAAAhsZW5kX29mXwUAAAAGcmVudGVyAQAAAAxyZWdpc3RlcmVkVHgAAAABAAAABHR4SWQJAAEsAAAAAgIAAAAVcmVnaXN0ZXJlZF9yZXR1cm5fb2ZfBQAAAAR0eElkAAAAAAVvd25lcgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABCQEAAAAFdmFsdWUAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAACG93bmVyS2V5AAAAAAtiZW5lZmljaWFyeQkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABCQEAAAAFdmFsdWUAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAADWJlbmVmY2lhcnlLZXkAAAAACmFzc2V0VG9rZW4JAAJZAAAAAQkBAAAABXZhbHVlAAAAAQkABB0AAAACBQAAAAR0aGlzBQAAAA1hc3NldFRva2VuS2V5AAAAAAtncmFjZVBlcmlvZAkBAAAABXZhbHVlAAAAAQkABBoAAAACBQAAAAR0aGlzBQAAAA5ncmFjZVBlcmlvZEtleQAAAAAOaW50ZXJlc3RQZXJpb2QJAQAAAAV2YWx1ZQAAAAEJAAQaAAAAAgUAAAAEdGhpcwUAAAARaW50ZXJlc3RQZXJpb2RLZXkAAAAAD3JldmVyc2VMZW5kUmF0ZQkBAAAABXZhbHVlAAAAAQkABBoAAAACBQAAAAR0aGlzBQAAABJyZXZlcnNlTGVuZFJhdGVLZXkAAAAAC2luaXRpYWxpemVkCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAR0aGlzBQAAAA1hc3NldFRva2VuS2V5AQAAAAppc0xlbmRPcGVuAAAAAQAAAAZyZW50ZXIEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwkBAAAAB3N0YXJ0T2YAAAABBQAAAAZyZW50ZXIDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABcwUAAAAHJG1hdGNoMAkAAGYAAAACBQAAAAFzAAAAAAAAAAAABwEAAAAHY2xvc2luZwAAAAEAAAAGcmVudGVyCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAHc3RhcnRPZgAAAAEFAAAABnJlbnRlcgAAAAAAAAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAADWVuZE9mRnJlZXplT2YAAAABBQAAAAZyZW50ZXIAAAAAAAAAAAAJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAAAZyYXRlT2YAAAABBQAAAAZyZW50ZXIAAAAAAAAAAAAJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAAAlkZXBvc2l0T2YAAAABBQAAAAZyZW50ZXIAAAAAAAAAAAAJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAAApsZW5kQW1vdW50AAAAAQUAAAAGcmVudGVyAAAAAAAAAAAABQAAAANuaWwBAAAADGNsb3NlRXhwaXJlZAAAAAEAAAAHYWRkcmVzcwQAAAAIbG9hblNpemUJAQAAAAV2YWx1ZQAAAAEJAAQaAAAAAgUAAAAEdGhpcwkBAAAACWRlcG9zaXRPZgAAAAEFAAAAB2FkZHJlc3MJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAHY2xvc2luZwAAAAEFAAAAB2FkZHJlc3MJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALYmVuZWZpY2lhcnkFAAAACGxvYW5TaXplBQAAAAxkZXBvc2l0VG9rZW4FAAAAA25pbAEAAAAEZG9CQgAAAAMAAAAGcmVudGVyAAAADXJldHVybkFzc2V0SWQAAAAJcmV0dXJuQW10BAAAAAlyZW50ZXJTdHIJAAJYAAAAAQgFAAAABnJlbnRlcgAAAAVieXRlcwQAAAAIbGVuZE9wZW4JAQAAAAppc0xlbmRPcGVuAAAAAQUAAAAJcmVudGVyU3RyBAAAABVjb3JyZWN0UmV0cnVybmluZ0Jhc2UJAAAAAAAAAgUAAAANcmV0dXJuQXNzZXRJZAUAAAAKYXNzZXRUb2tlbgQAAAAKbGVudEFtb3VudAkBAAAABXZhbHVlAAAAAQkABBoAAAACBQAAAAR0aGlzCQEAAAAKbGVuZEFtb3VudAAAAAEFAAAACXJlbnRlclN0cgQAAAATY29ycmVjdFJldHVybkFtb3VudAkAAAAAAAACBQAAAApsZW50QW1vdW50BQAAAAlyZXR1cm5BbXQEAAAADmRlcG9zaXRlZFZhbHVlCQEAAAAFdmFsdWUAAAABCQAEGgAAAAIFAAAABHRoaXMJAQAAAAlkZXBvc2l0T2YAAAABBQAAAAlyZW50ZXJTdHIDCQEAAAABIQAAAAEFAAAACGxlbmRPcGVuCQAAAgAAAAECAAAAGE5vIG9wZW4gbGVuZHMgZm9yIGNhbGxlcgMJAQAAAAEhAAAAAQUAAAAVY29ycmVjdFJldHJ1cm5pbmdCYXNlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAF1VzZXIgbXVzdCByZXR1cm4gV0JUQzogCQACWAAAAAEFAAAACmFzc2V0VG9rZW4CAAAADmJ1dCByZWNpZXZpbmc6CQACWAAAAAEFAAAADXJldHVybkFzc2V0SWQDCQEAAAABIQAAAAEFAAAAE2NvcnJlY3RSZXR1cm5BbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAARVXNlciBtdXN0IHJldHVybiAJAAGkAAAAAQUAAAAKbGVudEFtb3VudAIAAAAVIFdCVEMsIGJ1dCByZXR1cm5pbmcgCQABpAAAAAEFAAAACXJldHVybkFtdAQAAAAQcmV0dXJuRnVsbEFtb3VudAkAAGYAAAACCQAAZAAAAAIJAQAAAAV2YWx1ZQAAAAEJAAQaAAAAAgUAAAAEdGhpcwkBAAAAB3N0YXJ0T2YAAAABBQAAAAlyZW50ZXJTdHIFAAAAC2dyYWNlUGVyaW9kBQAAAAZoZWlnaHQEAAAAEGV4cGlyYXRpb25IZWlnaHQJAQAAAAV2YWx1ZQAAAAEJAAQaAAAAAgUAAAAEdGhpcwkBAAAADWVuZE9mRnJlZXplT2YAAAABBQAAAAlyZW50ZXJTdHIEAAAADHJldHVybkFtb3VudAMFAAAAEHJldHVybkZ1bGxBbW91bnQFAAAADmRlcG9zaXRlZFZhbHVlAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAAEGV4cGlyYXRpb25IZWlnaHQJAAACAAAAAQIAAAAVeW91ciBsb2FuIGhhcyBleHBpcmVkCQAAawAAAAMFAAAADmRlcG9zaXRlZFZhbHVlCQAAZQAAAAIFAAAAEGV4cGlyYXRpb25IZWlnaHQFAAAABmhlaWdodAUAAAAOaW50ZXJlc3RQZXJpb2QEAAAAD3RoZVJlc3RPZkFtb3VudAkAAGUAAAACBQAAAA5kZXBvc2l0ZWRWYWx1ZQUAAAAMcmV0dXJuQW1vdW50CQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAAB2Nsb3NpbmcAAAABBQAAAAlyZW50ZXJTdHIJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAGcmVudGVyBQAAAAxyZXR1cm5BbW91bnQFAAAADGRlcG9zaXRUb2tlbgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAtiZW5lZmljaWFyeQUAAAAPdGhlUmVzdE9mQW1vdW50BQAAAAxkZXBvc2l0VG9rZW4FAAAAA25pbAAAAAgAAAABaQEAAAAEaW5pdAAAAAYAAAAFb3duZXIAAAALYmVuZWZpY2lhcnkA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", "chainId": 84, "height": 570621, "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 3 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let depositToken = unit
5+
6+let gracePeriodKey = "gracePeriod"
7+
8+let interestPeriodKey = "interestPeriod"
9+
10+let reverseLendRateKey = "rate"
11+
12+let assetTokenKey = "assetToken"
13+
14+let ownerKey = "owner"
15+
16+let benefciaryKey = "beneficiary"
17+
18+func startOf (renter) = ("start_of_" + renter)
19+
20+
21+func endOfFreezeOf (renter) = ("end_of_freeze_of_" + renter)
22+
23+
24+func rateOf (renter) = ("rate_of_" + renter)
25+
26+
27+func depositOf (renter) = ("deposit_of_" + renter)
28+
29+
30+func lendAmount (renter) = ("lend_of_" + renter)
31+
32+
33+func registeredTx (txId) = ("registered_return_of_" + txId)
34+
35+
36+let owner = addressFromStringValue(value(getString(this, ownerKey)))
37+
38+let beneficiary = addressFromStringValue(value(getString(this, benefciaryKey)))
39+
40+let assetToken = fromBase58String(value(getString(this, assetTokenKey)))
41+
42+let gracePeriod = value(getInteger(this, gracePeriodKey))
43+
44+let interestPeriod = value(getInteger(this, interestPeriodKey))
45+
46+let reverseLendRate = value(getInteger(this, reverseLendRateKey))
47+
48+let initialized = isDefined(getString(this, assetTokenKey))
49+
50+func isLendOpen (renter) = match getInteger(this, startOf(renter)) {
51+ case s: Int =>
52+ (s > 0)
53+ case _ =>
54+ false
55+}
56+
57+
58+func closing (renter) = WriteSet([DataEntry(startOf(renter), 0), DataEntry(endOfFreezeOf(renter), 0), DataEntry(rateOf(renter), 0), DataEntry(depositOf(renter), 0), DataEntry(lendAmount(renter), 0)])
59+
60+
61+func closeExpired (address) = {
62+ let loanSize = value(getInteger(this, depositOf(address)))
63+ ScriptResult(closing(address), TransferSet([ScriptTransfer(beneficiary, loanSize, depositToken)]))
64+ }
65+
66+
67+func doBB (renter,returnAssetId,returnAmt) = {
68+ let renterStr = toBase58String(renter.bytes)
69+ let lendOpen = isLendOpen(renterStr)
70+ let correctRetrurningBase = (returnAssetId == assetToken)
71+ let lentAmount = value(getInteger(this, lendAmount(renterStr)))
72+ let correctReturnAmount = (lentAmount == returnAmt)
73+ let depositedValue = value(getInteger(this, depositOf(renterStr)))
74+ if (!(lendOpen))
75+ then throw("No open lends for caller")
76+ else if (!(correctRetrurningBase))
77+ then throw(((("User must return WBTC: " + toBase58String(assetToken)) + "but recieving:") + toBase58String(returnAssetId)))
78+ else if (!(correctReturnAmount))
79+ then throw(((("User must return " + toString(lentAmount)) + " WBTC, but returning ") + toString(returnAmt)))
80+ else {
81+ let returnFullAmount = ((value(getInteger(this, startOf(renterStr))) + gracePeriod) > height)
82+ let expirationHeight = value(getInteger(this, endOfFreezeOf(renterStr)))
83+ let returnAmount = if (returnFullAmount)
84+ then depositedValue
85+ else if ((height > expirationHeight))
86+ then throw("your loan has expired")
87+ else fraction(depositedValue, (expirationHeight - height), interestPeriod)
88+ let theRestOfAmount = (depositedValue - returnAmount)
89+ ScriptResult(closing(renterStr), TransferSet([ScriptTransfer(renter, returnAmount, depositToken), ScriptTransfer(beneficiary, theRestOfAmount, depositToken)]))
90+ }
91+ }
92+
93+
94+@Callable(i)
95+func init (owner,beneficiary,token,rate,grace,interest) = if ((i.caller == this))
96+ then if (initialized)
97+ then throw("already initialized with token")
98+ else WriteSet([DataEntry(ownerKey, owner), DataEntry(benefciaryKey, beneficiary), DataEntry(assetTokenKey, token), DataEntry(reverseLendRateKey, rate), DataEntry(gracePeriodKey, grace), DataEntry(interestPeriodKey, interest)])
99+ else throw("only dapp itself can init")
100+
101+
102+
103+@Callable(i)
104+func updateRate (rate,grace,interest) = if ((i.caller == owner))
105+ then WriteSet([DataEntry(reverseLendRateKey, rate), DataEntry(gracePeriodKey, grace), DataEntry(interestPeriodKey, interest)])
106+ else throw("only contract owner can set a rate")
107+
108+
109+
110+@Callable(i)
111+func borrow () = {
112+ let renter = toBase58String(i.caller.bytes)
113+ if (isLendOpen(renter))
114+ then throw((renter + " already has an open loan"))
115+ else match i.payment {
116+ case a: AttachedPayment =>
117+ if ((a.assetId == depositToken))
118+ then {
119+ let currentHeight = height
120+ let expirationHeight = ((height + gracePeriod) + interestPeriod)
121+ let rate = reverseLendRate
122+ let depositAmount = a.amount
123+ let assetTokensLent = (a.amount / rate)
124+ let datas = WriteSet([DataEntry(startOf(renter), currentHeight), DataEntry(endOfFreezeOf(renter), expirationHeight), DataEntry(rateOf(renter), rate), DataEntry(depositOf(renter), depositAmount), DataEntry(lendAmount(renter), assetTokensLent)])
125+ ScriptResult(datas, TransferSet([ScriptTransfer(i.caller, assetTokensLent, assetToken)]))
126+ }
127+ else throw(("can only lend WBTC for WAVES, but got " + toBase58String(value(a.assetId))))
128+ case _ =>
129+ throw("payment in assetTokens must be attached")
130+ }
131+ }
132+
133+
134+
135+@Callable(i)
136+func restoreBuyBack (txId) = match transferTransactionById(fromBase58String(txId)) {
137+ case t: TransferTransaction =>
138+ match getBoolean(this, registeredTx(txId)) {
139+ case b: Boolean =>
140+ throw((("Tx id " + txId) + " has already been registered"))
141+ case _ =>
142+ if ((t.recipient != this))
143+ then throw("Can only register payments for this dapp address")
144+ else {
145+ let sr = doBB(t.sender, value(t.assetId), t.amount)
146+ ScriptResult(WriteSet([DataEntry(registeredTx(txId), true), sr.writeSet.data]), sr.transferSet)
147+ }
148+ }
149+ case _: Unit =>
150+ throw("Transaction doesn't exist")
151+ case _ =>
152+ throw()
153+}
154+
155+
156+
157+@Callable(i)
158+func buyBack () = doBB(i.caller, value(value(i.payment).assetId), value(i.payment).amount)
159+
160+
161+
162+@Callable(i)
163+func closeExpiredFor (address) = {
164+ let expiryHeight = value(getInteger(this, endOfFreezeOf(address)))
165+ let loanExpired = (height > expiryHeight)
166+ let ownerCall = (i.caller.bytes == owner.bytes)
167+ if (!(ownerCall))
168+ then throw("Only owner can close expired rent of a user")
169+ else if (!(loanExpired))
170+ then throw(((("Owner can only close expired rents. Expiring on height " + toString(expiryHeight)) + ", current height") + toString(height)))
171+ else closeExpired(address)
172+ }
173+
174+
175+
176+@Callable(i)
177+func discard () = {
178+ let address = toBase58String(i.caller.bytes)
179+ closeExpired(address)
180+ }
181+
182+
183+
184+@Callable(i)
185+func withdraw (amount) = if ((i.caller == owner))
186+ then TransferSet([ScriptTransfer(owner, amount, assetToken)])
187+ else throw("only owner can withdraw WBTC")
188+
189+
190+@Verifier(tx)
191+func verify () = if (!(initialized))
192+ then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
193+ else false
194+

github/deemru/w8io/169f3d6 
20.99 ms