tx · 2D7fadJmPTPzQ84crsgEEFX1AVQsCbXhE6TiWpVpt5Qr

3MzTHd4e3yukNUURApVLVzH5uxeEsXHD6yY:  -0.01400000 Waves

2021.07.20 16:22 [1621993] smart account 3MzTHd4e3yukNUURApVLVzH5uxeEsXHD6yY > SELF 0.00000000 Waves

{ "type": 13, "id": "2D7fadJmPTPzQ84crsgEEFX1AVQsCbXhE6TiWpVpt5Qr", "fee": 1400000, "feeAssetId": null, "timestamp": 1626787409128, "version": 2, "chainId": 84, "sender": "3MzTHd4e3yukNUURApVLVzH5uxeEsXHD6yY", "senderPublicKey": "DhKV985fxsz63vhWDNTF3gWwe7AHS4RsGjR2BzThJRYa", "proofs": [ "4WMbx9QodwySwzgaGKyjB54478gxsBW2KAb6khfHEFpzsnoQa7n7pw9JbHAdBdQCxQnYYepuxKT2soMoqAkjQQ9Y", "81iN9V2VPfTm2a8XRHFWiueWevBm8LNoej3DBnEEUasw4CPbH27KkbSDNPEVjF6KFUqW6mwwoikWPpAY2W2AdWA" ], "script": "base64:AAIFAAAAAAAAABkIAhIAEgMKAQESABIDCgEBEgASABIDCgEBAAAAQAAAAAAHdmVyc2lvbgIAAAAFMS4wLjAAAAAACmtleVZlcnNpb24CAAAAB3ZlcnNpb24AAAAACWtleUFjdGl2ZQIAAAAGYWN0aXZlAAAAAAtrZXlBc3NldElkQQIAAAAKQV9hc3NldF9pZAAAAAALa2V5QXNzZXRJZEICAAAACkJfYXNzZXRfaWQAAAAAC2tleUJhbGFuY2VBAgAAAA9BX2Fzc2V0X2JhbGFuY2UAAAAAC2tleUJhbGFuY2VCAgAAAA9CX2Fzc2V0X2JhbGFuY2UAAAAAD2tleVNoYXJlQXNzZXRJZAIAAAAOc2hhcmVfYXNzZXRfaWQAAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkCAAAAEnNoYXJlX2Fzc2V0X3N1cHBseQAAAAANa2V5Q29tbWlzc2lvbgIAAAAKY29tbWlzc2lvbgAAAAAba2V5Q29tbWlzc2lvblNjYWxlRGVsaW1pdGVyAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAAIa2V5Q2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAAA9rZXlBZG1pblB1YktleTECAAAAC2FkbWluX3B1Yl8xAAAAAA9rZXlBZG1pblB1YktleTICAAAAC2FkbWluX3B1Yl8yAAAAAA9rZXlBZG1pblB1YktleTMCAAAAC2FkbWluX3B1Yl8zAAAAAAZvcmFjbGUJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVTpRaoekC86rvG6DuYumpJfGpiE4fNiswgBAAAAC2dldEFkbWluUHViAAAAAQAAAAtrZXlBZG1pblB1YgQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAZvcmFjbGUFAAAAC2tleUFkbWluUHViAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAABnN0cmluZwUAAAAHJG1hdGNoMAkAAlkAAAABBQAAAAZzdHJpbmcEAAAAB25vdGhpbmcFAAAAByRtYXRjaDAJAAACAAAAAQIAAAAZQWRtaW4gcHVibGljIGtleSBpcyBlbXB0eQAAAAAMYWRtaW5QdWJLZXkxCQEAAAALZ2V0QWRtaW5QdWIAAAABBQAAAA9rZXlBZG1pblB1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bnRCCQEAAAAMc3Rha2VkQW1vdW50AAAAAgUAAAASc3Rha2luZ0FkZHJlc3NVU0ROBQAAAAtzdHJBc3NldElkQgAAAAARYXZhaWxhYmxlQmFsYW5jZUEJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAADXN0YWtlZEFtb3VudEEAAAAAEWF2YWlsYWJsZUJhbGFuY2VCCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAA1zdGFrZWRBbW91bnRCAAAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRBCQAAZAAAAAIJAQAAAA5hY2NvdW50QmFsYW5jZQAAAAEFAAAACGFzc2V0SWRBBQAAAA1zdGFrZWRBbW91bnRBAAAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCCQAAZAAAAAIJAQAAAA5hY2NvdW50QmFsYW5jZQAAAAEFAAAACGFzc2V0SWRCBQAAAA1zdGFrZWRBbW91bnRCAAAAABBoYXNFbm91Z2hCYWxhbmNlAwkAAGcAAAACBQAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRBBQAAAAhiYWxhbmNlQQkAAGcAAAACBQAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCBQAAAAhiYWxhbmNlQgcBAAAADGdldEFzc2V0SW5mbwAAAAEAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACaWQFAAAAByRtYXRjaDAEAAAACHN0cmluZ0lkCQACWAAAAAEFAAAAAmlkBAAAAARpbmZvCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAPsAAAAAQUAAAACaWQJAAEsAAAAAgkAASwAAAACAgAAAAZBc3NldCAFAAAACHN0cmluZ0lkAgAAAA4gZG9lc24ndCBleGlzdAkABRUAAAADBQAAAAhzdHJpbmdJZAgFAAAABGluZm8AAAAEbmFtZQgFAAAABGluZm8AAAAIZGVjaW1hbHMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwCQAFFQAAAAMCAAAABVdBVkVTAgAAAAVXQVZFUwAAAAAAAAAACAkA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DXNoYXJlRGVjaW1hbHMAAAAAAAAAAAAAAAAAAAAAAAAFAAAABERPV04EAAAACnNoYXJlSXNzdWUJAARCAAAABQUAAAAJc2hhcmVOYW1lBQAAABBzaGFyZURlc2NyaXB0aW9uBQAAABJzaGFyZUluaXRpYWxTdXBwbHkFAAAADXNoYXJlRGVjaW1hbHMGBAAAAAxzaGFyZUlzc3VlSWQJAAQ4AAAAAQUAAAAKc2hhcmVJc3N1ZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAprZXlWZXJzaW9uBQAAAAd2ZXJzaW9uCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAlrZXlBY3RpdmUGCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAC2tleUFzc2V0SWRBBQAAAA5wbXRTdHJBc3NldElkQQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAtrZXlBc3NldElkQgUAAAAOcG10U3RyQXNzZXRJZEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VBBQAAAApwbXRBbW91bnRBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQgUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANa2V5Q29tbWlzc2lvbgUAAAAKY29tbWlzc2lvbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAba2V5Q29tbWlzc2lvblNjYWxlRGVsaW1pdGVyBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIJAARMAAAAAgUAAAAKc2hhcmVJc3N1ZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA9rZXlTaGFyZUFzc2V0SWQJAAJYAAAAAQUAAAAMc2hhcmVJc3N1ZUlkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABNrZXlTaGFyZUFzc2V0U3VwcGx5BQAAABJzaGFyZUluaXRpYWxTdXBwbHkJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABJzaGFyZUluaXRpYWxTdXBwbHkFAAAADHNoYXJlSXNzdWVJZAUAAAADbmlsAAAAAWkBAAAAFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMAAAABAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAAAtwbXRBc3NldElkQQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAALcG10QXNzZXRJZEIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAAB2Fzc2V0SWQEAAAACnBtdEFtb3VudEEJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50BQAAAAtwbXRBc3NldElkQQQAAAAKcG10QW1vdW50QgkBAAAAEGRlZHVjdFN0YWtpbmdGZWUAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAZhbW91bnQFAAAAC3BtdEFzc2V0SWRCBAAAAAp0b2tlblJhdGlvCQAAawAAAAMJAABrAAAAAwUAAAAIYmFsYW5jZUEFAAAAC3NjYWxlVmFsdWU4BQAAAApwbXRBbW91bnRBBQAAAAtzY2FsZVZhbHVlMwkAAGsAAAADBQAAAAhiYWxhbmNlQgUAAAALc2NhbGVWYWx1ZTgFAAAACnBtdEFtb3VudEIEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAABrAAAAAwUAAAAKcG10QW1vdW50QQUAAAALc2NhbGVWYWx1ZTgFAAAACGJhbGFuY2VBBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5CCQAAawAAAAMFAAAACnBtdEFtb3VudEIFAAAAC3NjYWxlVmFsdWU4BQAAAAhiYWxhbmNlQgQAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAAawAAAAMJAAGXAAAAAQkABEwAAAACBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIFAAAAA25pbAUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAALc2NhbGVWYWx1ZTgDCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQDAwkAAGYAAAACAAAAAAAAAAAABQAAABFzbGlwcGFnZVRvbGVyYW5jZQYJAABmAAAAAgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAKVNsaXBwYWdlIHRvbGVyYW5jZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgCQABpAAAAAEFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyAgAAABYgaW5jbHVzaXZlbHkuIEFjdHVhbDogCQABpAAAAAEFAAAAEXNsaXBwYWdlVG9sZXJhbmNlAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAgkAAAIAAAABAgAAABxUd28gYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkAwMJAQAAAAIhPQAAAAIFAAAAC3BtdEFzc2V0SWRBBQAAAAhhc3NldElkQQYJAQAAAAIhPQAAAAIFAAAAC3BtdEFzc2V0SWRCBQAAAAhhc3NldElkQgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACVJbmNvcnJlY3QgYXNzZXRzIGF0dGFjaGVkLiBFeHBlY3RlZDogBQAAAAtzdHJBc3NldElkQQIAAAAFIGFuZCAFAAAAC3N0ckFzc2V0SWRCAwMJAABmAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWUzCQAAZQAAAAIFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIFAAAACnRva2VuUmF0aW8GCQAAZgAAAAIFAAAACnRva2VuUmF0aW8JAABpAAAAAgkAAGgAAAACBQAAAAtzY2FsZVZhbHVlMwkAAGQAAAACBQAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyCQAAAgAAAAECAAAAPUluY29ycmVjdCBhc3NldHMgYW1vdW50OiBhbW91bnRzIG11c3QgaGF2ZSB0aGUgY29udHJhY3QgcmF0aW8DCQAAAAAAAAIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAAAAAAAAAAAAAkAAAIAAAABAgAAAB1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKcG10QW1vdW50QQUAAAALcG10QXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRCBQAAAAtwbXRBc3NldElkQgUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAKcG10QW1vdW50QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkJAABkAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAMc2hhcmVBc3NldElkBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BQAAAAxzaGFyZUFzc2V0SWQFAAAAA25pbAAAAAFpAQAAAAh3aXRoZHJhdwAAAAAEAAAADSR0MDEwMzIxMTA0NzEJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxMDMyMTEwNDcxAAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTAzMjExMDQ3MQAAAAJfMgQAAAAMYW1vdW50VG9QYXlBCQEAAAAQZGVkdWN0U3Rha2luZ0ZlZQAAAAIJAABrAAAAAwUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQQUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAIYXNzZXRJZEEEAAAADGFtb3VudFRvUGF5QgkBAAAAEGRlZHVjdFN0YWtpbmdGZWUAAAACCQAAawAAAAMFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAACGFzc2V0SWRCAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAADHNoYXJlQXNzZXRJZAkAAAIAAAABCQABLAAAAAICAAAAJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAkAAlgAAAABBQAAAAxzaGFyZUFzc2V0SWQDCQEAAAABIQAAAAEFAAAAEGhhc0Vub3VnaEJhbGFuY2UJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAAAwMJAABmAAAAAgUAAAAMYW1vdW50VG9QYXlBBQAAABFhdmFpbGFibGVCYWxhbmNlQQYJAABmAAAAAgUAAAAMYW1vdW50VG9QYXlCBQAAABFhdmFpbGFibGVCYWxhbmNlQgkBAAAAInRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZXMAAAACBQAAAAxhbW91bnRUb1BheUEFAAAADGFtb3VudFRvUGF5QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUEJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAADGFtb3VudFRvUGF5QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADGFtb3VudFRvUGF5QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa2V5U2hhcmVBc3NldFN1cHBseQkAAGUAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAABEJ1cm4AAAACBQAAAAxzaGFyZUFzc2V0SWQFAAAACXBtdEFtb3VudAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADGFtb3VudFRvUGF5QQUAAAAIYXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUIFAAAACGFzc2V0SWRCBQAAAANuaWwAAAABaQEAAAAIZXhjaGFuZ2UAAAABAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQQAAAANJHQwMTE2NzgxMTc1MwkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDExNjc4MTE3NTMAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAxMTY3ODExNzUzAAAAAl8yCgEAAAANY2FsY3VsYXRlRmVlcwAAAAIAAAAJdG9rZW5Gcm9tAAAAB3Rva2VuVG8EAAAAEGFtb3VudFdpdGhvdXRGZWUJAABrAAAAAwUAAAAHdG9rZW5UbwUAAAAJcG10QW1vdW50CQAAZAAAAAIFAAAACXBtdEFtb3VudAUAAAAJdG9rZW5Gcm9tBAAAAA1hbW91bnRXaXRoRmVlCQAAawAAAAMFAAAAEGFtb3VudFdpdGhvdXRGZWUJAABlAAAAAgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyBQAAAApjb21taXNzaW9uBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIEAAAAEGdvdmVybmFuY2VSZXdhcmQJAABrAAAAAwUAAAAQYW1vdW50V2l0aG91dEZlZQUAAAAUY29tbWlzc2lvbkdvdmVybmFuY2UFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgMJAABmAAAAAgUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAA1hbW91bnRXaXRoRmVlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAHUNhbGN1bGF0ZWQgYW1vdW50IHRvIHJlY2VpdmUgCQABpAAAAAEFAAAADWFtb3VudFdpdGhGZWUCAAAAICBpcyBsZXNzIHRoYW4gc3BlY2lmaWVkIG1pbmltdW0gCQABpAAAAAEFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQkABRUAAAADBQAAABBhbW91bnRXaXRob3V0RmVlBQAAAA1hbW91bnRXaXRoRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkAAGcAAAACAAAAAAAAAAAABQAAABJtaW5BbW91bnRUb1JlY2VpdmUJAAACAAAAAQkAASwAAAACAgAAADRNaW5pbWFsIGFtb3VudCB0byByZWNlaXZlIG11c3QgYmUgcG9zaXRpdmUuIEFjdHVhbDogCQABpAAAAAEFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDCQEAAAABIQAAAAEFAAAAEGhhc0Vub3VnaEJhbGFuY2UJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAAAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQQAAAALYXNzZXRJZFNlbmQFAAAACGFzc2V0SWRCBAAAAA0kdDAxMjkyOTEzMDIwCQEAAAANY2FsY3VsYXRlRmVlcwAAAAIFAAAACGJhbGFuY2VBBQAAAAhiYWxhbmNlQgQAAAAQYW1vdW50V2l0aG91dEZlZQgFAAAADSR0MDEyOTI5MTMwMjAAAAACXzEEAAAADWFtb3VudFdpdGhGZWUIBQAAAA0kdDAxMjkyOTEzMDIwAAAAAl8yBAAAABBnb3Zlcm5hbmNlUmV3YXJkCAUAAAANJHQwMTI5MjkxMzAyMAAAAAJfMwQAAAALbmV3QmFsYW5jZUEJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACXBtdEFtb3VudAQAAAALbmV3QmFsYW5jZUIJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAANYW1vdW50V2l0aEZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAMDCQAAZwAAAAIFAAAADXN0YWtlZEFtb3VudEEFAAAAC25ld0JhbGFuY2VBBgkAAGcAAAACBQAAAA1zdGFrZWRBbW91bnRCBQAAAAtuZXdCYWxhbmNlQgkBAAAAIXRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZQAAAAMFAAAADWFtb3VudFdpdGhGZWUFAAAAEWF2YWlsYWJsZUJhbGFuY2VCBQAAAAphc3NldE5hbWVCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADWFtb3VudFdpdGhGZWUFAAAAC2Fzc2V0SWRTZW5kCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAEWdvdmVybmFuY2VBZGRyZXNzBQAAABBnb3Zlcm5hbmNlUmV3YXJkBQAAAAthc3NldElkU2VuZAUAAAADbmlsAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQgQAAAALYXNzZXRJZFNlbmQFAAAACGFzc2V0SWRBBAAAAA0kdDAxMzg0MzEzOTM0CQEAAAANY2FsY3VsYXRlRmVlcwAAAAIFAAAACGJhbGFuY2VCBQAAAAhiYWxhbmNlQQQAAAAQYW1vdW50V2l0aG91dEZlZQgFAAAADSR0MDEzODQzMTM5MzQAAAACXzEEAAAADWFtb3VudFdpdGhGZWUIBQAAAA0kdDAxMzg0MzEzOTM0AAAAAl8yBAAAABBnb3Zlcm5hbmNlUmV3YXJkCAUAAAANJHQwMTM4NDMxMzkzNAAAAAJfMwQAAAALbmV3QmFsYW5jZUEJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAANYW1vdW50V2l0aEZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAQAAAALbmV3QmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAMDCQAAZwAAAAIFAAAADXN0YWtlZEFtb3VudEEFAAAAC25ld0JhbGFuY2VBBgkAAGcAAAACBQAAAA1zdGFrZWRBbW91bnRCBQAAAAtuZXdCYWxhbmNlQgkBAAAAIXRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZQAAAAMFAAAADWFtb3VudFdpdGhGZWUFAAAAEWF2YWlsYWJsZUJhbGFuY2VBBQAAAAphc3NldE5hbWVBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADWFtb3VudFdpdGhGZWUFAAAAC2Fzc2V0SWRTZW5kCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAEWdvdmVybmFuY2VBZGRyZXNzBQAAABBnb3Zlcm5hbmNlUmV3YXJkBQAAAAthc3NldElkU2VuZAUAAAADbmlsCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAUAAAALc3RyQXNzZXRJZEECAAAABCBvciAFAAAAC3N0ckFzc2V0SWRCAAAAAWkBAAAACHNodXRkb3duAAAAAAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQkAASwAAAACAgAAACJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAACGtleUNhdXNlAgAAABp0aGUgY2F1c2Ugd2Fzbid0IHNwZWNpZmllZAMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkxCQAETAAAAAIFAAAADGFkbWluUHViS2V5MgkABEwAAAACBQAAAAxhZG1pblB1YktleTMJAARMAAAAAgUAAAAUYWRtaW5QdWJLZXlTdGFydFN0b3AFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkBAAAAB3N1c3BlbmQAAAABAgAAAA9QYXVzZWQgYnkgYWRtaW4AAAABaQEAAAAIYWN0aXZhdGUAAAAAAwUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAWREFwcCBpcyBhbHJlYWR5IGFjdGl2ZQMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkxCQAETAAAAAIFAAAADGFkbWluUHViS2V5MgkABEwAAAACBQAAAAxhZG1pblB1YktleTMJAARMAAAAAgUAAAAUYWRtaW5QdWJLZXlTdGFydFN0b3AFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAJa2V5QWN0aXZlBgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAAhrZXlDYXVzZQUAAAADbmlsAAAAAWkBAAAAGXRha2VJbnRvQWNjb3VudEV4dHJhRnVuZHMAAAABAAAAC2Ftb3VudExlYXZlBAAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QQkAAGUAAAACBQAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRBBQAAAAhiYWxhbmNlQQQAAAAddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEIJAABlAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgUAAAAIYmFsYW5jZUIEAAAADWFtb3VudEVucm9sbEEJAABlAAAAAgUAAAAddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEEDCQAAAAAAAAIFAAAACGFzc2V0SWRBBQAAAAR1bml0BQAAAAthbW91bnRMZWF2ZQAAAAAAAAAAAAQAAAANYW1vdW50RW5yb2xsQgkAAGUAAAACBQAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QgMJAAAAAAAAAgUAAAAIYXNzZXRJZEIFAAAABHVuaXQFAAAAC2Ftb3VudExlYXZlAAAAAAAAAAAAAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAK09ubHkgdGhlIERBcHAgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24DCQAAZgAAAAIAAAAAAAAAAAAFAAAAC2Ftb3VudExlYXZlCQAAAgAAAAEJAAEsAAAAAgIAAAAzQXJndW1lbnQgJ2Ftb3VudExlYXZl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", "height": 1621993, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HSHss1doe4q64RNECjb2nMg5ezULm3nGRHF7ZnPwtAdJ Next: CWa7rzWnjopxgzHUqaFMAucGu73gRRxWJ9K7H3PGFqxG Diff:
OldNewDifferences
1515
1616 let keyBalanceB = "B_asset_balance"
1717
18-let keyBalanceInitA = "A_asset_init"
19-
20-let keyBalanceInitB = "B_asset_init"
21-
2218 let keyShareAssetId = "share_asset_id"
2319
2420 let keyShareAssetSupply = "share_asset_supply"
2824 let keyCommissionScaleDelimiter = "commission_scale_delimiter"
2925
3026 let keyCause = "shutdown_cause"
31-
32-let keyFirstHarvest = "first_harvest"
33-
34-let keyFirstHarvestHeight = "first_harvest_height"
35-
36-let kShareLimit = "share_limit_on_first_harvest"
37-
38-let kBasePeriod = "base_period"
39-
40-let kPeriodLength = "period_length"
41-
42-let kStartHeight = "start_height"
43-
44-let kFirstHarvestHeight = "first_harvest_height"
4527
4628 let keyAdminPubKey1 = "admin_pub_1"
4729
6951
7052 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7153
72-let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
54+let governanceAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
7355
74-let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
56+let stakingAddressUSDN = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
7557
76-let stakingAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
58+let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
7759
78-let USDNToWavesExchanger = Address(base58'3Mvutbqb6ykHHvNCCgELTNzyAMaPTqFMixX')
60+let NSBT = base58'36mg8NZTaFRDygiVwb8uBnLR51hetJruUCZcxhaVcHj9'
7961
80-let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
62+let SWOP = base58'2HAJrwa8q4SxBx9cHYaBTQdBjdk5wwqdof7ccpAx2uhZ'
8163
82-let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
64+let swopUSDNtoWAVES = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
8365
84-let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
85-
86-let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
87-
88-let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
66+let swopUSDNtoNSBT = Address(base58'3MzTHd4e3yukNUURApVLVzH5uxeEsXHD6yY')
8967
9068 let stakingFeeInUSDN = 270000
9169
153131 }
154132
155133
156-let stakedAmountUSDN = match getInteger(stakingAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))) {
157- case staked: Int =>
158- staked
159- case nothing: Unit =>
160- 0
161- case _ =>
162- throw("Match error")
163-}
134+func stakedAmount (stakingAddress,asset) = {
135+ let stakedAmountCalculated = match getInteger(stakingAddress, ((("rpd_balance_" + asset) + "_") + toString(this))) {
136+ case staked: Int =>
137+ staked
138+ case nothing: Unit =>
139+ 0
140+ case _ =>
141+ throw("Match error")
142+ }
143+ stakedAmountCalculated
144+ }
164145
165-let assetInitA = getIntegerValue(this, keyBalanceInitA)
166146
167-let assetInitB = getIntegerValue(this, keyBalanceInitB)
147+let stakedAmountA = stakedAmount(stakingAddressUSDN, strAssetIdA)
168148
169-let availableBalanceA = (balanceA - (if ((assetIdA == USDN))
170- then stakedAmountUSDN
171- else 0))
149+let stakedAmountB = stakedAmount(stakingAddressUSDN, strAssetIdB)
172150
173-let availableBalanceB = (balanceB - (if ((assetIdB == USDN))
174- then stakedAmountUSDN
175- else 0))
151+let availableBalanceA = (balanceA - stakedAmountA)
176152
177-let accountBalanceWithStakedA = (accountBalance(assetIdA) + (if ((assetIdA == USDN))
178- then stakedAmountUSDN
179- else 0))
153+let availableBalanceB = (balanceB - stakedAmountB)
180154
181-let accountBalanceWithStakedB = (accountBalance(assetIdB) + (if ((assetIdB == USDN))
182- then stakedAmountUSDN
183- else 0))
155+let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
156+
157+let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
184158
185159 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
186160 then (accountBalanceWithStakedB >= balanceB)
198172 }
199173
200174
201-func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
202- then $Tuple3("WAVES", "WAVES", 8)
203- else {
204- let stringId = assetStr
205- let id = fromBase58String(assetStr)
206- let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
207- $Tuple3(stringId, info.name, info.decimals)
208- }
175+func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
209176
210177
211-func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
178+func stakedTokenCount () = {
179+ let isStakedA = if ((stakedAmountA > 0))
180+ then 1
181+ else 0
182+ let isStakedB = if ((stakedAmountB > 0))
183+ then 1
184+ else 0
185+ (isStakedA + isStakedB)
186+ }
212187
213188
214189 func deductStakingFee (amount,assetId) = if ((assetId == USDN))
215190 then {
216- let result = (amount - stakingFeeInUSDN)
191+ let result = (amount - (stakedTokenCount() * stakingFeeInUSDN))
217192 if ((0 >= result))
218193 then throw((((("Insufficient amount " + toString(amount)) + " to deduct staking fee ") + toString(stakingFeeInUSDN)) + " USD-N"))
219194 else result
231206
232207
233208 @Callable(i)
234-func init (firstHarvest) = {
235- let $t067096786 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
236- let pmtAmountA = $t067096786._1
237- let pmtAssetIdA = $t067096786._2
238- let $t067916868 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
239- let pmtAmountB = $t067916868._1
240- let pmtAssetIdB = $t067916868._2
241- let $t068736950 = getAssetInfo(pmtAssetIdA)
242- let pmtStrAssetIdA = $t068736950._1
243- let pmtAssetNameA = $t068736950._2
244- let pmtDecimalsA = $t068736950._3
245- let $t069557032 = getAssetInfo(pmtAssetIdB)
246- let pmtStrAssetIdB = $t069557032._1
247- let pmtAssetNameB = $t069557032._2
248- let pmtDecimalsB = $t069557032._3
249- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
250- then throw("Only admin can call this function")
251- else if (isDefined(getBoolean(this, keyActive)))
252- then throw("DApp is already active")
253- else if ((pmtAssetIdA == pmtAssetIdB))
254- then throw("Assets must be different")
255- else {
256- let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
257- let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
258- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
259- let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
260- let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
261- let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
262- let shareInitialSupply = fraction(arg1, arg2, arg3)
263- let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
264- let shareIssueId = calculateAssetId(shareIssue)
265- let baseEntry = [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
266- if (firstHarvest)
267- then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
268- else baseEntry
269- }
209+func init () = {
210+ let $t059366013 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
211+ let pmtAmountA = $t059366013._1
212+ let pmtAssetIdA = $t059366013._2
213+ let $t060186095 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
214+ let pmtAmountB = $t060186095._1
215+ let pmtAssetIdB = $t060186095._2
216+ let $t061006177 = getAssetInfo(pmtAssetIdA)
217+ let pmtStrAssetIdA = $t061006177._1
218+ let pmtAssetNameA = $t061006177._2
219+ let pmtDecimalsA = $t061006177._3
220+ let $t061826259 = getAssetInfo(pmtAssetIdB)
221+ let pmtStrAssetIdB = $t061826259._1
222+ let pmtAssetNameB = $t061826259._2
223+ let pmtDecimalsB = $t061826259._3
224+ if (isDefined(getBoolean(this, keyActive)))
225+ then throw("DApp is already active")
226+ else if ((pmtAssetIdA == pmtAssetIdB))
227+ then throw("Assets must be different")
228+ else {
229+ let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
230+ let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
231+ let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
232+ let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
233+ let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
234+ let shareIssueId = calculateAssetId(shareIssue)
235+[StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
236+ }
270237 }
271-
272-
273-
274-@Callable(i)
275-func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
276- let $t092779364 = getAssetInfoFromString(strAssetIdA)
277- let pmtStrAssetIdA = $t092779364._1
278- let pmtAssetNameA = $t092779364._2
279- let pmtDecimalsA = $t092779364._3
280- let $t093699456 = getAssetInfoFromString(strAssetIdB)
281- let pmtStrAssetIdB = $t093699456._1
282- let pmtAssetNameB = $t093699456._2
283- let pmtDecimalsB = $t093699456._3
284- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
285- then throw("Only admin can call this function")
286- else if (isDefined(getBoolean(this, keyActive)))
287- then throw("DApp is already active")
288- else if ((strAssetIdA == strAssetIdB))
289- then throw("Assets must be different")
290- else {
291- let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
292- let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
293- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
294- let shareInitialSupply = 0
295- let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
296- let shareIssueId = calculateAssetId(shareIssue)
297- let baseEntry = [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceInitA, amtAssetA), IntegerEntry(keyBalanceInitB, amtAssetB), IntegerEntry(keyBalanceA, 0), IntegerEntry(keyBalanceB, 0), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply)]
298- if (firstHarvest)
299- then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
300- else baseEntry
301- }
302- }
303-
304-
305-
306-@Callable(i)
307-func keepLimitForFirstHarvest (shareLimit) = if (!(isActive))
308- then throw("DApp is inactive at this moment")
309- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
310- then throw("Only admin can call this function")
311- else [IntegerEntry(kShareLimit, shareLimit)]
312238
313239
314240
318244 let pmtAssetIdB = i.payments[1].assetId
319245 let pmtAmountA = deductStakingFee(i.payments[0].amount, pmtAssetIdA)
320246 let pmtAmountB = deductStakingFee(i.payments[1].amount, pmtAssetIdB)
321- if (if ((balanceA == 0))
322- then (balanceB == 0)
323- else false)
324- then {
325- let $t01214112218 = getAssetInfo(pmtAssetIdA)
326- let pmtStrAssetIdA = $t01214112218._1
327- let pmtAssetNameA = $t01214112218._2
328- let pmtDecimalsA = $t01214112218._3
329- let $t01222712304 = getAssetInfo(pmtAssetIdB)
330- let pmtStrAssetIdB = $t01222712304._1
331- let pmtAssetNameB = $t01222712304._2
332- let pmtDecimalsB = $t01222712304._3
333- let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
334- if ((pmtAssetIdA == pmtAssetIdB))
335- then throw("Assets must be different")
336- else {
337- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
338- let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
339- if (!(isActive))
340- then throw("DApp is inactive at this moment")
341- else if (if ((0 > slippageTolerance))
342- then true
343- else (slippageTolerance > slippageToleranceDelimiter))
344- then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
345- else if ((size(i.payments) != 2))
346- then throw("Two attached assets expected")
347- else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
348- then true
349- else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
350- then throw("Incorrect assets amount: amounts must have the contract ratio")
351- else if (if ((pmtAssetIdA != assetIdA))
352- then true
353- else (pmtAssetIdB != assetIdB))
354- then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
355- else if ((shareInitialSupply == 0))
356- then throw("Too small amount to replenish")
357- else if (!(hasEnoughBalance))
358- then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
359- else [Reissue(shareAssetId, shareInitialSupply, true), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareAssetId)]
360- }
361- }
362- else {
363- let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
364- let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
365- let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
366- let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
367- if (!(isActive))
368- then throw("DApp is inactive at this moment")
369- else if (if ((0 > slippageTolerance))
247+ let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
248+ let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
249+ let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
250+ let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
251+ if (!(isActive))
252+ then throw("DApp is inactive at this moment")
253+ else if (if ((0 > slippageTolerance))
254+ then true
255+ else (slippageTolerance > slippageToleranceDelimiter))
256+ then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
257+ else if ((size(i.payments) != 2))
258+ then throw("Two attached assets expected")
259+ else if (if ((pmtAssetIdA != assetIdA))
370260 then true
371- else (slippageTolerance > slippageToleranceDelimiter))
372- then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
373- else if ((size(i.payments) != 2))
374- then throw("Two attached assets expected")
375- else if (if ((pmtAssetIdA != assetIdA))
376- then true
377- else (pmtAssetIdB != assetIdB))
378- then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
379- else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
380- then true
381- else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
382- then throw("Incorrect assets amount: amounts must have the contract ratio")
383- else if ((shareTokenToPayAmount == 0))
384- then throw("Too small amount to replenish")
385- else if (!(hasEnoughBalance))
386- then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
387- else [IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
388- }
261+ else (pmtAssetIdB != assetIdB))
262+ then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
263+ else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
264+ then true
265+ else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
266+ then throw("Incorrect assets amount: amounts must have the contract ratio")
267+ else if ((shareTokenToPayAmount == 0))
268+ then throw("Too small amount to replenish")
269+ else if (!(hasEnoughBalance))
270+ then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
271+ else [IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
389272 }
390273
391274
392275
393276 @Callable(i)
394277 func withdraw () = {
395- let $t01670316853 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
396- let pmtAmount = $t01670316853._1
397- let pmtAssetId = $t01670316853._2
278+ let $t01032110471 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
279+ let pmtAmount = $t01032110471._1
280+ let pmtAssetId = $t01032110471._2
398281 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA)
399282 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB)
400283 if (!(isActive))
416299
417300 @Callable(i)
418301 func exchange (minAmountToReceive) = {
419- let $t01805918134 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
420- let pmtAmount = $t01805918134._1
421- let pmtAssetId = $t01805918134._2
302+ let $t01167811753 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
303+ let pmtAmount = $t01167811753._1
304+ let pmtAssetId = $t01167811753._2
422305 func calculateFees (tokenFrom,tokenTo) = {
423306 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
424307 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
430313
431314 if (!(isActive))
432315 then throw("DApp is inactive at this moment")
433- else if (if ((balanceA == 0))
434- then true
435- else (balanceB == 0))
436- then throw("Can't exchange with zero balance")
437- else if ((0 >= minAmountToReceive))
438- then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
439- else if ((size(i.payments) != 1))
440- then throw("One attached payment expected")
441- else if (!(hasEnoughBalance))
442- then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
443- else if ((pmtAssetId == assetIdA))
316+ else if ((0 >= minAmountToReceive))
317+ then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
318+ else if ((size(i.payments) != 1))
319+ then throw("One attached payment expected")
320+ else if (!(hasEnoughBalance))
321+ then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
322+ else if ((pmtAssetId == assetIdA))
323+ then {
324+ let assetIdSend = assetIdB
325+ let $t01292913020 = calculateFees(balanceA, balanceB)
326+ let amountWithoutFee = $t01292913020._1
327+ let amountWithFee = $t01292913020._2
328+ let governanceReward = $t01292913020._3
329+ let newBalanceA = (balanceA + pmtAmount)
330+ let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
331+ if (if ((stakedAmountA >= newBalanceA))
332+ then true
333+ else (stakedAmountB >= newBalanceB))
334+ then throwInsufficientAvailableBalance(amountWithFee, availableBalanceB, assetNameB)
335+ else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
336+ }
337+ else if ((pmtAssetId == assetIdB))
444338 then {
445- let assetIdSend = assetIdB
446- let $t01940819499 = calculateFees(balanceA, balanceB)
447- let amountWithoutFee = $t01940819499._1
448- let amountWithFee = $t01940819499._2
449- let governanceReward = $t01940819499._3
450- let newBalanceA = (balanceA + pmtAmount)
451- let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
452- if (if (if ((assetIdA == USDN))
453- then (stakedAmountUSDN >= newBalanceA)
454- else false)
339+ let assetIdSend = assetIdA
340+ let $t01384313934 = calculateFees(balanceB, balanceA)
341+ let amountWithoutFee = $t01384313934._1
342+ let amountWithFee = $t01384313934._2
343+ let governanceReward = $t01384313934._3
344+ let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
345+ let newBalanceB = (balanceB + pmtAmount)
346+ if (if ((stakedAmountA >= newBalanceA))
455347 then true
456- else if ((assetIdB == USDN))
457- then (stakedAmountUSDN >= newBalanceB)
458- else false)
459- then throwInsufficientAvailableBalance(amountWithFee, availableBalanceB, assetNameB)
460- else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
348+ else (stakedAmountB >= newBalanceB))
349+ then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
350+ else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
461351 }
462- else if ((pmtAssetId == assetIdB))
463- then {
464- let assetIdSend = assetIdA
465- let $t02036820459 = calculateFees(balanceB, balanceA)
466- let amountWithoutFee = $t02036820459._1
467- let amountWithFee = $t02036820459._2
468- let governanceReward = $t02036820459._3
469- let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
470- let newBalanceB = (balanceB + pmtAmount)
471- if (if (if ((assetIdA == USDN))
472- then (stakedAmountUSDN >= newBalanceA)
473- else false)
474- then true
475- else if ((assetIdB == USDN))
476- then (stakedAmountUSDN >= newBalanceB)
477- else false)
478- then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
479- else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
480- }
481- else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
352+ else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
482353 }
483354
484355
545416 }
546417 match tx {
547418 case inv: InvokeScriptTransaction =>
548- let callTakeIntoAccount = if ((inv.dApp == this))
549- then (inv.function == "takeIntoAccountExtraFunds")
550- else false
551- let callStaking = if ((inv.dApp == stakingAddress))
552- then if (if (if ((inv.function == "lockNeutrino"))
553- then (size(inv.payments) == 1)
554- else false)
555- then (inv.payments[0].assetId == USDN)
556- else false)
557- then true
558- else if ((inv.function == "unlockNeutrino"))
559- then (size(inv.payments) == 0)
560- else false
561- else false
562- let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
563- then (inv.function == "exchange")
564- else false)
565- then (assetIdA == USDN)
419+ if (if (if (if (sigVerify(inv.bodyBytes, inv.proofs[0], adminPubKeyStaking))
420+ then (inv.dApp == stakingAddressUSDN)
566421 else false)
567422 then true
568- else if (if ((assetIdB == USDN))
569- then (size(inv.payments) == 1)
423+ else if (if (sigVerify(inv.bodyBytes, inv.proofs[0], adminPubKeyStaking))
424+ then (inv.function == "exchange")
570425 else false)
571- then (inv.payments[0].assetId == USDN)
572- else false
573- let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
426+ then if (if (if (if (if ((assetIdA == NSBT))
427+ then (assetIdB == USDN)
428+ else false)
429+ then (inv.dApp == swopUSDNtoWAVES)
430+ else false)
431+ then (inv.payments[0].assetId == unit)
432+ else false)
433+ then if ((inv.payments[0].assetId == unit))
434+ then true
435+ else (inv.payments[0].assetId == USDN)
436+ else false)
437+ then true
438+ else if (if ((assetIdA == NSBT))
439+ then (assetIdB == SWOP)
440+ else false)
441+ then if (if ((inv.dApp == swopUSDNtoNSBT))
442+ then (inv.payments[0].assetId == USDN)
443+ else false)
444+ then true
445+ else if ((inv.dApp == swopUSDNtoWAVES))
446+ then if ((inv.payments[0].assetId == unit))
447+ then true
448+ else (inv.payments[0].assetId == USDN)
449+ else false
450+ else false
451+ else false)
574452 then true
575- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
576- then true
577- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
578- then true
579- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
580- if (if (if (if (callTakeIntoAccount)
581- then true
582- else callStaking)
583- then true
584- else exchangeToWaves)
585- then signedByAdmin
586- else false)
453+ else if (if (sigVerify(inv.bodyBytes, inv.proofs[0], adminPubKeyStaking))
454+ then (inv.dApp == this)
455+ else false)
456+ then (inv.function == "takeIntoAccountExtraFunds")
457+ else false)
587458 then true
588459 else multiSignedByAdmins
589460 case _ =>
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "1.0.0"
55
66 let keyVersion = "version"
77
88 let keyActive = "active"
99
1010 let keyAssetIdA = "A_asset_id"
1111
1212 let keyAssetIdB = "B_asset_id"
1313
1414 let keyBalanceA = "A_asset_balance"
1515
1616 let keyBalanceB = "B_asset_balance"
1717
18-let keyBalanceInitA = "A_asset_init"
19-
20-let keyBalanceInitB = "B_asset_init"
21-
2218 let keyShareAssetId = "share_asset_id"
2319
2420 let keyShareAssetSupply = "share_asset_supply"
2521
2622 let keyCommission = "commission"
2723
2824 let keyCommissionScaleDelimiter = "commission_scale_delimiter"
2925
3026 let keyCause = "shutdown_cause"
31-
32-let keyFirstHarvest = "first_harvest"
33-
34-let keyFirstHarvestHeight = "first_harvest_height"
35-
36-let kShareLimit = "share_limit_on_first_harvest"
37-
38-let kBasePeriod = "base_period"
39-
40-let kPeriodLength = "period_length"
41-
42-let kStartHeight = "start_height"
43-
44-let kFirstHarvestHeight = "first_harvest_height"
4527
4628 let keyAdminPubKey1 = "admin_pub_1"
4729
4830 let keyAdminPubKey2 = "admin_pub_2"
4931
5032 let keyAdminPubKey3 = "admin_pub_3"
5133
5234 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
5335
5436 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
5537 case string: String =>
5638 fromBase58String(string)
5739 case nothing =>
5840 throw("Admin public key is empty")
5941 }
6042
6143
6244 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
6345
6446 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
6547
6648 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
6749
6850 let adminPubKeyStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
6951
7052 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7153
72-let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
54+let governanceAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
7355
74-let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
56+let stakingAddressUSDN = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
7557
76-let stakingAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
58+let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
7759
78-let USDNToWavesExchanger = Address(base58'3Mvutbqb6ykHHvNCCgELTNzyAMaPTqFMixX')
60+let NSBT = base58'36mg8NZTaFRDygiVwb8uBnLR51hetJruUCZcxhaVcHj9'
7961
80-let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
62+let SWOP = base58'2HAJrwa8q4SxBx9cHYaBTQdBjdk5wwqdof7ccpAx2uhZ'
8163
82-let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
64+let swopUSDNtoWAVES = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
8365
84-let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
85-
86-let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
87-
88-let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
66+let swopUSDNtoNSBT = Address(base58'3MzTHd4e3yukNUURApVLVzH5uxeEsXHD6yY')
8967
9068 let stakingFeeInUSDN = 270000
9169
9270 let isActive = getBooleanValue(this, keyActive)
9371
9472 let strAssetIdA = getStringValue(this, keyAssetIdA)
9573
9674 let strAssetIdB = getStringValue(this, keyAssetIdB)
9775
9876 let assetIdA = if ((strAssetIdA == "WAVES"))
9977 then unit
10078 else fromBase58String(strAssetIdA)
10179
10280 let assetIdB = if ((strAssetIdB == "WAVES"))
10381 then unit
10482 else fromBase58String(strAssetIdB)
10583
10684 let assetNameA = match assetIdA {
10785 case id: ByteVector =>
10886 value(assetInfo(id)).name
10987 case waves: Unit =>
11088 "WAVES"
11189 case _ =>
11290 throw("Match error")
11391 }
11492
11593 let assetNameB = match assetIdB {
11694 case id: ByteVector =>
11795 value(assetInfo(id)).name
11896 case waves: Unit =>
11997 "WAVES"
12098 case _ =>
12199 throw("Match error")
122100 }
123101
124102 let balanceA = getIntegerValue(this, keyBalanceA)
125103
126104 let balanceB = getIntegerValue(this, keyBalanceB)
127105
128106 let shareAssetId = fromBase58String(getStringValue(this, keyShareAssetId))
129107
130108 let shareAssetSupply = getIntegerValue(this, keyShareAssetSupply)
131109
132110 let commission = 3000
133111
134112 let commissionGovernance = 1200
135113
136114 let commissionScaleDelimiter = 1000000
137115
138116 let scaleValue3 = 1000
139117
140118 let scaleValue8 = 100000000
141119
142120 let slippageToleranceDelimiter = 1000
143121
144122 let scaleValue8Digits = 8
145123
146124 func accountBalance (assetId) = match assetId {
147125 case id: ByteVector =>
148126 assetBalance(this, id)
149127 case waves: Unit =>
150128 wavesBalance(this).available
151129 case _ =>
152130 throw("Match error")
153131 }
154132
155133
156-let stakedAmountUSDN = match getInteger(stakingAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))) {
157- case staked: Int =>
158- staked
159- case nothing: Unit =>
160- 0
161- case _ =>
162- throw("Match error")
163-}
134+func stakedAmount (stakingAddress,asset) = {
135+ let stakedAmountCalculated = match getInteger(stakingAddress, ((("rpd_balance_" + asset) + "_") + toString(this))) {
136+ case staked: Int =>
137+ staked
138+ case nothing: Unit =>
139+ 0
140+ case _ =>
141+ throw("Match error")
142+ }
143+ stakedAmountCalculated
144+ }
164145
165-let assetInitA = getIntegerValue(this, keyBalanceInitA)
166146
167-let assetInitB = getIntegerValue(this, keyBalanceInitB)
147+let stakedAmountA = stakedAmount(stakingAddressUSDN, strAssetIdA)
168148
169-let availableBalanceA = (balanceA - (if ((assetIdA == USDN))
170- then stakedAmountUSDN
171- else 0))
149+let stakedAmountB = stakedAmount(stakingAddressUSDN, strAssetIdB)
172150
173-let availableBalanceB = (balanceB - (if ((assetIdB == USDN))
174- then stakedAmountUSDN
175- else 0))
151+let availableBalanceA = (balanceA - stakedAmountA)
176152
177-let accountBalanceWithStakedA = (accountBalance(assetIdA) + (if ((assetIdA == USDN))
178- then stakedAmountUSDN
179- else 0))
153+let availableBalanceB = (balanceB - stakedAmountB)
180154
181-let accountBalanceWithStakedB = (accountBalance(assetIdB) + (if ((assetIdB == USDN))
182- then stakedAmountUSDN
183- else 0))
155+let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
156+
157+let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
184158
185159 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
186160 then (accountBalanceWithStakedB >= balanceB)
187161 else false
188162
189163 func getAssetInfo (assetId) = match assetId {
190164 case id: ByteVector =>
191165 let stringId = toBase58String(id)
192166 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
193167 $Tuple3(stringId, info.name, info.decimals)
194168 case waves: Unit =>
195169 $Tuple3("WAVES", "WAVES", 8)
196170 case _ =>
197171 throw("Match error")
198172 }
199173
200174
201-func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
202- then $Tuple3("WAVES", "WAVES", 8)
203- else {
204- let stringId = assetStr
205- let id = fromBase58String(assetStr)
206- let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
207- $Tuple3(stringId, info.name, info.decimals)
208- }
175+func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
209176
210177
211-func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
178+func stakedTokenCount () = {
179+ let isStakedA = if ((stakedAmountA > 0))
180+ then 1
181+ else 0
182+ let isStakedB = if ((stakedAmountB > 0))
183+ then 1
184+ else 0
185+ (isStakedA + isStakedB)
186+ }
212187
213188
214189 func deductStakingFee (amount,assetId) = if ((assetId == USDN))
215190 then {
216- let result = (amount - stakingFeeInUSDN)
191+ let result = (amount - (stakedTokenCount() * stakingFeeInUSDN))
217192 if ((0 >= result))
218193 then throw((((("Insufficient amount " + toString(amount)) + " to deduct staking fee ") + toString(stakingFeeInUSDN)) + " USD-N"))
219194 else result
220195 }
221196 else amount
222197
223198
224199 func throwInsufficientAvailableBalance (amount,available,assetName) = throw((((((((("Insufficient DApp balance to pay " + toString(amount)) + " ") + assetName) + " due to staking. Available: ") + toString(available)) + " ") + assetName) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
225200
226201
227202 func throwInsufficientAvailableBalances (amountA,amountB) = throw((((((((((((((((("Insufficient DApp balance to pay " + toString(amountA)) + " ") + assetNameA) + " and ") + toString(amountB)) + " ") + assetNameB) + " due to staking. Available: ") + toString(availableBalanceA)) + " ") + assetNameA) + " and ") + toString(availableBalanceB)) + " ") + assetNameB) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
228203
229204
230205 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
231206
232207
233208 @Callable(i)
234-func init (firstHarvest) = {
235- let $t067096786 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
236- let pmtAmountA = $t067096786._1
237- let pmtAssetIdA = $t067096786._2
238- let $t067916868 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
239- let pmtAmountB = $t067916868._1
240- let pmtAssetIdB = $t067916868._2
241- let $t068736950 = getAssetInfo(pmtAssetIdA)
242- let pmtStrAssetIdA = $t068736950._1
243- let pmtAssetNameA = $t068736950._2
244- let pmtDecimalsA = $t068736950._3
245- let $t069557032 = getAssetInfo(pmtAssetIdB)
246- let pmtStrAssetIdB = $t069557032._1
247- let pmtAssetNameB = $t069557032._2
248- let pmtDecimalsB = $t069557032._3
249- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
250- then throw("Only admin can call this function")
251- else if (isDefined(getBoolean(this, keyActive)))
252- then throw("DApp is already active")
253- else if ((pmtAssetIdA == pmtAssetIdB))
254- then throw("Assets must be different")
255- else {
256- let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
257- let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
258- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
259- let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
260- let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
261- let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
262- let shareInitialSupply = fraction(arg1, arg2, arg3)
263- let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
264- let shareIssueId = calculateAssetId(shareIssue)
265- let baseEntry = [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
266- if (firstHarvest)
267- then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
268- else baseEntry
269- }
209+func init () = {
210+ let $t059366013 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
211+ let pmtAmountA = $t059366013._1
212+ let pmtAssetIdA = $t059366013._2
213+ let $t060186095 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
214+ let pmtAmountB = $t060186095._1
215+ let pmtAssetIdB = $t060186095._2
216+ let $t061006177 = getAssetInfo(pmtAssetIdA)
217+ let pmtStrAssetIdA = $t061006177._1
218+ let pmtAssetNameA = $t061006177._2
219+ let pmtDecimalsA = $t061006177._3
220+ let $t061826259 = getAssetInfo(pmtAssetIdB)
221+ let pmtStrAssetIdB = $t061826259._1
222+ let pmtAssetNameB = $t061826259._2
223+ let pmtDecimalsB = $t061826259._3
224+ if (isDefined(getBoolean(this, keyActive)))
225+ then throw("DApp is already active")
226+ else if ((pmtAssetIdA == pmtAssetIdB))
227+ then throw("Assets must be different")
228+ else {
229+ let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
230+ let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
231+ let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
232+ let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
233+ let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
234+ let shareIssueId = calculateAssetId(shareIssue)
235+[StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
236+ }
270237 }
271-
272-
273-
274-@Callable(i)
275-func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
276- let $t092779364 = getAssetInfoFromString(strAssetIdA)
277- let pmtStrAssetIdA = $t092779364._1
278- let pmtAssetNameA = $t092779364._2
279- let pmtDecimalsA = $t092779364._3
280- let $t093699456 = getAssetInfoFromString(strAssetIdB)
281- let pmtStrAssetIdB = $t093699456._1
282- let pmtAssetNameB = $t093699456._2
283- let pmtDecimalsB = $t093699456._3
284- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
285- then throw("Only admin can call this function")
286- else if (isDefined(getBoolean(this, keyActive)))
287- then throw("DApp is already active")
288- else if ((strAssetIdA == strAssetIdB))
289- then throw("Assets must be different")
290- else {
291- let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
292- let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
293- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
294- let shareInitialSupply = 0
295- let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
296- let shareIssueId = calculateAssetId(shareIssue)
297- let baseEntry = [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceInitA, amtAssetA), IntegerEntry(keyBalanceInitB, amtAssetB), IntegerEntry(keyBalanceA, 0), IntegerEntry(keyBalanceB, 0), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply)]
298- if (firstHarvest)
299- then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
300- else baseEntry
301- }
302- }
303-
304-
305-
306-@Callable(i)
307-func keepLimitForFirstHarvest (shareLimit) = if (!(isActive))
308- then throw("DApp is inactive at this moment")
309- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
310- then throw("Only admin can call this function")
311- else [IntegerEntry(kShareLimit, shareLimit)]
312238
313239
314240
315241 @Callable(i)
316242 func replenishWithTwoTokens (slippageTolerance) = {
317243 let pmtAssetIdA = i.payments[0].assetId
318244 let pmtAssetIdB = i.payments[1].assetId
319245 let pmtAmountA = deductStakingFee(i.payments[0].amount, pmtAssetIdA)
320246 let pmtAmountB = deductStakingFee(i.payments[1].amount, pmtAssetIdB)
321- if (if ((balanceA == 0))
322- then (balanceB == 0)
323- else false)
324- then {
325- let $t01214112218 = getAssetInfo(pmtAssetIdA)
326- let pmtStrAssetIdA = $t01214112218._1
327- let pmtAssetNameA = $t01214112218._2
328- let pmtDecimalsA = $t01214112218._3
329- let $t01222712304 = getAssetInfo(pmtAssetIdB)
330- let pmtStrAssetIdB = $t01222712304._1
331- let pmtAssetNameB = $t01222712304._2
332- let pmtDecimalsB = $t01222712304._3
333- let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
334- if ((pmtAssetIdA == pmtAssetIdB))
335- then throw("Assets must be different")
336- else {
337- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
338- let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
339- if (!(isActive))
340- then throw("DApp is inactive at this moment")
341- else if (if ((0 > slippageTolerance))
342- then true
343- else (slippageTolerance > slippageToleranceDelimiter))
344- then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
345- else if ((size(i.payments) != 2))
346- then throw("Two attached assets expected")
347- else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
348- then true
349- else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
350- then throw("Incorrect assets amount: amounts must have the contract ratio")
351- else if (if ((pmtAssetIdA != assetIdA))
352- then true
353- else (pmtAssetIdB != assetIdB))
354- then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
355- else if ((shareInitialSupply == 0))
356- then throw("Too small amount to replenish")
357- else if (!(hasEnoughBalance))
358- then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
359- else [Reissue(shareAssetId, shareInitialSupply, true), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareAssetId)]
360- }
361- }
362- else {
363- let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
364- let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
365- let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
366- let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
367- if (!(isActive))
368- then throw("DApp is inactive at this moment")
369- else if (if ((0 > slippageTolerance))
247+ let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
248+ let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
249+ let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
250+ let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
251+ if (!(isActive))
252+ then throw("DApp is inactive at this moment")
253+ else if (if ((0 > slippageTolerance))
254+ then true
255+ else (slippageTolerance > slippageToleranceDelimiter))
256+ then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
257+ else if ((size(i.payments) != 2))
258+ then throw("Two attached assets expected")
259+ else if (if ((pmtAssetIdA != assetIdA))
370260 then true
371- else (slippageTolerance > slippageToleranceDelimiter))
372- then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
373- else if ((size(i.payments) != 2))
374- then throw("Two attached assets expected")
375- else if (if ((pmtAssetIdA != assetIdA))
376- then true
377- else (pmtAssetIdB != assetIdB))
378- then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
379- else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
380- then true
381- else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
382- then throw("Incorrect assets amount: amounts must have the contract ratio")
383- else if ((shareTokenToPayAmount == 0))
384- then throw("Too small amount to replenish")
385- else if (!(hasEnoughBalance))
386- then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
387- else [IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
388- }
261+ else (pmtAssetIdB != assetIdB))
262+ then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
263+ else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
264+ then true
265+ else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
266+ then throw("Incorrect assets amount: amounts must have the contract ratio")
267+ else if ((shareTokenToPayAmount == 0))
268+ then throw("Too small amount to replenish")
269+ else if (!(hasEnoughBalance))
270+ then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
271+ else [IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
389272 }
390273
391274
392275
393276 @Callable(i)
394277 func withdraw () = {
395- let $t01670316853 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
396- let pmtAmount = $t01670316853._1
397- let pmtAssetId = $t01670316853._2
278+ let $t01032110471 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
279+ let pmtAmount = $t01032110471._1
280+ let pmtAssetId = $t01032110471._2
398281 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA)
399282 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB)
400283 if (!(isActive))
401284 then throw("DApp is inactive at this moment")
402285 else if ((size(i.payments) != 1))
403286 then throw("One attached payment expected")
404287 else if ((pmtAssetId != shareAssetId))
405288 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
406289 else if (!(hasEnoughBalance))
407290 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
408291 else if (if ((amountToPayA > availableBalanceA))
409292 then true
410293 else (amountToPayB > availableBalanceB))
411294 then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
412295 else [IntegerEntry(keyBalanceA, (balanceA - amountToPayA)), IntegerEntry(keyBalanceB, (balanceB - amountToPayB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
413296 }
414297
415298
416299
417300 @Callable(i)
418301 func exchange (minAmountToReceive) = {
419- let $t01805918134 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
420- let pmtAmount = $t01805918134._1
421- let pmtAssetId = $t01805918134._2
302+ let $t01167811753 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
303+ let pmtAmount = $t01167811753._1
304+ let pmtAssetId = $t01167811753._2
422305 func calculateFees (tokenFrom,tokenTo) = {
423306 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
424307 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
425308 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
426309 if ((minAmountToReceive > amountWithFee))
427310 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
428311 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
429312 }
430313
431314 if (!(isActive))
432315 then throw("DApp is inactive at this moment")
433- else if (if ((balanceA == 0))
434- then true
435- else (balanceB == 0))
436- then throw("Can't exchange with zero balance")
437- else if ((0 >= minAmountToReceive))
438- then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
439- else if ((size(i.payments) != 1))
440- then throw("One attached payment expected")
441- else if (!(hasEnoughBalance))
442- then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
443- else if ((pmtAssetId == assetIdA))
316+ else if ((0 >= minAmountToReceive))
317+ then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
318+ else if ((size(i.payments) != 1))
319+ then throw("One attached payment expected")
320+ else if (!(hasEnoughBalance))
321+ then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
322+ else if ((pmtAssetId == assetIdA))
323+ then {
324+ let assetIdSend = assetIdB
325+ let $t01292913020 = calculateFees(balanceA, balanceB)
326+ let amountWithoutFee = $t01292913020._1
327+ let amountWithFee = $t01292913020._2
328+ let governanceReward = $t01292913020._3
329+ let newBalanceA = (balanceA + pmtAmount)
330+ let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
331+ if (if ((stakedAmountA >= newBalanceA))
332+ then true
333+ else (stakedAmountB >= newBalanceB))
334+ then throwInsufficientAvailableBalance(amountWithFee, availableBalanceB, assetNameB)
335+ else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
336+ }
337+ else if ((pmtAssetId == assetIdB))
444338 then {
445- let assetIdSend = assetIdB
446- let $t01940819499 = calculateFees(balanceA, balanceB)
447- let amountWithoutFee = $t01940819499._1
448- let amountWithFee = $t01940819499._2
449- let governanceReward = $t01940819499._3
450- let newBalanceA = (balanceA + pmtAmount)
451- let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
452- if (if (if ((assetIdA == USDN))
453- then (stakedAmountUSDN >= newBalanceA)
454- else false)
339+ let assetIdSend = assetIdA
340+ let $t01384313934 = calculateFees(balanceB, balanceA)
341+ let amountWithoutFee = $t01384313934._1
342+ let amountWithFee = $t01384313934._2
343+ let governanceReward = $t01384313934._3
344+ let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
345+ let newBalanceB = (balanceB + pmtAmount)
346+ if (if ((stakedAmountA >= newBalanceA))
455347 then true
456- else if ((assetIdB == USDN))
457- then (stakedAmountUSDN >= newBalanceB)
458- else false)
459- then throwInsufficientAvailableBalance(amountWithFee, availableBalanceB, assetNameB)
460- else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
348+ else (stakedAmountB >= newBalanceB))
349+ then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
350+ else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
461351 }
462- else if ((pmtAssetId == assetIdB))
463- then {
464- let assetIdSend = assetIdA
465- let $t02036820459 = calculateFees(balanceB, balanceA)
466- let amountWithoutFee = $t02036820459._1
467- let amountWithFee = $t02036820459._2
468- let governanceReward = $t02036820459._3
469- let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
470- let newBalanceB = (balanceB + pmtAmount)
471- if (if (if ((assetIdA == USDN))
472- then (stakedAmountUSDN >= newBalanceA)
473- else false)
474- then true
475- else if ((assetIdB == USDN))
476- then (stakedAmountUSDN >= newBalanceB)
477- else false)
478- then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
479- else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
480- }
481- else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
352+ else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
482353 }
483354
484355
485356
486357 @Callable(i)
487358 func shutdown () = if (!(isActive))
488359 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
489360 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
490361 then throw("Only admin can call this function")
491362 else suspend("Paused by admin")
492363
493364
494365
495366 @Callable(i)
496367 func activate () = if (isActive)
497368 then throw("DApp is already active")
498369 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
499370 then throw("Only admin can call this function")
500371 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
501372
502373
503374
504375 @Callable(i)
505376 func takeIntoAccountExtraFunds (amountLeave) = {
506377 let uncountableAmountEnrollAssetA = (accountBalanceWithStakedA - balanceA)
507378 let uncountableAmountEnrollAssetB = (accountBalanceWithStakedB - balanceB)
508379 let amountEnrollA = (uncountableAmountEnrollAssetA - (if ((assetIdA == unit))
509380 then amountLeave
510381 else 0))
511382 let amountEnrollB = (uncountableAmountEnrollAssetB - (if ((assetIdB == unit))
512383 then amountLeave
513384 else 0))
514385 if (!(isActive))
515386 then throw("DApp is inactive at this moment")
516387 else if ((i.caller != this))
517388 then throw("Only the DApp itself can call this function")
518389 else if ((0 > amountLeave))
519390 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
520391 else if (if ((0 > uncountableAmountEnrollAssetA))
521392 then true
522393 else (0 > uncountableAmountEnrollAssetB))
523394 then suspend("Enroll amount negative")
524395 else if (if ((0 > amountEnrollA))
525396 then true
526397 else (0 > amountEnrollB))
527398 then throw("Too large amountLeave")
528399 else [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
529400 }
530401
531402
532403 @Verifier(tx)
533404 func verify () = {
534405 let multiSignedByAdmins = {
535406 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
536407 then 1
537408 else 0
538409 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
539410 then 1
540411 else 0
541412 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
542413 then 1
543414 else 0
544415 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
545416 }
546417 match tx {
547418 case inv: InvokeScriptTransaction =>
548- let callTakeIntoAccount = if ((inv.dApp == this))
549- then (inv.function == "takeIntoAccountExtraFunds")
550- else false
551- let callStaking = if ((inv.dApp == stakingAddress))
552- then if (if (if ((inv.function == "lockNeutrino"))
553- then (size(inv.payments) == 1)
554- else false)
555- then (inv.payments[0].assetId == USDN)
556- else false)
557- then true
558- else if ((inv.function == "unlockNeutrino"))
559- then (size(inv.payments) == 0)
560- else false
561- else false
562- let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
563- then (inv.function == "exchange")
564- else false)
565- then (assetIdA == USDN)
419+ if (if (if (if (sigVerify(inv.bodyBytes, inv.proofs[0], adminPubKeyStaking))
420+ then (inv.dApp == stakingAddressUSDN)
566421 else false)
567422 then true
568- else if (if ((assetIdB == USDN))
569- then (size(inv.payments) == 1)
423+ else if (if (sigVerify(inv.bodyBytes, inv.proofs[0], adminPubKeyStaking))
424+ then (inv.function == "exchange")
570425 else false)
571- then (inv.payments[0].assetId == USDN)
572- else false
573- let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
426+ then if (if (if (if (if ((assetIdA == NSBT))
427+ then (assetIdB == USDN)
428+ else false)
429+ then (inv.dApp == swopUSDNtoWAVES)
430+ else false)
431+ then (inv.payments[0].assetId == unit)
432+ else false)
433+ then if ((inv.payments[0].assetId == unit))
434+ then true
435+ else (inv.payments[0].assetId == USDN)
436+ else false)
437+ then true
438+ else if (if ((assetIdA == NSBT))
439+ then (assetIdB == SWOP)
440+ else false)
441+ then if (if ((inv.dApp == swopUSDNtoNSBT))
442+ then (inv.payments[0].assetId == USDN)
443+ else false)
444+ then true
445+ else if ((inv.dApp == swopUSDNtoWAVES))
446+ then if ((inv.payments[0].assetId == unit))
447+ then true
448+ else (inv.payments[0].assetId == USDN)
449+ else false
450+ else false
451+ else false)
574452 then true
575- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
576- then true
577- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
578- then true
579- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
580- if (if (if (if (callTakeIntoAccount)
581- then true
582- else callStaking)
583- then true
584- else exchangeToWaves)
585- then signedByAdmin
586- else false)
453+ else if (if (sigVerify(inv.bodyBytes, inv.proofs[0], adminPubKeyStaking))
454+ then (inv.dApp == this)
455+ else false)
456+ then (inv.function == "takeIntoAccountExtraFunds")
457+ else false)
587458 then true
588459 else multiSignedByAdmins
589460 case _ =>
590461 multiSignedByAdmins
591462 }
592463 }
593464

github/deemru/w8io/873ac7e 
136.73 ms