tx · 6RZsF65DgtCDhNMdqx7ALk8FrxViNV3WdQcVEpCrftij

3N5NAftzfcw3gAt8nc35bNr9UdPTVgC81fd:  -0.04000000 Waves

2022.07.20 15:53 [2148105] smart account 3N5NAftzfcw3gAt8nc35bNr9UdPTVgC81fd > SELF 0.00000000 Waves

{ "type": 13, "id": "6RZsF65DgtCDhNMdqx7ALk8FrxViNV3WdQcVEpCrftij", "fee": 4000000, "feeAssetId": null, "timestamp": 1658321593000, "version": 1, "sender": "3N5NAftzfcw3gAt8nc35bNr9UdPTVgC81fd", "senderPublicKey": "CdnTmMHxT68Qa4MtHEnAiUhsdKTi2YkHPGn92ThinVNt", "proofs": [ "5c8s5GgFisSH9R1gjooicfgUDu37uFmV48bfb6FsNrWhc1YZeCsdi9Kg3spFxKd1XNSjpddK1ew2WZgaLeu3JSGR", "5mJe9eESuJcYccMJCBsDhdrS3NC8msjDpgp8PJZ7hLdmWgMG8qTucPXqJCWfZZ8UFiZmB4KqC4xac56ec6tzY5sS", "42mQtVTS9hFgy7TbWzyv7RD2F4QT5nM8XzzRYf2CtFygfymmsbiuSBec7AmhAcixiFV5mKBKEfrJjnDgm6wZVx2n" ], "script": "base64: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AAAFAAAAABJiRnVuY0lkeFJlc2VydmVFbmQAAAAAAAAAAAYAAAAAEWJGdW5jSWR4U3VwcGx5RW5kAAAAAAAAAAAHAAAAAA1iRnVuY0lkeEJSRW5kAAAAAAAAAAAIAAAAAAxiRnVuY0lkeFJlc3QAAAAAAAAAAAkAAAAAEmJGdW5jSWR4V2F2ZXNQcmljZQAAAAAAAAAACgAAAAAIUHJpY2VLZXkCAAAABXByaWNlAAAAAA5Oc2J0QXNzZXRJZEtleQIAAAANYm9uZF9hc3NldF9pZAAAAAASTmV1dHJpbm9Bc3NldElkS2V5AgAAABFuZXV0cmlub19hc3NldF9pZAAAAAAOU3VyZkFzc2V0SWRLZXkCAAAADXN1cmZfYXNzZXRfaWQAAAAAEUJhbGFuY2VMb2NrZWRrS2V5AgAAAA1iYWxhbmNlX2xvY2tfAAAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkJAAEsAAAAAgUAAAARQmFsYW5jZUxvY2tlZGtLZXkCAAAABXdhdmVzAAAAABhOZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkJAAEsAAAAAgUAAAARQmFsYW5jZUxvY2tlZGtLZXkCAAAACG5ldXRyaW5vAAAAAA1GaXJzdE9yZGVyS2V5AgAAAAtvcmRlcl9maXJzdAAAAAAPTWF0aENvbnRyYWN0S2V5AgAAAA1tYXRoX2NvbnRyYWN0AAAAABVNaW5XYXZlc0Zvck5zYnRCdXlLZXkCAAAAEm1pbl93YXZlc19uc2J0X2J1eQAAAAAOTWluTnNidFNlbGxLZXkCAAAADW1pbl9uc2J0X3NlbGwAAAAAFU1pbldhdmVzRm9yU3VyZkJ1eUtleQIAAAASbWluX3dhdmVzX3N1cmZfYnV5AAAAABRNaW5Vc2RuRm9yU3VyZkJ1eUtleQIAAAARbWluX3VzZG5fc3VyZl9idXkBAAAAEmdldFJvaUJ5T3JkZXJJZEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAABBkZWJ1Z19vcmRlcl9yb2lfBQAAAAdvcmRlcklkAQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADG9yZGVyX3ByaWNlXwUAAAAHb3JkZXJJZAEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAxvcmRlcl90b3RhbF8FAAAAB29yZGVySWQBAAAAEGdldE9yZGVyT3duZXJLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfb3duZXJfBQAAAAdvcmRlcklkAQAAABFnZXRPcmRlckhlaWdodEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAA1vcmRlcl9oZWlnaHRfBQAAAAdvcmRlcklkAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAA1vcmRlcl9zdGF0dXNfBQAAAAdvcmRlcklkAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAAE29yZGVyX2ZpbGxlZF90b3RhbF8FAAAAB29yZGVySWQBAAAAD2dldFByZXZPcmRlcktleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAtvcmRlcl9wcmV2XwUAAAAHb3JkZXJJZAEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAAC29yZGVyX25leHRfBQAAAAdvcmRlcklkAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABrAAAAAwUAAAAGYW1vdW50BQAAAAVNVUxUOAUAAAAFcHJpY2UBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACAAAABmFtb3VudAAAAAVwcmljZQkAAGsAAAADBQAAAAZhbW91bnQFAAAABXByaWNlBQAAAAVNVUxUOAEAAAAFdG9YMTYAAAACAAAAB29yaWdWYWwAAAANb3JpZ1NjYWxlTXVsdAkAATwAAAADCQABNgAAAAEFAAAAB29yaWdWYWwFAAAAB01VTFRYMTYJAAE2AAAAAQUAAAANb3JpZ1NjYWxlTXVsdAEAAAAHZnJvbVgxNgAAAAIAAAADdmFsAAAAD3Jlc3VsdFNjYWxlTXVsdAkAAaAAAAABCQABPAAAAAMFAAAAA3ZhbAkAATYAAAABBQAAAA9yZXN1bHRTY2FsZU11bHQFAAAAB01VTFRYMTYAAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVTX5YnYYiLrMWyfu8rmkonHDc0g4nCta94AAAAAD2NvbnRyb2xDb250cmFjdAkBAAAAB0FkZHJlc3MAAAABAQAAABoBVCFBmWCv1bHMtRUHYsxdLI5/1uzEtUljoQAAAAATbGlxdWlkYXRpb25Db250cmFjdAkBAAAAB0FkZHJlc3MAAAABAQAAABoBVIU74x8XFOr+m4eGxNcmrGVmBniai3IguQAAAAAMbWF0aENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAAA9NYXRoQ29udHJhY3RLZXkAAAAAD25ldXRyaW5vQXNzZXRJZAEAAAAg93bq9/eDymXbbhPuAjvPWCmVqcHRjfJL2mzYHWKAyN4AAAAAC25zYnRBc3NldElkAQAAACDQtcyxzfaIZM1HKi2M+rz5PsT9DiVMH3RcKTr+nWmhEAAAAAAJaXNCbG9ja2VkCQEAAAAWZ2V0Qm9vbEJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAIAAAAKaXNfYmxvY2tlZAAAAAAVbWluV2F2ZXNBbW91bnROc2J0QnV5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAFU1pbldhdmVzRm9yTnNidEJ1eUtleQAAAAAAO5rKAAAAAAALbWluTnNidFNlbGwJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAOTWluTnNidFNlbGxLZXkAAAAAAAAPQkAAAAAAFW1pbldhdmVzQW1vdW50U3VyZkJ1eQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABVNaW5XYXZlc0ZvclN1cmZCdXlLZXkAAAAAAAX14QAAAAAAFG1pblVzZG5BbW91bnRTdXJmQnV5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAFE1pblVzZG5Gb3JTdXJmQnV5S2V5AAAAAAAAmJaAAAAAAApmaXJzdE9yZGVyCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAAA1GaXJzdE9yZGVyS2V5AQAAAA1nZXRPcmRlclByaWNlAAAAAQAAAAJpZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAEGdldE9yZGVyUHJpY2VLZXkAAAABBQAAAAJpZAEAAAANZ2V0T3JkZXJUb3RhbAAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABBnZXRPcmRlclRvdGFsS2V5AAAAAQUAAAACaWQBAAAADWdldE9yZGVyT3duZXIAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJPd25lcktleQAAAAEFAAAAAmlkAQAAAA5nZXRPcmRlclN0YXR1cwAAAAEAAAACaWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAAAmlkAQAAABNnZXRPcmRlckZpbGxlZFRvdGFsAAAAAQAAAAJpZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAFmdldE9yZGVyRmlsbGVkVG90YWxLZXkAAAABBQAAAAJpZAEAAAAMZ2V0UHJldk9yZGVyAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAD2dldFByZXZPcmRlcktleQAAAAEFAAAAAmlkAQAAAAxnZXROZXh0T3JkZXIAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQUAAAACaWQBAAAAD2dldFJldmVyc2VQcmljZQAAAAEAAAAFcHJpY2UJAABpAAAAAgkAAGgAAAACBQAAAAVNVUxUNgUAAAAFTVVMVDYFAAAABXByaWNlAQAAABZjYWxjTnNidDJXYXZlc1ByaWNlUmF3AAAAAgAAAA1zcGVudFdhdmVzUmF3AAAAD3JlY2VpdmVkTnNidFJhdwkAATwAAAADCQABNgAAAAEFAAAADXNwZW50V2F2ZXNSYXcJAAE2AAAAAQkAAGgAAAACBQAAAAVNVUxUNgUAAAAFTVVMVDYJAAE2AAAAAQUAAAAPcmVjZWl2ZWROc2J0UmF3AQAAAAlvcmRlckRhdGEAAAAIAAAAB29yZGVySWQAAAANdG90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c0Zvck5zYnRCdXkFAAAAA25pbAAAAAFpAQAAAA1jb25zdHJ1Y3RvclYyAAAAAgAAABVtaW5XYXZlc0ZvclN1cmZCdXlLZXkAAAAUbWluVXNkbkZvclN1cmZCdXlLZXkDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAARUGVybWlzc2lvbiBkZW5pZWQEAAAABWlzc3VlCQAEQwAAAAcCAAAABFNVUkYCAAAALFNtYXJ0IFV0aWxpdHkgUmVjYXBpdGFsaXphdGlvbiBGZWF0dXJlIHRva2VuAAAAAAAAAAAAAAAAAAAAAAAGBgUAAAAEdW5pdAAAAAAAAAAAAAQAAAAHYXNzZXRJZAkABDgAAAABBQAAAAVpc3N1ZQkABEwAAAACBQAAAAVpc3N1ZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA5TdXJmQXNzZXRJZEtleQkAAlgAAAABBQAAAAdhc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABVNaW5XYXZlc0ZvclN1cmZCdXlLZXkFAAAAFW1pbldhdmVzRm9yU3VyZkJ1eUtleQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAUTWluVXNkbkZvclN1cmZCdXlLZXkFAAAAFG1pblVzZG5Gb3JTdXJmQnV5S2V5BQAAAANuaWwAAAABaQEAAAAHYnV5TnNidAAAAAAEAAAAA3BtdAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAJcG10QW1vdW50CAUAAAADcG10AAAABmFtb3VudAQAAAAId2F2ZXNQYXkFAAAACXBtdEFtb3VudAMFAAAACWlzQmxvY2tlZAkAAAIAAAABAgAAAFljb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTiBhY3Rpb25zIHVudGlsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQJAAACAAAAAQIAAAASY2FuIHVzZSB3YXZlcyBvbmx5AwkAAGYAAAAC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eQMJAAAAAAAAAgUAAAAKZmlyc3RPcmRlcgUAAAAHb3JkZXJJZAUAAAAJbmV4dE9yZGVyBQAAAApmaXJzdE9yZGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9nZXROZXh0T3JkZXJLZXkAAAABBQAAAAlwcmV2T3JkZXIFAAAACW5leHRPcmRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2V0UHJldk9yZGVyS2V5AAAAAQUAAAAJbmV4dE9yZGVyBQAAAAlwcmV2T3JkZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQUAAAAHb3JkZXJJZAUAAAAIQ0FOQ0VMRUQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAZhbW91bnQFAAAABHVuaXQFAAAAA25pbAAAAAFpAQAAACBtaW5XYXZlc0Ftb3VudE5zYnRCdXlTWVNSRUFET05MWQAAAAAJAAUUAAAAAgUAAAADbmlsBQAAABVtaW5XYXZlc0Ftb3VudE5zYnRCdXkAAAABaQEAAAAfbWluTnNidEFtb3VudEZvclNlbGxTWVNSRUFET05MWQAAAAAJAAUUAAAAAgUAAAADbmlsBQAAAAttaW5Oc2J0U2VsbAAAAAFpAQAAACBtaW5XYXZlc0Ftb3VudFN1cmZCdXlTWVNSRUFET05MWQAAAAAJAAUUAAAAAgUAAAADbmlsBQAAABVtaW5XYXZlc0Ftb3VudFN1cmZCdXkAAAABaQEAAAAfbWluVXNkbkFtb3VudFN1cmZCdXlTWVNSRUFET05MWQAAAAAJAAUUAAAAAgUAAAADbmlsBQAAABRtaW5Vc2RuQW1vdW50U3VyZkJ1eQAAAAFpAQAAAAdidXlTdXJmAAAAAwAAABJhdmVyYWdlUHJpY2VXYW50ZWQAAAAQbWF4VG9sZXJhbmNlUGVyYwAAAAlhdXRvU3Rha2UDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQD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", "chainId": 84, "height": 2148105, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: C4gLMcgjmiKZU6Dw92dqeHpmv9MSRbSUWqN6s9oVLad8 Next: 2Lo8TBcCTixaLpG9K9HNdAaBwkzKiya3gLmPw2JBYaSn Diff:
OldNewDifferences
345345 @Callable(i)
346346 func buySurf (averagePriceWanted,maxTolerancePerc,autoStake) = if ((size(i.payments) != 1))
347347 then throw("exactly 1 payment must be attached")
348- else {
349- let pmt = i.payments[0]
350- let amt = pmt.amount
351- let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
352- if (if ((pmtAssetId != neutrinoAssetId))
353- then (pmtAssetId != WAVESID)
354- else false)
355- then throw("Unsupported payment asset")
356- else if (if ((pmtAssetId == neutrinoAssetId))
357- then (minUsdnAmountSurfBuy > amt)
358- else false)
359- then throw((("min " + toString((minUsdnAmountSurfBuy / MULT6))) + " USDN expected"))
360- else if (if ((pmtAssetId == WAVESID))
361- then (minWavesAmountSurfBuy > amt)
348+ else if ((0 >= averagePriceWanted))
349+ then throw("averagePriceWanted should be positive")
350+ else if ((0 >= maxTolerancePerc))
351+ then throw("maxTolerancePerc should be positive")
352+ else {
353+ let pmt = i.payments[0]
354+ let amt = pmt.amount
355+ let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
356+ if (if ((pmtAssetId != neutrinoAssetId))
357+ then (pmtAssetId != WAVESID)
362358 else false)
363- then throw((("min " + toString((minWavesAmountSurfBuy / MULT8))) + " WAVES expected"))
364- else {
365- let surfResult = asAnyList(invoke(mathContract, "surfFunctionREADONLY", [amt, pmtAssetId], nil))
366- let spentWaves = asInt(surfResult[bFuncIdxWaves])
367- let spentUsdn = asInt(surfResult[bFuncIdxUsdn])
368- let surfAmount = asInt(surfResult[bFuncIdxSurf])
369- let surfAmountX6 = toBigInt(surfAmount)
370- let spentActualX18 = if ((pmtAssetId == WAVESID))
371- then (toBigInt(spentWaves) * MULTX10)
372- else (toBigInt(spentUsdn) * MULTX12)
373- if ((spentActualX18 > ((toBigInt((maxTolerancePerc + MULT6)) * toBigInt(averagePriceWanted)) * surfAmountX6)))
374- then throw((((((("Tolerance " + toString(maxTolerancePerc)) + " exceeded: spent ") + (if ((pmtAssetId == WAVESID))
375- then (toString(spentWaves) + " WAVES")
376- else (toString(spentUsdn) + " USDN"))) + " for ") + toString(surfAmount)) + " SURF"))
359+ then throw("Unsupported payment asset")
360+ else if (if ((pmtAssetId == neutrinoAssetId))
361+ then (minUsdnAmountSurfBuy > amt)
362+ else false)
363+ then throw((("min " + toString((minUsdnAmountSurfBuy / MULT6))) + " USDN expected"))
364+ else if (if ((pmtAssetId == WAVESID))
365+ then (minWavesAmountSurfBuy > amt)
366+ else false)
367+ then throw((("min " + toString((minWavesAmountSurfBuy / MULT8))) + " WAVES expected"))
377368 else {
378- let rest = asInt(surfResult[bFuncIdxRest])
379- let transfer = if ((pmtAssetId == WAVESID))
380- then {
381- let wavesAmt = invoke(neutrinoContract, "acceptWaves", nil, [AttachedPayment(unit, (amt - rest))])
382- if ((wavesAmt == wavesAmt))
383- then if ((rest > 0))
384- then [ScriptTransfer(i.caller, rest, unit)]
385- else nil
386- else throw("Strict value is not equal to itself.")
369+ let surfResult = asAnyList(invoke(mathContract, "surfFunctionREADONLY", [amt, pmtAssetId], nil))
370+ let spentWaves = asInt(surfResult[bFuncIdxWaves])
371+ let spentUsdn = asInt(surfResult[bFuncIdxUsdn])
372+ let surfAmount = asInt(surfResult[bFuncIdxSurf])
373+ let surfAmountX6 = toBigInt(surfAmount)
374+ let spentActualX18 = if ((pmtAssetId == WAVESID))
375+ then (toBigInt(spentWaves) * MULTX10)
376+ else (toBigInt(spentUsdn) * MULTX12)
377+ if ((spentActualX18 > ((toBigInt((maxTolerancePerc + MULT6)) * toBigInt(averagePriceWanted)) * surfAmountX6)))
378+ then throw((((((("Tolerance " + toString(maxTolerancePerc)) + " exceeded: spent ") + (if ((pmtAssetId == WAVESID))
379+ then (toString(spentWaves) + " WAVES")
380+ else (toString(spentUsdn) + " USDN"))) + " for ") + toString(surfAmount)) + " SURF"))
381+ else {
382+ let rest = asInt(surfResult[bFuncIdxRest])
383+ let transfer = if ((pmtAssetId == WAVESID))
384+ then {
385+ let wavesAmt = invoke(neutrinoContract, "acceptWaves", nil, [AttachedPayment(unit, (amt - rest))])
386+ if ((wavesAmt == wavesAmt))
387+ then if ((rest > 0))
388+ then [ScriptTransfer(i.caller, rest, unit)]
389+ else nil
390+ else throw("Strict value is not equal to itself.")
391+ }
392+ else if ((rest > 0))
393+ then [ScriptTransfer(neutrinoContract, (amt - rest), neutrinoAssetId), ScriptTransfer(i.caller, rest, neutrinoAssetId)]
394+ else [ScriptTransfer(neutrinoContract, (amt - rest), neutrinoAssetId)]
395+ let surfAssetId = fromBase58String(getStringValue(SurfAssetIdKey))
396+ (transfer ++ [Reissue(surfAssetId, surfAmount, true), ScriptTransfer(i.caller, surfAmount, surfAssetId), surfData(surfResult)])
387397 }
388- else if ((rest > 0))
389- then [ScriptTransfer(neutrinoContract, (amt - rest), neutrinoAssetId), ScriptTransfer(i.caller, rest, neutrinoAssetId)]
390- else [ScriptTransfer(neutrinoContract, (amt - rest), neutrinoAssetId)]
391- let surfAssetId = fromBase58String(getStringValue(SurfAssetIdKey))
392- (transfer ++ [Reissue(surfAssetId, surfAmount, true), ScriptTransfer(i.caller, surfAmount, surfAssetId), surfData(surfResult)])
393398 }
394- }
395- }
399+ }
396400
397401
398402 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
55
66
77 func getStringByKey (key) = valueOrElse(getString(this, key), "")
88
99
1010 func getBoolByAddressAndKey (address,key) = valueOrElse(getBoolean(address, key), false)
1111
1212
1313 func getStringByAddressAndKey (address,key) = valueOrElse(getString(address, key), "")
1414
1515
1616 func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(address, key), 0)
1717
1818
1919 func asAnyList (val) = match val {
2020 case valAnyLyst: List[Any] =>
2121 valAnyLyst
2222 case _ =>
2323 throw("fail to cast into List[Any]")
2424 }
2525
2626
2727 func asString (val) = match val {
2828 case valStr: String =>
2929 valStr
3030 case _ =>
3131 throw("fail to cast into String")
3232 }
3333
3434
3535 func asInt (val) = match val {
3636 case valInt: Int =>
3737 valInt
3838 case _ =>
3939 throw("fail to cast into Int")
4040 }
4141
4242
4343 let SEP = "__"
4444
4545 let MULT6 = 1000000
4646
4747 let MULT8 = 100000000
4848
4949 let MULTX10 = toBigInt(10000000000)
5050
5151 let MULTX12 = toBigInt(1000000000000)
5252
5353 let MULTX16 = toBigInt(10000000000000000)
5454
5555 let CANCELED = "canceled"
5656
5757 let NEW = "new"
5858
5959 let FILLED = "filled"
6060
6161 let WAVESID = fromBase58String("WAVES")
6262
6363 let nMetricIdxPrice = 0
6464
6565 let nMetricIdxUsdnLockedBalance = 1
6666
6767 let nMetricIdxWavesLockedBalance = 2
6868
6969 let nMetricIdxReserve = 3
7070
7171 let nMetricIdxReserveInUsdn = 4
7272
7373 let nMetricIdxUsdnSupply = 5
7474
7575 let nMetricIdxSurplus = 6
7676
7777 let nMetricIdxSurplusPercent = 7
7878
7979 let nMetricIdxBR = 8
8080
8181 let nMetricIdxNsbtSupply = 9
8282
8383 let nMetricIdxMaxNsbtSupply = 10
8484
8585 let nMetricIdxSurfSupply = 11
8686
8787 let bFuncIdxSurf = 0
8888
8989 let bFuncIdxWaves = 1
9090
9191 let bFuncIdxUsdn = 2
9292
9393 let bFuncIdxReserveStart = 3
9494
9595 let bFuncIdxSupplyStart = 4
9696
9797 let bFuncIdxBRStart = 5
9898
9999 let bFuncIdxReserveEnd = 6
100100
101101 let bFuncIdxSupplyEnd = 7
102102
103103 let bFuncIdxBREnd = 8
104104
105105 let bFuncIdxRest = 9
106106
107107 let bFuncIdxWavesPrice = 10
108108
109109 let PriceKey = "price"
110110
111111 let NsbtAssetIdKey = "bond_asset_id"
112112
113113 let NeutrinoAssetIdKey = "neutrino_asset_id"
114114
115115 let SurfAssetIdKey = "surf_asset_id"
116116
117117 let BalanceLockedkKey = "balance_lock_"
118118
119119 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
120120
121121 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
122122
123123 let FirstOrderKey = "order_first"
124124
125125 let MathContractKey = "math_contract"
126126
127127 let MinWavesForNsbtBuyKey = "min_waves_nsbt_buy"
128128
129129 let MinNsbtSellKey = "min_nsbt_sell"
130130
131131 let MinWavesForSurfBuyKey = "min_waves_surf_buy"
132132
133133 let MinUsdnForSurfBuyKey = "min_usdn_surf_buy"
134134
135135 func getRoiByOrderIdKey (orderId) = ("debug_order_roi_" + orderId)
136136
137137
138138 func getOrderPriceKey (orderId) = ("order_price_" + orderId)
139139
140140
141141 func getOrderTotalKey (orderId) = ("order_total_" + orderId)
142142
143143
144144 func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
145145
146146
147147 func getOrderHeightKey (orderId) = ("order_height_" + orderId)
148148
149149
150150 func getOrderStatusKey (orderId) = ("order_status_" + orderId)
151151
152152
153153 func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
154154
155155
156156 func getPrevOrderKey (orderId) = ("order_prev_" + orderId)
157157
158158
159159 func getNextOrderKey (orderId) = ("order_next_" + orderId)
160160
161161
162162 func convertNeutrinoToWaves (amount,price) = fraction(amount, MULT8, price)
163163
164164
165165 func convertWavesToNeutrino (amount,price) = fraction(amount, price, MULT8)
166166
167167
168168 func toX16 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULTX16, toBigInt(origScaleMult))
169169
170170
171171 func fromX16 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULTX16))
172172
173173
174174 let neutrinoContract = Address(base58'3N9be2mwrA52WJho6DiesZkk4351GvpnWuj')
175175
176176 let controlContract = Address(base58'3MrwvfA9VRYwhHy4NuWPQGdxCtZdhH4LMMa')
177177
178178 let liquidationContract = Address(base58'3N24ZPUAMhFm76N3vbNiiDtFqfUnmBHTc5N')
179179
180180 let mathContract = addressFromStringValue(getStringByKey(MathContractKey))
181181
182182 let neutrinoAssetId = base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
183183
184184 let nsbtAssetId = base58'F3iaxzruFeKujfVfYSZEkejpjh67wmRfPCRHiNmWKp3Z'
185185
186186 let isBlocked = getBoolByAddressAndKey(controlContract, "is_blocked")
187187
188188 let minWavesAmountNsbtBuy = valueOrElse(getInteger(this, MinWavesForNsbtBuyKey), 1000000000)
189189
190190 let minNsbtSell = valueOrElse(getInteger(this, MinNsbtSellKey), 1000000)
191191
192192 let minWavesAmountSurfBuy = valueOrElse(getInteger(this, MinWavesForSurfBuyKey), 100000000)
193193
194194 let minUsdnAmountSurfBuy = valueOrElse(getInteger(this, MinUsdnForSurfBuyKey), 10000000)
195195
196196 let firstOrder = getStringByKey(FirstOrderKey)
197197
198198 func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
199199
200200
201201 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
202202
203203
204204 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
205205
206206
207207 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
208208
209209
210210 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
211211
212212
213213 func getPrevOrder (id) = getStringByKey(getPrevOrderKey(id))
214214
215215
216216 func getNextOrder (id) = getStringByKey(getNextOrderKey(id))
217217
218218
219219 func getReversePrice (price) = ((MULT6 * MULT6) / price)
220220
221221
222222 func calcNsbt2WavesPriceRaw (spentWavesRaw,receivedNsbtRaw) = fraction(toBigInt(spentWavesRaw), toBigInt((MULT6 * MULT6)), toBigInt(receivedNsbtRaw))
223223
224224
225225 func orderData (orderId,totalWavelets,filledWavelets,owner,status,roi,price,currentPrice) = [StringEntry(getOrderPriceKey(orderId), toString(price)), IntegerEntry(getOrderTotalKey(orderId), totalWavelets), IntegerEntry(getOrderFilledTotalKey(orderId), filledWavelets), StringEntry(getOrderOwnerKey(orderId), owner), IntegerEntry(getOrderHeightKey(orderId), height), StringEntry(getOrderStatusKey(orderId), status), IntegerEntry(("debug_order_currentPrice_" + orderId), currentPrice), IntegerEntry(getRoiByOrderIdKey(orderId), roi)]
226226
227227
228228 func toStr (name,curveResult) = (((((((((((((((((((((((((((((((((((name + "[nsbtAmountRaw=") + toString(asInt(curveResult[0]))) + " usdnPayment=") + toString(asInt(curveResult[1]))) + " wRaw=") + toString(asInt(curveResult[2]))) + " uRaw=") + toString(asInt(curveResult[3]))) + " mRaw=") + toString(asInt(curveResult[4]))) + " sRaw=") + toString(asInt(curveResult[5]))) + " nsbtCurveParam_a=") + toString(asInt(curveResult[6]))) + " nsbtCurveParam_b=") + toString(asInt(curveResult[7]))) + " wReservesInUsdn=") + toString(asInt(curveResult[8]))) + " price=") + toString(asInt(curveResult[9]))) + " multBR=") + toString(asInt(curveResult[10]))) + " multPower=") + toString(asInt(curveResult[11]))) + " multExpInPower=") + asString(curveResult[12])) + " multK=") + asString(curveResult[13])) + " step1=") + asString(curveResult[14])) + " step2=") + asString(curveResult[15])) + " step3=") + toString(asInt(curveResult[16]))) + "]")
229229
230230
231231 func surfData (surfResult) = StringEntry("debug_surfResult", makeString(["%d%d%d%d%d%d%d%d%d%d%d", toString(asInt(surfResult[bFuncIdxSurf])), toString(asInt(surfResult[bFuncIdxWaves])), toString(asInt(surfResult[bFuncIdxUsdn])), toString(asInt(surfResult[bFuncIdxReserveStart])), toString(asInt(surfResult[bFuncIdxSupplyStart])), toString(asInt(surfResult[bFuncIdxBRStart])), toString(asInt(surfResult[bFuncIdxReserveEnd])), toString(asInt(surfResult[bFuncIdxSupplyEnd])), toString(asInt(surfResult[bFuncIdxBREnd])), toString(asInt(surfResult[bFuncIdxRest])), toString(asInt(surfResult[bFuncIdxWavesPrice]))], SEP))
232232
233233
234234 @Callable(i)
235235 func constructor (mathContractAddress,minWavesForNsbtBuy,minNsbtSell) = if ((i.caller != this))
236236 then throw("Permission denied")
237237 else [StringEntry(MathContractKey, mathContractAddress), IntegerEntry(MinNsbtSellKey, minNsbtSell), IntegerEntry(MinWavesForNsbtBuyKey, minWavesForNsbtBuy)]
238238
239239
240240
241241 @Callable(i)
242242 func constructorV2 (minWavesForSurfBuyKey,minUsdnForSurfBuyKey) = if ((i.caller != this))
243243 then throw("Permission denied")
244244 else {
245245 let issue = Issue("SURF", "Smart Utility Recapitalization Feature token", 0, 6, true, unit, 0)
246246 let assetId = calculateAssetId(issue)
247247 [issue, StringEntry(SurfAssetIdKey, toBase58String(assetId)), IntegerEntry(MinWavesForSurfBuyKey, minWavesForSurfBuyKey), IntegerEntry(MinUsdnForSurfBuyKey, minUsdnForSurfBuyKey)]
248248 }
249249
250250
251251
252252 @Callable(i)
253253 func buyNsbt () = {
254254 let pmt = value(i.payments[0])
255255 let pmtAmount = pmt.amount
256256 let wavesPay = pmtAmount
257257 if (isBlocked)
258258 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
259259 else if (isDefined(pmt.assetId))
260260 then throw("can use waves only")
261261 else if ((minWavesAmountNsbtBuy > pmtAmount))
262262 then throw((("min " + toString((minWavesAmountNsbtBuy / MULT8))) + " waves expected"))
263263 else {
264264 let ownerAddress = i.caller
265265 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
266266 let currentPrice = asInt(neutrinoMetrics[0])
267267 let curveResult = asAnyList(invoke(mathContract, "curveFunctionREADONLY", [wavesPay], nil))
268268 let nsbtAmount = asInt(curveResult[0])
269269 if ((0 >= nsbtAmount))
270270 then throw("nsbtAmount <= 0")
271271 else {
272272 let nsbt2WavesPriceRaw = calcNsbt2WavesPriceRaw(wavesPay, nsbtAmount)
273273 let roi = 0
274274 let amountLeased = invoke(neutrinoContract, "acceptWaves", nil, i.payments)
275275 if ((amountLeased == amountLeased))
276276 then $Tuple2((orderData(toBase58String(i.transactionId), pmtAmount, pmtAmount, toString(ownerAddress), FILLED, roi, nsbt2WavesPriceRaw, currentPrice) ++ [ScriptTransfer(ownerAddress, nsbtAmount, nsbtAssetId), StringEntry("debug_curveResult", toStr("curveResult", curveResult))]), nsbtAmount)
277277 else throw("Strict value is not equal to itself.")
278278 }
279279 }
280280 }
281281
282282
283283
284284 @Callable(i)
285285 func sellNsbt () = if (isBlocked)
286286 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
287287 else {
288288 let pmt = value(i.payments[0])
289289 let pmtAmount = pmt.amount
290290 if ((pmt.assetId != nsbtAssetId))
291291 then throw("can use NSBT only")
292292 else if ((minNsbtSell > pmtAmount))
293293 then throw((("min " + toString((minNsbtSell / MULT6))) + " nsbt expected"))
294294 else {
295295 let newPrice = asInt(asAnyList(invoke(mathContract, "calcContractNsbtPriceSYSREADONLY", [-(pmtAmount)], nil))[0])
296296 if ((MULT6 > newPrice))
297297 then throw((("resulting nsbt price would be < 1 (" + toString(newPrice)) + " usdn)"))
298298 else {
299299 let transf = invoke(neutrinoContract, "transferUsdnToUser", [pmtAmount, toString(i.caller)], nil)
300300 if ((transf == transf))
301301 then $Tuple2(nil, newPrice)
302302 else throw("Strict value is not equal to itself.")
303303 }
304304 }
305305 }
306306
307307
308308
309309 @Callable(i)
310310 func cancelOrder (orderId) = {
311311 let owner = getOrderOwner(orderId)
312312 let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
313313 let caller = toString(i.caller)
314314 let nextOrder = getNextOrder(orderId)
315315 let prevOrder = getPrevOrder(orderId)
316316 if ((getOrderStatus(orderId) != NEW))
317317 then throw("invalid order status")
318318 else [StringEntry(FirstOrderKey, if ((firstOrder == orderId))
319319 then nextOrder
320320 else firstOrder), StringEntry(getNextOrderKey(prevOrder), nextOrder), StringEntry(getPrevOrderKey(nextOrder), prevOrder), StringEntry(getOrderStatusKey(orderId), CANCELED), ScriptTransfer(i.caller, amount, unit)]
321321 }
322322
323323
324324
325325 @Callable(i)
326326 func minWavesAmountNsbtBuySYSREADONLY () = $Tuple2(nil, minWavesAmountNsbtBuy)
327327
328328
329329
330330 @Callable(i)
331331 func minNsbtAmountForSellSYSREADONLY () = $Tuple2(nil, minNsbtSell)
332332
333333
334334
335335 @Callable(i)
336336 func minWavesAmountSurfBuySYSREADONLY () = $Tuple2(nil, minWavesAmountSurfBuy)
337337
338338
339339
340340 @Callable(i)
341341 func minUsdnAmountSurfBuySYSREADONLY () = $Tuple2(nil, minUsdnAmountSurfBuy)
342342
343343
344344
345345 @Callable(i)
346346 func buySurf (averagePriceWanted,maxTolerancePerc,autoStake) = if ((size(i.payments) != 1))
347347 then throw("exactly 1 payment must be attached")
348- else {
349- let pmt = i.payments[0]
350- let amt = pmt.amount
351- let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
352- if (if ((pmtAssetId != neutrinoAssetId))
353- then (pmtAssetId != WAVESID)
354- else false)
355- then throw("Unsupported payment asset")
356- else if (if ((pmtAssetId == neutrinoAssetId))
357- then (minUsdnAmountSurfBuy > amt)
358- else false)
359- then throw((("min " + toString((minUsdnAmountSurfBuy / MULT6))) + " USDN expected"))
360- else if (if ((pmtAssetId == WAVESID))
361- then (minWavesAmountSurfBuy > amt)
348+ else if ((0 >= averagePriceWanted))
349+ then throw("averagePriceWanted should be positive")
350+ else if ((0 >= maxTolerancePerc))
351+ then throw("maxTolerancePerc should be positive")
352+ else {
353+ let pmt = i.payments[0]
354+ let amt = pmt.amount
355+ let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
356+ if (if ((pmtAssetId != neutrinoAssetId))
357+ then (pmtAssetId != WAVESID)
362358 else false)
363- then throw((("min " + toString((minWavesAmountSurfBuy / MULT8))) + " WAVES expected"))
364- else {
365- let surfResult = asAnyList(invoke(mathContract, "surfFunctionREADONLY", [amt, pmtAssetId], nil))
366- let spentWaves = asInt(surfResult[bFuncIdxWaves])
367- let spentUsdn = asInt(surfResult[bFuncIdxUsdn])
368- let surfAmount = asInt(surfResult[bFuncIdxSurf])
369- let surfAmountX6 = toBigInt(surfAmount)
370- let spentActualX18 = if ((pmtAssetId == WAVESID))
371- then (toBigInt(spentWaves) * MULTX10)
372- else (toBigInt(spentUsdn) * MULTX12)
373- if ((spentActualX18 > ((toBigInt((maxTolerancePerc + MULT6)) * toBigInt(averagePriceWanted)) * surfAmountX6)))
374- then throw((((((("Tolerance " + toString(maxTolerancePerc)) + " exceeded: spent ") + (if ((pmtAssetId == WAVESID))
375- then (toString(spentWaves) + " WAVES")
376- else (toString(spentUsdn) + " USDN"))) + " for ") + toString(surfAmount)) + " SURF"))
359+ then throw("Unsupported payment asset")
360+ else if (if ((pmtAssetId == neutrinoAssetId))
361+ then (minUsdnAmountSurfBuy > amt)
362+ else false)
363+ then throw((("min " + toString((minUsdnAmountSurfBuy / MULT6))) + " USDN expected"))
364+ else if (if ((pmtAssetId == WAVESID))
365+ then (minWavesAmountSurfBuy > amt)
366+ else false)
367+ then throw((("min " + toString((minWavesAmountSurfBuy / MULT8))) + " WAVES expected"))
377368 else {
378- let rest = asInt(surfResult[bFuncIdxRest])
379- let transfer = if ((pmtAssetId == WAVESID))
380- then {
381- let wavesAmt = invoke(neutrinoContract, "acceptWaves", nil, [AttachedPayment(unit, (amt - rest))])
382- if ((wavesAmt == wavesAmt))
383- then if ((rest > 0))
384- then [ScriptTransfer(i.caller, rest, unit)]
385- else nil
386- else throw("Strict value is not equal to itself.")
369+ let surfResult = asAnyList(invoke(mathContract, "surfFunctionREADONLY", [amt, pmtAssetId], nil))
370+ let spentWaves = asInt(surfResult[bFuncIdxWaves])
371+ let spentUsdn = asInt(surfResult[bFuncIdxUsdn])
372+ let surfAmount = asInt(surfResult[bFuncIdxSurf])
373+ let surfAmountX6 = toBigInt(surfAmount)
374+ let spentActualX18 = if ((pmtAssetId == WAVESID))
375+ then (toBigInt(spentWaves) * MULTX10)
376+ else (toBigInt(spentUsdn) * MULTX12)
377+ if ((spentActualX18 > ((toBigInt((maxTolerancePerc + MULT6)) * toBigInt(averagePriceWanted)) * surfAmountX6)))
378+ then throw((((((("Tolerance " + toString(maxTolerancePerc)) + " exceeded: spent ") + (if ((pmtAssetId == WAVESID))
379+ then (toString(spentWaves) + " WAVES")
380+ else (toString(spentUsdn) + " USDN"))) + " for ") + toString(surfAmount)) + " SURF"))
381+ else {
382+ let rest = asInt(surfResult[bFuncIdxRest])
383+ let transfer = if ((pmtAssetId == WAVESID))
384+ then {
385+ let wavesAmt = invoke(neutrinoContract, "acceptWaves", nil, [AttachedPayment(unit, (amt - rest))])
386+ if ((wavesAmt == wavesAmt))
387+ then if ((rest > 0))
388+ then [ScriptTransfer(i.caller, rest, unit)]
389+ else nil
390+ else throw("Strict value is not equal to itself.")
391+ }
392+ else if ((rest > 0))
393+ then [ScriptTransfer(neutrinoContract, (amt - rest), neutrinoAssetId), ScriptTransfer(i.caller, rest, neutrinoAssetId)]
394+ else [ScriptTransfer(neutrinoContract, (amt - rest), neutrinoAssetId)]
395+ let surfAssetId = fromBase58String(getStringValue(SurfAssetIdKey))
396+ (transfer ++ [Reissue(surfAssetId, surfAmount, true), ScriptTransfer(i.caller, surfAmount, surfAssetId), surfData(surfResult)])
387397 }
388- else if ((rest > 0))
389- then [ScriptTransfer(neutrinoContract, (amt - rest), neutrinoAssetId), ScriptTransfer(i.caller, rest, neutrinoAssetId)]
390- else [ScriptTransfer(neutrinoContract, (amt - rest), neutrinoAssetId)]
391- let surfAssetId = fromBase58String(getStringValue(SurfAssetIdKey))
392- (transfer ++ [Reissue(surfAssetId, surfAmount, true), ScriptTransfer(i.caller, surfAmount, surfAssetId), surfData(surfResult)])
393398 }
394- }
395- }
399+ }
396400
397401
398402 @Verifier(tx)
399403 func verify () = {
400404 let pubKeyAdminsListStr = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], SEP)
401405 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
402406 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
403407 then 1
404408 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
405409 then 1
406410 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
407411 then 1
408412 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
409413 then 2
410414 else 0))
411415 (count >= 3)
412416 }
413417

github/deemru/w8io/026f985 
55.44 ms