tx · vFXR1tZT3rBZUgMVMwWLGufyjY8EagHxRSBVnzeH9Ne

3PMrcFXJx23B9zbxxUT49z6ET6wF2dKfTdW:  -0.01000000 Waves

2022.01.19 19:52 [2951140] smart account 3PMrcFXJx23B9zbxxUT49z6ET6wF2dKfTdW > SELF 0.00000000 Waves

{ "type": 13, "id": "vFXR1tZT3rBZUgMVMwWLGufyjY8EagHxRSBVnzeH9Ne", "fee": 1000000, "feeAssetId": null, "timestamp": 1642611108553, "version": 1, "sender": "3PMrcFXJx23B9zbxxUT49z6ET6wF2dKfTdW", "senderPublicKey": "DCwRjW98gZsAvKFLyK4sgrn1zwQWLok27vhfYxz4Cok5", "proofs": [ "3tvoPcYu25cuKYfvfZaJ1NSYnkAWLNkVUD3DWYG6WfjyjGWUd3AM22DVYQeA7ioAoNT3BZKCHiuCknTQhH7djX6Z" ], "script": "base64:AAIFAAAAAAAAAB8IAhIAEgMKAQgSBAoCCAgSAwoBCBIECgIIARIDCgEIAAAAIgEAAAAEZ2V0UwAAAAEAAAADa2V5CQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQAAAAALb3JhY2xlU3RvcmUCAAAADW9yYWNsZUFkZHJlc3MAAAAAEm1heWJlT3JhY2xlQWRkcmVzcwQAAAAHJG1hdGNoMAkBAAAABGdldFMAAAABBQAAAAtvcmFjbGVTdG9yZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwCQAEJgAAAAEFAAAAAXMFAAAABHVuaXQAAAAABkhFSUdIVAUAAAAGaGVpZ2h0AQAAAAh3cml0ZUludAAAAAIAAAADa2V5AAAABXZhbHVlAwkAAGYAAAACAAAAAAAAAAAABQAAAAV2YWx1ZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkAAaQAAAABBQAAAAV2YWx1ZQIAAAAJIGZvciBrZXkgBQAAAANrZXkJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAANrZXkFAAAABXZhbHVlAQAAAARnZXRJAAAAAQAAAANrZXkJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AQAAAAhjaGFuZ2VCeQAAAAIAAAADa2V5AAAABXZhbHVlCQEAAAAId3JpdGVJbnQAAAACBQAAAANrZXkJAABkAAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAABGdldEkAAAABBQAAAANrZXkAAAAAAAAAAAAFAAAABXZhbHVlAQAAAA91c2VyU2hhcmVzU3RvcmUAAAABAAAABHVzZXIJAAEsAAAAAgUAAAAEdXNlcgIAAAAHX3NoYXJlcwAAAAARc3Rha2VkSGVpZ2h0U3RvcmUCAAAADHN0YWtlZEhlaWdodAAAAAAQdG90YWxTaGFyZXNTdG9yZQIAAAALdG90YWxTaGFyZXMAAAAAC3N0YWtlZFN0b3JlAgAAAAZzdGFrZWQBAAAAEHdyaXRlQ29uc3RTdHJpbmcAAAACAAAAA2tleQAAAAV2YWx1ZQMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5CQEAAAALU3RyaW5nRW50cnkAAAACBQAAAANrZXkFAAAABXZhbHVlCQAAAgAAAAEJAAEsAAAAAgIAAAAVYWxyZWFkeSBpbml0aWFsaXplZDogBQAAAANrZXkAAAAACmFkbWluU3RvcmUCAAAABWFkbWluAAAAABF2aXJlc0Fzc2V0SWRTdG9yZQIAAAAHYXNzZXRJZAAAAAALbWludGVyU3RvcmUCAAAADHZpcmVzX21pbnRlcgAAAAALY29uZmlnU3RvcmUCAAAABmNvbmZpZwAAAAANY29uZmlnQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAtjb25maWdTdG9yZQIAAAAQbm8gY29uZmlnQWRkcmVzcwIAAAAWaW52YWxpZCBjb25maWcgYWRkcmVzcwAAAAAFUkJhc2UAACOG8m/BAAAAAAAAA2FwcgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAAEHZpcmVzX3N0YWtlcl9hcHICAAAAE25vIHZpcmVzX3N0YWtlcl9hcHIAAAAADWJsb2Nrc1BlclllYXIJAABoAAAAAgkAAGgAAAACAAAAAAAAAAFtAAAAAAAAAAAYAAAAAAAAAAA8AAAAAAlSUGVyQmxvY2sJAABrAAAAAwUAAAADYXByBQAAAAVSQmFzZQkAAGgAAAACAAAAAAAAAAPoBQAAAA1ibG9ja3NQZXJZZWFyAAAAAAt2aXJlc01pbnRlcgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAA1jb25maWdBZGRyZXNzBQAAAAttaW50ZXJTdG9yZQIAAAAcdmlyZXMtc3Rha2VyOiBubyB2aXJlc01pbnRlcgIAAAATaW52YWxpZCB2aXJlc01pbnRlcgAAAAAEbWFpbgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABN2YWx1ZU9yRXJy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YXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQEAAAADHNoYXJlc0Ftb3VudAkBAAAADXZpcmVzVG9TaGFyZXMAAAABBQAAAAZhbW91bnQJAARMAAAAAgkBAAAACHdyaXRlSW50AAAAAgUAAAALc3Rha2VkU3RvcmUJAABkAAAAAgUAAAANY3VycmVudFN0YWtlZAUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAh3cml0ZUludAAAAAIFAAAAEXN0YWtlZEhlaWdodFN0b3JlBQAAAAZIRUlHSFQJAARMAAAAAgkBAAAACGNoYW5nZUJ5AAAAAgUAAAAQdG90YWxTaGFyZXNTdG9yZQUAAAAMc2hhcmVzQW1vdW50CQAETAAAAAIJAQAAAAhjaGFuZ2VCeQAAAAIJAQAAAA91c2VyU2hhcmVzU3RvcmUAAAABBQAAAAR1c2VyBQAAAAxzaGFyZXNBbW91bnQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAMdW5zdGFrZVZpcmVzAAAAAgAAAAR1c2VyAAAAFGFtb3VudFZpcmVzVG9VbnN0YWtlBAAAAAZjaGVja3MDCQEAAAAJdmFsaWRVc2VyAAAAAgUAAAABaQUAAAAEdXNlcgkBAAAACW9wQWxsb3dlZAAAAAECAAAADXVuc3Rha2VfdmlyZXMHAwkAAAAAAAACBQAAAAZjaGVja3MFAAAABmNoZWNrcwQAAAAKdXNlclNoYXJlcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAPdXNlclNoYXJlc1N0b3JlAAAAAQUAAAAEdXNlcgAAAAAAAAAAAAMJAAAAAAAAAgUAAAAKdXNlclNoYXJlcwAAAAAAAAAAAAkAAAIAAAABAgAAABJub3RoaW5nIHRvIHVuc3Rha2UEAAAADG1heEF2YWlsYWJsZQkBAAAADXNoYXJlc1RvVmlyZXMAAAABBQAAAAp1c2VyU2hhcmVzBAAAAAZhbW91bnQDCQAAAAAAAAIFAAAAFGFtb3VudFZpcmVzVG9VbnN0YWtlAP//////////BQAAAAxtYXhBdmFpbGFibGUFAAAAFGFtb3VudFZpcmVzVG9VbnN0YWtlAwkAAGYAAAACAAAAAAAAAAAABQAAAAZhbW91bnQJAAACAAAAAQIAAAAeY2Fubm90IHVuc3Rha2UgbmVnYXRpdmUgYW1vdW50AwkAAGYAAAACBQAAAAZhbW91bnQFAAAADG1heEF2YWlsYWJsZQkAAAIAAAABAgAAACFjYW5ub3QgdW5zdGFrZSBtb3JlIHRoYW4geW91IGhhdmUEAAAADHNoYXJlc0Ftb3VudAkAAZcAAAABCQAETAAAAAIJAQAAAA12aXJlc1RvU2hhcmVzAAAAAQUAAAAGYW1vdW50CQAETAAAAAIFAAAACnVzZXJTaGFyZXMFAAAAA25pbAMJAAAAAAAAAgUAAAAMc2hhcmVzQW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAAF2Nhbm5vdCB1bnN0YWtlIDAgc2hhcmVzCQAETAAAAAIJAQAAAAh3cml0ZUludAAAAAIFAAAAC3N0YWtlZFN0b3JlCQAAZQAAAAIFAAAADWN1cnJlbnRTdGFrZWQFAAAABmFtb3VudAkABEwAAAACCQEAAAAId3JpdGVJbnQAAAACBQAAABFzdGFrZWRIZWlnaHRTdG9yZQUAAAAGSEVJR0hUCQAETAAAAAIJAQAAAAhjaGFuZ2VCeQAAAAIFAAAAEHRvdGFsU2hhcmVzU3RvcmUJAQAAAAEtAAAAAQUAAAAMc2hhcmVzQW1vdW50CQAETAAAAAIJAQAAAAhjaGFuZ2VCeQAAAAIJAQAAAA91c2VyU2hhcmVzU3RvcmUAAAABBQAAAAR1c2VyCQEAAAABLQAAAAEFAAAADHNoYXJlc0Ftb3VudAkABEwAAAACCQEAAAAGcGF5b3V0AAAAAgUAAAAEdXNlcgUAAAAGYW1vdW50BQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAE3Vuc3Rha2VBbGxWaXJlc0Zyb20AAAABAAAABHVzZXIEAAAABmNoZWNrcwMJAAAAAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAARtYWluCQEAAAAJb3BBbGxvd2VkAAAAAQIAAAANdW5zdGFrZV92aXJlcwcDCQAAAAAAAAIFAAAABmNoZWNrcwUAAAAGY2hlY2tzBAAAAAp1c2VyU2hhcmVzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAA91c2VyU2hhcmVzU3RvcmUAAAABBQAAAAR1c2VyAAAAAAAAAAAABAAAAA11bnN0YWtlQW1vdW50CQEAAAANc2hhcmVzVG9WaXJlcwAAAAEFAAAACnVzZXJTaGFyZXMJAAUUAAAAAgkABEwAAAACCQEAAAAId3JpdGVJbnQAAAACBQAAAAtzdGFrZWRTdG9yZQkAAGUAAAACBQAAAA1jdXJyZW50U3Rha2VkBQAAAA11bnN0YWtlQW1vdW50CQAETAAAAAIJAQAAAAh3cml0ZUludAAAAAIFAAAAEXN0YWtlZEhlaWdodFN0b3JlBQAAAAZIRUlHSFQJAARMAAAAAgkBAAAACGNoYW5nZUJ5AAAAAgUAAAAQdG90YWxTaGFyZXNTdG9yZQkBAAAAAS0AAAABBQAAAAp1c2VyU2hhcmVzCQAETAAAAAIJAQAAAAhjaGFuZ2VCeQAAAAIJAQAAAA91c2VyU2hhcmVzU3RvcmUAAAABBQAAAAR1c2VyCQEAAAABLQAAAAEFAAAACnVzZXJTaGFyZXMJAARMAAAAAgkBAAAABnBheW91dAAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAAA11bnN0YWtlQW1vdW50BQAAAANuaWwFAAAADXVuc3Rha2VBbW91bnQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAB6Y254=", "chainId": 87, "height": 2951140, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5CfQCX3Qg1qY4TA6Lub8r8iNVatc1k1bwcyXq9ooifVA Next: E3YLgiJaTSyXvRiTTAwRfpEqpgNV79KsKHAjovfCat1 Diff:
OldNewDifferences
4040 else throw(("already initialized: " + key))
4141
4242
43-let mainStore = "main"
44-
4543 let adminStore = "admin"
4644
4745 let viresAssetIdStore = "assetId"
6058
6159 let RPerBlock = fraction(apr, RBase, (1000 * blocksPerYear))
6260
63-let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, minterStore), "no viresMinter")), "invalid viresMinter")
61+let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, minterStore), "vires-staker: no viresMinter")), "invalid viresMinter")
6462
65-let main = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, mainStore), "no main")), "invalid main")
63+let main = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "main"), "no main")), "invalid main")
6664
6765 let viresIdStr = valueOrErrorMessage(getString(viresMinter, viresAssetIdStore), "vires assetId not found")
6866
7371 else true
7472
7573
76-func viresPaymentOnly (i) = throwIf(if (if ((i.payments[0].assetId != viresAssetId))
77- then true
78- else (0 >= i.payments[0].amount))
79- then true
80- else (size(i.payments) != 1), "staking only vires")
74+func viresPaymentOnly (i) = if (throwIf((0 >= i.payments[0].amount), "staking zero amount"))
75+ then throwIf(if ((i.payments[0].assetId != viresAssetId))
76+ then true
77+ else (size(i.payments) != 1), "staking only vires")
78+ else false
8179
8280
8381 func validUser (i,user) = match addressFromString(user) {
8482 case a: Address =>
85- if ((i.caller == main))
83+ if (if ((i.caller == main))
84+ then true
85+ else (toString(i.caller) == user))
8686 then true
8787 else if ((i.caller != a))
8888 then throw("only main can do on users behalf")
116116 }
117117
118118
119-func payout (user,amount) = {
119+func ensureViresBalance (amount) = {
120120 let viresBalance = assetBalance(this, viresAssetId)
121121 if ((amount > viresBalance))
122122 then {
123123 let mint = invoke(viresMinter, "stakerMint", [toString(this), (amount - viresBalance)], nil)
124124 if ((mint == mint))
125- then ScriptTransfer(addressFromStringValue(user), amount, viresAssetId)
125+ then nil
126126 else throw("Strict value is not equal to itself.")
127127 }
128- else ScriptTransfer(addressFromStringValue(user), amount, viresAssetId)
128+ else nil
129+ }
130+
131+
132+func payout (user,amount) = {
133+ let ensure = ensureViresBalance(amount)
134+ if ((ensure == ensure))
135+ then ScriptTransfer(addressFromStringValue(user), amount, viresAssetId)
136+ else throw("Strict value is not equal to itself.")
129137 }
130138
131139
211219 }
212220
213221
222+
223+@Callable(i)
224+func unstakeAllViresFrom (user) = {
225+ let checks = if ((i.caller == main))
226+ then opAllowed("unstake_vires")
227+ else false
228+ if ((checks == checks))
229+ then {
230+ let userShares = valueOrElse(getInteger(this, userSharesStore(user)), 0)
231+ let unstakeAmount = sharesToVires(userShares)
232+ $Tuple2([writeInt(stakedStore, (currentStaked - unstakeAmount)), writeInt(stakedHeightStore, HEIGHT), changeBy(totalSharesStore, -(userShares)), changeBy(userSharesStore(user), -(userShares)), payout(toString(i.caller), unstakeAmount)], unstakeAmount)
233+ }
234+ else throw("Strict value is not equal to itself.")
235+ }
236+
237+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getS (key) = getString(this, key)
55
66
77 let oracleStore = "oracleAddress"
88
99 let maybeOracleAddress = match getS(oracleStore) {
1010 case s: String =>
1111 addressFromString(s)
1212 case _ =>
1313 unit
1414 }
1515
1616 let HEIGHT = height
1717
1818 func writeInt (key,value) = if ((0 > value))
1919 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
2020 else IntegerEntry(key, value)
2121
2222
2323 func getI (key) = getInteger(this, key)
2424
2525
2626 func changeBy (key,value) = writeInt(key, (valueOrElse(getI(key), 0) + value))
2727
2828
2929 func userSharesStore (user) = (user + "_shares")
3030
3131
3232 let stakedHeightStore = "stakedHeight"
3333
3434 let totalSharesStore = "totalShares"
3535
3636 let stakedStore = "staked"
3737
3838 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
3939 then StringEntry(key, value)
4040 else throw(("already initialized: " + key))
4141
4242
43-let mainStore = "main"
44-
4543 let adminStore = "admin"
4644
4745 let viresAssetIdStore = "assetId"
4846
4947 let minterStore = "vires_minter"
5048
5149 let configStore = "config"
5250
5351 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configStore), "no configAddress")), "invalid config address")
5452
5553 let RBase = 10000000000000000
5654
5755 let apr = valueOrErrorMessage(getInteger(configAddress, "vires_staker_apr"), "no vires_staker_apr")
5856
5957 let blocksPerYear = ((365 * 24) * 60)
6058
6159 let RPerBlock = fraction(apr, RBase, (1000 * blocksPerYear))
6260
63-let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, minterStore), "no viresMinter")), "invalid viresMinter")
61+let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, minterStore), "vires-staker: no viresMinter")), "invalid viresMinter")
6462
65-let main = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, mainStore), "no main")), "invalid main")
63+let main = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "main"), "no main")), "invalid main")
6664
6765 let viresIdStr = valueOrErrorMessage(getString(viresMinter, viresAssetIdStore), "vires assetId not found")
6866
6967 let viresAssetId = valueOrErrorMessage(fromBase58String(viresIdStr), "invalid vires assetId")
7068
7169 func throwIf (condition,error) = if (condition)
7270 then throw(error)
7371 else true
7472
7573
76-func viresPaymentOnly (i) = throwIf(if (if ((i.payments[0].assetId != viresAssetId))
77- then true
78- else (0 >= i.payments[0].amount))
79- then true
80- else (size(i.payments) != 1), "staking only vires")
74+func viresPaymentOnly (i) = if (throwIf((0 >= i.payments[0].amount), "staking zero amount"))
75+ then throwIf(if ((i.payments[0].assetId != viresAssetId))
76+ then true
77+ else (size(i.payments) != 1), "staking only vires")
78+ else false
8179
8280
8381 func validUser (i,user) = match addressFromString(user) {
8482 case a: Address =>
85- if ((i.caller == main))
83+ if (if ((i.caller == main))
84+ then true
85+ else (toString(i.caller) == user))
8686 then true
8787 else if ((i.caller != a))
8888 then throw("only main can do on users behalf")
8989 else true
9090 case _ =>
9191 throw("invalid user")
9292 }
9393
9494
9595 let currentStaked = {
9696 let stakedHeight = valueOrElse(getInteger(this, stakedHeightStore), 0)
9797 let staked = valueOrElse(getInteger(this, stakedStore), 0)
9898 let d = (HEIGHT - stakedHeight)
9999 let r = (RBase + (d * RPerBlock))
100100 fraction(staked, r, RBase)
101101 }
102102
103103 func viresToShares (viresAmount) = {
104104 let totalShares = valueOrElse(getInteger(this, totalSharesStore), 0)
105105 if ((totalShares == 0))
106106 then viresAmount
107107 else fraction(viresAmount, totalShares, currentStaked)
108108 }
109109
110110
111111 func sharesToVires (sharesAmount) = {
112112 let totalShares = valueOrElse(getInteger(this, totalSharesStore), 0)
113113 if ((totalShares == 0))
114114 then sharesAmount
115115 else fraction(sharesAmount, currentStaked, totalShares)
116116 }
117117
118118
119-func payout (user,amount) = {
119+func ensureViresBalance (amount) = {
120120 let viresBalance = assetBalance(this, viresAssetId)
121121 if ((amount > viresBalance))
122122 then {
123123 let mint = invoke(viresMinter, "stakerMint", [toString(this), (amount - viresBalance)], nil)
124124 if ((mint == mint))
125- then ScriptTransfer(addressFromStringValue(user), amount, viresAssetId)
125+ then nil
126126 else throw("Strict value is not equal to itself.")
127127 }
128- else ScriptTransfer(addressFromStringValue(user), amount, viresAssetId)
128+ else nil
129+ }
130+
131+
132+func payout (user,amount) = {
133+ let ensure = ensureViresBalance(amount)
134+ if ((ensure == ensure))
135+ then ScriptTransfer(addressFromStringValue(user), amount, viresAssetId)
136+ else throw("Strict value is not equal to itself.")
129137 }
130138
131139
132140 func opAllowed (op) = match invoke(configAddress, "opAllowed", [viresIdStr, op], nil) {
133141 case b: Boolean =>
134142 if (b)
135143 then true
136144 else throw("not allowed")
137145 case _ =>
138146 throw("opAllowed: unexpected result type")
139147 }
140148
141149
142150 @Callable(i)
143151 func advise () = {
144152 let totalShares = valueOrElse(getInteger(this, totalSharesStore), 0)
145153 let totalStaked = sharesToVires(totalShares)
146154 $Tuple2(nil, ("totalStaked: " + toString(totalStaked)))
147155 }
148156
149157
150158
151159 @Callable(i)
152160 func adviseUser (user) = {
153161 let userShares = valueOrElse(getInteger(this, userSharesStore(user)), 0)
154162 let available = sharesToVires(userShares)
155163 $Tuple2(nil, ((("viresStakedShares: " + toString(userShares)) + ", viresStaked: ") + toString(available)))
156164 }
157165
158166
159167
160168 @Callable(i)
161169 func init (configAddress,oracleAddr) = [StringEntry(oracleStore, oracleAddr), writeConstString(adminStore, toString(i.caller)), writeConstString(configStore, configAddress)]
162170
163171
164172
165173 @Callable(i)
166174 func stakeVires (user) = {
167175 let checks = if (if (viresPaymentOnly(i))
168176 then validUser(i, user)
169177 else false)
170178 then opAllowed("stake_vires")
171179 else false
172180 if ((checks == checks))
173181 then {
174182 let amount = i.payments[0].amount
175183 let sharesAmount = viresToShares(amount)
176184 [writeInt(stakedStore, (currentStaked + amount)), writeInt(stakedHeightStore, HEIGHT), changeBy(totalSharesStore, sharesAmount), changeBy(userSharesStore(user), sharesAmount)]
177185 }
178186 else throw("Strict value is not equal to itself.")
179187 }
180188
181189
182190
183191 @Callable(i)
184192 func unstakeVires (user,amountViresToUnstake) = {
185193 let checks = if (validUser(i, user))
186194 then opAllowed("unstake_vires")
187195 else false
188196 if ((checks == checks))
189197 then {
190198 let userShares = valueOrElse(getInteger(this, userSharesStore(user)), 0)
191199 if ((userShares == 0))
192200 then throw("nothing to unstake")
193201 else {
194202 let maxAvailable = sharesToVires(userShares)
195203 let amount = if ((amountViresToUnstake == -1))
196204 then maxAvailable
197205 else amountViresToUnstake
198206 if ((0 > amount))
199207 then throw("cannot unstake negative amount")
200208 else if ((amount > maxAvailable))
201209 then throw("cannot unstake more than you have")
202210 else {
203211 let sharesAmount = min([viresToShares(amount), userShares])
204212 if ((sharesAmount == 0))
205213 then throw("cannot unstake 0 shares")
206214 else [writeInt(stakedStore, (currentStaked - amount)), writeInt(stakedHeightStore, HEIGHT), changeBy(totalSharesStore, -(sharesAmount)), changeBy(userSharesStore(user), -(sharesAmount)), payout(user, amount)]
207215 }
208216 }
209217 }
210218 else throw("Strict value is not equal to itself.")
211219 }
212220
213221
222+
223+@Callable(i)
224+func unstakeAllViresFrom (user) = {
225+ let checks = if ((i.caller == main))
226+ then opAllowed("unstake_vires")
227+ else false
228+ if ((checks == checks))
229+ then {
230+ let userShares = valueOrElse(getInteger(this, userSharesStore(user)), 0)
231+ let unstakeAmount = sharesToVires(userShares)
232+ $Tuple2([writeInt(stakedStore, (currentStaked - unstakeAmount)), writeInt(stakedHeightStore, HEIGHT), changeBy(totalSharesStore, -(userShares)), changeBy(userSharesStore(user), -(userShares)), payout(toString(i.caller), unstakeAmount)], unstakeAmount)
233+ }
234+ else throw("Strict value is not equal to itself.")
235+ }
236+
237+

github/deemru/w8io/6500d08 
42.84 ms