tx · DjSaU8Kn5D9yH2J6vmbq7XyH2DnLzQawu1oxq7JLT5Dc 3PPdeWwrzaxqgr6BuReoF3sWfxW8SYv743D: -0.01000000 Waves 2021.12.28 17:36 [2919274] smart account 3PPdeWwrzaxqgr6BuReoF3sWfxW8SYv743D > SELF 0.00000000 Waves
{ "type": 13, "id": "DjSaU8Kn5D9yH2J6vmbq7XyH2DnLzQawu1oxq7JLT5Dc", "fee": 1000000, "feeAssetId": null, "timestamp": 1640702116312, "version": 1, "sender": "3PPdeWwrzaxqgr6BuReoF3sWfxW8SYv743D", "senderPublicKey": "C3fFhhdansbg2NWwzu6z87qa7RTEYVqqFHbmzz7mBcok", "proofs": [ "3BiGTDqow6DbqNoi7Hkn4NFE5GvYvw8fb7dUMz7z42wWbLymH2CszdvtQ3g1t91qLcqjxmQG6bCD7i5QosdQMhBG" ], "script": "base64:AAIFAAAAAAAAAIsIAhIAEgMKAQgSBAoCCAgSABIDCgEIEgASABIDCgEBEgASCAoGCAgICAgBEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBARIDCgEIEgQKAggEEgQKAggBEgMKAQgSBAoCCAESBAoCCAESAwoBCBIFCgMICAESBQoDCAgBEgMKAQgSABIDCgEIEgQKAggBAAAAWQEAAAAEZ2V0SQAAAAEAAAADa2V5CQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQEAAAAEZ2V0UwAAAAEAAAADa2V5CQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQEAAAAFZ2V0U1YAAAABAAAAA2tleQkBAAAABXZhbHVlAAAAAQkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkBAAAAB3Rocm93SWYAAAACAAAACWNvbmRpdGlvbgAAAAVlcnJvcgMFAAAACWNvbmRpdGlvbgkAAAIAAAABBQAAAAVlcnJvcgYBAAAACHdyaXRlSW50AAAAAgAAAANrZXkAAAAFdmFsdWUDCQAAZgAAAAIAAAAAAAAAAAAFAAAABXZhbHVlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAF3dyaXRpbmcgbmVnYXRpdmUgdmFsdWUgCQABpAAAAAEFAAAABXZhbHVlAgAAAAkgZm9yIGtleSAFAAAAA2tleQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUBAAAACGNoYW5nZUJ5AAAAAgAAAANrZXkAAAAFdmFsdWUJAQAAAAh3cml0ZUludAAAAAIFAAAAA2tleQkAAGQAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAAEZ2V0SQAAAAEFAAAAA2tleQAAAAAAAAAAAAUAAAAFdmFsdWUBAAAAC3dyaXRlU3RyaW5nAAAAAgAAAANrZXkAAAAFdmFsdWUJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUBAAAADGZyYWN0aW9uQ2VpbAAAAAMAAAAFdmFsdWUAAAAJbnVtZXJhdG9yAAAAC2Rlbm9taW5hdG9yBAAAAARjYW5kCQAAawAAAAMFAAAABXZhbHVlBQAAAAludW1lcmF0b3IFAAAAC2Rlbm9taW5hdG9yBAAAAAFEAAAAAAC1BPMzBAAAAAVleGFjdAkAAAAAAAACCQAAagAAAAIJAABoAAAAAgkAAGoAAAACBQAAAARjYW5kBQAAAAFECQAAagAAAAIFAAAAC2Rlbm9taW5hdG9yBQAAAAFEBQAAAAFECQAAagAAAAIJAABoAAAAAgkAAGoAAAACBQAAAAV2YWx1ZQUAAAABRAkAAGoAAAACBQAAAAludW1lcmF0b3IFAAAAAUQFAAAAAUQDBQAAAAVleGFjdAUAAAAEY2FuZAkAAGQAAAACBQAAAARjYW5kAAAAAAAAAAABAAAAAA1CbG9ja3NQZXJZZWFyAAAAAAAACAUgAAAAAAVSQmFzZQAAI4byb8EAAAAAAAALZmFjdG9yc0Jhc2UAAAAAAAAAA+gAAAAADGFzc2V0SWRTdG9yZQIAAAAHYXNzZXRJZAAAAAAJbWFpblN0b3JlAgAAAARtYWluAAAAABJyZXNlcnZlRmFjdG9yU3RvcmUJAAEsAAAAAgkBAAAABWdldFNWAAAAAQUAAAAMYXNzZXRJZFN0b3JlAgAAAA5fUmVzZXJ2ZUZhY3RvcgAAAAAVY29sbGF0ZXJhbEZhY3RvclN0b3JlCQABLAAAAAIJAQAAAAVnZXRTVgAAAAEFAAAADGFzc2V0SWRTdG9yZQIAAAARX0NvbGxhdGVyYWxGYWN0b3IAAAAAGWxpcXVpZGF0aW9uVGhyZXNob2xkU3RvcmUJAAEsAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNTgpAAAAAQUAAAAMYXNzZXRJZFN0b3JlAgAAABVfTGlxdWlkYXRpb25UaHJlc2hvbGQAAAAAEm92ZXJsYXBDaGFyZ2VTdG9yZQIAAAAWYWNjb3VudF9oZWFsdGhfb3ZlcmxhcAAAAAAXbGlxdWlkYXRpb25QZW5hbHR5U3RvcmUJAAEsAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNTgpAAAAAQUAAAAMYXNzZXRJZFN0b3JlAgAAABNfTGlxdWlkYXRpb25QZW5hbHR5AAAAABJjb25maWdBZGRyZXNzU3RvcmUCAAAADWNvbmZpZ0FkZHJlc3MAAAAAC29yYWNsZVN0b3JlAgAAAA1vcmFjbGVBZGRyZXNzAAAAAA1hVG9rZW5JZFN0b3JlAgAAAAhhVG9rZW5JZAAAAAAPYVRva2VuTmFtZVN0b3JlAgAAAAphVG9rZW5OYW1lAAAAABZhVG9rZW5DaXJjdWxhdGlvblN0b3JlAgAAABFhVG9rZW5DaXJjdWxhdGlvbgAAAAAVbGFzdFVwZGF0ZUhlaWdodFN0b3JlAgAAABBsYXN0VXBkYXRlSGVpZ2h0AAAAAA50b3RhbERlYnRTdG9yZQIAAAALdG90YWxCb3Jyb3cAAAAAEXRvdGFsRGVwb3NpdFN0b3JlAgAAAAx0b3RhbERlcG9zaXQAAAAAEXRvdGFsUmVzZXJ2ZVN0b3JlAgAAAAx0b3RhbFJlc2VydmUAAAAACmluZGV4U3RvcmUCAAAAC3N0b3JlZEluZGV4AAAAABNhVG9rZW5EZWNpbWFsc1N0b3JlAgAAAA5hVG9rZW5EZWNpbWFscwEAAAASYVRva2VuQmFsYW5jZVN0b3JlAAAAAQAAAAt1c2VyQWRkcmVzcwkAASwAAAACBQAAAAt1c2VyQWRkcmVzcwIAAAAOX2FUb2tlbkJhbGFuY2UBAAAACWRlYnRTdG9yZQAAAAEAAAALdXNlckFkZHJlc3MJAAEsAAAAAgUAAAALdXNlckFkZHJlc3MCAAAABV9kZWJ0AQAAAA5kZWJ0SW5kZXhTdG9yZQAAAAEAAAALdXNlckFkZHJlc3MJAAEsAAAAAgUAAAALdXNlckFkZHJlc3MCAAAABl9pbmRleAEAAAAUdXNlQXNDb2xsYXRlcmFsU3RvcmUAAAABAAAAC3VzZXJBZGRyZXNzCQABLAAAAAIFAAAAC3VzZXJBZGRyZXNzAgAAABBfdXNlQXNDb2xsYXRlcmFsAAAAAAdhc3NldElkBAAAAAJpZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQEAAAAEZ2V0UwAAAAEFAAAADGFzc2V0SWRTdG9yZQIAAAAKbm8gYXNzZXRJZAMJAAAAAAAAAgUAAAACaWQCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEFAAAAAmlkAAAAAAphc3NldElkU3RyBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJidgUAAAAHJG1hdGNoMAkAAlgAAAABBQAAAAJidgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5p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B19EUG9pbnQAAAAADXJlc2VydmVGYWN0b3IJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzBQAAABJyZXNlcnZlRmFjdG9yU3RvcmUCAAAAEG5vIHJlc2VydmVGYWN0b3IAAAAAEGNvbGxhdGVyYWxGYWN0b3IJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzBQAAABVjb2xsYXRlcmFsRmFjdG9yU3RvcmUCAAAAE25vIGNvbGxhdGVyYWxGYWN0b3IAAAAAFGxpcXVpZGF0aW9uVGhyZXNob2xkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwUAAAAZbGlxdWlkYXRpb25UaHJlc2hvbGRTdG9yZQIAAAAXbm8gbGlxdWlkYXRpb25UaHJlc2hvbGQAAAAAFGFjY291bnRIZWFsdGhPdmVybGFwCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwUAAAASb3ZlcmxhcENoYXJnZVN0b3JlAgAAABBubyBvdmVybGFwQ2hhcmdlAAAAABJsaXF1aWRhdGlvblBlbmFsdHkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzBQAAABdsaXF1aWRhdGlvblBlbmFsdHlTdG9yZQIAAAAVbm8gbGlxdWlkYXRpb25QZW5hbHR5AAAAABJzdG9yZWRUb3RhbERlcG9zaXQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAARnZXRJAAAAAQUAAAARdG90YWxEZXBvc2l0U3RvcmUAAAAAAAAAAAAAAAAAEnN0b3JlZFRvdGFsUmVzZXJ2ZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAABGdldEkAAAABBQAAABF0b3RhbFJlc2VydmVTdG9yZQAAAAAAAAAAAAAAAAAPc3RvcmVkVG90YWxEZWJ0CQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAAEZ2V0SQAAAAEFAAAADnRvdGFsRGVidFN0b3JlAAAA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DGN1cnJlbnRJbmRleAUAAAALc3RvcmVkSW5kZXgAAAAACWFkZGVkRGVidAkAAGUAAAACBQAAABBjdXJyZW50VG90YWxEZWJ0BQAAAA9zdG9yZWRUb3RhbERlYnQAAAAADGFkZGVkRGVwb3NpdAkAAGsAAAADBQAAAAlhZGRlZERlYnQJAABlAAAAAgUAAAALZmFjdG9yc0Jhc2UFAAAADXJlc2VydmVGYWN0b3IFAAAAC2ZhY3RvcnNCYXNlAAAAABNjdXJyZW50VG90YWxEZXBvc2l0CQAAZAAAAAIFAAAAEnN0b3JlZFRvdGFsRGVwb3NpdAUAAAAMYWRkZWREZXBvc2l0AAAAABNjdXJyZW50VG90YWxSZXNlcnZlCQAAZQAAAAIJAABkAAAAAgUAAAASc3RvcmVkVG90YWxSZXNlcnZlBQAAAAlhZGRlZERlYnQFAAAADGFkZGVkRGVwb3NpdAEAAAANcGF5bWVudEFtb3VudAAAAAIAAAABaQAAAAdhc3NldElkBAAAAAFwCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQDCQAAZwAAAAIAAAAAAAAAAAAFAAAAAXAJAAACAAAAAQIAAAAnUGF5bWVudCBpcyBsZXNzIHRoYW4gbWluIGFsbG93ZWQgYW1vdW50AwkBAAAAAiE9AAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAUAAAAHYXNzZXRJZAkAAAIAAAABCQABLAAAAAICAAAAHWJhZCBhc3NldCBhdHRhY2hlZDogcmVxdWlyZWQgBQAAAAphc3NldElkU3RyBQAAAAFwAQAAAApzeW5jVG90YWxzAAAABAAAABFhZGRpdGlvbmFsRGVwb3NpdAAAAA5hZGRpdGlvbmFsRGVidAAAABFhZGRpdGlvbmFsUmVzZXJ2ZQAAAA1rZWVwQXRCYWxhbmNlBAAAAA1hY3R1YWxCYWxhbmNlBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAANhaWQFAAAAByRtYXRjaDAJAAPwAAAAAgUAAAAEdGhpcwUAAAADYWlkCAkAA+8AAAABBQAAAAR0aGlzAAAACWF2YWlsYWJsZQQAAAANc3Rha2luZ0FjdGlvbgMJAAAAAAAAAgUAAAANYWN0dWFsQmFsYW5jZQUAAAANa2VlcEF0QmFsYW5jZQUAAAAEdW5pdAQAAAAOc3Rha2luZ0VuYWJsZWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAANY29uZmlnQWRkcmVzcwkAASwAAAACAgAAABBzdGFraW5nX2VuYWJsZWRfBQAAAAphc3NldElkU3RyBwMJAQAAAAEhAAAAAQUAAAAOc3Rha2luZ0VuYWJsZWQFAAAABHVuaXQEAAAADnN0YWtpbmdBZGRyZXNzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADWNvbmZpZ0FkZHJlc3MJAAEsAAAAAgIAAAAPc3Rha2luZ19jb25maWdfBQAAAAphc3NldElkU3RyCQABLAAAAAICAAAAF25vIHN0YWtpbmcgYWRkcmVzcyBmb3IgBQAAAAphc3NldElkU3RyCQABLAAAAAICAAAAGGJhZCBzdGFraW5nIGFkZHJlc3MgZm9yIAUAAAAKYXNzZXRJZFN0cgMJAABmAAAAAgUAAAANYWN0dWFsQmFsYW5jZQUAAAANa2VlcEF0QmFsYW5jZQkAA/wAAAAEBQAAAA5zdGFraW5nQWRkcmVzcwIAAAADcHV0BQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIFAAAAB2Fzc2V0SWQJAABlAAAAAgUAAAANYWN0dWFsQmFsYW5jZQUAAAANa2VlcEF0QmFsYW5jZQUAAAADbmlsCQAD/AAAAAQFAAAADnN0YWtpbmdBZGRyZXNzAgAAAANnZXQJAARMAAAAAgkAAGUAAAACBQAAAA1rZWVwQXRCYWxhbmNlBQAAAA1hY3R1YWxCYWxhbmNlBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAANc3Rha2luZ0FjdGlvbgUAAAANc3Rha2luZ0FjdGlvbgkABEwAAAACCQEAAAAId3JpdGVJbnQAAAACBQAAAAppbmRleFN0b3JlBQAAAAxjdXJyZW50SW5kZXgJAARMAAAAAgkBAAAACHdyaXRlSW50AAAAAgUAAAAVbGFzdFVwZGF0ZUhlaWdodFN0b3JlBQAAAAZIRUlHSFQJAARMAAAAAgkBAAAACHdyaXRlSW50AAAAAgUAAAARdG90YWxEZXBvc2l0U3RvcmUJAABkAAAAAgUAAAATY3VycmVudFRvdGFsRGVwb3NpdAUAAAARYWRkaXRpb25hbERlcG9zaXQJAARMAAAAAgkBAAAACHdyaXRlSW50AAAAAgUAAAAOdG90YWxEZWJ0U3RvcmUJAABkAAAAAgUAAAAQY3VycmVudFRvdGFsRGVidAUAAAAOYWRkaXRpb25hbERlYnQJAARMAAAAAgkBAAAACHdyaXRlSW50AAAAAgUAAAARdG90YWxSZXNlcnZlU3RvcmUJAABkAAAAAgUAAAATY3VycmVudFRvdGFsUmVzZXJ2ZQUAAAARYWRkaXRpb25hbFJlc2VydmUFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAAAABXBvdzEwAAAAAQAAAAFuAwkAAAAAAAACBQAAAAFuAAAAAAAAAAAGAAAAAAAAD0JAAwkAAAAAAAACBQAAAAFuAAAAAAAAAAAIAAAAAAAF9eEACQAAAgAAAAEJAAEsAAAAAgIAAAAOYmFkIGRlY2ltYWxzOiAJAAGkAAAAAQUAAAABbgEAAAAKYXNzZXRUb1VzZAAAAAEAAAAGYW1vdW50CQAAawAAAAMFAAAABmFtb3VudAUAAAALb3JhY2xlUHJpY2UJAQAAAAVwb3cxMAAAAAEFAAAADWFzc2V0RGVjaW1hbHMBAAAACnVzZFRvQXNzZXQAAAABAAAABmFtb3VudAkAAGsAAAADBQAAAAZhbW91bnQJAQAAAAVwb3cxMAAAAAEFAAAADWFzc2V0RGVjaW1hbHMFAAAAC29yYWNsZVByaWNlAQAAAA1hVG9rZW5Ub0Fzc2V0AAAAAQAAAAxhVG9rZW5BbW91bnQDCQAAAAAAAAIFAAAADGFUb2tlbkFtb3VudAAAAAAAAAAAAAAAAAAAAAAAAAMJAABmAAAAAgUAAAARYVRva2VuQ2lyY3VsYXRpb24AAAAAAAAAAAAJAABrAAAAAwUAAAAMYVRva2VuQW1vdW50BQAAABNjdXJyZW50VG90YWxEZXBvc2l0BQAAABFhVG9rZW5DaXJjdWxhdGlvbgUAAAAMYVRva2VuQW1vdW50AQAAAA1hc3NldFRvQVRva2VuAAAAAQAAAAthc3NldEFtb3VudAMJAAAAAAAAAgUAAAALYXNzZXRBbW91bnQAAAAAAAAAAAAAAAAAAAAAAAADCQAAZgAAAAIFAAAAEWFUb2tlbkNpcmN1bGF0aW9uAAAAAAAAAAAACQAAawAAAAMFAAAAC2Fzc2V0QW1vdW50BQAAABFhVG9rZW5DaXJjdWxhdGlvbgUAAAATY3VycmVudFRvdGFsRGVwb3NpdAUAAAALYXNzZXRBbW91bnQBAAAAEWFzc2V0VG9BVG9rZW5DZWlsAAAAAQAAAAthc3NldEFtb3VudAMJAAAAAAAAAgUAAAALYXNzZXRBbW91bnQAAAAAAAAAAAAAAAAAAAAAAAADCQAAZgAAAAIFAAAAEWFUb2tlbkNpcmN1bGF0aW9uAAAAAAAAAAAACQEAAAAMZnJhY3Rpb25DZWlsAAAAAwUAAAALYXNzZXRBbW91bnQFAAAAEWFUb2tlbkNpcmN1bGF0aW9uBQAAABNjdXJyZW50VG90YWxEZXBvc2l0BQAAAAthc3NldEFtb3VudAEAAAANYVRva2VuQmFsYW5jZQAAAAEAAAAHYWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAABGdldEkAAAABCQEAAAASYVRva2VuQmFsYW5jZVN0b3JlAAAAAQUAAAAHYWRkcmVzcwAAAAAAAAAAAAEAAAAJZW5hYmxlQ29sAAAAAQAAAAR1c2VyCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgkBAAAAFHVzZUFzQ29sbGF0ZXJhbFN0b3JlAAAAAQUAAAAEdXNlcgYBAAAAEWVuYWJsZUNvbElmTmVlZGVkAAAAAQAAAAR1c2VyAwkAAGYAAAACCQEAAAAPY3VycmVudFVzZXJEZWJ0AAAAAQUAAAAEdXNlcgAAAAAAAAAAAAkABEwAAAACCQEAAAAJZW5hYmxlQ29sAAAAAQUAAAAEdXNlcgUAAAADbmlsBQAAAANuaWwBAAAADGNvbGxhcHNlVXNlcgAAAAIAAAAHYWRkcmVzcwAAAAZhbW91bnQEAAAABGRlYnQJAQAAAA9jdXJyZW50VXNlckRlYnQAAAABBQAAAAdhZGRy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aW4gY2FuIGRvCQEAAAAKc3luY1RvdGFscwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaQEAAAAKaW5pdGlhbGl6ZQAAAAYAAAAKY2ZnQWRkcmVzcwAAAApvcmFjbGVBZGRyAAAADmFzc2V0SWRPcldhdmVzAAAACmFUb2tlbk5hbWUAAAARYVRva2VuRGVzY3JpcHRpb24AAAAOYVRva2VuRGVjaW1hbHMEAAAABmNoZWNrcwMFAAAADm5vdEluaXRpYWxpemVkCQEAAAAQaXNBc3NldElkT3JXYXZlcwAAAAEFAAAADmFzc2V0SWRPcldhdmVzBwMJAAAAAAAAAgUAAAAGY2hlY2tzBQAAAAZjaGVja3MEAAAABmFUb2tlbgkABEIAAAAFBQAAAAphVG9rZW5OYW1lBQAAABFhVG9rZW5EZXNjcmlwdGlvbgAAAAAAAAAAAAUAAAAOYVRva2VuRGVjaW1hbHMGCQAETAAAAAIFAAAABmFUb2tlbgkABEwAAAACCQEAAAALd3JpdGVTdHJpbmcAAAACBQAAAAtvcmFjbGVTdG9yZQUAAAAKb3JhY2xlQWRkcgkABEwAAAACCQEAAAAId3JpdGVJbnQAAAACBQAAABNhVG9rZW5EZWNpbWFsc1N0b3JlBQAAAA5hVG9rZW5EZWNpbWFscwkABEwAAAACCQEAAAALd3JpdGVTdHJpbmcAAAACBQAAAA9hVG9rZW5OYW1lU3RvcmUFAAAACmFUb2tlbk5hbWUJAARMAAAAAgkBAAAAC3dyaXRlU3RyaW5nAAAAAgUAAAAMYXNzZXRJZFN0b3JlBQAAAA5hc3NldElkT3JXYXZlcwkABEwAAAACCQEAAAALd3JpdGVTdHJpbmcAAAACBQAAABJjb25maWdBZGRyZXNzU3RvcmUFAAAACmNmZ0FkZHJlc3MJAARMAAAAAgkBAAAAC3dyaXRlU3RyaW5nAAAAAgUAAAANYVRva2VuSWRTdG9yZQkAAlgAAAABCQAEOAAAAAEFAAAABmFUb2tlbgkABEwAAAACCQEAAAAId3JpdGVJbnQAAAACBQAAABVsYXN0VXBkYXRlSGVpZ2h0U3RvcmUFAAAABkhFSUdIVAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBu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cm93Rm9yAAAAAgAAAAdhZGRyZXNzAAAADmFtb3VudFRvQm9ycm93BAAAAAZjaGVja3MDAwkBAAAACG1haW5Pbmx5AAAAAQUAAAABaQkBAAAADmxpcXVpZGl0eUNoZWNrAAAAAwUAAAAOYW1vdW50VG9Cb3Jyb3cJAABlAAAAAgUAAAASc3RvcmVkVG90YWxEZXBvc2l0BQAAAA9zdG9yZWRUb3RhbERlYnQCAAAAGXRvbyBtdWNoIGJvcnJvdyByZXF1ZXN0ZWQHCQEAAAAJb3BBbGxvd2VkAAAAAQIAAAAGYm9ycm93BwMJAAAAAAAAAgUAAAAGY2hlY2tzBQAAAAZjaGVja3MEAAAAC2N1cnJlbnREZWJ0CQEAAAAPY3VycmVudFVzZXJEZWJ0AAAAAQUAAAAHYWRkcmVzcwQAAAAHbmV3RGVidAkAAGQAAAACBQAAAAtjdXJyZW50RGVidAUAAAAOYW1vdW50VG9Cb3Jyb3cJAAROAAAAAgkBAAAACnN5bmNUb3RhbHMAAAAEAAAAAAAAAAAABQAAAA5hbW91bnRUb0JvcnJvdwAAAAAAAAAAAAUAAAAOYW1vdW50VG9Cb3Jyb3cJAARMAAAAAgkBAAAACHdyaXRlSW50AAAAAgkBAAAACWRlYnRTdG9yZQAAAAEFAAAAB2FkZHJlc3MFAAAAB25ld0RlYnQJAARMAAAAAgkBAAAACWVuYWJsZUNvbAAAAAEFAAAAB2FkZHJlc3MJAARMAAAAAgkBAAAACHdyaXRlSW50AAAAAgkBAAAADmRlYnRJbmRleFN0b3JlAAAAAQUAAAAHYWRkcmVzcwUAAAAMY3VycmVudEluZGV4CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAB2FkZHJlc3MFAAAADmFtb3VudFRvQm9ycm93BQAAAAdhc3NldElkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADW1pbnRBdG9rZW5Gb3IAAAACAAAAB2FkZHJlc3MAAAAMYW1vdW50VG9NaW50BAAAABF1c2VyQVRva2VuQmFsYW5jZQkBAAAADWFUb2tlbkJhbGFuY2UAAAAB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", "chainId": 87, "height": 2919274, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FDTZCFH4KLn7nqey6YgGLvjBnzWAN7am2RfJqfrGXSyD Next: G5PTv1uPXkGGbbSfHmu4Br51FvqAGwvCUSnNuWXq4KX6 Diff:
Old | New | Differences | |
---|---|---|---|
151 | 151 | else true | |
152 | 152 | ||
153 | 153 | ||
154 | - | func ah (i) = if (if ((i != "WAVES")) | |
154 | + | func ah (ag) = { | |
155 | + | let ai = valueOrErrorMessage(getString(aa, "divAdmins"), "no div admins") | |
156 | + | if (!(contains(ai, toString(ag.caller)))) | |
157 | + | then throw("only div admin can do") | |
158 | + | else true | |
159 | + | } | |
160 | + | ||
161 | + | ||
162 | + | func aj (i) = if (if ((i != "WAVES")) | |
155 | 163 | then (fromBase58String(i) == fromBase58String("")) | |
156 | 164 | else false) | |
157 | 165 | then throw("invalid assetId") | |
158 | 166 | else true | |
159 | 167 | ||
160 | 168 | ||
161 | - | let | |
169 | + | let ak = e(isDefined(c(u)), "already initialized") | |
162 | 170 | ||
163 | - | let | |
171 | + | let al = { | |
164 | 172 | let U = c(C) | |
165 | 173 | if ($isInstanceOf(U, "String")) | |
166 | 174 | then { | |
167 | - | let | |
168 | - | addressFromString( | |
175 | + | let am = U | |
176 | + | addressFromString(am) | |
169 | 177 | } | |
170 | 178 | else unit | |
171 | 179 | } | |
172 | 180 | ||
173 | - | let | |
174 | - | let U = invoke(valueOrErrorMessage( | |
181 | + | let an = { | |
182 | + | let U = invoke(valueOrErrorMessage(al, "no oracle"), "price", [d(u)], nil) | |
175 | 183 | if ($isInstanceOf(U, "Int")) | |
176 | 184 | then { | |
177 | 185 | let ag = U | |
180 | 188 | else throw("bad oracle data") | |
181 | 189 | } | |
182 | 190 | ||
183 | - | let | |
191 | + | let ao = height | |
184 | 192 | ||
185 | - | let | |
193 | + | let ap = valueOrErrorMessage(a(G), "no lastUpdateHeight") | |
186 | 194 | ||
187 | - | let | |
195 | + | let aq = fromBase58String(valueOrErrorMessage(c(D), "no aTokenId")) | |
188 | 196 | ||
189 | - | let | |
197 | + | let ar = valueOrElse(a(F), 0) | |
190 | 198 | ||
191 | - | let | |
199 | + | let as = { | |
192 | 200 | let S = d(u) | |
193 | 201 | $Tuple4(getIntegerValue(aa, (S + "_APoint")), getIntegerValue(aa, (S + "_BPoint")), getIntegerValue(aa, (S + "_CPoint")), getIntegerValue(aa, (S + "_DPoint"))) | |
194 | 202 | } | |
195 | 203 | ||
196 | - | let | |
204 | + | let at = valueOrErrorMessage(getInteger(aa, w), "no reserveFactor") | |
197 | 205 | ||
198 | - | let | |
206 | + | let au = valueOrErrorMessage(getInteger(aa, x), "no collateralFactor") | |
199 | 207 | ||
200 | - | let | |
208 | + | let av = valueOrErrorMessage(getInteger(aa, y), "no liquidationThreshold") | |
201 | 209 | ||
202 | - | let | |
210 | + | let aw = valueOrErrorMessage(getInteger(aa, z), "no overlapCharge") | |
203 | 211 | ||
204 | - | let | |
212 | + | let ax = valueOrErrorMessage(getInteger(aa, A), "no liquidationPenalty") | |
205 | 213 | ||
206 | - | let | |
214 | + | let ay = valueOrElse(a(I), 0) | |
207 | 215 | ||
208 | - | let | |
216 | + | let az = valueOrElse(a(J), 0) | |
209 | 217 | ||
210 | - | let | |
218 | + | let aA = valueOrElse(a(H), 0) | |
211 | 219 | ||
212 | - | let | |
220 | + | let aB = valueOrElse(a(K), s) | |
213 | 221 | ||
214 | - | let | |
215 | - | then fraction( | |
222 | + | let aC = if ((ay > 0)) | |
223 | + | then fraction(aA, t, ay) | |
216 | 224 | else 0 | |
217 | 225 | ||
218 | - | let | |
219 | - | let | |
220 | - | let | |
221 | - | let ae = | |
222 | - | let | |
223 | - | let | |
224 | - | let | |
225 | - | let | |
226 | - | if (( | |
227 | - | then | |
228 | - | else if (( | |
229 | - | then | |
230 | - | else if (if ((ae > | |
226 | + | let aD = { | |
227 | + | let aE = as | |
228 | + | let aF = aE._1 | |
229 | + | let ae = aE._2 | |
230 | + | let aG = aE._3 | |
231 | + | let aH = aE._4 | |
232 | + | let aI = (fraction((aF - aG), aC, -(ae)) + aF) | |
233 | + | let aJ = (fraction((aG - aH), (aC - ae), (ae - t)) + aG) | |
234 | + | if ((aC == 0)) | |
235 | + | then aF | |
236 | + | else if ((aC == ae)) | |
237 | + | then aG | |
238 | + | else if (if ((ae > aC)) | |
231 | 239 | then true | |
232 | 240 | else (ae == t)) | |
233 | - | then | |
234 | - | else | |
241 | + | then aI | |
242 | + | else aJ | |
235 | 243 | } | |
236 | 244 | ||
237 | - | let | |
245 | + | let aK = if ((ay == 0)) | |
238 | 246 | then 0 | |
239 | - | else fraction(fraction( | |
247 | + | else fraction(fraction(aA, aD, ay), (t - at), t) | |
240 | 248 | ||
241 | - | let | |
242 | - | then | |
249 | + | let aL = if ((ao == ap)) | |
250 | + | then aB | |
243 | 251 | else { | |
244 | - | let | |
245 | - | l( | |
252 | + | let aM = l(aD, s, (r * t)) | |
253 | + | l(aB, (s + (aM * (ao - ap))), s) | |
246 | 254 | } | |
247 | 255 | ||
248 | - | func | |
249 | - | then throw(("not enough liquidity: " + | |
256 | + | func aN (aO,aP,aQ) = if ((aO > aP)) | |
257 | + | then throw(("not enough liquidity: " + aQ)) | |
250 | 258 | else true | |
251 | 259 | ||
252 | 260 | ||
253 | - | func | |
261 | + | func aR (N) = valueOrElse(a(O(N)), 0) | |
254 | 262 | ||
255 | 263 | ||
256 | - | func | |
257 | - | let | |
258 | - | if (( | |
264 | + | func aS (N) = { | |
265 | + | let aT = aR(N) | |
266 | + | if ((aT == 0)) | |
259 | 267 | then 0 | |
260 | 268 | else { | |
261 | - | let | |
262 | - | fraction( | |
269 | + | let aU = valueOrErrorMessage(a(P(N)), "has debt but does not have index") | |
270 | + | fraction(aT, aL, aU) | |
263 | 271 | } | |
264 | 272 | } | |
265 | 273 | ||
266 | 274 | ||
267 | - | let | |
275 | + | let aV = fraction(aA, aL, aB) | |
268 | 276 | ||
269 | - | let | |
277 | + | let aW = (aV - aA) | |
270 | 278 | ||
271 | - | let | |
279 | + | let aX = fraction(aW, (t - at), t) | |
272 | 280 | ||
273 | - | let | |
281 | + | let aY = (ay + aX) | |
274 | 282 | ||
275 | - | let | |
283 | + | let aZ = ((az + aW) - aX) | |
276 | 284 | ||
277 | - | func | |
278 | - | let | |
279 | - | if ((0 >= | |
285 | + | func ba (ag,R) = { | |
286 | + | let bb = ag.payments[0].amount | |
287 | + | if ((0 >= bb)) | |
280 | 288 | then throw("Payment is less than min allowed amount") | |
281 | 289 | else if ((ag.payments[0].assetId != R)) | |
282 | 290 | then throw(("bad asset attached: required " + T)) | |
283 | - | else | |
291 | + | else bb | |
284 | 292 | } | |
285 | 293 | ||
286 | 294 | ||
287 | - | func | |
288 | - | let | |
295 | + | func bc (bd,be,bf,bg) = { | |
296 | + | let bh = { | |
289 | 297 | let U = R | |
290 | 298 | if ($isInstanceOf(U, "ByteVector")) | |
291 | 299 | then { | |
294 | 302 | } | |
295 | 303 | else wavesBalance(this).available | |
296 | 304 | } | |
297 | - | let | |
305 | + | let bi = if ((bh == bg)) | |
298 | 306 | then unit | |
299 | 307 | else { | |
300 | - | let | |
301 | - | if (!( | |
308 | + | let bj = valueOrElse(getBoolean(aa, ("staking_enabled_" + T)), false) | |
309 | + | if (!(bj)) | |
302 | 310 | then unit | |
303 | 311 | else { | |
304 | - | let | |
305 | - | if (( | |
306 | - | then invoke( | |
307 | - | else invoke( | |
312 | + | let bk = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(aa, ("staking_config_" + T)), ("no staking address for " + T))), ("bad staking address for " + T)) | |
313 | + | if ((bh > bg)) | |
314 | + | then invoke(bk, "put", nil, [AttachedPayment(R, (bh - bg))]) | |
315 | + | else invoke(bk, "get", [(bg - bh)], nil) | |
308 | 316 | } | |
309 | 317 | } | |
310 | - | if (( | |
311 | - | then [h(K, | |
318 | + | if ((bi == bi)) | |
319 | + | then [h(K, aL), h(G, ao), h(I, (aY + bd)), h(H, (aV + be)), h(J, (aZ + bf))] | |
312 | 320 | else throw("Strict value is not equal to itself.") | |
313 | 321 | } | |
314 | 322 | ||
315 | 323 | ||
316 | - | func | |
324 | + | func bl (bm) = if ((bm == 6)) | |
317 | 325 | then 1000000 | |
318 | - | else if (( | |
326 | + | else if ((bm == 8)) | |
319 | 327 | then 100000000 | |
320 | - | else throw(("bad decimals: " + toString( | |
328 | + | else throw(("bad decimals: " + toString(bm))) | |
321 | 329 | ||
322 | 330 | ||
323 | - | func | |
331 | + | func bn (aO) = fraction(aO, an, bl(Z)) | |
324 | 332 | ||
325 | 333 | ||
326 | - | func bm (aM) = fraction(aM, bj(Z), al) | |
327 | - | ||
328 | - | ||
329 | - | func bn (bo) = if ((bo == 0)) | |
330 | - | then 0 | |
331 | - | else if ((ap > 0)) | |
332 | - | then fraction(bo, aW, ap) | |
333 | - | else bo | |
334 | + | func bo (aO) = fraction(aO, bl(Z), an) | |
334 | 335 | ||
335 | 336 | ||
336 | 337 | func bp (bq) = if ((bq == 0)) | |
337 | 338 | then 0 | |
338 | - | else if (( | |
339 | - | then fraction(bq, | |
339 | + | else if ((ar > 0)) | |
340 | + | then fraction(bq, aY, ar) | |
340 | 341 | else bq | |
341 | 342 | ||
342 | 343 | ||
343 | - | func br ( | |
344 | + | func br (bs) = if ((bs == 0)) | |
344 | 345 | then 0 | |
345 | - | else if (( | |
346 | - | then | |
347 | - | else | |
346 | + | else if ((ar > 0)) | |
347 | + | then fraction(bs, ar, aY) | |
348 | + | else bs | |
348 | 349 | ||
349 | 350 | ||
350 | - | func bs (bt) = valueOrElse(a(M(bt)), 0) | |
351 | + | func bt (bs) = if ((bs == 0)) | |
352 | + | then 0 | |
353 | + | else if ((ar > 0)) | |
354 | + | then l(bs, ar, aY) | |
355 | + | else bs | |
351 | 356 | ||
352 | 357 | ||
353 | - | func bu (bv) = | |
358 | + | func bu (bv) = valueOrElse(a(M(bv)), 0) | |
354 | 359 | ||
355 | 360 | ||
356 | - | func bw (bv) = if ((aQ(bv) > 0)) | |
357 | - | then [bu(bv)] | |
361 | + | func bw (bx) = BooleanEntry(Q(bx), true) | |
362 | + | ||
363 | + | ||
364 | + | func by (bx) = if ((aS(bx) > 0)) | |
365 | + | then [bw(bx)] | |
358 | 366 | else nil | |
359 | 367 | ||
360 | 368 | ||
361 | - | func | |
362 | - | let | |
363 | - | let | |
364 | - | let | |
365 | - | let | |
369 | + | func bz (bv,aO) = { | |
370 | + | let bA = aS(bv) | |
371 | + | let bB = bp(bu(bv)) | |
372 | + | let bC = min([bA, bB]) | |
373 | + | let bD = if ((-1 > aO)) | |
366 | 374 | then throw("invalid collapse amount") | |
367 | - | else if (if (( | |
375 | + | else if (if ((bC == 0)) | |
368 | 376 | then true | |
369 | - | else ( | |
377 | + | else (aO == 0)) | |
370 | 378 | then throw("nothing to collapse") | |
371 | - | else if (if (( | |
379 | + | else if (if ((aO == -1)) | |
372 | 380 | then true | |
373 | - | else ( | |
374 | - | then | |
375 | - | else | |
376 | - | let | |
377 | - | $Tuple2(( | |
381 | + | else (aO > bC)) | |
382 | + | then bC | |
383 | + | else aO | |
384 | + | let bE = bt(bD) | |
385 | + | $Tuple2((bc(-(bD), -(bD), 0, 0) ++ [j(M(bv), -(bE)), j(F, -(bE)), h(O(bv), (bA - bD)), h(P(bv), aL)]), bD) | |
378 | 386 | } | |
379 | 387 | ||
380 | 388 | ||
381 | - | func | |
382 | - | let | |
383 | - | if (( | |
389 | + | func bF (N,aO) = { | |
390 | + | let bG = ab("repay") | |
391 | + | if ((bG == bG)) | |
384 | 392 | then { | |
385 | - | let | |
386 | - | if (( | |
393 | + | let bH = aS(N) | |
394 | + | if ((bH == bH)) | |
387 | 395 | then { | |
388 | - | let | |
389 | - | then $Tuple4(0, -( | |
390 | - | else $Tuple4(( | |
391 | - | let | |
392 | - | let | |
393 | - | let | |
394 | - | let | |
395 | - | let | |
396 | - | $Tuple2((( | |
396 | + | let bI = if ((aO > bH)) | |
397 | + | then $Tuple4(0, -(bH), (aO - bH), [ScriptTransfer(addressFromStringValue(N), (aO - bH), R)]) | |
398 | + | else $Tuple4((bH - aO), -(aO), 0, nil) | |
399 | + | let bJ = bI._1 | |
400 | + | let bK = bI._2 | |
401 | + | let bL = bI._3 | |
402 | + | let bM = bI._4 | |
403 | + | let bN = (aO - bL) | |
404 | + | $Tuple2(((bc(0, bK, 0, bL) ++ bM) ++ [h(O(N), bJ), h(P(N), aL)]), bN) | |
397 | 405 | } | |
398 | 406 | else throw("Strict value is not equal to itself.") | |
399 | 407 | } | |
401 | 409 | } | |
402 | 410 | ||
403 | 411 | ||
404 | - | func | |
405 | - | let | |
406 | - | let | |
407 | - | let ae = | |
408 | - | let | |
409 | - | let | |
410 | - | ((((((((((((((("ABCD: " + toString( | |
412 | + | func bO () = { | |
413 | + | let bP = as | |
414 | + | let aF = bP._1 | |
415 | + | let ae = bP._2 | |
416 | + | let aG = bP._3 | |
417 | + | let aH = bP._4 | |
418 | + | ((((((((((((((("ABCD: " + toString(aF)) + ";") + toString(ae)) + ";") + toString(aG)) + ";") + toString(aH)) + ", reserveFactor: ") + toString(at)) + ", collateralFactor: ") + toString(au)) + ", liquidationThreshold: ") + toString(av)) + ", liquidationPenalty: ") + toString(ax)) | |
411 | 419 | } | |
412 | 420 | ||
413 | 421 | ||
414 | - | func | |
422 | + | func bQ () = ((((((((((((((((((((((((((("currentTotalDeposit: " + toString(aY)) + ", storedTotalDeposit: ") + toString(ay)) + ", currentTotalDebt: ") + toString(aV)) + ", storedTotalDebt: ") + toString(aA)) + ", currentTotalReserve: ") + toString(aZ)) + ", storedTotalReserve: ") + toString(az)) + ", currentIndex:") + toString(aL)) + ", storedIndex: ") + toString(aB)) + ", lastUpdateHeight: ") + toString(ap)) + ", utilization: ") + toString(aC)) + ", aTokenCirculation: ") + toString(ar)) + ", aTokenPrice: ") + toString(bp(pow(10, 0, Z, 0, 0, FLOOR)))) + ", APR: ") + toString(aD)) + ", APY: ") + toString(aK)) | |
415 | 423 | ||
416 | 424 | ||
417 | - | func | |
418 | - | let | |
419 | - | let | |
420 | - | ((((((((((((((((("currentDebt: " + toString( | |
425 | + | func bR (bx) = { | |
426 | + | let bS = bu(bx) | |
427 | + | let bT = X(addressFromStringValue(bx), aq) | |
428 | + | ((((((((((((((((("currentDebt: " + toString(aS(bx))) + ", storedDebt: ") + toString(valueOrElse(a(O(bx)), 0))) + ", currentDeposit: ") + toString(bp(bS))) + ", aTokenContractBalance: ") + toString(bS)) + ", aTokenWalletBalance: ") + toString(bT)) + ", walletStake: ") + toString(bp(bT))) + ", assetWalletBalance: ") + toString(X(addressFromStringValue(bx), R))) + ", useAsCollateral: ") + toString(valueOrElse(getBoolean(this, Q(bx)), true))) + ", storedIndex: ") + toString(valueOrElse(a(P(bx)), 0))) | |
421 | 429 | } | |
422 | 430 | ||
423 | 431 | ||
424 | - | func | |
432 | + | func bU () = ((((((((((((((((((((((("storedTotalDeposit: " + toString(ay)) + ", storedTotalDebt: ") + toString(aA)) + ", storedTotalReserve: ") + toString(az)) + ", storedIndex: ") + toString(aB)) + ", lastUpdateHeight: ") + toString(ap)) + ", currentTotalDeposit: ") + toString(aY)) + ", currentTotalDebt: ") + toString(aV)) + ", currentTotalReserve: ") + toString(aZ)) + ", currentIndex: ") + toString(aL)) + ", currentHeight: ") + toString(ao)) + ", aTokenCirculation: ") + toString(ar)) + ", aTokenPrice: ") + toString(bp(pow(10, 0, Z, 0, 0, FLOOR)))) | |
425 | 433 | ||
426 | 434 | ||
427 | - | func | |
428 | - | let | |
429 | - | let | |
430 | - | let | |
431 | - | if (( | |
432 | - | then $Tuple4( | |
433 | - | else $Tuple4( | |
435 | + | func bV (bx) = { | |
436 | + | let bW = bu(bx) | |
437 | + | let bX = bp(bW) | |
438 | + | let bA = aS(bx) | |
439 | + | if ((ao == ap)) | |
440 | + | then $Tuple4(ay, aA, bX, bA) | |
441 | + | else $Tuple4(aY, aV, bX, bA) | |
434 | 442 | } | |
435 | 443 | ||
436 | 444 | ||
437 | 445 | @Callable(ag) | |
438 | - | func | |
446 | + | func getReserveDivsInfo () = $Tuple2(nil, $Tuple2(aZ, T)) | |
439 | 447 | ||
440 | 448 | ||
441 | 449 | ||
442 | 450 | @Callable(ag) | |
443 | - | func getCurrentTotals2 (bW,bX) = { | |
444 | - | let bY = bT(bW) | |
445 | - | let bZ = bY._1 | |
446 | - | let ca = bY._2 | |
447 | - | let cb = bY._3 | |
448 | - | let cc = bY._4 | |
449 | - | let cd = bT(bX) | |
450 | - | let ce = cd._1 | |
451 | - | let cf = cd._2 | |
452 | - | let cg = cd._3 | |
453 | - | let ch = cd._4 | |
454 | - | $Tuple2(nil, $Tuple6(bZ, ca, cb, cc, cg, ch)) | |
451 | + | func getCurrentTotals (bx) = $Tuple2(nil, bV(bx)) | |
452 | + | ||
453 | + | ||
454 | + | ||
455 | + | @Callable(ag) | |
456 | + | func getCurrentTotals2 (bY,bZ) = { | |
457 | + | let ca = bV(bY) | |
458 | + | let cb = ca._1 | |
459 | + | let cc = ca._2 | |
460 | + | let cd = ca._3 | |
461 | + | let ce = ca._4 | |
462 | + | let cf = bV(bZ) | |
463 | + | let cg = cf._1 | |
464 | + | let ch = cf._2 | |
465 | + | let ci = cf._3 | |
466 | + | let cj = cf._4 | |
467 | + | $Tuple2(nil, $Tuple6(cb, cc, cd, ce, ci, cj)) | |
455 | 468 | } | |
456 | 469 | ||
457 | 470 | ||
458 | 471 | ||
459 | 472 | @Callable(ag) | |
460 | - | func advise () = $Tuple2(nil, ((((("reserveAddress: " + toString(this)) + ", ") + | |
473 | + | func advise () = $Tuple2(nil, ((((("reserveAddress: " + toString(this)) + ", ") + bO()) + ", ") + bQ())) | |
461 | 474 | ||
462 | 475 | ||
463 | 476 | ||
464 | 477 | @Callable(ag) | |
465 | - | func adviseUser ( | |
466 | - | let | |
467 | - | let | |
468 | - | let | |
469 | - | let | |
470 | - | then | |
478 | + | func adviseUser (bx) = { | |
479 | + | let ck = bn(aV) | |
480 | + | let cl = bn(aY) | |
481 | + | let cm = valueOrElse(getBoolean(this, Q(bx)), true) | |
482 | + | let cn = if (cm) | |
483 | + | then cl | |
471 | 484 | else 0 | |
472 | - | let | |
473 | - | let | |
474 | - | let | |
485 | + | let co = min([ck, cn]) | |
486 | + | let cp = l(co, aw, t) | |
487 | + | let cq = if ((ck > cn)) | |
475 | 488 | then 0 | |
476 | - | else fraction(( | |
477 | - | let | |
478 | - | then (fraction(( | |
479 | - | else | |
480 | - | let | |
481 | - | $Tuple2(nil, (( | |
489 | + | else fraction((cn - ck), au, t) | |
490 | + | let cr = if ((ck > cn)) | |
491 | + | then (fraction((ck - cn), t, av) + cp) | |
492 | + | else cp | |
493 | + | let cs = ((((((((("reserveAddress: " + toString(this)) + ", currentDebtUsd: ") + toString(ck)) + ", currentDepositUsd: ") + toString(cl)) + ", bp: ") + toString(cq)) + ", bpu: ") + toString(cr)) | |
494 | + | $Tuple2(nil, ((cs + ", ") + bR(bx))) | |
482 | 495 | } | |
483 | 496 | ||
484 | 497 | ||
486 | 499 | @Callable(ag) | |
487 | 500 | func addInterest () = if ((ag.payments[0].assetId != R)) | |
488 | 501 | then throw("can't add interest with unrelated token") | |
489 | - | else | |
502 | + | else bc(ag.payments[0].amount, 0, 0, 0) | |
490 | 503 | ||
491 | 504 | ||
492 | 505 | ||
493 | 506 | @Callable(ag) | |
494 | 507 | func addToReserve () = if ((ag.payments[0].assetId != R)) | |
495 | 508 | then throw("can't add interest with unrelated token") | |
496 | - | else | |
509 | + | else bc(0, 0, ag.payments[0].amount, 0) | |
497 | 510 | ||
498 | 511 | ||
499 | 512 | ||
500 | 513 | @Callable(ag) | |
501 | - | func withdrawFromReserve (bB) = { | |
502 | - | let cr = getStringValue(aa, "admin") | |
503 | - | if ((toString(ag.caller) != cr)) | |
504 | - | then throw("only admin can do") | |
505 | - | else (ba(0, 0, -(bB), bB) ++ [ScriptTransfer(addressFromStringValue(cr), bB, R)]) | |
506 | - | } | |
507 | - | ||
508 | - | ||
509 | - | ||
510 | - | @Callable(ag) | |
511 | - | func forceUpdate () = { | |
512 | - | let cr = getStringValue(aa, "admin") | |
513 | - | if ((toString(ag.caller) != cr)) | |
514 | - | then throw("only admin can do") | |
515 | - | else ba(0, 0, 0, 0) | |
516 | - | } | |
517 | - | ||
518 | - | ||
519 | - | ||
520 | - | @Callable(ag) | |
521 | - | func initialize (cs,ct,cu,cv,cw,cx) = { | |
522 | - | let bE = if (ai) | |
523 | - | then ah(cu) | |
524 | - | else false | |
525 | - | if ((bE == bE)) | |
514 | + | func withdrawFromReserve (bD) = { | |
515 | + | let bG = ah(ag) | |
516 | + | if ((bG == bG)) | |
526 | 517 | then { | |
527 | - | let cy = Issue(cv, cw, 0, cx, true) | |
528 | - | [cy, k(C, ct), h(L, cx), k(E, cv), k(u, cu), k(B, cs), k(D, toBase58String(calculateAssetId(cy))), h(G, am)] | |
518 | + | let ct = if ((bD == -1)) | |
519 | + | then aZ | |
520 | + | else bD | |
521 | + | $Tuple2((bc(0, 0, -(ct), ct) ++ [ScriptTransfer(ag.caller, ct, R)]), ct) | |
529 | 522 | } | |
530 | 523 | else throw("Strict value is not equal to itself.") | |
531 | 524 | } | |
533 | 526 | ||
534 | 527 | ||
535 | 528 | @Callable(ag) | |
536 | - | func userDepositUSD (bt) = $Tuple2(nil, bl(bn(bs(bt)))) | |
537 | - | ||
538 | - | ||
539 | - | ||
540 | - | @Callable(ag) | |
541 | - | func userDebtUSD (bt) = $Tuple2(nil, bl(aQ(bt))) | |
542 | - | ||
543 | - | ||
544 | - | ||
545 | - | @Callable(ag) | |
546 | - | func userBalance (bt) = { | |
547 | - | let bU = bs(bt) | |
548 | - | let bV = bn(bU) | |
549 | - | let by = aQ(bt) | |
550 | - | $Tuple2(nil, $Tuple6(bU, bV, bl(bV), by, bl(by), valueOrElse(getBoolean(this, Q(bt)), true))) | |
529 | + | func forceUpdate () = { | |
530 | + | let cu = getStringValue(aa, "admin") | |
531 | + | if ((toString(ag.caller) != cu)) | |
532 | + | then throw("only admin can do") | |
533 | + | else bc(0, 0, 0, 0) | |
551 | 534 | } | |
552 | 535 | ||
553 | 536 | ||
554 | 537 | ||
555 | 538 | @Callable(ag) | |
556 | - | func userDebt (bt) = { | |
557 | - | let by = aQ(bt) | |
558 | - | let cz = bl(by) | |
559 | - | $Tuple2(nil, $Tuple2(by, cz)) | |
560 | - | } | |
561 | - | ||
562 | - | ||
563 | - | ||
564 | - | @Callable(ag) | |
565 | - | func assetUsdValue (bq) = $Tuple2(nil, bl(bq)) | |
566 | - | ||
567 | - | ||
568 | - | ||
569 | - | @Callable(ag) | |
570 | - | func repayFor (N) = { | |
571 | - | let bE = af(ag) | |
572 | - | if ((bE == bE)) | |
573 | - | then bD(N, aY(ag, R)) | |
539 | + | func initialize (cv,cw,cx,cy,cz,cA) = { | |
540 | + | let bG = if (ak) | |
541 | + | then aj(cx) | |
542 | + | else false | |
543 | + | if ((bG == bG)) | |
544 | + | then { | |
545 | + | let cB = Issue(cy, cz, 0, cA, true) | |
546 | + | [cB, k(C, cw), h(L, cA), k(E, cy), k(u, cx), k(B, cv), k(D, toBase58String(calculateAssetId(cB))), h(G, ao)] | |
547 | + | } | |
574 | 548 | else throw("Strict value is not equal to itself.") | |
575 | 549 | } | |
576 | 550 | ||
577 | 551 | ||
578 | 552 | ||
579 | 553 | @Callable(ag) | |
580 | - | func depositFor (cA,cB) = { | |
581 | - | let bE = if (af(ag)) | |
554 | + | func userDepositUSD (bv) = $Tuple2(nil, bn(bp(bu(bv)))) | |
555 | + | ||
556 | + | ||
557 | + | ||
558 | + | @Callable(ag) | |
559 | + | func userDebtUSD (bv) = $Tuple2(nil, bn(aS(bv))) | |
560 | + | ||
561 | + | ||
562 | + | ||
563 | + | @Callable(ag) | |
564 | + | func userBalance (bv) = { | |
565 | + | let bW = bu(bv) | |
566 | + | let bX = bp(bW) | |
567 | + | let bA = aS(bv) | |
568 | + | $Tuple2(nil, $Tuple6(bW, bX, bn(bX), bA, bn(bA), valueOrElse(getBoolean(this, Q(bv)), true))) | |
569 | + | } | |
570 | + | ||
571 | + | ||
572 | + | ||
573 | + | @Callable(ag) | |
574 | + | func userDebt (bv) = { | |
575 | + | let bA = aS(bv) | |
576 | + | let cC = bn(bA) | |
577 | + | $Tuple2(nil, $Tuple2(bA, cC)) | |
578 | + | } | |
579 | + | ||
580 | + | ||
581 | + | ||
582 | + | @Callable(ag) | |
583 | + | func assetUsdValue (bs) = $Tuple2(nil, bn(bs)) | |
584 | + | ||
585 | + | ||
586 | + | ||
587 | + | @Callable(ag) | |
588 | + | func repayFor (N) = { | |
589 | + | let bG = af(ag) | |
590 | + | if ((bG == bG)) | |
591 | + | then bF(N, ba(ag, R)) | |
592 | + | else throw("Strict value is not equal to itself.") | |
593 | + | } | |
594 | + | ||
595 | + | ||
596 | + | ||
597 | + | @Callable(ag) | |
598 | + | func depositFor (cD,cE) = { | |
599 | + | let bG = if (af(ag)) | |
582 | 600 | then ab("deposit") | |
583 | 601 | else false | |
584 | - | if (( | |
585 | - | then if (if (( | |
586 | - | then !( | |
602 | + | if ((bG == bG)) | |
603 | + | then if (if ((aS(cD) > 0)) | |
604 | + | then !(cE) | |
587 | 605 | else false) | |
588 | 606 | then throw("can't disable use as collateral for asset with open debt") | |
589 | 607 | else { | |
590 | - | let | |
591 | - | let | |
592 | - | ( | |
608 | + | let aO = ba(ag, R) | |
609 | + | let bq = br(aO) | |
610 | + | (bc(aO, 0, 0, 0) ++ [j(F, bq), j(M(cD), bq), BooleanEntry(Q(cD), cE)]) | |
593 | 611 | } | |
594 | 612 | else throw("Strict value is not equal to itself.") | |
595 | 613 | } | |
597 | 615 | ||
598 | 616 | ||
599 | 617 | @Callable(ag) | |
600 | - | func withdrawFor ( | |
601 | - | let | |
602 | - | let | |
603 | - | then | |
618 | + | func withdrawFor (bv,aO) = { | |
619 | + | let cF = ((ay + az) - aA) | |
620 | + | let bG = if (if (if (af(ag)) | |
621 | + | then aN(aO, cF, "funds in use") | |
604 | 622 | else false) | |
605 | - | then e((-1 > | |
623 | + | then e((-1 > aO), "invalid amount") | |
606 | 624 | else false) | |
607 | 625 | then ab("withdraw") | |
608 | 626 | else false | |
609 | - | if (( | |
627 | + | if ((bG == bG)) | |
610 | 628 | then { | |
611 | - | let | |
629 | + | let cG = if ((aO == -1)) | |
612 | 630 | then { | |
613 | - | let | |
614 | - | $Tuple2( | |
631 | + | let bW = bu(bv) | |
632 | + | $Tuple2(bW, bp(bW)) | |
615 | 633 | } | |
616 | - | else $Tuple2( | |
617 | - | let | |
618 | - | let | |
619 | - | $Tuple2(( | |
634 | + | else $Tuple2(bt(aO), aO) | |
635 | + | let bE = cG._1 | |
636 | + | let cH = cG._2 | |
637 | + | $Tuple2((bc(-(cH), 0, 0, cH) ++ [ScriptTransfer(addressFromStringValue(bv), cH, R), j(M(bv), -(bE)), j(F, -(bE))]), cH) | |
620 | 638 | } | |
621 | 639 | else throw("Strict value is not equal to itself.") | |
622 | 640 | } | |
624 | 642 | ||
625 | 643 | ||
626 | 644 | @Callable(ag) | |
627 | - | func replenishWithAtokenFor ( | |
628 | - | let | |
645 | + | func replenishWithAtokenFor (bx) = { | |
646 | + | let bG = if (af(ag)) | |
629 | 647 | then ab("atokens") | |
630 | 648 | else false | |
631 | - | if (( | |
649 | + | if ((bG == bG)) | |
632 | 650 | then { | |
633 | - | let | |
634 | - | $Tuple2((( | |
651 | + | let bq = ba(ag, aq) | |
652 | + | $Tuple2(((bc(0, 0, 0, 0) ++ [j(M(bx), bq), Burn(aq, bq)]) ++ by(bx)), bp(bq)) | |
635 | 653 | } | |
636 | 654 | else throw("Strict value is not equal to itself.") | |
637 | 655 | } | |
639 | 657 | ||
640 | 658 | ||
641 | 659 | @Callable(ag) | |
642 | - | func borrowFor ( | |
643 | - | let | |
644 | - | then | |
660 | + | func borrowFor (bv,cI) = { | |
661 | + | let bG = if (if (af(ag)) | |
662 | + | then aN(cI, (ay - aA), "too much borrow requested") | |
645 | 663 | else false) | |
646 | 664 | then ab("borrow") | |
647 | 665 | else false | |
648 | - | if (( | |
666 | + | if ((bG == bG)) | |
649 | 667 | then { | |
650 | - | let | |
651 | - | let | |
652 | - | ( | |
668 | + | let bH = aS(bv) | |
669 | + | let bJ = (bH + cI) | |
670 | + | (bc(0, cI, 0, cI) ++ [h(O(bv), bJ), bw(bv), h(P(bv), aL), ScriptTransfer(addressFromStringValue(bv), cI, R)]) | |
653 | 671 | } | |
654 | 672 | else throw("Strict value is not equal to itself.") | |
655 | 673 | } | |
657 | 675 | ||
658 | 676 | ||
659 | 677 | @Callable(ag) | |
660 | - | func mintAtokenFor ( | |
661 | - | let | |
662 | - | let | |
663 | - | then | |
664 | - | else | |
665 | - | let | |
678 | + | func mintAtokenFor (bv,cJ) = { | |
679 | + | let cK = bu(bv) | |
680 | + | let aO = if ((cJ == -1)) | |
681 | + | then cK | |
682 | + | else cJ | |
683 | + | let bG = if (if (if (af(ag)) | |
666 | 684 | then ab("atokens") | |
667 | 685 | else false) | |
668 | - | then e((-1 > | |
686 | + | then e((-1 > cJ), "invalid amountToMint") | |
669 | 687 | else false) | |
670 | - | then e(( | |
688 | + | then e((aO > cK), ("Trying to mint more than available, max: " + toString(cK))) | |
671 | 689 | else false | |
672 | - | if (( | |
673 | - | then $Tuple2(( | |
690 | + | if ((bG == bG)) | |
691 | + | then $Tuple2((bc(0, 0, 0, 0) ++ [j(M(bv), -(aO)), Reissue(aq, aO, true), ScriptTransfer(addressFromStringValue(bv), aO, aq)]), bp(aO)) | |
674 | 692 | else throw("Strict value is not equal to itself.") | |
675 | 693 | } | |
676 | 694 | ||
677 | 695 | ||
678 | 696 | ||
679 | 697 | @Callable(ag) | |
680 | - | func redeemAtokens () = { | |
681 | - | let bE = ab("atokens") | |
682 | - | if ((bE == bE)) | |
698 | + | func redeemAtokensFor (bx) = { | |
699 | + | let bG = if (af(ag)) | |
700 | + | then ab("atokens") | |
701 | + | else false | |
702 | + | if ((bG == bG)) | |
683 | 703 | then { | |
684 | - | let | |
685 | - | let | |
686 | - | ( | |
704 | + | let bq = ba(ag, aq) | |
705 | + | let cL = bp(bq) | |
706 | + | $Tuple2((bc(-(cL), 0, 0, cL) ++ [ScriptTransfer(addressFromStringValue(bx), cL, R), j(F, -(bq)), Burn(aq, bq)]), cL) | |
687 | 707 | } | |
688 | 708 | else throw("Strict value is not equal to itself.") | |
689 | 709 | } | |
691 | 711 | ||
692 | 712 | ||
693 | 713 | @Callable(ag) | |
694 | - | func transferATokensFor ( | |
695 | - | let | |
714 | + | func transferATokensFor (cM,cN,cO) = { | |
715 | + | let bG = if (af(ag)) | |
696 | 716 | then ab("transfer_debt") | |
697 | 717 | else false | |
698 | - | if (( | |
718 | + | if ((bG == bG)) | |
699 | 719 | then { | |
700 | - | let | |
701 | - | let | |
702 | - | let | |
703 | - | if (( | |
704 | - | then throw((((((((((("transferAtokensFor error:" + " transfer.valueUsd: ") + toString( | |
705 | - | else $Tuple2((( | |
720 | + | let cP = bo(cO) | |
721 | + | let bW = br(cP) | |
722 | + | let cQ = bu(cM) | |
723 | + | if ((bW > cQ)) | |
724 | + | then throw((((((((((("transferAtokensFor error:" + " transfer.valueUsd: ") + toString(cO)) + " transfer.assets: ") + toString(cP)) + " transfer.atokens: ") + toString(bW)) + " from.atokens: ") + toString(cQ)) + " at ") + toString(this))) | |
725 | + | else $Tuple2(((bc(0, 0, 0, 0) ++ [j(M(cM), -(bW)), j(M(cN), bW)]) ++ by(cN)), bp(bW)) | |
706 | 726 | } | |
707 | 727 | else throw("Strict value is not equal to itself.") | |
708 | 728 | } | |
710 | 730 | ||
711 | 731 | ||
712 | 732 | @Callable(ag) | |
713 | - | func transferDebtFor ( | |
714 | - | let | |
733 | + | func transferDebtFor (cM,cN,aO) = { | |
734 | + | let bG = if (af(ag)) | |
715 | 735 | then ab("transfer_debt") | |
716 | 736 | else false | |
717 | - | if (( | |
718 | - | then $Tuple2(( | |
737 | + | if ((bG == bG)) | |
738 | + | then $Tuple2((bc(0, 0, 0, 0) ++ [h(O(cM), (aS(cM) - aO)), h(O(cN), (aS(cN) + aO)), h(P(cM), aL), h(P(cN), aL), bw(cN)]), aO) | |
719 | 739 | else throw("Strict value is not equal to itself.") | |
720 | 740 | } | |
721 | 741 | ||
722 | 742 | ||
723 | 743 | ||
724 | 744 | @Callable(ag) | |
725 | - | func disableUseAsCollateralFor ( | |
726 | - | let | |
745 | + | func disableUseAsCollateralFor (bv) = { | |
746 | + | let bG = if (af(ag)) | |
727 | 747 | then ab("use_as_col") | |
728 | 748 | else false | |
729 | - | if (( | |
730 | - | then if (( | |
749 | + | if ((bG == bG)) | |
750 | + | then if ((aS(bv) > 0)) | |
731 | 751 | then throw("can't disable collateral for asset with open debt") | |
732 | - | else ( | |
752 | + | else (bc(0, 0, 0, 0) ++ [BooleanEntry(Q(bv), false)]) | |
733 | 753 | else throw("Strict value is not equal to itself.") | |
734 | 754 | } | |
735 | 755 | ||
737 | 757 | ||
738 | 758 | @Callable(ag) | |
739 | 759 | func enableUseAsCollateral () = { | |
740 | - | let | |
741 | - | if (( | |
742 | - | then ( | |
760 | + | let bG = ab("use_as_col") | |
761 | + | if ((bG == bG)) | |
762 | + | then (bc(0, 0, 0, 0) ++ [bw(toString(ag.caller))]) | |
743 | 763 | else throw("Strict value is not equal to itself.") | |
744 | 764 | } | |
745 | 765 | ||
746 | 766 | ||
747 | 767 | ||
748 | 768 | @Callable(ag) | |
749 | - | func collapseFor ( | |
750 | - | let | |
769 | + | func collapseFor (bx) = { | |
770 | + | let bG = if (af(ag)) | |
751 | 771 | then ab("force_collapse") | |
752 | 772 | else false | |
753 | - | if (( | |
754 | - | then bx | |
773 | + | if ((bG == bG)) | |
774 | + | then bz(bx, -1) | |
755 | 775 | else throw("Strict value is not equal to itself.") | |
756 | 776 | } | |
757 | 777 | ||
758 | 778 | ||
759 | 779 | ||
760 | 780 | @Callable(ag) | |
761 | - | func collapseForAmount ( | |
762 | - | let | |
781 | + | func collapseForAmount (bx,aO) = { | |
782 | + | let bG = if (af(ag)) | |
763 | 783 | then ab("collapse") | |
764 | 784 | else false | |
765 | - | if (( | |
766 | - | then bx | |
785 | + | if ((bG == bG)) | |
786 | + | then bz(bx, aO) | |
767 | 787 | else throw("Strict value is not equal to itself.") | |
768 | 788 | } | |
769 | 789 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func a (b) = getInteger(this, b) | |
5 | 5 | ||
6 | 6 | ||
7 | 7 | func c (b) = getString(this, b) | |
8 | 8 | ||
9 | 9 | ||
10 | 10 | func d (b) = value(getString(this, b)) | |
11 | 11 | ||
12 | 12 | ||
13 | 13 | func e (f,g) = if (f) | |
14 | 14 | then throw(g) | |
15 | 15 | else true | |
16 | 16 | ||
17 | 17 | ||
18 | 18 | func h (b,i) = if ((0 > i)) | |
19 | 19 | then throw(((("writing negative value " + toString(i)) + " for key ") + b)) | |
20 | 20 | else IntegerEntry(b, i) | |
21 | 21 | ||
22 | 22 | ||
23 | 23 | func j (b,i) = h(b, (valueOrElse(a(b), 0) + i)) | |
24 | 24 | ||
25 | 25 | ||
26 | 26 | func k (b,i) = StringEntry(b, i) | |
27 | 27 | ||
28 | 28 | ||
29 | 29 | func l (i,m,n) = { | |
30 | 30 | let o = fraction(i, m, n) | |
31 | 31 | let p = 3037000499 | |
32 | 32 | let q = ((((o % p) * (n % p)) % p) == (((i % p) * (m % p)) % p)) | |
33 | 33 | if (q) | |
34 | 34 | then o | |
35 | 35 | else (o + 1) | |
36 | 36 | } | |
37 | 37 | ||
38 | 38 | ||
39 | 39 | let r = 525600 | |
40 | 40 | ||
41 | 41 | let s = 10000000000000000 | |
42 | 42 | ||
43 | 43 | let t = 1000 | |
44 | 44 | ||
45 | 45 | let u = "assetId" | |
46 | 46 | ||
47 | 47 | let v = "main" | |
48 | 48 | ||
49 | 49 | let w = (d(u) + "_ReserveFactor") | |
50 | 50 | ||
51 | 51 | let x = (d(u) + "_CollateralFactor") | |
52 | 52 | ||
53 | 53 | let y = (getStringValue(u) + "_LiquidationThreshold") | |
54 | 54 | ||
55 | 55 | let z = "account_health_overlap" | |
56 | 56 | ||
57 | 57 | let A = (getStringValue(u) + "_LiquidationPenalty") | |
58 | 58 | ||
59 | 59 | let B = "configAddress" | |
60 | 60 | ||
61 | 61 | let C = "oracleAddress" | |
62 | 62 | ||
63 | 63 | let D = "aTokenId" | |
64 | 64 | ||
65 | 65 | let E = "aTokenName" | |
66 | 66 | ||
67 | 67 | let F = "aTokenCirculation" | |
68 | 68 | ||
69 | 69 | let G = "lastUpdateHeight" | |
70 | 70 | ||
71 | 71 | let H = "totalBorrow" | |
72 | 72 | ||
73 | 73 | let I = "totalDeposit" | |
74 | 74 | ||
75 | 75 | let J = "totalReserve" | |
76 | 76 | ||
77 | 77 | let K = "storedIndex" | |
78 | 78 | ||
79 | 79 | let L = "aTokenDecimals" | |
80 | 80 | ||
81 | 81 | func M (N) = (N + "_aTokenBalance") | |
82 | 82 | ||
83 | 83 | ||
84 | 84 | func O (N) = (N + "_debt") | |
85 | 85 | ||
86 | 86 | ||
87 | 87 | func P (N) = (N + "_index") | |
88 | 88 | ||
89 | 89 | ||
90 | 90 | func Q (N) = (N + "_useAsCollateral") | |
91 | 91 | ||
92 | 92 | ||
93 | 93 | let R = { | |
94 | 94 | let S = valueOrErrorMessage(c(u), "no assetId") | |
95 | 95 | if ((S == "WAVES")) | |
96 | 96 | then unit | |
97 | 97 | else fromBase58String(S) | |
98 | 98 | } | |
99 | 99 | ||
100 | 100 | let T = { | |
101 | 101 | let U = R | |
102 | 102 | if ($isInstanceOf(U, "ByteVector")) | |
103 | 103 | then { | |
104 | 104 | let V = U | |
105 | 105 | toBase58String(V) | |
106 | 106 | } | |
107 | 107 | else if ($isInstanceOf(U, "Unit")) | |
108 | 108 | then { | |
109 | 109 | let W = U | |
110 | 110 | "WAVES" | |
111 | 111 | } | |
112 | 112 | else throw("Match error") | |
113 | 113 | } | |
114 | 114 | ||
115 | 115 | func X (Y,R) = { | |
116 | 116 | let U = R | |
117 | 117 | if ($isInstanceOf(U, "ByteVector")) | |
118 | 118 | then { | |
119 | 119 | let V = U | |
120 | 120 | assetBalance(Y, V) | |
121 | 121 | } | |
122 | 122 | else if ($isInstanceOf(U, "Unit")) | |
123 | 123 | then { | |
124 | 124 | let W = U | |
125 | 125 | wavesBalance(Y).available | |
126 | 126 | } | |
127 | 127 | else throw("Match error") | |
128 | 128 | } | |
129 | 129 | ||
130 | 130 | ||
131 | 131 | let Z = valueOrErrorMessage(a(L), "no assetDecimals") | |
132 | 132 | ||
133 | 133 | let aa = valueOrErrorMessage(addressFromString(valueOrErrorMessage(c(B), "no configAddress")), "invalid config address") | |
134 | 134 | ||
135 | 135 | func ab (ac) = { | |
136 | 136 | let ad = valueOrErrorMessage(c(u), "no assetId") | |
137 | 137 | let U = invoke(aa, "opAllowed", [ad, ac], nil) | |
138 | 138 | if ($isInstanceOf(U, "Boolean")) | |
139 | 139 | then { | |
140 | 140 | let ae = U | |
141 | 141 | if (ae) | |
142 | 142 | then true | |
143 | 143 | else throw("not allowed") | |
144 | 144 | } | |
145 | 145 | else throw("opAllowed: unexpected result type") | |
146 | 146 | } | |
147 | 147 | ||
148 | 148 | ||
149 | 149 | func af (ag) = if ((ag.caller != valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(aa, v), "no main in config")), "invalid main address"))) | |
150 | 150 | then throw("only main can do") | |
151 | 151 | else true | |
152 | 152 | ||
153 | 153 | ||
154 | - | func ah (i) = if (if ((i != "WAVES")) | |
154 | + | func ah (ag) = { | |
155 | + | let ai = valueOrErrorMessage(getString(aa, "divAdmins"), "no div admins") | |
156 | + | if (!(contains(ai, toString(ag.caller)))) | |
157 | + | then throw("only div admin can do") | |
158 | + | else true | |
159 | + | } | |
160 | + | ||
161 | + | ||
162 | + | func aj (i) = if (if ((i != "WAVES")) | |
155 | 163 | then (fromBase58String(i) == fromBase58String("")) | |
156 | 164 | else false) | |
157 | 165 | then throw("invalid assetId") | |
158 | 166 | else true | |
159 | 167 | ||
160 | 168 | ||
161 | - | let | |
169 | + | let ak = e(isDefined(c(u)), "already initialized") | |
162 | 170 | ||
163 | - | let | |
171 | + | let al = { | |
164 | 172 | let U = c(C) | |
165 | 173 | if ($isInstanceOf(U, "String")) | |
166 | 174 | then { | |
167 | - | let | |
168 | - | addressFromString( | |
175 | + | let am = U | |
176 | + | addressFromString(am) | |
169 | 177 | } | |
170 | 178 | else unit | |
171 | 179 | } | |
172 | 180 | ||
173 | - | let | |
174 | - | let U = invoke(valueOrErrorMessage( | |
181 | + | let an = { | |
182 | + | let U = invoke(valueOrErrorMessage(al, "no oracle"), "price", [d(u)], nil) | |
175 | 183 | if ($isInstanceOf(U, "Int")) | |
176 | 184 | then { | |
177 | 185 | let ag = U | |
178 | 186 | ag | |
179 | 187 | } | |
180 | 188 | else throw("bad oracle data") | |
181 | 189 | } | |
182 | 190 | ||
183 | - | let | |
191 | + | let ao = height | |
184 | 192 | ||
185 | - | let | |
193 | + | let ap = valueOrErrorMessage(a(G), "no lastUpdateHeight") | |
186 | 194 | ||
187 | - | let | |
195 | + | let aq = fromBase58String(valueOrErrorMessage(c(D), "no aTokenId")) | |
188 | 196 | ||
189 | - | let | |
197 | + | let ar = valueOrElse(a(F), 0) | |
190 | 198 | ||
191 | - | let | |
199 | + | let as = { | |
192 | 200 | let S = d(u) | |
193 | 201 | $Tuple4(getIntegerValue(aa, (S + "_APoint")), getIntegerValue(aa, (S + "_BPoint")), getIntegerValue(aa, (S + "_CPoint")), getIntegerValue(aa, (S + "_DPoint"))) | |
194 | 202 | } | |
195 | 203 | ||
196 | - | let | |
204 | + | let at = valueOrErrorMessage(getInteger(aa, w), "no reserveFactor") | |
197 | 205 | ||
198 | - | let | |
206 | + | let au = valueOrErrorMessage(getInteger(aa, x), "no collateralFactor") | |
199 | 207 | ||
200 | - | let | |
208 | + | let av = valueOrErrorMessage(getInteger(aa, y), "no liquidationThreshold") | |
201 | 209 | ||
202 | - | let | |
210 | + | let aw = valueOrErrorMessage(getInteger(aa, z), "no overlapCharge") | |
203 | 211 | ||
204 | - | let | |
212 | + | let ax = valueOrErrorMessage(getInteger(aa, A), "no liquidationPenalty") | |
205 | 213 | ||
206 | - | let | |
214 | + | let ay = valueOrElse(a(I), 0) | |
207 | 215 | ||
208 | - | let | |
216 | + | let az = valueOrElse(a(J), 0) | |
209 | 217 | ||
210 | - | let | |
218 | + | let aA = valueOrElse(a(H), 0) | |
211 | 219 | ||
212 | - | let | |
220 | + | let aB = valueOrElse(a(K), s) | |
213 | 221 | ||
214 | - | let | |
215 | - | then fraction( | |
222 | + | let aC = if ((ay > 0)) | |
223 | + | then fraction(aA, t, ay) | |
216 | 224 | else 0 | |
217 | 225 | ||
218 | - | let | |
219 | - | let | |
220 | - | let | |
221 | - | let ae = | |
222 | - | let | |
223 | - | let | |
224 | - | let | |
225 | - | let | |
226 | - | if (( | |
227 | - | then | |
228 | - | else if (( | |
229 | - | then | |
230 | - | else if (if ((ae > | |
226 | + | let aD = { | |
227 | + | let aE = as | |
228 | + | let aF = aE._1 | |
229 | + | let ae = aE._2 | |
230 | + | let aG = aE._3 | |
231 | + | let aH = aE._4 | |
232 | + | let aI = (fraction((aF - aG), aC, -(ae)) + aF) | |
233 | + | let aJ = (fraction((aG - aH), (aC - ae), (ae - t)) + aG) | |
234 | + | if ((aC == 0)) | |
235 | + | then aF | |
236 | + | else if ((aC == ae)) | |
237 | + | then aG | |
238 | + | else if (if ((ae > aC)) | |
231 | 239 | then true | |
232 | 240 | else (ae == t)) | |
233 | - | then | |
234 | - | else | |
241 | + | then aI | |
242 | + | else aJ | |
235 | 243 | } | |
236 | 244 | ||
237 | - | let | |
245 | + | let aK = if ((ay == 0)) | |
238 | 246 | then 0 | |
239 | - | else fraction(fraction( | |
247 | + | else fraction(fraction(aA, aD, ay), (t - at), t) | |
240 | 248 | ||
241 | - | let | |
242 | - | then | |
249 | + | let aL = if ((ao == ap)) | |
250 | + | then aB | |
243 | 251 | else { | |
244 | - | let | |
245 | - | l( | |
252 | + | let aM = l(aD, s, (r * t)) | |
253 | + | l(aB, (s + (aM * (ao - ap))), s) | |
246 | 254 | } | |
247 | 255 | ||
248 | - | func | |
249 | - | then throw(("not enough liquidity: " + | |
256 | + | func aN (aO,aP,aQ) = if ((aO > aP)) | |
257 | + | then throw(("not enough liquidity: " + aQ)) | |
250 | 258 | else true | |
251 | 259 | ||
252 | 260 | ||
253 | - | func | |
261 | + | func aR (N) = valueOrElse(a(O(N)), 0) | |
254 | 262 | ||
255 | 263 | ||
256 | - | func | |
257 | - | let | |
258 | - | if (( | |
264 | + | func aS (N) = { | |
265 | + | let aT = aR(N) | |
266 | + | if ((aT == 0)) | |
259 | 267 | then 0 | |
260 | 268 | else { | |
261 | - | let | |
262 | - | fraction( | |
269 | + | let aU = valueOrErrorMessage(a(P(N)), "has debt but does not have index") | |
270 | + | fraction(aT, aL, aU) | |
263 | 271 | } | |
264 | 272 | } | |
265 | 273 | ||
266 | 274 | ||
267 | - | let | |
275 | + | let aV = fraction(aA, aL, aB) | |
268 | 276 | ||
269 | - | let | |
277 | + | let aW = (aV - aA) | |
270 | 278 | ||
271 | - | let | |
279 | + | let aX = fraction(aW, (t - at), t) | |
272 | 280 | ||
273 | - | let | |
281 | + | let aY = (ay + aX) | |
274 | 282 | ||
275 | - | let | |
283 | + | let aZ = ((az + aW) - aX) | |
276 | 284 | ||
277 | - | func | |
278 | - | let | |
279 | - | if ((0 >= | |
285 | + | func ba (ag,R) = { | |
286 | + | let bb = ag.payments[0].amount | |
287 | + | if ((0 >= bb)) | |
280 | 288 | then throw("Payment is less than min allowed amount") | |
281 | 289 | else if ((ag.payments[0].assetId != R)) | |
282 | 290 | then throw(("bad asset attached: required " + T)) | |
283 | - | else | |
291 | + | else bb | |
284 | 292 | } | |
285 | 293 | ||
286 | 294 | ||
287 | - | func | |
288 | - | let | |
295 | + | func bc (bd,be,bf,bg) = { | |
296 | + | let bh = { | |
289 | 297 | let U = R | |
290 | 298 | if ($isInstanceOf(U, "ByteVector")) | |
291 | 299 | then { | |
292 | 300 | let ad = U | |
293 | 301 | assetBalance(this, ad) | |
294 | 302 | } | |
295 | 303 | else wavesBalance(this).available | |
296 | 304 | } | |
297 | - | let | |
305 | + | let bi = if ((bh == bg)) | |
298 | 306 | then unit | |
299 | 307 | else { | |
300 | - | let | |
301 | - | if (!( | |
308 | + | let bj = valueOrElse(getBoolean(aa, ("staking_enabled_" + T)), false) | |
309 | + | if (!(bj)) | |
302 | 310 | then unit | |
303 | 311 | else { | |
304 | - | let | |
305 | - | if (( | |
306 | - | then invoke( | |
307 | - | else invoke( | |
312 | + | let bk = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(aa, ("staking_config_" + T)), ("no staking address for " + T))), ("bad staking address for " + T)) | |
313 | + | if ((bh > bg)) | |
314 | + | then invoke(bk, "put", nil, [AttachedPayment(R, (bh - bg))]) | |
315 | + | else invoke(bk, "get", [(bg - bh)], nil) | |
308 | 316 | } | |
309 | 317 | } | |
310 | - | if (( | |
311 | - | then [h(K, | |
318 | + | if ((bi == bi)) | |
319 | + | then [h(K, aL), h(G, ao), h(I, (aY + bd)), h(H, (aV + be)), h(J, (aZ + bf))] | |
312 | 320 | else throw("Strict value is not equal to itself.") | |
313 | 321 | } | |
314 | 322 | ||
315 | 323 | ||
316 | - | func | |
324 | + | func bl (bm) = if ((bm == 6)) | |
317 | 325 | then 1000000 | |
318 | - | else if (( | |
326 | + | else if ((bm == 8)) | |
319 | 327 | then 100000000 | |
320 | - | else throw(("bad decimals: " + toString( | |
328 | + | else throw(("bad decimals: " + toString(bm))) | |
321 | 329 | ||
322 | 330 | ||
323 | - | func | |
331 | + | func bn (aO) = fraction(aO, an, bl(Z)) | |
324 | 332 | ||
325 | 333 | ||
326 | - | func bm (aM) = fraction(aM, bj(Z), al) | |
327 | - | ||
328 | - | ||
329 | - | func bn (bo) = if ((bo == 0)) | |
330 | - | then 0 | |
331 | - | else if ((ap > 0)) | |
332 | - | then fraction(bo, aW, ap) | |
333 | - | else bo | |
334 | + | func bo (aO) = fraction(aO, bl(Z), an) | |
334 | 335 | ||
335 | 336 | ||
336 | 337 | func bp (bq) = if ((bq == 0)) | |
337 | 338 | then 0 | |
338 | - | else if (( | |
339 | - | then fraction(bq, | |
339 | + | else if ((ar > 0)) | |
340 | + | then fraction(bq, aY, ar) | |
340 | 341 | else bq | |
341 | 342 | ||
342 | 343 | ||
343 | - | func br ( | |
344 | + | func br (bs) = if ((bs == 0)) | |
344 | 345 | then 0 | |
345 | - | else if (( | |
346 | - | then | |
347 | - | else | |
346 | + | else if ((ar > 0)) | |
347 | + | then fraction(bs, ar, aY) | |
348 | + | else bs | |
348 | 349 | ||
349 | 350 | ||
350 | - | func bs (bt) = valueOrElse(a(M(bt)), 0) | |
351 | + | func bt (bs) = if ((bs == 0)) | |
352 | + | then 0 | |
353 | + | else if ((ar > 0)) | |
354 | + | then l(bs, ar, aY) | |
355 | + | else bs | |
351 | 356 | ||
352 | 357 | ||
353 | - | func bu (bv) = | |
358 | + | func bu (bv) = valueOrElse(a(M(bv)), 0) | |
354 | 359 | ||
355 | 360 | ||
356 | - | func bw (bv) = if ((aQ(bv) > 0)) | |
357 | - | then [bu(bv)] | |
361 | + | func bw (bx) = BooleanEntry(Q(bx), true) | |
362 | + | ||
363 | + | ||
364 | + | func by (bx) = if ((aS(bx) > 0)) | |
365 | + | then [bw(bx)] | |
358 | 366 | else nil | |
359 | 367 | ||
360 | 368 | ||
361 | - | func | |
362 | - | let | |
363 | - | let | |
364 | - | let | |
365 | - | let | |
369 | + | func bz (bv,aO) = { | |
370 | + | let bA = aS(bv) | |
371 | + | let bB = bp(bu(bv)) | |
372 | + | let bC = min([bA, bB]) | |
373 | + | let bD = if ((-1 > aO)) | |
366 | 374 | then throw("invalid collapse amount") | |
367 | - | else if (if (( | |
375 | + | else if (if ((bC == 0)) | |
368 | 376 | then true | |
369 | - | else ( | |
377 | + | else (aO == 0)) | |
370 | 378 | then throw("nothing to collapse") | |
371 | - | else if (if (( | |
379 | + | else if (if ((aO == -1)) | |
372 | 380 | then true | |
373 | - | else ( | |
374 | - | then | |
375 | - | else | |
376 | - | let | |
377 | - | $Tuple2(( | |
381 | + | else (aO > bC)) | |
382 | + | then bC | |
383 | + | else aO | |
384 | + | let bE = bt(bD) | |
385 | + | $Tuple2((bc(-(bD), -(bD), 0, 0) ++ [j(M(bv), -(bE)), j(F, -(bE)), h(O(bv), (bA - bD)), h(P(bv), aL)]), bD) | |
378 | 386 | } | |
379 | 387 | ||
380 | 388 | ||
381 | - | func | |
382 | - | let | |
383 | - | if (( | |
389 | + | func bF (N,aO) = { | |
390 | + | let bG = ab("repay") | |
391 | + | if ((bG == bG)) | |
384 | 392 | then { | |
385 | - | let | |
386 | - | if (( | |
393 | + | let bH = aS(N) | |
394 | + | if ((bH == bH)) | |
387 | 395 | then { | |
388 | - | let | |
389 | - | then $Tuple4(0, -( | |
390 | - | else $Tuple4(( | |
391 | - | let | |
392 | - | let | |
393 | - | let | |
394 | - | let | |
395 | - | let | |
396 | - | $Tuple2((( | |
396 | + | let bI = if ((aO > bH)) | |
397 | + | then $Tuple4(0, -(bH), (aO - bH), [ScriptTransfer(addressFromStringValue(N), (aO - bH), R)]) | |
398 | + | else $Tuple4((bH - aO), -(aO), 0, nil) | |
399 | + | let bJ = bI._1 | |
400 | + | let bK = bI._2 | |
401 | + | let bL = bI._3 | |
402 | + | let bM = bI._4 | |
403 | + | let bN = (aO - bL) | |
404 | + | $Tuple2(((bc(0, bK, 0, bL) ++ bM) ++ [h(O(N), bJ), h(P(N), aL)]), bN) | |
397 | 405 | } | |
398 | 406 | else throw("Strict value is not equal to itself.") | |
399 | 407 | } | |
400 | 408 | else throw("Strict value is not equal to itself.") | |
401 | 409 | } | |
402 | 410 | ||
403 | 411 | ||
404 | - | func | |
405 | - | let | |
406 | - | let | |
407 | - | let ae = | |
408 | - | let | |
409 | - | let | |
410 | - | ((((((((((((((("ABCD: " + toString( | |
412 | + | func bO () = { | |
413 | + | let bP = as | |
414 | + | let aF = bP._1 | |
415 | + | let ae = bP._2 | |
416 | + | let aG = bP._3 | |
417 | + | let aH = bP._4 | |
418 | + | ((((((((((((((("ABCD: " + toString(aF)) + ";") + toString(ae)) + ";") + toString(aG)) + ";") + toString(aH)) + ", reserveFactor: ") + toString(at)) + ", collateralFactor: ") + toString(au)) + ", liquidationThreshold: ") + toString(av)) + ", liquidationPenalty: ") + toString(ax)) | |
411 | 419 | } | |
412 | 420 | ||
413 | 421 | ||
414 | - | func | |
422 | + | func bQ () = ((((((((((((((((((((((((((("currentTotalDeposit: " + toString(aY)) + ", storedTotalDeposit: ") + toString(ay)) + ", currentTotalDebt: ") + toString(aV)) + ", storedTotalDebt: ") + toString(aA)) + ", currentTotalReserve: ") + toString(aZ)) + ", storedTotalReserve: ") + toString(az)) + ", currentIndex:") + toString(aL)) + ", storedIndex: ") + toString(aB)) + ", lastUpdateHeight: ") + toString(ap)) + ", utilization: ") + toString(aC)) + ", aTokenCirculation: ") + toString(ar)) + ", aTokenPrice: ") + toString(bp(pow(10, 0, Z, 0, 0, FLOOR)))) + ", APR: ") + toString(aD)) + ", APY: ") + toString(aK)) | |
415 | 423 | ||
416 | 424 | ||
417 | - | func | |
418 | - | let | |
419 | - | let | |
420 | - | ((((((((((((((((("currentDebt: " + toString( | |
425 | + | func bR (bx) = { | |
426 | + | let bS = bu(bx) | |
427 | + | let bT = X(addressFromStringValue(bx), aq) | |
428 | + | ((((((((((((((((("currentDebt: " + toString(aS(bx))) + ", storedDebt: ") + toString(valueOrElse(a(O(bx)), 0))) + ", currentDeposit: ") + toString(bp(bS))) + ", aTokenContractBalance: ") + toString(bS)) + ", aTokenWalletBalance: ") + toString(bT)) + ", walletStake: ") + toString(bp(bT))) + ", assetWalletBalance: ") + toString(X(addressFromStringValue(bx), R))) + ", useAsCollateral: ") + toString(valueOrElse(getBoolean(this, Q(bx)), true))) + ", storedIndex: ") + toString(valueOrElse(a(P(bx)), 0))) | |
421 | 429 | } | |
422 | 430 | ||
423 | 431 | ||
424 | - | func | |
432 | + | func bU () = ((((((((((((((((((((((("storedTotalDeposit: " + toString(ay)) + ", storedTotalDebt: ") + toString(aA)) + ", storedTotalReserve: ") + toString(az)) + ", storedIndex: ") + toString(aB)) + ", lastUpdateHeight: ") + toString(ap)) + ", currentTotalDeposit: ") + toString(aY)) + ", currentTotalDebt: ") + toString(aV)) + ", currentTotalReserve: ") + toString(aZ)) + ", currentIndex: ") + toString(aL)) + ", currentHeight: ") + toString(ao)) + ", aTokenCirculation: ") + toString(ar)) + ", aTokenPrice: ") + toString(bp(pow(10, 0, Z, 0, 0, FLOOR)))) | |
425 | 433 | ||
426 | 434 | ||
427 | - | func | |
428 | - | let | |
429 | - | let | |
430 | - | let | |
431 | - | if (( | |
432 | - | then $Tuple4( | |
433 | - | else $Tuple4( | |
435 | + | func bV (bx) = { | |
436 | + | let bW = bu(bx) | |
437 | + | let bX = bp(bW) | |
438 | + | let bA = aS(bx) | |
439 | + | if ((ao == ap)) | |
440 | + | then $Tuple4(ay, aA, bX, bA) | |
441 | + | else $Tuple4(aY, aV, bX, bA) | |
434 | 442 | } | |
435 | 443 | ||
436 | 444 | ||
437 | 445 | @Callable(ag) | |
438 | - | func | |
446 | + | func getReserveDivsInfo () = $Tuple2(nil, $Tuple2(aZ, T)) | |
439 | 447 | ||
440 | 448 | ||
441 | 449 | ||
442 | 450 | @Callable(ag) | |
443 | - | func getCurrentTotals2 (bW,bX) = { | |
444 | - | let bY = bT(bW) | |
445 | - | let bZ = bY._1 | |
446 | - | let ca = bY._2 | |
447 | - | let cb = bY._3 | |
448 | - | let cc = bY._4 | |
449 | - | let cd = bT(bX) | |
450 | - | let ce = cd._1 | |
451 | - | let cf = cd._2 | |
452 | - | let cg = cd._3 | |
453 | - | let ch = cd._4 | |
454 | - | $Tuple2(nil, $Tuple6(bZ, ca, cb, cc, cg, ch)) | |
451 | + | func getCurrentTotals (bx) = $Tuple2(nil, bV(bx)) | |
452 | + | ||
453 | + | ||
454 | + | ||
455 | + | @Callable(ag) | |
456 | + | func getCurrentTotals2 (bY,bZ) = { | |
457 | + | let ca = bV(bY) | |
458 | + | let cb = ca._1 | |
459 | + | let cc = ca._2 | |
460 | + | let cd = ca._3 | |
461 | + | let ce = ca._4 | |
462 | + | let cf = bV(bZ) | |
463 | + | let cg = cf._1 | |
464 | + | let ch = cf._2 | |
465 | + | let ci = cf._3 | |
466 | + | let cj = cf._4 | |
467 | + | $Tuple2(nil, $Tuple6(cb, cc, cd, ce, ci, cj)) | |
455 | 468 | } | |
456 | 469 | ||
457 | 470 | ||
458 | 471 | ||
459 | 472 | @Callable(ag) | |
460 | - | func advise () = $Tuple2(nil, ((((("reserveAddress: " + toString(this)) + ", ") + | |
473 | + | func advise () = $Tuple2(nil, ((((("reserveAddress: " + toString(this)) + ", ") + bO()) + ", ") + bQ())) | |
461 | 474 | ||
462 | 475 | ||
463 | 476 | ||
464 | 477 | @Callable(ag) | |
465 | - | func adviseUser ( | |
466 | - | let | |
467 | - | let | |
468 | - | let | |
469 | - | let | |
470 | - | then | |
478 | + | func adviseUser (bx) = { | |
479 | + | let ck = bn(aV) | |
480 | + | let cl = bn(aY) | |
481 | + | let cm = valueOrElse(getBoolean(this, Q(bx)), true) | |
482 | + | let cn = if (cm) | |
483 | + | then cl | |
471 | 484 | else 0 | |
472 | - | let | |
473 | - | let | |
474 | - | let | |
485 | + | let co = min([ck, cn]) | |
486 | + | let cp = l(co, aw, t) | |
487 | + | let cq = if ((ck > cn)) | |
475 | 488 | then 0 | |
476 | - | else fraction(( | |
477 | - | let | |
478 | - | then (fraction(( | |
479 | - | else | |
480 | - | let | |
481 | - | $Tuple2(nil, (( | |
489 | + | else fraction((cn - ck), au, t) | |
490 | + | let cr = if ((ck > cn)) | |
491 | + | then (fraction((ck - cn), t, av) + cp) | |
492 | + | else cp | |
493 | + | let cs = ((((((((("reserveAddress: " + toString(this)) + ", currentDebtUsd: ") + toString(ck)) + ", currentDepositUsd: ") + toString(cl)) + ", bp: ") + toString(cq)) + ", bpu: ") + toString(cr)) | |
494 | + | $Tuple2(nil, ((cs + ", ") + bR(bx))) | |
482 | 495 | } | |
483 | 496 | ||
484 | 497 | ||
485 | 498 | ||
486 | 499 | @Callable(ag) | |
487 | 500 | func addInterest () = if ((ag.payments[0].assetId != R)) | |
488 | 501 | then throw("can't add interest with unrelated token") | |
489 | - | else | |
502 | + | else bc(ag.payments[0].amount, 0, 0, 0) | |
490 | 503 | ||
491 | 504 | ||
492 | 505 | ||
493 | 506 | @Callable(ag) | |
494 | 507 | func addToReserve () = if ((ag.payments[0].assetId != R)) | |
495 | 508 | then throw("can't add interest with unrelated token") | |
496 | - | else | |
509 | + | else bc(0, 0, ag.payments[0].amount, 0) | |
497 | 510 | ||
498 | 511 | ||
499 | 512 | ||
500 | 513 | @Callable(ag) | |
501 | - | func withdrawFromReserve (bB) = { | |
502 | - | let cr = getStringValue(aa, "admin") | |
503 | - | if ((toString(ag.caller) != cr)) | |
504 | - | then throw("only admin can do") | |
505 | - | else (ba(0, 0, -(bB), bB) ++ [ScriptTransfer(addressFromStringValue(cr), bB, R)]) | |
506 | - | } | |
507 | - | ||
508 | - | ||
509 | - | ||
510 | - | @Callable(ag) | |
511 | - | func forceUpdate () = { | |
512 | - | let cr = getStringValue(aa, "admin") | |
513 | - | if ((toString(ag.caller) != cr)) | |
514 | - | then throw("only admin can do") | |
515 | - | else ba(0, 0, 0, 0) | |
516 | - | } | |
517 | - | ||
518 | - | ||
519 | - | ||
520 | - | @Callable(ag) | |
521 | - | func initialize (cs,ct,cu,cv,cw,cx) = { | |
522 | - | let bE = if (ai) | |
523 | - | then ah(cu) | |
524 | - | else false | |
525 | - | if ((bE == bE)) | |
514 | + | func withdrawFromReserve (bD) = { | |
515 | + | let bG = ah(ag) | |
516 | + | if ((bG == bG)) | |
526 | 517 | then { | |
527 | - | let cy = Issue(cv, cw, 0, cx, true) | |
528 | - | [cy, k(C, ct), h(L, cx), k(E, cv), k(u, cu), k(B, cs), k(D, toBase58String(calculateAssetId(cy))), h(G, am)] | |
518 | + | let ct = if ((bD == -1)) | |
519 | + | then aZ | |
520 | + | else bD | |
521 | + | $Tuple2((bc(0, 0, -(ct), ct) ++ [ScriptTransfer(ag.caller, ct, R)]), ct) | |
529 | 522 | } | |
530 | 523 | else throw("Strict value is not equal to itself.") | |
531 | 524 | } | |
532 | 525 | ||
533 | 526 | ||
534 | 527 | ||
535 | 528 | @Callable(ag) | |
536 | - | func userDepositUSD (bt) = $Tuple2(nil, bl(bn(bs(bt)))) | |
537 | - | ||
538 | - | ||
539 | - | ||
540 | - | @Callable(ag) | |
541 | - | func userDebtUSD (bt) = $Tuple2(nil, bl(aQ(bt))) | |
542 | - | ||
543 | - | ||
544 | - | ||
545 | - | @Callable(ag) | |
546 | - | func userBalance (bt) = { | |
547 | - | let bU = bs(bt) | |
548 | - | let bV = bn(bU) | |
549 | - | let by = aQ(bt) | |
550 | - | $Tuple2(nil, $Tuple6(bU, bV, bl(bV), by, bl(by), valueOrElse(getBoolean(this, Q(bt)), true))) | |
529 | + | func forceUpdate () = { | |
530 | + | let cu = getStringValue(aa, "admin") | |
531 | + | if ((toString(ag.caller) != cu)) | |
532 | + | then throw("only admin can do") | |
533 | + | else bc(0, 0, 0, 0) | |
551 | 534 | } | |
552 | 535 | ||
553 | 536 | ||
554 | 537 | ||
555 | 538 | @Callable(ag) | |
556 | - | func userDebt (bt) = { | |
557 | - | let by = aQ(bt) | |
558 | - | let cz = bl(by) | |
559 | - | $Tuple2(nil, $Tuple2(by, cz)) | |
560 | - | } | |
561 | - | ||
562 | - | ||
563 | - | ||
564 | - | @Callable(ag) | |
565 | - | func assetUsdValue (bq) = $Tuple2(nil, bl(bq)) | |
566 | - | ||
567 | - | ||
568 | - | ||
569 | - | @Callable(ag) | |
570 | - | func repayFor (N) = { | |
571 | - | let bE = af(ag) | |
572 | - | if ((bE == bE)) | |
573 | - | then bD(N, aY(ag, R)) | |
539 | + | func initialize (cv,cw,cx,cy,cz,cA) = { | |
540 | + | let bG = if (ak) | |
541 | + | then aj(cx) | |
542 | + | else false | |
543 | + | if ((bG == bG)) | |
544 | + | then { | |
545 | + | let cB = Issue(cy, cz, 0, cA, true) | |
546 | + | [cB, k(C, cw), h(L, cA), k(E, cy), k(u, cx), k(B, cv), k(D, toBase58String(calculateAssetId(cB))), h(G, ao)] | |
547 | + | } | |
574 | 548 | else throw("Strict value is not equal to itself.") | |
575 | 549 | } | |
576 | 550 | ||
577 | 551 | ||
578 | 552 | ||
579 | 553 | @Callable(ag) | |
580 | - | func depositFor (cA,cB) = { | |
581 | - | let bE = if (af(ag)) | |
554 | + | func userDepositUSD (bv) = $Tuple2(nil, bn(bp(bu(bv)))) | |
555 | + | ||
556 | + | ||
557 | + | ||
558 | + | @Callable(ag) | |
559 | + | func userDebtUSD (bv) = $Tuple2(nil, bn(aS(bv))) | |
560 | + | ||
561 | + | ||
562 | + | ||
563 | + | @Callable(ag) | |
564 | + | func userBalance (bv) = { | |
565 | + | let bW = bu(bv) | |
566 | + | let bX = bp(bW) | |
567 | + | let bA = aS(bv) | |
568 | + | $Tuple2(nil, $Tuple6(bW, bX, bn(bX), bA, bn(bA), valueOrElse(getBoolean(this, Q(bv)), true))) | |
569 | + | } | |
570 | + | ||
571 | + | ||
572 | + | ||
573 | + | @Callable(ag) | |
574 | + | func userDebt (bv) = { | |
575 | + | let bA = aS(bv) | |
576 | + | let cC = bn(bA) | |
577 | + | $Tuple2(nil, $Tuple2(bA, cC)) | |
578 | + | } | |
579 | + | ||
580 | + | ||
581 | + | ||
582 | + | @Callable(ag) | |
583 | + | func assetUsdValue (bs) = $Tuple2(nil, bn(bs)) | |
584 | + | ||
585 | + | ||
586 | + | ||
587 | + | @Callable(ag) | |
588 | + | func repayFor (N) = { | |
589 | + | let bG = af(ag) | |
590 | + | if ((bG == bG)) | |
591 | + | then bF(N, ba(ag, R)) | |
592 | + | else throw("Strict value is not equal to itself.") | |
593 | + | } | |
594 | + | ||
595 | + | ||
596 | + | ||
597 | + | @Callable(ag) | |
598 | + | func depositFor (cD,cE) = { | |
599 | + | let bG = if (af(ag)) | |
582 | 600 | then ab("deposit") | |
583 | 601 | else false | |
584 | - | if (( | |
585 | - | then if (if (( | |
586 | - | then !( | |
602 | + | if ((bG == bG)) | |
603 | + | then if (if ((aS(cD) > 0)) | |
604 | + | then !(cE) | |
587 | 605 | else false) | |
588 | 606 | then throw("can't disable use as collateral for asset with open debt") | |
589 | 607 | else { | |
590 | - | let | |
591 | - | let | |
592 | - | ( | |
608 | + | let aO = ba(ag, R) | |
609 | + | let bq = br(aO) | |
610 | + | (bc(aO, 0, 0, 0) ++ [j(F, bq), j(M(cD), bq), BooleanEntry(Q(cD), cE)]) | |
593 | 611 | } | |
594 | 612 | else throw("Strict value is not equal to itself.") | |
595 | 613 | } | |
596 | 614 | ||
597 | 615 | ||
598 | 616 | ||
599 | 617 | @Callable(ag) | |
600 | - | func withdrawFor ( | |
601 | - | let | |
602 | - | let | |
603 | - | then | |
618 | + | func withdrawFor (bv,aO) = { | |
619 | + | let cF = ((ay + az) - aA) | |
620 | + | let bG = if (if (if (af(ag)) | |
621 | + | then aN(aO, cF, "funds in use") | |
604 | 622 | else false) | |
605 | - | then e((-1 > | |
623 | + | then e((-1 > aO), "invalid amount") | |
606 | 624 | else false) | |
607 | 625 | then ab("withdraw") | |
608 | 626 | else false | |
609 | - | if (( | |
627 | + | if ((bG == bG)) | |
610 | 628 | then { | |
611 | - | let | |
629 | + | let cG = if ((aO == -1)) | |
612 | 630 | then { | |
613 | - | let | |
614 | - | $Tuple2( | |
631 | + | let bW = bu(bv) | |
632 | + | $Tuple2(bW, bp(bW)) | |
615 | 633 | } | |
616 | - | else $Tuple2( | |
617 | - | let | |
618 | - | let | |
619 | - | $Tuple2(( | |
634 | + | else $Tuple2(bt(aO), aO) | |
635 | + | let bE = cG._1 | |
636 | + | let cH = cG._2 | |
637 | + | $Tuple2((bc(-(cH), 0, 0, cH) ++ [ScriptTransfer(addressFromStringValue(bv), cH, R), j(M(bv), -(bE)), j(F, -(bE))]), cH) | |
620 | 638 | } | |
621 | 639 | else throw("Strict value is not equal to itself.") | |
622 | 640 | } | |
623 | 641 | ||
624 | 642 | ||
625 | 643 | ||
626 | 644 | @Callable(ag) | |
627 | - | func replenishWithAtokenFor ( | |
628 | - | let | |
645 | + | func replenishWithAtokenFor (bx) = { | |
646 | + | let bG = if (af(ag)) | |
629 | 647 | then ab("atokens") | |
630 | 648 | else false | |
631 | - | if (( | |
649 | + | if ((bG == bG)) | |
632 | 650 | then { | |
633 | - | let | |
634 | - | $Tuple2((( | |
651 | + | let bq = ba(ag, aq) | |
652 | + | $Tuple2(((bc(0, 0, 0, 0) ++ [j(M(bx), bq), Burn(aq, bq)]) ++ by(bx)), bp(bq)) | |
635 | 653 | } | |
636 | 654 | else throw("Strict value is not equal to itself.") | |
637 | 655 | } | |
638 | 656 | ||
639 | 657 | ||
640 | 658 | ||
641 | 659 | @Callable(ag) | |
642 | - | func borrowFor ( | |
643 | - | let | |
644 | - | then | |
660 | + | func borrowFor (bv,cI) = { | |
661 | + | let bG = if (if (af(ag)) | |
662 | + | then aN(cI, (ay - aA), "too much borrow requested") | |
645 | 663 | else false) | |
646 | 664 | then ab("borrow") | |
647 | 665 | else false | |
648 | - | if (( | |
666 | + | if ((bG == bG)) | |
649 | 667 | then { | |
650 | - | let | |
651 | - | let | |
652 | - | ( | |
668 | + | let bH = aS(bv) | |
669 | + | let bJ = (bH + cI) | |
670 | + | (bc(0, cI, 0, cI) ++ [h(O(bv), bJ), bw(bv), h(P(bv), aL), ScriptTransfer(addressFromStringValue(bv), cI, R)]) | |
653 | 671 | } | |
654 | 672 | else throw("Strict value is not equal to itself.") | |
655 | 673 | } | |
656 | 674 | ||
657 | 675 | ||
658 | 676 | ||
659 | 677 | @Callable(ag) | |
660 | - | func mintAtokenFor ( | |
661 | - | let | |
662 | - | let | |
663 | - | then | |
664 | - | else | |
665 | - | let | |
678 | + | func mintAtokenFor (bv,cJ) = { | |
679 | + | let cK = bu(bv) | |
680 | + | let aO = if ((cJ == -1)) | |
681 | + | then cK | |
682 | + | else cJ | |
683 | + | let bG = if (if (if (af(ag)) | |
666 | 684 | then ab("atokens") | |
667 | 685 | else false) | |
668 | - | then e((-1 > | |
686 | + | then e((-1 > cJ), "invalid amountToMint") | |
669 | 687 | else false) | |
670 | - | then e(( | |
688 | + | then e((aO > cK), ("Trying to mint more than available, max: " + toString(cK))) | |
671 | 689 | else false | |
672 | - | if (( | |
673 | - | then $Tuple2(( | |
690 | + | if ((bG == bG)) | |
691 | + | then $Tuple2((bc(0, 0, 0, 0) ++ [j(M(bv), -(aO)), Reissue(aq, aO, true), ScriptTransfer(addressFromStringValue(bv), aO, aq)]), bp(aO)) | |
674 | 692 | else throw("Strict value is not equal to itself.") | |
675 | 693 | } | |
676 | 694 | ||
677 | 695 | ||
678 | 696 | ||
679 | 697 | @Callable(ag) | |
680 | - | func redeemAtokens () = { | |
681 | - | let bE = ab("atokens") | |
682 | - | if ((bE == bE)) | |
698 | + | func redeemAtokensFor (bx) = { | |
699 | + | let bG = if (af(ag)) | |
700 | + | then ab("atokens") | |
701 | + | else false | |
702 | + | if ((bG == bG)) | |
683 | 703 | then { | |
684 | - | let | |
685 | - | let | |
686 | - | ( | |
704 | + | let bq = ba(ag, aq) | |
705 | + | let cL = bp(bq) | |
706 | + | $Tuple2((bc(-(cL), 0, 0, cL) ++ [ScriptTransfer(addressFromStringValue(bx), cL, R), j(F, -(bq)), Burn(aq, bq)]), cL) | |
687 | 707 | } | |
688 | 708 | else throw("Strict value is not equal to itself.") | |
689 | 709 | } | |
690 | 710 | ||
691 | 711 | ||
692 | 712 | ||
693 | 713 | @Callable(ag) | |
694 | - | func transferATokensFor ( | |
695 | - | let | |
714 | + | func transferATokensFor (cM,cN,cO) = { | |
715 | + | let bG = if (af(ag)) | |
696 | 716 | then ab("transfer_debt") | |
697 | 717 | else false | |
698 | - | if (( | |
718 | + | if ((bG == bG)) | |
699 | 719 | then { | |
700 | - | let | |
701 | - | let | |
702 | - | let | |
703 | - | if (( | |
704 | - | then throw((((((((((("transferAtokensFor error:" + " transfer.valueUsd: ") + toString( | |
705 | - | else $Tuple2((( | |
720 | + | let cP = bo(cO) | |
721 | + | let bW = br(cP) | |
722 | + | let cQ = bu(cM) | |
723 | + | if ((bW > cQ)) | |
724 | + | then throw((((((((((("transferAtokensFor error:" + " transfer.valueUsd: ") + toString(cO)) + " transfer.assets: ") + toString(cP)) + " transfer.atokens: ") + toString(bW)) + " from.atokens: ") + toString(cQ)) + " at ") + toString(this))) | |
725 | + | else $Tuple2(((bc(0, 0, 0, 0) ++ [j(M(cM), -(bW)), j(M(cN), bW)]) ++ by(cN)), bp(bW)) | |
706 | 726 | } | |
707 | 727 | else throw("Strict value is not equal to itself.") | |
708 | 728 | } | |
709 | 729 | ||
710 | 730 | ||
711 | 731 | ||
712 | 732 | @Callable(ag) | |
713 | - | func transferDebtFor ( | |
714 | - | let | |
733 | + | func transferDebtFor (cM,cN,aO) = { | |
734 | + | let bG = if (af(ag)) | |
715 | 735 | then ab("transfer_debt") | |
716 | 736 | else false | |
717 | - | if (( | |
718 | - | then $Tuple2(( | |
737 | + | if ((bG == bG)) | |
738 | + | then $Tuple2((bc(0, 0, 0, 0) ++ [h(O(cM), (aS(cM) - aO)), h(O(cN), (aS(cN) + aO)), h(P(cM), aL), h(P(cN), aL), bw(cN)]), aO) | |
719 | 739 | else throw("Strict value is not equal to itself.") | |
720 | 740 | } | |
721 | 741 | ||
722 | 742 | ||
723 | 743 | ||
724 | 744 | @Callable(ag) | |
725 | - | func disableUseAsCollateralFor ( | |
726 | - | let | |
745 | + | func disableUseAsCollateralFor (bv) = { | |
746 | + | let bG = if (af(ag)) | |
727 | 747 | then ab("use_as_col") | |
728 | 748 | else false | |
729 | - | if (( | |
730 | - | then if (( | |
749 | + | if ((bG == bG)) | |
750 | + | then if ((aS(bv) > 0)) | |
731 | 751 | then throw("can't disable collateral for asset with open debt") | |
732 | - | else ( | |
752 | + | else (bc(0, 0, 0, 0) ++ [BooleanEntry(Q(bv), false)]) | |
733 | 753 | else throw("Strict value is not equal to itself.") | |
734 | 754 | } | |
735 | 755 | ||
736 | 756 | ||
737 | 757 | ||
738 | 758 | @Callable(ag) | |
739 | 759 | func enableUseAsCollateral () = { | |
740 | - | let | |
741 | - | if (( | |
742 | - | then ( | |
760 | + | let bG = ab("use_as_col") | |
761 | + | if ((bG == bG)) | |
762 | + | then (bc(0, 0, 0, 0) ++ [bw(toString(ag.caller))]) | |
743 | 763 | else throw("Strict value is not equal to itself.") | |
744 | 764 | } | |
745 | 765 | ||
746 | 766 | ||
747 | 767 | ||
748 | 768 | @Callable(ag) | |
749 | - | func collapseFor ( | |
750 | - | let | |
769 | + | func collapseFor (bx) = { | |
770 | + | let bG = if (af(ag)) | |
751 | 771 | then ab("force_collapse") | |
752 | 772 | else false | |
753 | - | if (( | |
754 | - | then bx | |
773 | + | if ((bG == bG)) | |
774 | + | then bz(bx, -1) | |
755 | 775 | else throw("Strict value is not equal to itself.") | |
756 | 776 | } | |
757 | 777 | ||
758 | 778 | ||
759 | 779 | ||
760 | 780 | @Callable(ag) | |
761 | - | func collapseForAmount ( | |
762 | - | let | |
781 | + | func collapseForAmount (bx,aO) = { | |
782 | + | let bG = if (af(ag)) | |
763 | 783 | then ab("collapse") | |
764 | 784 | else false | |
765 | - | if (( | |
766 | - | then bx | |
785 | + | if ((bG == bG)) | |
786 | + | then bz(bx, aO) | |
767 | 787 | else throw("Strict value is not equal to itself.") | |
768 | 788 | } | |
769 | 789 | ||
770 | 790 |
github/deemru/w8io/6500d08 261.68 ms ◑