tx · FoSco38YsY8cB83qsD7Vk1Qmdq6ZPZDcUK51nJXkDh3w

3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37:  -0.01400000 Waves

2021.09.20 18:23 [1711553] smart account 3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37 > SELF 0.00000000 Waves

{ "type": 13, "id": "FoSco38YsY8cB83qsD7Vk1Qmdq6ZPZDcUK51nJXkDh3w", "fee": 1400000, "feeAssetId": null, "timestamp": 1632151436420, "version": 2, "chainId": 84, "sender": "3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37", "senderPublicKey": "4bwUHdA4vTBJ1k43dYKiPYTDqm3QqiZXNGXoQstGAD1k", "proofs": [ "3SAYn5EGhyC9iTwh8WGfXU9EgHNM1qNbbqLWdrUyqnt6y9wsU9woDbnc77PN69iXyzCD98L3iSNUmx7r7KH83F2W", "2TDGWNpi8UfBSqk2k7GaFgWwt2KgG4LG2PdaozqUJfsu3SpHSMLdNw3n1TXRRLU6T6KFnv6LzUyLbiaszRuHYUe3" ], "script": "base64:AAIFAAAAAAAAACMIAhIDCgEIEgMKAQESAwoBARIAEgMKAQESABIAEgMKAQESAAAAAFgAAAAAB3ZlcnNpb24CAAAABTEuMC4wAAAAAAprZXlWZXJzaW9uAgAAAAd2ZXJzaW9uAAAAAAlrZXlBY3RpdmUCAAAABmFjdGl2ZQAAAAALa2V5QXNzZXRJZEECAAAACkFfYXNzZXRfaWQAAAAAC2tleUFzc2V0SWRCAgAAAApCX2Fzc2V0X2lkAAAAAAtrZXlCYWxhbmNlQQIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAtrZXlCYWxhbmNlQgIAAAAPQl9hc3NldF9iYWxhbmNlAAAAAA9rZXlCYWxhbmNlSW5pdEECAAAADEFfYXNzZXRfaW5pdAAAAAAPa2V5QmFsYW5jZUluaXRCAgAAAAxCX2Fzc2V0X2luaXQAAAAAD2tleVNoYXJlQXNzZXRJZAIAAAAOc2hhcmVfYXNzZXRfaWQAAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkCAAAAEnNoYXJlX2Fzc2V0X3N1cHBseQAAAAANa2V5Q29tbWlzc2lvbgIAAAAKY29tbWlzc2lvbgAAAAAba2V5Q29tbWlzc2lvblNjYWxlRGVsaW1pdGVyAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAAIa2V5Q2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAAA9rZXlGaXJzdEhhcnZlc3QCAAAADWZpcnN0X2hhcnZlc3QAAAAAFWtleUZpcnN0SGFydmVzdEhlaWdodAIAAAAUZmlyc3RfaGFydmVzdF9oZWlnaHQAAAAADWtleVNoYXJlTGltaXQCAAAAHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAAAAADWtleUJhc2VQZXJpb2QCAAAAC2Jhc2VfcGVyaW9kAAAAAA9rZXlQZXJpb2RMZW5ndGgCAAAADXBlcmlvZF9sZW5ndGgAAAAADmtleVN0YXJ0SGVpZ2h0AgAAAAxzdGFydF9oZWlnaHQAAAAAFmtleU9yYWNsZUFzc2V0UHJpb3JpdHkCAAAAD2Fzc2V0X3ByaW9yaXR5XwAAAAATa2V5T3JhY2xlU2NyaXB0SGFzaAIAAAAQc2NyaXB0X2hhc2hfY3BtbQAAAAARa2V5SW5pdFBv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AAALa2V5QmFsYW5jZUEAAAAACGJhbGFuY2VCCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzBQAAAAtrZXlCYWxhbmNlQgAAAAAMc2hhcmVBc3NldElkCQACWQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAAD2tleVNoYXJlQXNzZXRJZAAAAAAQc2hhcmVBc3NldFN1cHBseQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAATa2V5U2hhcmVBc3NldFN1cHBseQAAAAAKY29tbWlzc2lvbgAAAAAAAAALuAAAAAAUY29tbWlzc2lvbkdvdmVybmFuY2UAAAAAAAAABLAAAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgAAAAAAAA9CQAAAAAALc2NhbGVWYWx1ZTMAAAAAAAAAA+gAAAAAC3NjYWxlVmFsdWU4AAAAAAAF9eEAAAAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgAAAAAAAAAD6AAAAAARc2NhbGVWYWx1ZThEaWdpdHMAAAAAAAAAAAgAAAAAGWNvbWlzc2lvbkZvckluaXRhbGl6YXRpb24AAAAAADuaygABAAAADmFjY291bnRCYWxhbmNlAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAkAA/AAAAACBQAAAAR0aGlzBQAAAAJpZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDAICQAD7wAAAAEFAAAABHRoaXMAAAAJYXZhaWxhYmxlCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAAxzdGFrZWRBbW91bnQAAAABAAAAB2Fzc2V0SWQEAAAAFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAA2FJZAUAAAAHJG1hdGNoMAMDCQAAAAAAAAIFAAAAA2FJZAUAAAAEVVNETgYJAAAAAAAAAgUAAAADYUlkBQAAAAROU0JUCQAEGgAAAAIFAAAAFnN0YWtpbmdVU0ROTlNCVEFkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADHJwZF9iYWxhbmNlXwkAAlgAAAABBQAAAANhSWQCAAAAAV8JAAQlAAAAAQUAAAAEdGhpcwMJAAAAAAAAAgUAAAADYUlkBQAAAARFVVJOCQAEGgAAAAIFAAAAEnN0YWtpbmdFVVJOQWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAYJXMlcyVzX19zdGFraW5nQmFsYW5jZV9fCQACWAAAAAEFAAAAA2FJZAIAAAACX18JAAQlAAAAAQUAAAAEdGhpcwAAAAAAAAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAAAAAAAAAAAAAkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgQAAAAHJG1hdGNoMAUAAAAWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFpBQAAAAckbWF0Y2gwBQAAAAFpAAAAAAAAAAAAAQAAAA5pc0FsbG93ZWRBc3NldAAAAAEAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACaWQFAAAAByRtYXRjaDADAwkAAAAAAAACBQAAAAJpZAUAAAAEVVNETgYJAAAAAAAAAgUAAAACaWQFAAAABFNXT1AGBwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDAGCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAAAAAA1zdGFrZWRBbW91bnRBCQEAAAAMc3Rha2VkQW1vdW50AAAAAQUAAAAIYXNzZXRJZEEAAAAADXN0YWtlZEFtb3VudEIJAQAAAAxzdGFrZWRBbW91bnQAAAABBQAAAAhhc3NldElkQgAAAAAKYXNzZXRJbml0QQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAAPa2V5QmFsYW5jZUluaXRBAAAAAAphc3NldEluaXRCCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzBQAAAA9rZXlCYWxhbmNlSW5pdEIAAAAAEWF2YWlsYWJsZUJhbGFuY2VBCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAA1zdGFrZWRBbW91bnRBAAAAABFhdmFpbGFibGVCYWxhbmNlQgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAANc3Rha2VkQW1vdW50QgAAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQQkAAGQAAAACCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAAhhc3NldElkQQUAAAANc3Rha2VkQW1vdW50QQAAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgkAAGQAAAACCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAAhhc3NldElkQgUAAAANc3Rha2VkQW1vdW50QgAAAAAQaGFzRW5vdWdoQmFsYW5jZQMJAABnAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQQUAAAAIYmFsYW5jZUEJAABnAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgUAAAAIYmFsYW5jZUIHAQAAAAxnZXRBc3NldEluZm8AAAABAAAAB2Fzc2V0SWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAmlkBQAAAAckbWF0Y2gwBAAAAAhzdHJpbmdJZAkAAlgAAAABBQAAAAJpZAQAAAAEaW5mbwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEFAAAAAmlkCQABLAAAAAIJAAEsAAAAAgIAAAAGQXNzZXQgBQAAAAhzdHJpbmdJZAIAAAAOIGRvZXNuJ3QgZXhpc3QJAAUVAAAAAwUAAAAIc3RyaW5nSWQIBQAAAARpbmZvAAAABG5hbWUIBQAAAARpbmZvAAAACGRlY2ltYWxzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BAAAAAV3YXZlcwUAAAAHJG1hdGNoMAkABRUAAAADAgAAAAVXQVZFUwIAAAAFV0FWRVMAAAAAAAAAAAgJAAAC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AAAAC01hdGNoIGVycm9yBAAAAA5hc3NldDFQcmlvcml0eQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAZvcmFjbGUJAAEsAAAAAgUAAAAWa2V5T3JhY2xlQXNzZXRQcmlvcml0eQUAAAAOcG10U3RyQXNzZXRJZDEAAAAAAAAPQj8EAAAADmFzc2V0MlByaW9yaXR5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACBQAAABZrZXlPcmFjbGVBc3NldFByaW9yaXR5BQAAAA5wbXRTdHJBc3NldElkMgAAAAAAAA9CPwQAAAANJHQwMTAwNjkxMDI5NgMJAABmAAAAAgUAAAAOYXNzZXQyUHJpb3JpdHkFAAAADmFzc2V0MVByaW9yaXR5CQAFFgAAAAQFAAAACnBtdEFtb3VudDIFAAAAC3BtdEFzc2V0SWQyBQAAAApwbXRBbW91bnQxBQAAAAtwbXRBc3NldElkMQkABRYAAAAEBQAAAApwbXRBbW91bnQxBQAAAAtwbXRBc3NldElkMQUAAAAKcG10QW1vdW50MgUAAAALcG10QXNzZXRJZDIEAAAACnBtdEFtb3VudEEIBQAAAA0kdDAxMDA2OTEwMjk2AAAAAl8xBAAAAAtwbXRBc3NldElkQQgFAAAADSR0MDEwMDY5MTAyOTYAAAACXzIEAAAACnBtdEFtb3VudEIIBQAAAA0kdDAxMDA2OTEwMjk2AAAAAl8zBAAAAAtwbXRBc3NldElkQggFAAAADSR0MDEwMDY5MTAyOTYAAAACXzQEAAAADSR0MDEwMzA1MTAzODIJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtwbXRBc3NldElkQQQAAAAOcG10U3RyQXNzZXRJZEEIBQAAAA0kdDAxMDMwNTEwMzgyAAAAAl8xBAAAAA1wbXRBc3NldE5hbWVBCAUAAAANJHQwMTAzMDUxMDM4MgAAAAJfMgQAAAAMcG10RGVjaW1hbHNBCAUAAAANJHQwMTAzMDUxMDM4MgAAAAJfMwQAAAANJHQwMTAzOTExMDQ2OAkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRCBAAAAA5wbXRTdHJBc3NldElkQggFAAAADSR0MDEwMzkxMTA0NjgAAAACXzEEAAAADXBtdEFzc2V0TmFtZUIIBQAAAA0kdDAxMDM5MTEwNDY4AAAAAl8yBAAAAAxwbXREZWNpbWFsc0IIBQAAAA0kdDAxMDM5MTEwNDY4AAAAAl8zBAAAAAlhZGRQYXJhbXMJAARMAAAAAgkABCUAAAABBQAAAAR0aGlzCQAETAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAA1wbXRBc3NldE5hbWVBAgAAAAFfBQAAAA1wbXRBc3NldE5hbWVCCQAETAAAAAIFAAAADnBtdFN0ckFzc2V0SWRBCQAETAAAAAIFAAAADnBtdFN0ckFzc2V0SWRCBQAAAANuaWwEAAAAB2FkZFBvb2wJAAP8AAAABAUAAAAGb3JhY2xlAgAAAAdhZGRQb29sBQAAAAlhZGRQYXJhbXMFAAAAA25pbAMJAAAAAAAAAgUAAAAHYWRkUG9vbAUAAAAHYWRkUG9vbAMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAGb3JhY2xlCQABLAAAAAICAAAABXBvb2xfCQAEJQAAAAEFAAAABHRoaXMJAAACAAAAAQIAAAARUG9vbCBpcyBub3QgYWRkZWQEAAAACXNoYXJlTmFtZQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAABcwkAAS8AAAACBQAAAA1wbXRBc3NldE5hbWVBAAAAAAAAAAAHAgAAAAFfCQABLwAAAAIFAAAADXBtdEFzc2V0TmFtZUIAAAAAAAAAAAcEAAAAEHNoYXJlRGVzY3JpcHRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQAAAA1wbXRBc3NldE5hbWVBAgAAAAUgYW5kIAUAAAANcG10QXNzZXROYW1lQgIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAABHRoaXMEAAAADXNoYXJlRGVjaW1hbHMJAABpAAAAAgkAAGQAAAACBQAAAAxwbXREZWNpbWFsc0EFAAAADHBtdERlY2ltYWxzQgAAAAAAAAAAAgQAAAAEYXJnMQkAAGwAAAAGBQAAAApwbXRBbW91bnRBBQAAAAxwbXREZWNpbWFsc0EAAAAAAAAAAAUAAAAAAAAAAAEFAAAADHBtdERlY2ltYWxzQQUAAAAERE9XTgQAAAAEYXJnMgkAAGwAAAAGBQAAAApwbXRBbW91bnRCBQAAAAxwbXREZWNpbWFsc0IAAAAAAAAAAAUAAAAAAAAAAAEFAAAADHBtdERlY2ltYWxzQgUAAAAERE9XTgQAAAAEYXJnMwkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAABQAAAA1zaGFyZURlY2ltYWxzAAAAAAAAAAAAAAAAAAAAAAAABQAAAARET1dOBAAAABJzaGFyZUluaXRpYWxTdXBwbHkJAABrAAAAAwUAAAAEYXJnMQUAAAAEYXJnMgUAAAAEYXJnMwQAAAAKc2hhcmVJc3N1ZQkABEIAAAAFBQAAAAlzaGFyZU5hbWUFAAAAEHNoYXJlRGVzY3JpcHRpb24FAAAAEnNoYXJlSW5pdGlhbFN1cHBseQUAAAANc2hhcmVEZWNpbWFscwYEAAAADHNoYXJlSXNzdWVJZAkABDgAAAABBQAAAApzaGFyZUlzc3VlBAAAAAliYXNlRW50cnkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAKa2V5VmVyc2lvbgUAAAAHdmVyc2lvbgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAJa2V5QWN0aXZlBgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAtrZXlBc3NldElkQQUAAAAOcG10U3RyQXNzZXRJZEEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAALa2V5QXNzZXRJZEIFAAAADnBtdFN0ckFzc2V0SWRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAAKcG10QW1vdW50QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADWtleUNvbW1pc3Npb24FAAAACmNvbW1pc3Npb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAG2tleUNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyCQAETAAAAAIFAAAACnNoYXJlSXNzdWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAPa2V5U2hhcmVBc3NldElkCQACWAAAAAEFAAAADHNoYXJlSXNzdWVJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa2V5U2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrZXlJbml0UG9vbEhlaWdodAUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAC3VzZXJBZGRyZXNzBQAAABJzaGFyZUluaXRpYWxTdXBwbHkFAAAADHNoYXJlSXNzdWVJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA13YWxsZXRBZGRyZXNzBQAAABljb21pc3Npb25Gb3JJbml0YWxpemF0aW9uBQAAAARTV09QBQAAAANuaWwFAAAACWJhc2VFbnRyeQkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAYa2VlcExpbWl0Rm9yRmlyc3RIYXJ2ZXN0AAAAAQAAAApzaGFyZUxpbWl0AwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABJhZG1pblB1YktleVN0YWtpbmcFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANa2V5U2hhcmVMaW1pdAUAAAAKc2hhcmVMaW1pdAUAAAADbmlsAAAAAWkBAAAAFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMAAAABAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAAAtwbXRBc3NldElkQQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAALcG10QXNzZXRJZEIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAAB2Fzc2V0SWQEAAAACnBtdEFtb3VudEEJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAwgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50BQAAAAtwbXRBc3NldElkQQUAAAALcG10QXNzZXRJZEIEAAAACnBtdEFtb3VudEIJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAwgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAGYW1vdW50BQAAAAtwbXRBc3NldElkQgUAAAALcG10QXNzZXRJZEEDAwkAAAAAAAACBQAAAAhiYWxhbmNlQQAAAAAAAAAAAAkAAAAAAAACBQAAAAhiYWxhbmNlQgAAAAAAAAAAAAcEAAAADSR0MDEzMzg4MTM0NjUJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtwbXRBc3NldElkQQQAAAAOcG10U3RyQXNzZXRJZEEIBQAAAA0kdDAxMzM4ODEzNDY1AAAAAl8xBAAAAA1wbXRBc3NldE5hbWVBCAUAAAANJHQwMTMzODgxMzQ2NQAAAAJfMgQAAAAMcG10RGVjaW1hbHNBCAUAAAANJHQwMTMzODgxMzQ2NQAAAAJfMwQAAAANJHQwMTM0NzQxMzU1MQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRCBAAAAA5wbXRTdHJBc3NldElkQggFAAAADSR0MDEzNDc0MTM1NTEAAAACXzEEAAAADXBtdEFzc2V0TmFtZUIIBQAAAA0kdDAxMzQ3NDEzNTUxAAAAAl8yBAAAAAxwbXREZWNpbWFsc0IIBQAAAA0kdDAxMzQ3NDEzNTUxAAAAAl8zBAAAAAp0b2tlblJhdGlvCQAAawAAAAMJAABrAAAAAwUAAAAKYXNzZXRJbml0QQUAAAALc2NhbGVWYWx1ZTgFAAAACnBtdEFtb3VudEEFAAAAC3NjYWxlVmFsdWUzCQAAawAAAAMFAAAACmFzc2V0SW5pdEIFAAAAC3NjYWxlVmFsdWU4BQAAAApwbXRBbW91bnRCAwkAAAAAAAACBQAAAAtwbXRBc3NldElkQQUAAAALcG10QXNzZXRJZEIJAAACAAAAAQIAAAAYQXNzZXRzIG11c3QgYmUgZGlmZmVyZW50BAAAAA1zaGFyZURlY2ltYWxzCQAAaQAAAAIJAABkAAAAAgUAAAAMcG10RGVjaW1hbHNBBQAAAAxwbXREZWNpbWFsc0IAAAAAAAAAAAIEAAAAEnNoYXJlSW5pdGlhbFN1cHBseQkAAGsAAAADCQAAbAAAAAYFAAAACnBtdEFtb3VudEEFAAAADHBtdERlY2ltYWxzQQAAAAAAAAAABQAAAAAAAAAAAQUAAAAMcG10RGVjaW1hbHNBBQAAAARET1dOCQAAbAAAAAYFAAAACnBtdEFtb3VudEIFAAAADHBtdERlY2ltYWxzQgAAAAAAAAAABQAAAAAAAAAAAQUAAAAMcG10RGVjaW1hbHNCBQAAAARET1dOCQAAbAAAAAYAAAAAAAAAAAoAAAAAAAAAAAAFAAAADXNoYXJlRGVjaW1hbHMAAAAAAAAAAAAAAAAAAAAAAAAFAAAABERPV04DCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQDAwkAAGYAAAACAAAAAAAAAAAABQAAABFzbGlwcGFnZVRvbGVyYW5jZQYJAABmAAAAAgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAKVNsaXBwYWdlIHRvbGVyYW5jZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgCQABpAAAAAEFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyAgAAABYgaW5jbHVzaXZlbHkuIEFjdHVhbDogCQABpAAAAAEFAAAAEXNsaXBwYWdlVG9sZXJhbmNlAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAgkAAAIAAAABAgAAABxUd28gYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkAwMJAABmAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWUzCQAAZQAAAAIFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIFAAAACnRva2VuUmF0aW8GCQAAZgAAAAIFAAAACnRva2VuUmF0aW8JAABpAAAAAgkAAGgAAAACBQAAAAtzY2FsZVZhbHVlMwkAAGQAAAACBQAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyCQAAAgAAAAECAAAAPUluY29ycmVjdCBhc3NldHMgYW1vdW50OiBhbW91bnRzIG11c3QgaGF2ZSB0aGUgY29udHJhY3QgcmF0aW8DAwkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEEFAAAACGFzc2V0SWRBBgkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEIFAAAACGFzc2V0SWRCCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJUluY29ycmVjdCBhc3NldHMgYXR0YWNoZWQuIEV4cGVjdGVkOiAFAAAAC3N0ckFzc2V0SWRBAgAAAAUgYW5kIAUAAAALc3RyQXNzZXRJZEIDCQAAAAAAAAIFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQAAAAAAAAAAAAkAAAIAAAABAgAAAB1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKcG10QW1vdW50QQUAAAALcG10QXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRCBQAAAAtwbXRBc3NldElkQgUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAACQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAMc2hhcmVBc3NldElkBQAAABJzaGFyZUluaXRpYWxTdXBwbHkGCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAAKcG10QW1vdW50QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQUAAAAMc2hhcmVBc3NldElkBQAAAANuaWwEAAAACnRva2VuUmF0aW8JAABrAAAAAwkAAGsAAAADBQAAAAhiYWxhbmNlQQUAAAALc2NhbGVWYWx1ZTgFAAAACnBtdEFtb3VudEEFAAAAC3NjYWxlVmFsdWUzCQAAawAAAAMFAAAACGJhbGFuY2VCBQAAAAtzY2FsZVZhbHVlOAUAAAAKcG10QW1vdW50QgQAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkAAGsAAAADBQAAAApwbXRBbW91bnRBBQAAAAtzY2FsZVZhbHVlOAUAAAAIYmFsYW5jZUEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIJAABrAAAAAwUAAAAKcG10QW1vdW50QgUAAAALc2NhbGVWYWx1ZTgFAAAACGJhbGFuY2VCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAtzY2FsZVZhbHVlOAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBgkAAGYAAAACBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAApU2xpcHBhZ2UgdG9sZXJhbmNlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAJAAGkAAAAAQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXICAAAAFiBpbmNsdXNpdmVseS4gQWN0dWFsOiAJAAGkAAAAAQUAAAARc2xpcHBhZ2VUb2xlcmFuY2UDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAACCQAAAgAAAAECAAAAHFR3byBhdHRhY2hlZCBhc3NldHMgZXhwZWN0ZWQDAwkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEEFAAAACGFzc2V0SWRBBgkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEIFAAAACGFzc2V0SWRCCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJUluY29ycmVjdCBhc3NldHMgYXR0YWNoZWQuIEV4cGVjdGVkOiAFAAAAC3N0ckFzc2V0SWRBAgAAAAUgYW5kIAUAAAALc3RyQXNzZXRJZEIDAwkAAGYAAAACCQAAaQAAAAIJAABoAAAAAgUAAAALc2NhbGVWYWx1ZTMJAABlAAAAAgUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgUAAAAKdG9rZW5SYXRpbwYJAABmAAAAAgUAAAAKdG9rZW5SYXRpbwkAAGkAAAACCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWUzCQAAZAAAAAIFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIJAAACAAAAAQIAAAA9SW5jb3JyZWN0IGFzc2V0cyBhbW91bnQ6IGFtb3VudHMgbXVzdCBoYXZlIHRoZSBjb250cmFjdCByYXRpbwMJAAAAAAAAAgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAAHVRvbyBzbWFsbCBhbW91bnQgdG8gcmVwbGVuaXNoAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRBBQAAAAtwbXRBc3NldElkQQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACnBtdEFtb3VudEIFAAAAC3BtdEFzc2V0SWRCBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAApwbXRBbW91bnRBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQgkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa2V5U2hhcmVBc3NldFN1cHBseQkAAGQAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAAxzaGFyZUFzc2V0SWQFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQFAAAADHNoYXJlQXNzZXRJZAUAAAADbmlsAAAAAWkBAAAACHdpdGhkcmF3AAAAAAQAAAANJHQwMTc5NTAxODEwMAkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDE3OTUwMTgxMDAAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAxNzk1MDE4MTAwAAAAAl8yBAAAAAxhbW91bnRUb1BheUEJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAwkAAGsAAAADBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VBBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAhhc3NldElkQQUAAAAIYXNzZXRJZEIEAAAADGFtb3VudFRvUGF5QgkBAAAAEGRlZHVjdFN0YWtpbmdGZWUAAAADCQAAawAAAAMFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAACGFzc2V0SWRCBQAAAAhhc3NldElkQQMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAxzaGFyZUFzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAACRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAJAAJYAAAAAQUAAAAMc2hhcmVBc3NldElkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMDCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QQUAAAARYXZhaWxhYmxlQmFsYW5jZUEGCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QgUAAAARYXZhaWxhYmxlQmFsYW5jZUIJAQAAACJ0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2VzAAAAAgUAAAAMYW1vdW50VG9QYXlBBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VBCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAAxhbW91bnRUb1BheUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkJAABlAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAJcG10QW1vdW50CQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAAMc2hhcmVBc3NldElkBQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUEFAAAACGFzc2V0SWRBCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAMYW1vdW50VG9QYXlCBQAAAAhhc3NldElkQgUAAAADbmlsAAAAAWkBAAAACGV4Y2hhbmdlAAAAAQAAABJtaW5BbW91bnRUb1JlY2VpdmUEAAAADSR0MDE5MzI2MTk0MDEJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxOTMyNjE5NDAxAAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTkzMjYxOTQwMQAAAAJfMgoBAAAADWNhbGN1bGF0ZUZlZXMAAAACAAAACXRva2VuRnJvbQAAAAd0b2tlblRvBAAAABBhbW91bnRXaXRob3V0RmVlCQAAawAAAAMFAAAAB3Rva2VuVG8FAAAACXBtdEFtb3VudAkAAGQAAAACBQAAAAlwbXRBbW91bnQFAAAACXRva2VuRnJvbQQAAAANYW1vdW50V2l0aEZlZQkAAGsAAAADBQAAABBhbW91bnRXaXRob3V0RmVlCQAAZQAAAAIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAKY29tbWlzc2lvbgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyBAAAABBnb3Zlcm5hbmNlUmV3YXJkCQAAawAAAAMFAAAAEGFtb3VudFdpdGhvdXRGZWUFAAAAFGNvbW1pc3Npb25Hb3Zlcm5hbmNlBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIDCQAAZgAAAAIFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAANYW1vdW50V2l0aEZlZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB1DYWxjdWxhdGVkIGFtb3VudCB0byByZWNlaXZlIAkAAaQAAAABBQAAAA1hbW91bnRXaXRoRmVlAgAAACAgaXMgbGVzcyB0aGFuIHNwZWNpZmllZCBtaW5pbXVtIAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUJAAUVAAAAAwUAAAAQYW1vdW50V2l0aG91dEZlZQUAAAANYW1vdW50V2l0aEZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQAAAAAAAAIFAAAACGJhbGFuY2VBAAAAAAAAAAAABgkAAAAAAAACBQAAAAhiYWxhbmNlQgAAAAAAAAAAAAkAAAIAAAABAgAAACBDYW4ndCBleGNoYW5nZSB3aXRoIHplcm8gYmFsYW5jZQMJAABnAAAAAgAAAAAAAAAAAAUAAAASbWluQW1vdW50VG9SZWNlaXZlCQAAAgAAAAEJAAEsAAAAAgIAAAA0TWluaW1hbCBhbW91bnQgdG8gcmVjZWl2ZSBtdXN0IGJlIHBvc2l0aXZlLiBBY3R1YWw6IAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEEAAAAC2Fzc2V0SWRTZW5kBQAAAAhhc3NldElkQgQAAAANJHQwMjA2NzUyMDc2NgkBAAAADWNhbGN1bGF0ZUZlZXMAAAACBQAAAAhiYWxhbmNlQQUAAAAIYmFsYW5jZUIEAAAAEGFtb3VudFdpdGhvdXRGZWUIBQAAAA0kdDAyMDY3NTIwNzY2AAAAAl8xBAAAAA1hbW91bnRXaXRoRmVlCAUAAAANJHQwMjA2NzUyMDc2NgAAAAJfMgQAAAAQZ292ZXJuYW5jZVJld2FyZAgFAAAADSR0MDIwNjc1MjA3NjYAAAACXzMEAAAAC25ld0JhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQEAAAAC25ld0JhbGFuY2VCCQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudFdpdGhGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQDAwkAAGcAAAACBQAAAA1zdGFrZWRBbW91bnRBBQAAAAtuZXdCYWxhbmNlQQYJAABnAAAAAgUAAAANc3Rha2VkQW1vdW50QgUAAAALbmV3QmFsYW5jZUIJAQAAACF0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2UAAAADBQAAAA1hbW91bnRXaXRoRmVlBQAAABFhdmFpbGFibGVCYWxhbmNlQgUAAAAKYXNzZXROYW1lQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQgUAAAALbmV3QmFsYW5jZUIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA1hbW91bnRXaXRoRmVlBQAAAAthc3NldElkU2VuZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA13YWxsZXRBZGRyZXNzBQAAABBnb3Zlcm5hbmNlUmV3YXJkBQAAAAthc3NldElkU2VuZAUAAAADbmlsAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQgQAAAALYXNzZXRJZFNlbmQFAAAACGFzc2V0SWRBBAAAAA0kdDAyMTU4NTIxNjc2CQEAAAANY2FsY3VsYXRlRmVlcwAAAAIFAAAACGJhbGFuY2VCBQAAAAhiYWxhbmNlQQQAAAAQYW1vdW50V2l0aG91dEZlZQgFAAAADSR0MDIxNTg1MjE2NzYAAAACXzEEAAAADWFtb3VudFdpdGhGZWUIBQAAAA0kdDAyMTU4NTIxNjc2AAAAAl8yBAAAABBnb3Zlcm5hbmNlUmV3YXJkCAUAAAANJHQwMjE1ODUyMTY3NgAAAAJfMwQAAAALbmV3QmFsYW5jZUEJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAANYW1vdW50V2l0aEZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAQAAAALbmV3QmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAMDCQAAZwAAAAIFAAAADXN0YWtlZEFtb3VudEEFAAAAC25ld0JhbGFuY2VBBgkAAGcAAAACBQAAAA1zdGFrZWRBbW91bnRCBQAAAAtuZXdCYWxhbmNlQgkBAAAAIXRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZQAAAAMFAAAADWFtb3VudFdpdGhGZWUFAAAAEWF2YWlsYWJsZUJhbGFuY2VBBQAAAAphc3NldE5hbWVBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADWFtb3VudFdpdGhGZWUFAAAAC2Fzc2V0SWRTZW5kCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAADXdhbGxldEFkZHJlc3MFAAAAEGdvdmVybmFuY2VSZXdhcmQFAAAAC2Fzc2V0SWRTZW5kBQAAAANuaWwJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAkSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkLiBFeHBlY3RlZDogBQAAAAtzdHJBc3NldElkQQIAAAAEIG9yIAUAAAALc3RyQXNzZXRJZEIAAAABaQEAAAAIc2h1dGRvd24AAAAAAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABCQABLAAAAAICAAAAIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAIa2V5Q2F1c2UCAAAAGnRoZSBjYXVzZSB3YXNuJ3Qgc3BlY2lmaWVkAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABRhZG1pblB1YktleVN0YXJ0U3RvcAUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCQEAAAAHc3VzcGVuZAAAAAECAAAAD1BhdXNlZCBieSBhZG1pbgAAAAFpAQAAAAhhY3RpdmF0ZQAAAAADBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAABZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABRhZG1pblB1YktleVN0YXJ0U3RvcAUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAlrZXlBY3RpdmUGCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAACGtleUNhdXNlBQAAAANuaWwAAAABaQEAAAAZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwAAAAEAAAALYW1vdW50TGVhdmUEAAAAHXVuY291bnRhYmxlQW1vdW50RW5yb2xsQXNzZXRBCQAAZQAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEFAAAACGJhbGFuY2VBBAAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QgkAAGUAAAACBQAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCBQAAAAhiYWxhbmNlQgQAAAANYW1vdW50RW5yb2xsQQkAAGUAAAACBQAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QQMJAAAAAAAAAgUAAAAIYXNzZXRJZEEFAAAABHVuaXQFAAAAC2Ftb3VudExlYXZlAAAAAAAAAAAABAAAAA1hbW91bnRFbnJvbGxCCQAAZQAAAAIFAAAAHXVuY291bnRhYmxlQW1vdW50RW5yb2xsQXNzZXRCAwkAAAAAAAACBQAAAAhhc3NldElkQgUAAAAEdW5pdAUAAAALYW1vdW50TGVhdmUAAAAAAAAAAAADCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAArT25seSB0aGUgREFwcCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAABmAAAAAgAAAAAAAAAAAAUAAAALYW1vdW50TGVhdmUJAAACAAAAAQkAASwAAAACAgAAADNBcmd1bWVudCAnYW1vdW50TGVhdmUnIGNhbm5vdCBiZSBuZWdhdGl2ZS4gQWN0dWFsOiAJAAGkAAAAAQUAAAALYW1vdW50TGVhdmUDAwkAAGYAAAACAAAAAAAAAAAABQAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QQYJAABmAAAAAgAAAAAAAAAAAAUAAAAddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEIJAQAAAAdzdXNwZW5kAAAAAQIAAAAWRW5yb2xsIGFtb3VudCBuZWdhdGl2ZQMDCQAAZgAAAAIAAAAAAAAAAAAFAAAADWFtb3VudEVucm9sbEEGCQAAZgAAAAIAAAAAAAAAAAAFAAAADWFtb3VudEVucm9sbEIJAAACAAAAAQIAAAAVVG9vIGxhcmdlIGFtb3VudExlYXZlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAANYW1vdW50RW5yb2xsQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudEVucm9sbEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgIAAAAMbGFzdF9pbmNvbWVfBQAAAAtzdHJBc3NldElkQQUAAAANYW1vdW50RW5yb2xsQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACAgAAAAxsYXN0X2luY29tZV8FAAAAC3N0ckFzc2V0SWRCBQAAAA1hbW91bnRFbnJvbGxCBQAAAANuaWwAAAABaQEAAAASZW5hYmxlRmlyc3RIYXJ2ZXN0AAAAAAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAPa2V5Rmlyc3RIYXJ2ZXN0BgkABEwAAAACCQEAAAAMSW50ZWdl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", "height": 1711553, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AJaFgiazFXzqBC6rLaRvMMuRP19zPPa7XBbT5NNsANQK Next: XUffMTW8u96tuEEdo6pzM95BGXPT9Q8TQw442wiijpa Diff:
OldNewDifferences
343343 }
344344 let asset1Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId1)), 999999)
345345 let asset2Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId2)), 999999)
346- let $t01000310230 = if ((asset2Priority > asset1Priority))
346+ let $t01006910296 = if ((asset2Priority > asset1Priority))
347347 then $Tuple4(pmtAmount2, pmtAssetId2, pmtAmount1, pmtAssetId1)
348348 else $Tuple4(pmtAmount1, pmtAssetId1, pmtAmount2, pmtAssetId2)
349- let pmtAmountA = $t01000310230._1
350- let pmtAssetIdA = $t01000310230._2
351- let pmtAmountB = $t01000310230._3
352- let pmtAssetIdB = $t01000310230._4
353- let $t01023910316 = getAssetInfo(pmtAssetIdA)
354- let pmtStrAssetIdA = $t01023910316._1
355- let pmtAssetNameA = $t01023910316._2
356- let pmtDecimalsA = $t01023910316._3
357- let $t01032510402 = getAssetInfo(pmtAssetIdB)
358- let pmtStrAssetIdB = $t01032510402._1
359- let pmtAssetNameB = $t01032510402._2
360- let pmtDecimalsB = $t01032510402._3
349+ let pmtAmountA = $t01006910296._1
350+ let pmtAssetIdA = $t01006910296._2
351+ let pmtAmountB = $t01006910296._3
352+ let pmtAssetIdB = $t01006910296._4
353+ let $t01030510382 = getAssetInfo(pmtAssetIdA)
354+ let pmtStrAssetIdA = $t01030510382._1
355+ let pmtAssetNameA = $t01030510382._2
356+ let pmtDecimalsA = $t01030510382._3
357+ let $t01039110468 = getAssetInfo(pmtAssetIdB)
358+ let pmtStrAssetIdB = $t01039110468._1
359+ let pmtAssetNameB = $t01039110468._2
360+ let pmtDecimalsB = $t01039110468._3
361361 let addParams = [toString(this), ((pmtAssetNameA + "_") + pmtAssetNameB), pmtStrAssetIdA, pmtStrAssetIdB]
362362 let addPool = invoke(oracle, "addPool", addParams, nil)
363363 if ((addPool == addPool))
401401 then (balanceB == 0)
402402 else false)
403403 then {
404- let $t01332213399 = getAssetInfo(pmtAssetIdA)
405- let pmtStrAssetIdA = $t01332213399._1
406- let pmtAssetNameA = $t01332213399._2
407- let pmtDecimalsA = $t01332213399._3
408- let $t01340813485 = getAssetInfo(pmtAssetIdB)
409- let pmtStrAssetIdB = $t01340813485._1
410- let pmtAssetNameB = $t01340813485._2
411- let pmtDecimalsB = $t01340813485._3
404+ let $t01338813465 = getAssetInfo(pmtAssetIdA)
405+ let pmtStrAssetIdA = $t01338813465._1
406+ let pmtAssetNameA = $t01338813465._2
407+ let pmtDecimalsA = $t01338813465._3
408+ let $t01347413551 = getAssetInfo(pmtAssetIdB)
409+ let pmtStrAssetIdB = $t01347413551._1
410+ let pmtAssetNameB = $t01347413551._2
411+ let pmtDecimalsB = $t01347413551._3
412412 let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
413413 if ((pmtAssetIdA == pmtAssetIdB))
414414 then throw("Assets must be different")
471471
472472 @Callable(i)
473473 func withdraw () = {
474- let $t01788418034 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
475- let pmtAmount = $t01788418034._1
476- let pmtAssetId = $t01788418034._2
474+ let $t01795018100 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
475+ let pmtAmount = $t01795018100._1
476+ let pmtAssetId = $t01795018100._2
477477 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA, assetIdB)
478478 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB, assetIdA)
479479 if (!(isActive))
495495
496496 @Callable(i)
497497 func exchange (minAmountToReceive) = {
498- let $t01926019335 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
499- let pmtAmount = $t01926019335._1
500- let pmtAssetId = $t01926019335._2
498+ let $t01932619401 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
499+ let pmtAmount = $t01932619401._1
500+ let pmtAssetId = $t01932619401._2
501501 func calculateFees (tokenFrom,tokenTo) = {
502502 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
503503 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
522522 else if ((pmtAssetId == assetIdA))
523523 then {
524524 let assetIdSend = assetIdB
525- let $t02060920700 = calculateFees(balanceA, balanceB)
526- let amountWithoutFee = $t02060920700._1
527- let amountWithFee = $t02060920700._2
528- let governanceReward = $t02060920700._3
525+ let $t02067520766 = calculateFees(balanceA, balanceB)
526+ let amountWithoutFee = $t02067520766._1
527+ let amountWithFee = $t02067520766._2
528+ let governanceReward = $t02067520766._3
529529 let newBalanceA = (balanceA + pmtAmount)
530530 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
531531 if (if ((stakedAmountA >= newBalanceA))
537537 else if ((pmtAssetId == assetIdB))
538538 then {
539539 let assetIdSend = assetIdA
540- let $t02151921610 = calculateFees(balanceB, balanceA)
541- let amountWithoutFee = $t02151921610._1
542- let amountWithFee = $t02151921610._2
543- let governanceReward = $t02151921610._3
540+ let $t02158521676 = calculateFees(balanceB, balanceA)
541+ let amountWithoutFee = $t02158521676._1
542+ let amountWithFee = $t02158521676._2
543+ let governanceReward = $t02158521676._3
544544 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
545545 let newBalanceB = (balanceB + pmtAmount)
546546 if (if ((stakedAmountA >= newBalanceA))
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
1818 let keyBalanceInitA = "A_asset_init"
1919
2020 let keyBalanceInitB = "B_asset_init"
2121
2222 let keyShareAssetId = "share_asset_id"
2323
2424 let keyShareAssetSupply = "share_asset_supply"
2525
2626 let keyCommission = "commission"
2727
2828 let keyCommissionScaleDelimiter = "commission_scale_delimiter"
2929
3030 let keyCause = "shutdown_cause"
3131
3232 let keyFirstHarvest = "first_harvest"
3333
3434 let keyFirstHarvestHeight = "first_harvest_height"
3535
3636 let keyShareLimit = "share_limit_on_first_harvest"
3737
3838 let keyBasePeriod = "base_period"
3939
4040 let keyPeriodLength = "period_length"
4141
4242 let keyStartHeight = "start_height"
4343
4444 let keyOracleAssetPriority = "asset_priority_"
4545
4646 let keyOracleScriptHash = "script_hash_cpmm"
4747
4848 let keyInitPoolHeight = "init_pool_height"
4949
5050 let keyAdminPubKey1 = "admin_pub_1"
5151
5252 let keyAdminPubKey2 = "admin_pub_2"
5353
5454 let keyAdminPubKey3 = "admin_pub_3"
5555
5656 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
5757
5858 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
5959 case string: String =>
6060 fromBase58String(string)
6161 case nothing =>
6262 throw("Admin public key is empty")
6363 }
6464
6565
6666 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
6767
6868 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
6969
7070 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
7171
7272 let adminPubKeyStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7373
7474 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7575
7676 let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
7777
7878 let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
7979
8080 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
8181
8282 let NSBT = base58'36mg8NZTaFRDygiVwb8uBnLR51hetJruUCZcxhaVcHj9'
8383
8484 let SWOP = base58'2HAJrwa8q4SxBx9cHYaBTQdBjdk5wwqdof7ccpAx2uhZ'
8585
8686 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
8787
8888 let stakingUSDNNSBTAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
8989
9090 let stakingEURNAddress = Address(base58'3MyVqAbmKWh339gF6hy8faWw1jGeTV2wnGE')
9191
9292 let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
9393
9494 let USDNToNSBTExchanger = Address(base58'3Mye9wVR7d2mc6Y5ZJTu11svzgUQ7o8H9dA')
9595
9696 let stakingFeeInUSDN = 270000
9797
9898 let stakingFeeInEURN = 234000
9999
100100 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, keyBasePeriod), "Empty keyBasePeriod")
101101
102102 let startHeight = valueOrErrorMessage(getInteger(votingAddress, keyStartHeight), "Empty keyStartHeight")
103103
104104 let periodLength = valueOrErrorMessage(getInteger(votingAddress, keyPeriodLength), "Empty keyPeriodLength")
105105
106106 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 1)
107107
108108 let isActive = getBooleanValue(this, keyActive)
109109
110110 let strAssetIdA = getStringValue(this, keyAssetIdA)
111111
112112 let strAssetIdB = getStringValue(this, keyAssetIdB)
113113
114114 let assetIdA = if ((strAssetIdA == "WAVES"))
115115 then unit
116116 else fromBase58String(strAssetIdA)
117117
118118 let assetIdB = if ((strAssetIdB == "WAVES"))
119119 then unit
120120 else fromBase58String(strAssetIdB)
121121
122122 let assetNameA = match assetIdA {
123123 case id: ByteVector =>
124124 value(assetInfo(id)).name
125125 case waves: Unit =>
126126 "WAVES"
127127 case _ =>
128128 throw("Match error")
129129 }
130130
131131 let assetNameB = match assetIdB {
132132 case id: ByteVector =>
133133 value(assetInfo(id)).name
134134 case waves: Unit =>
135135 "WAVES"
136136 case _ =>
137137 throw("Match error")
138138 }
139139
140140 let balanceA = getIntegerValue(this, keyBalanceA)
141141
142142 let balanceB = getIntegerValue(this, keyBalanceB)
143143
144144 let shareAssetId = fromBase58String(getStringValue(this, keyShareAssetId))
145145
146146 let shareAssetSupply = getIntegerValue(this, keyShareAssetSupply)
147147
148148 let commission = 3000
149149
150150 let commissionGovernance = 1200
151151
152152 let commissionScaleDelimiter = 1000000
153153
154154 let scaleValue3 = 1000
155155
156156 let scaleValue8 = 100000000
157157
158158 let slippageToleranceDelimiter = 1000
159159
160160 let scaleValue8Digits = 8
161161
162162 let comissionForInitalization = 1000000000
163163
164164 func accountBalance (assetId) = match assetId {
165165 case id: ByteVector =>
166166 assetBalance(this, id)
167167 case waves: Unit =>
168168 wavesBalance(this).available
169169 case _ =>
170170 throw("Match error")
171171 }
172172
173173
174174 func stakedAmount (assetId) = {
175175 let stakedAmountCalculated = match assetId {
176176 case aId: ByteVector =>
177177 if (if ((aId == USDN))
178178 then true
179179 else (aId == NSBT))
180180 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
181181 else if ((aId == EURN))
182182 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
183183 else 0
184184 case _: Unit =>
185185 0
186186 case _ =>
187187 throw("Match error")
188188 }
189189 match stakedAmountCalculated {
190190 case i: Int =>
191191 i
192192 case _ =>
193193 0
194194 }
195195 }
196196
197197
198198 func isAllowedAsset (assetId) = match assetId {
199199 case id: ByteVector =>
200200 if (if ((id == USDN))
201201 then true
202202 else (id == SWOP))
203203 then true
204204 else false
205205 case waves: Unit =>
206206 true
207207 case _ =>
208208 throw("Match error")
209209 }
210210
211211
212212 let stakedAmountA = stakedAmount(assetIdA)
213213
214214 let stakedAmountB = stakedAmount(assetIdB)
215215
216216 let assetInitA = getIntegerValue(this, keyBalanceInitA)
217217
218218 let assetInitB = getIntegerValue(this, keyBalanceInitB)
219219
220220 let availableBalanceA = (balanceA - stakedAmountA)
221221
222222 let availableBalanceB = (balanceB - stakedAmountB)
223223
224224 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
225225
226226 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
227227
228228 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
229229 then (accountBalanceWithStakedB >= balanceB)
230230 else false
231231
232232 func getAssetInfo (assetId) = match assetId {
233233 case id: ByteVector =>
234234 let stringId = toBase58String(id)
235235 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
236236 $Tuple3(stringId, info.name, info.decimals)
237237 case waves: Unit =>
238238 $Tuple3("WAVES", "WAVES", 8)
239239 case _ =>
240240 throw("Match error")
241241 }
242242
243243
244244 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
245245 then $Tuple3("WAVES", "WAVES", 8)
246246 else {
247247 let stringId = assetStr
248248 let id = fromBase58String(assetStr)
249249 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
250250 $Tuple3(stringId, info.name, info.decimals)
251251 }
252252
253253
254254 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
255255
256256
257257 func deductStakingFee (amount,assetId,secondAssetId) = if (if ((assetId == USDN))
258258 then true
259259 else (assetId == EURN))
260260 then {
261261 let stakinFee = if ((assetId == USDN))
262262 then (stakingFeeInUSDN * (if ((secondAssetId == NSBT))
263263 then 2
264264 else 1))
265265 else if ((assetId == EURN))
266266 then stakingFeeInEURN
267267 else 0
268268 let result = (amount - stakinFee)
269269 if ((0 >= result))
270270 then throw((((("Insufficient amount " + toString(amount)) + " to deduct staking fee ") + toString(stakinFee)) + "USDN/EURN"))
271271 else result
272272 }
273273 else amount
274274
275275
276276 func getStakingFee (assetId,secondAssetId) = if ((assetId == USDN))
277277 then (stakingFeeInUSDN * (if ((secondAssetId == NSBT))
278278 then 2
279279 else 1))
280280 else if ((assetId == EURN))
281281 then stakingFeeInEURN
282282 else 0
283283
284284
285285 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"))
286286
287287
288288 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"))
289289
290290
291291 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
292292
293293
294294 @Callable(i)
295295 func init (userAddressStr) = {
296296 let $t083608437 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
297297 let pmtAmount1 = $t083608437._1
298298 let pmtAssetId1 = $t083608437._2
299299 let $t084428519 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
300300 let pmtAmount2 = $t084428519._1
301301 let pmtAssetId2 = $t084428519._2
302302 let $t085248607 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
303303 let pmtAmountSWOP = $t085248607._1
304304 let pmtAssetIdSWOP = $t085248607._2
305305 let check = isDataStorageUntouched(this)
306306 let userScriptHash = scriptHash(this)
307307 let userAddress = addressFromStringValue(userAddressStr)
308308 let oracleCpmmHash = value(getBinary(oracle, keyOracleScriptHash))
309309 if ((i.caller == this))
310310 then throw("You can't call yourself")
311311 else if (if ((pmtAssetIdSWOP != SWOP))
312312 then true
313313 else (pmtAmountSWOP != comissionForInitalization))
314314 then throw("You need to attach 10 SWOP tokens")
315315 else if (if (!(isAllowedAsset(pmtAssetId1)))
316316 then !(isAllowedAsset(pmtAssetId2))
317317 else false)
318318 then throw("One of assets must be USDN, WAVES or SWOP")
319319 else if (if ((userScriptHash != oracleCpmmHash))
320320 then true
321321 else !(check))
322322 then throw("Unexpected script was found.")
323323 else if (isDefined(getBoolean(this, keyActive)))
324324 then throw("DApp is already active")
325325 else if ((pmtAssetId1 == pmtAssetId2))
326326 then throw("Assets must be different")
327327 else {
328328 let pmtStrAssetId1 = match pmtAssetId1 {
329329 case id: ByteVector =>
330330 toBase58String(id)
331331 case waves: Unit =>
332332 "WAVES"
333333 case _ =>
334334 throw("Match error")
335335 }
336336 let pmtStrAssetId2 = match pmtAssetId2 {
337337 case id: ByteVector =>
338338 toBase58String(id)
339339 case waves: Unit =>
340340 "WAVES"
341341 case _ =>
342342 throw("Match error")
343343 }
344344 let asset1Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId1)), 999999)
345345 let asset2Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId2)), 999999)
346- let $t01000310230 = if ((asset2Priority > asset1Priority))
346+ let $t01006910296 = if ((asset2Priority > asset1Priority))
347347 then $Tuple4(pmtAmount2, pmtAssetId2, pmtAmount1, pmtAssetId1)
348348 else $Tuple4(pmtAmount1, pmtAssetId1, pmtAmount2, pmtAssetId2)
349- let pmtAmountA = $t01000310230._1
350- let pmtAssetIdA = $t01000310230._2
351- let pmtAmountB = $t01000310230._3
352- let pmtAssetIdB = $t01000310230._4
353- let $t01023910316 = getAssetInfo(pmtAssetIdA)
354- let pmtStrAssetIdA = $t01023910316._1
355- let pmtAssetNameA = $t01023910316._2
356- let pmtDecimalsA = $t01023910316._3
357- let $t01032510402 = getAssetInfo(pmtAssetIdB)
358- let pmtStrAssetIdB = $t01032510402._1
359- let pmtAssetNameB = $t01032510402._2
360- let pmtDecimalsB = $t01032510402._3
349+ let pmtAmountA = $t01006910296._1
350+ let pmtAssetIdA = $t01006910296._2
351+ let pmtAmountB = $t01006910296._3
352+ let pmtAssetIdB = $t01006910296._4
353+ let $t01030510382 = getAssetInfo(pmtAssetIdA)
354+ let pmtStrAssetIdA = $t01030510382._1
355+ let pmtAssetNameA = $t01030510382._2
356+ let pmtDecimalsA = $t01030510382._3
357+ let $t01039110468 = getAssetInfo(pmtAssetIdB)
358+ let pmtStrAssetIdB = $t01039110468._1
359+ let pmtAssetNameB = $t01039110468._2
360+ let pmtDecimalsB = $t01039110468._3
361361 let addParams = [toString(this), ((pmtAssetNameA + "_") + pmtAssetNameB), pmtStrAssetIdA, pmtStrAssetIdB]
362362 let addPool = invoke(oracle, "addPool", addParams, nil)
363363 if ((addPool == addPool))
364364 then if (!(isDefined(getString(oracle, ("pool_" + toString(this))))))
365365 then throw("Pool is not added")
366366 else {
367367 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
368368 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
369369 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
370370 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
371371 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
372372 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
373373 let shareInitialSupply = fraction(arg1, arg2, arg3)
374374 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
375375 let shareIssueId = calculateAssetId(shareIssue)
376376 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), IntegerEntry(keyInitPoolHeight, height), ScriptTransfer(userAddress, shareInitialSupply, shareIssueId), ScriptTransfer(walletAddress, comissionForInitalization, SWOP)]
377377 baseEntry
378378 }
379379 else throw("Strict value is not equal to itself.")
380380 }
381381 }
382382
383383
384384
385385 @Callable(i)
386386 func keepLimitForFirstHarvest (shareLimit) = if (!(isActive))
387387 then throw("DApp is inactive at this moment")
388388 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
389389 then throw("Only admin can call this function")
390390 else [IntegerEntry(keyShareLimit, shareLimit)]
391391
392392
393393
394394 @Callable(i)
395395 func replenishWithTwoTokens (slippageTolerance) = {
396396 let pmtAssetIdA = i.payments[0].assetId
397397 let pmtAssetIdB = i.payments[1].assetId
398398 let pmtAmountA = deductStakingFee(i.payments[0].amount, pmtAssetIdA, pmtAssetIdB)
399399 let pmtAmountB = deductStakingFee(i.payments[1].amount, pmtAssetIdB, pmtAssetIdA)
400400 if (if ((balanceA == 0))
401401 then (balanceB == 0)
402402 else false)
403403 then {
404- let $t01332213399 = getAssetInfo(pmtAssetIdA)
405- let pmtStrAssetIdA = $t01332213399._1
406- let pmtAssetNameA = $t01332213399._2
407- let pmtDecimalsA = $t01332213399._3
408- let $t01340813485 = getAssetInfo(pmtAssetIdB)
409- let pmtStrAssetIdB = $t01340813485._1
410- let pmtAssetNameB = $t01340813485._2
411- let pmtDecimalsB = $t01340813485._3
404+ let $t01338813465 = getAssetInfo(pmtAssetIdA)
405+ let pmtStrAssetIdA = $t01338813465._1
406+ let pmtAssetNameA = $t01338813465._2
407+ let pmtDecimalsA = $t01338813465._3
408+ let $t01347413551 = getAssetInfo(pmtAssetIdB)
409+ let pmtStrAssetIdB = $t01347413551._1
410+ let pmtAssetNameB = $t01347413551._2
411+ let pmtDecimalsB = $t01347413551._3
412412 let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
413413 if ((pmtAssetIdA == pmtAssetIdB))
414414 then throw("Assets must be different")
415415 else {
416416 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
417417 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
418418 if (!(isActive))
419419 then throw("DApp is inactive at this moment")
420420 else if (if ((0 > slippageTolerance))
421421 then true
422422 else (slippageTolerance > slippageToleranceDelimiter))
423423 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
424424 else if ((size(i.payments) != 2))
425425 then throw("Two attached assets expected")
426426 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
427427 then true
428428 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
429429 then throw("Incorrect assets amount: amounts must have the contract ratio")
430430 else if (if ((pmtAssetIdA != assetIdA))
431431 then true
432432 else (pmtAssetIdB != assetIdB))
433433 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
434434 else if ((shareInitialSupply == 0))
435435 then throw("Too small amount to replenish")
436436 else if (!(hasEnoughBalance))
437437 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
438438 else [Reissue(shareAssetId, shareInitialSupply, true), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareAssetId)]
439439 }
440440 }
441441 else {
442442 let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
443443 let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
444444 let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
445445 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
446446 if (!(isActive))
447447 then throw("DApp is inactive at this moment")
448448 else if (if ((0 > slippageTolerance))
449449 then true
450450 else (slippageTolerance > slippageToleranceDelimiter))
451451 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
452452 else if ((size(i.payments) != 2))
453453 then throw("Two attached assets expected")
454454 else if (if ((pmtAssetIdA != assetIdA))
455455 then true
456456 else (pmtAssetIdB != assetIdB))
457457 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
458458 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
459459 then true
460460 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
461461 then throw("Incorrect assets amount: amounts must have the contract ratio")
462462 else if ((shareTokenToPayAmount == 0))
463463 then throw("Too small amount to replenish")
464464 else if (!(hasEnoughBalance))
465465 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
466466 else [IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
467467 }
468468 }
469469
470470
471471
472472 @Callable(i)
473473 func withdraw () = {
474- let $t01788418034 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
475- let pmtAmount = $t01788418034._1
476- let pmtAssetId = $t01788418034._2
474+ let $t01795018100 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
475+ let pmtAmount = $t01795018100._1
476+ let pmtAssetId = $t01795018100._2
477477 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA, assetIdB)
478478 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB, assetIdA)
479479 if (!(isActive))
480480 then throw("DApp is inactive at this moment")
481481 else if ((size(i.payments) != 1))
482482 then throw("One attached payment expected")
483483 else if ((pmtAssetId != shareAssetId))
484484 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
485485 else if (!(hasEnoughBalance))
486486 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
487487 else if (if ((amountToPayA > availableBalanceA))
488488 then true
489489 else (amountToPayB > availableBalanceB))
490490 then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
491491 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)]
492492 }
493493
494494
495495
496496 @Callable(i)
497497 func exchange (minAmountToReceive) = {
498- let $t01926019335 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
499- let pmtAmount = $t01926019335._1
500- let pmtAssetId = $t01926019335._2
498+ let $t01932619401 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
499+ let pmtAmount = $t01932619401._1
500+ let pmtAssetId = $t01932619401._2
501501 func calculateFees (tokenFrom,tokenTo) = {
502502 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
503503 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
504504 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
505505 if ((minAmountToReceive > amountWithFee))
506506 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
507507 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
508508 }
509509
510510 if (!(isActive))
511511 then throw("DApp is inactive at this moment")
512512 else if (if ((balanceA == 0))
513513 then true
514514 else (balanceB == 0))
515515 then throw("Can't exchange with zero balance")
516516 else if ((0 >= minAmountToReceive))
517517 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
518518 else if ((size(i.payments) != 1))
519519 then throw("One attached payment expected")
520520 else if (!(hasEnoughBalance))
521521 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
522522 else if ((pmtAssetId == assetIdA))
523523 then {
524524 let assetIdSend = assetIdB
525- let $t02060920700 = calculateFees(balanceA, balanceB)
526- let amountWithoutFee = $t02060920700._1
527- let amountWithFee = $t02060920700._2
528- let governanceReward = $t02060920700._3
525+ let $t02067520766 = calculateFees(balanceA, balanceB)
526+ let amountWithoutFee = $t02067520766._1
527+ let amountWithFee = $t02067520766._2
528+ let governanceReward = $t02067520766._3
529529 let newBalanceA = (balanceA + pmtAmount)
530530 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
531531 if (if ((stakedAmountA >= newBalanceA))
532532 then true
533533 else (stakedAmountB >= newBalanceB))
534534 then throwInsufficientAvailableBalance(amountWithFee, availableBalanceB, assetNameB)
535535 else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
536536 }
537537 else if ((pmtAssetId == assetIdB))
538538 then {
539539 let assetIdSend = assetIdA
540- let $t02151921610 = calculateFees(balanceB, balanceA)
541- let amountWithoutFee = $t02151921610._1
542- let amountWithFee = $t02151921610._2
543- let governanceReward = $t02151921610._3
540+ let $t02158521676 = calculateFees(balanceB, balanceA)
541+ let amountWithoutFee = $t02158521676._1
542+ let amountWithFee = $t02158521676._2
543+ let governanceReward = $t02158521676._3
544544 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
545545 let newBalanceB = (balanceB + pmtAmount)
546546 if (if ((stakedAmountA >= newBalanceA))
547547 then true
548548 else (stakedAmountB >= newBalanceB))
549549 then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
550550 else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
551551 }
552552 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
553553 }
554554
555555
556556
557557 @Callable(i)
558558 func shutdown () = if (!(isActive))
559559 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
560560 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
561561 then throw("Only admin can call this function")
562562 else suspend("Paused by admin")
563563
564564
565565
566566 @Callable(i)
567567 func activate () = if (isActive)
568568 then throw("DApp is already active")
569569 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
570570 then throw("Only admin can call this function")
571571 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
572572
573573
574574
575575 @Callable(i)
576576 func takeIntoAccountExtraFunds (amountLeave) = {
577577 let uncountableAmountEnrollAssetA = (accountBalanceWithStakedA - balanceA)
578578 let uncountableAmountEnrollAssetB = (accountBalanceWithStakedB - balanceB)
579579 let amountEnrollA = (uncountableAmountEnrollAssetA - (if ((assetIdA == unit))
580580 then amountLeave
581581 else 0))
582582 let amountEnrollB = (uncountableAmountEnrollAssetB - (if ((assetIdB == unit))
583583 then amountLeave
584584 else 0))
585585 if (!(isActive))
586586 then throw("DApp is inactive at this moment")
587587 else if ((i.caller != this))
588588 then throw("Only the DApp itself can call this function")
589589 else if ((0 > amountLeave))
590590 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
591591 else if (if ((0 > uncountableAmountEnrollAssetA))
592592 then true
593593 else (0 > uncountableAmountEnrollAssetB))
594594 then suspend("Enroll amount negative")
595595 else if (if ((0 > amountEnrollA))
596596 then true
597597 else (0 > amountEnrollB))
598598 then throw("Too large amountLeave")
599599 else [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
600600 }
601601
602602
603603
604604 @Callable(i)
605605 func enableFirstHarvest () = [BooleanEntry(keyFirstHarvest, true), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]
606606
607607
608608 @Verifier(tx)
609609 func verify () = {
610610 let multiSignedByAdmins = {
611611 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
612612 then 1
613613 else 0
614614 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
615615 then 1
616616 else 0
617617 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
618618 then 1
619619 else 0
620620 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
621621 }
622622 match tx {
623623 case inv: InvokeScriptTransaction =>
624624 let callTakeIntoAccount = if ((inv.dApp == this))
625625 then (inv.function == "takeIntoAccountExtraFunds")
626626 else false
627627 let callEnableFirstHarvest = if ((inv.dApp == this))
628628 then (inv.function == "enableFirstHarvest")
629629 else false
630630 let callStaking = if (if ((inv.dApp == stakingUSDNNSBTAddress))
631631 then if (if (if ((inv.function == "lockNeutrino"))
632632 then (size(inv.payments) == 1)
633633 else false)
634634 then if ((inv.payments[0].assetId == USDN))
635635 then true
636636 else (inv.payments[0].assetId == NSBT)
637637 else false)
638638 then true
639639 else if ((inv.function == "unlockNeutrino"))
640640 then (size(inv.payments) == 0)
641641 else false
642642 else false)
643643 then true
644644 else if ((inv.dApp == stakingEURNAddress))
645645 then if (if (if ((inv.function == "startStaking"))
646646 then (size(inv.payments) == 1)
647647 else false)
648648 then (inv.payments[0].assetId == EURN)
649649 else false)
650650 then true
651651 else if ((inv.function == "stopStaking"))
652652 then (size(inv.payments) == 0)
653653 else false
654654 else false
655655 let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
656656 then (inv.function == "exchange")
657657 else false)
658658 then (assetIdA == USDN)
659659 else false)
660660 then true
661661 else if (if ((assetIdB == USDN))
662662 then (size(inv.payments) == 1)
663663 else false)
664664 then (inv.payments[0].assetId == USDN)
665665 else false
666666 let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
667667 then (inv.function == "exchange")
668668 else false)
669669 then (assetIdA == NSBT)
670670 else false)
671671 then true
672672 else if (if ((assetIdB == NSBT))
673673 then (size(inv.payments) == 1)
674674 else false)
675675 then (inv.payments[0].assetId == USDN)
676676 else false
677677 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
678678 then true
679679 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
680680 then true
681681 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
682682 then true
683683 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
684684 if (if (if (if (if (if (callTakeIntoAccount)
685685 then true
686686 else callEnableFirstHarvest)
687687 then true
688688 else callStaking)
689689 then true
690690 else exchangeToWaves)
691691 then true
692692 else exchangeToNSBTs)
693693 then signedByAdmin
694694 else false)
695695 then true
696696 else multiSignedByAdmins
697697 case _ =>
698698 multiSignedByAdmins
699699 }
700700 }
701701

github/deemru/w8io/873ac7e 
100.40 ms