tx · C3ZFD5MvuhYXhGkZXn3KvJLy7UXnf2XtpkP3wN4itE2X

3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37:  -0.01400000 Waves

2021.08.16 16:28 [1660965] smart account 3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37 > SELF 0.00000000 Waves

{ "type": 13, "id": "C3ZFD5MvuhYXhGkZXn3KvJLy7UXnf2XtpkP3wN4itE2X", "fee": 1400000, "feeAssetId": null, "timestamp": 1629120504757, "version": 2, "chainId": 84, "sender": "3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37", "senderPublicKey": "4bwUHdA4vTBJ1k43dYKiPYTDqm3QqiZXNGXoQstGAD1k", "proofs": [ "2hoNdo5L6LxXKe5acAj99QGpaTSgAy3SoPnMpbpYyeAszhpm8qjY24ikCiiURrLTebS5cSdoV9RjHw6uWMDtFToJ", "5eNsWpPA1hB15FS5WkRUtbKVTDGE4jvCu8dqZU7pfD8ig2PSDQoSBxKaVexJWZmSumPz1zDtqBC8UdnoNoEX1rmh" ], "script": "base64:AAIFAAAAAAAAACMIAhIDCgEIEgMKAQESAwoBARIAEgMKAQESABIAEgMKAQESAAAAAFgAAAAAB3ZlcnNpb24CAAAABTEuMC4wAAAAAAprZXlWZXJzaW9uAgAAAAd2ZXJzaW9uAAAAAAlrZXlBY3RpdmUCAAAABmFjdGl2ZQAAAAALa2V5QXNzZXRJZEECAAAACkFfYXNzZXRfaWQAAAAAC2tleUFzc2V0SWRCAgAAAApCX2Fzc2V0X2lkAAAAAAtrZXlCYWxhbmNlQQIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAtrZXlCYWxhbmNlQgIAAAAPQl9hc3NldF9iYWxhbmNlAAAAAA9rZXlCYWxhbmNlSW5pdEECAAAADEFfYXNzZXRfaW5pdAAAAAAPa2V5QmFsYW5jZUluaXRCAgAAAAxCX2Fzc2V0X2luaXQAAAAAD2tleVNoYXJlQXNzZXRJZAIAAAAOc2hhcmVfYXNzZXRfaWQAAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkCAAAAEnNoYXJlX2Fzc2V0X3N1cHBseQAAAAANa2V5Q29tbWlzc2lvbgIAAAAKY29tbWlzc2lvbgAAAAAba2V5Q29tbWlzc2lvblNjYWxlRGVsaW1pdGVyAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAAIa2V5Q2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAAA9rZXlGaXJzdEhhcnZlc3QCAAAADWZpcnN0X2hhcnZlc3QAAAAAFWtleUZpcnN0SGFydmVzdEhlaWdodAIAAAAUZmlyc3RfaGFydmVzdF9oZWlnaHQAAAAADWtleVNoYXJlTGltaXQCAAAAHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAAAAADWtleUJhc2VQZXJpb2QCAAAAC2Jhc2VfcGVyaW9kAAAAAA9rZXlQZXJpb2RMZW5ndGgCAAAADXBlcmlvZF9sZW5ndGgAAAAADmtleVN0YXJ0SGVpZ2h0AgAAAAxzdGFydF9oZWlnaHQAAAAAFmtleU9yYWNsZUFzc2V0UHJpb3JpdHkCAAAAD2Fzc2V0X3ByaW9yaXR5XwAAAAATa2V5T3JhY2xlU2NyaXB0SGFzaAIAAAAQc2NyaXB0X2hhc2hfY3BtbQAAAAARa2V5SW5pdFBv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AAAAC2tleUJhbGFuY2VBAAAAAAhiYWxhbmNlQgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAALa2V5QmFsYW5jZUIAAAAADHNoYXJlQXNzZXRJZAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAAA9rZXlTaGFyZUFzc2V0SWQAAAAAEHNoYXJlQXNzZXRTdXBwbHkJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMFAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkAAAAACmNvbW1pc3Npb24AAAAAAAAAC7gAAAAAFGNvbW1pc3Npb25Hb3Zlcm5hbmNlAAAAAAAAAASwAAAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIAAAAAAAAPQkAAAAAAC3NjYWxlVmFsdWUzAAAAAAAAAAPoAAAAAAtzY2FsZVZhbHVlOAAAAAAABfXhAAAAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIAAAAAAAAAA+gAAAAAEXNjYWxlVmFsdWU4RGlnaXRzAAAAAAAAAAAIAAAAABljb21pc3Npb25Gb3JJbml0YWxpemF0aW9uAAAAAAA7msoAAQAAAA5hY2NvdW50QmFsYW5jZQAAAAEAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACaWQFAAAAByRtYXRjaDAJAAPwAAAAAgUAAAAEdGhpcwUAAAACaWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwCAkAA+8AAAABBQAAAAR0aGlzAAAACWF2YWlsYWJsZQkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAAMc3Rha2VkQW1vdW50AAAAAQAAAAdhc3NldElkBAAAABZzdGFrZWRBbW91bnRDYWxjdWxhdGVkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAANhSWQFAAAAByRtYXRjaDADAwkAAAAAAAACBQAAAANhSWQFAAAABFVTRE4GCQAAAAAAAAIFAAAAA2FJZAUAAAAETlNCVAkABBoAAAACBQAAABZzdGFraW5nVVNETk5TQlRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAxycGRfYmFsYW5jZV8JAAJYAAAAAQUAAAADYUlkAgAAAAFfCQAEJQAAAAEFAAAABHRoaXMDCQAAAAAAAAIFAAAAA2FJZAUAAAAERVVSTgkABBoAAAACBQAAABJzdGFraW5nRVVSTkFkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAGCVzJXMlc19fc3Rha2luZ0JhbGFuY2VfXwkAAlgAAAABBQAAAANhSWQCAAAAAl9fCQAEJQAAAAEFAAAABHRoaXMAAAAAAAAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQAAAAAAAAAAAAJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IEAAAAByRtYXRjaDAFAAAAFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABaQUAAAAHJG1hdGNoMAUAAAABaQAAAAAAAAAAAAEAAAAOaXNBbGxvd2VkQXNzZXQAAAABAAAAB2Fzc2V0SWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAmlkBQAAAAckbWF0Y2gwAwMJAAAAAAAAAgUAAAACaWQFAAAABFVTRE4GCQAAAAAAAAIFAAAAAmlkBQAAAARTV09QBgcDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwBgkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgAAAAANc3Rha2VkQW1vdW50QQkBAAAADHN0YWtlZEFtb3VudAAAAAEFAAAACGFzc2V0SWRBAAAAAA1zdGFrZWRBbW91bnRCCQEAAAAMc3Rha2VkQW1vdW50AAAAAQUAAAAIYXNzZXRJZEIAAAAACmFzc2V0SW5pdEEJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMFAAAAD2tleUJhbGFuY2VJbml0QQAAAAAKYXNzZXRJbml0QgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAAPa2V5QmFsYW5jZUluaXRCAAAAABFhdmFpbGFibGVCYWxhbmNlQQkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAANc3Rha2VkQW1vdW50QQAAAAARYXZhaWxhYmxlQmFsYW5jZUIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADXN0YWtlZEFtb3VudEIAAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEJAABkAAAAAgkBAAAADmFjY291bnRCYWxhbmNlAAAAAQUAAAAIYXNzZXRJZEEFAAAADXN0YWtlZEFtb3VudEEAAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEIJAABkAAAAAgkBAAAADmFjY291bnRCYWxhbmNlAAAAAQUAAAAIYXNzZXRJZEIFAAAADXN0YWtlZEFtb3VudEIAAAAAEGhhc0Vub3VnaEJhbGFuY2UDCQAAZwAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEFAAAACGJhbGFuY2VBCQAAZwAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEIFAAAACGJhbGFuY2VCBwEAAAAMZ2V0QXNzZXRJbmZvAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAQAAAAIc3RyaW5nSWQJAAJYAAAAAQUAAAACaWQEAAAABGluZm8JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAJpZAkAASwAAAACCQABLAAAAAICAAAABkFzc2V0IAUAAAAIc3RyaW5nSWQCAAAADiBkb2Vzbid0IGV4aXN0CQAFFQAAAAMFAAAACHN0cmluZ0lkCAUAAAAEaW5mbwAAAARuYW1lCAUAAAAEaW5mbwAAAAhkZWNpbWFscwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDAJAAUVAAAAAwIAAAAFV0FWRVMCAAAABVdBVkVTAAAAAAAAAAAICQAA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dWVPckVsc2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACBQAAABZrZXlPcmFjbGVBc3NldFByaW9yaXR5BQAAAA5wbXRTdHJBc3NldElkMQAAAAAAAA9CPwQAAAAOYXNzZXQyUHJpb3JpdHkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAGb3JhY2xlCQABLAAAAAIFAAAAFmtleU9yYWNsZUFzc2V0UHJpb3JpdHkFAAAADnBtdFN0ckFzc2V0SWQyAAAAAAAAD0I/BAAAAAwkdDA5OTYyMTAxODkDCQAAZgAAAAIFAAAADmFzc2V0MlByaW9yaXR5BQAAAA5hc3NldDFQcmlvcml0eQkABRYAAAAEBQAAAApwbXRBbW91bnQyBQAAAAtwbXRBc3NldElkMgUAAAAKcG10QW1vdW50MQUAAAALcG10QXNzZXRJZDEJAAUWAAAABAUAAAAKcG10QW1vdW50MQUAAAALcG10QXNzZXRJZDEFAAAACnBtdEFtb3VudDIFAAAAC3BtdEFzc2V0SWQyBAAAAApwbXRBbW91bnRBCAUAAAAMJHQwOTk2MjEwMTg5AAAAAl8xBAAAAAtwbXRBc3NldElkQQgFAAAADCR0MDk5NjIxMDE4OQAAAAJfMgQAAAAKcG10QW1vdW50QggFAAAADCR0MDk5NjIxMDE4OQAAAAJfMwQAAAALcG10QXNzZXRJZEIIBQAAAAwkdDA5OTYyMTAxODkAAAACXzQEAAAADSR0MDEwMTk4MTAyNzUJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtwbXRBc3NldElkQQQAAAAOcG10U3RyQXNzZXRJZEEIBQAAAA0kdDAxMDE5ODEwMjc1AAAAAl8xBAAAAA1wbXRBc3NldE5hbWVBCAUAAAANJHQwMTAxOTgxMDI3NQAAAAJfMgQAAAAMcG10RGVjaW1hbHNBCAUAAAANJHQwMTAxOTgxMDI3NQAAAAJfMwQAAAANJHQwMTAyODQxMDM2MQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRCBAAAAA5wbXRTdHJBc3NldElkQggFAAAADSR0MDEwMjg0MTAzNjEAAAACXzEEAAAADXBtdEFzc2V0TmFtZUIIBQAAAA0kdDAxMDI4NDEwMzYxAAAAAl8yBAAAAAxwbXREZWNpbWFsc0IIBQAAAA0kdDAxMDI4NDEwMzYxAAAAAl8zBAAAAAdhZGRQb29sCQAD/AAAAAQFAAAABm9yYWNsZQIAAAAHYWRkUG9vbAkABEwAAAACBQAAAAR0aGlzCQAETAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAA1wbXRBc3NldE5hbWVBAgAAAAFfBQAAAA1wbXRBc3NldE5hbWVCBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAHYWRkUG9vbAUAAAAHYWRkUG9vbAMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAGb3JhY2xlCQABLAAAAAICAAAABXBvb2xfCQAEJQAAAAEFAAAABHRoaXMJAAACAAAAAQIAAAARUG9vbCBpcyBub3QgYWRkZWQEAAAACXNoYXJlTmFtZQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAABcwkAAS8AAAACBQAAAA1wbXRBc3NldE5hbWVBAAAAAAAAAAAHAgAAAAFfCQABLwAAAAIFAAAADXBtdEFzc2V0TmFtZUIAAAAAAAAAAAcEAAAAEHNoYXJlRGVzY3JpcHRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQAAAA1wbXRBc3NldE5hbWVBAgAAAAUgYW5kIAUAAAANcG10QXNzZXROYW1lQgIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAABHRoaXMEAAAADXNoYXJlRGVjaW1hbHMJAABpAAAAAgkAAGQAAAACBQAAAAxwbXREZWNpbWFsc0EFAAAADHBtdERlY2ltYWxzQgAAAAAAAAAAAgQAAAAEYXJnMQkAAGwAAAAGBQAAAApwbXRBbW91bnRBBQAAAAxwbXREZWNpbWFsc0EAAAAAAAAAAAUAAAAAAAAAAAEFAAAADHBtdERlY2ltYWxzQQUAAAAERE9XTgQAAAAEYXJnMgkAAGwAAAAGBQAAAApwbXRBbW91bnRCBQAAAAxwbXREZWNpbWFsc0IAAAAAAAAAAAUAAAAAAAAAAAEFAAAADHBtdERlY2ltYWxzQgUAAAAERE9XTgQAAAAEYXJnMwkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAABQAAAA1zaGFyZURlY2ltYWxzAAAAAAAAAAAAAAAAAAAAAAAABQAAAARET1dOBAAAABJzaGFyZUluaXRpYWxTdXBwbHkJAABrAAAAAwUAAAAEYXJnMQUAAAAEYXJnMgUAAAAEYXJnMwQAAAAKc2hhcmVJc3N1ZQkABEIAAAAFBQAAAAlzaGFyZU5hbWUFAAAAEHNoYXJlRGVzY3JpcHRpb24FAAAAEnNoYXJlSW5pdGlhbFN1cHBseQUAAAANc2hhcmVEZWNpbWFscwYEAAAADHNoYXJlSXNzdWVJZAkABDgAAAABBQAAAApzaGFyZUlzc3VlBAAAAAliYXNlRW50cnkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAKa2V5VmVyc2lvbgUAAAAHdmVyc2lvbgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAJa2V5QWN0aXZlBgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAtrZXlBc3NldElkQQUAAAAOcG10U3RyQXNzZXRJZEEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAALa2V5QXNzZXRJZEIFAAAADnBtdFN0ckFzc2V0SWRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAAKcG10QW1vdW50QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADWtleUNvbW1pc3Npb24FAAAACmNvbW1pc3Npb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAG2tleUNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyCQAETAAAAAIFAAAACnNoYXJlSXNzdWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAPa2V5U2hhcmVBc3NldElkCQACWAAAAAEFAAAADHNoYXJlSXNzdWVJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa2V5U2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrZXlJbml0UG9vbEhlaWdodAUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAC3VzZXJBZGRyZXNzBQAAABJzaGFyZUluaXRpYWxTdXBwbHkFAAAADHNoYXJlSXNzdWVJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA13YWxsZXRBZGRyZXNzBQAAABljb21pc3Npb25Gb3JJbml0YWxpemF0aW9uBQAAAARTV09QBQAAAANuaWwFAAAACWJhc2VFbnRyeQkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAYa2VlcExpbWl0Rm9yRmlyc3RIYXJ2ZXN0AAAAAQAAAApzaGFyZUxpbWl0AwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABJhZG1pblB1YktleVN0YWtpbmcFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANa2V5U2hhcmVMaW1pdAUAAAAKc2hhcmVMaW1pdAUAAAADbmlsAAAAAWkBAAAAFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMAAAABAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAAAtwbXRBc3NldElkQQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAALcG10QXNzZXRJZEIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAAB2Fzc2V0SWQEAAAACnBtdEFtb3VudEEJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAwgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50BQAAAAtwbXRBc3NldElkQQUAAAALcG10QXNzZXRJZEIEAAAACnBtdEFtb3VudEIJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAwgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAGYW1vdW50BQAAAAtwbXRBc3NldElkQgUAAAALcG10QXNzZXRJZEEDAwkAAAAAAAACBQAAAAhiYWxhbmNlQQAAAAAAAAAAAAkAAAAAAAACBQAAAAhiYWxhbmNlQgAAAAAAAAAAAAcEAAAADSR0MDEzMTQ2MTMyMjMJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtwbXRBc3NldElkQQQAAAAOcG10U3RyQXNzZXRJZEEIBQAAAA0kdDAxMzE0NjEzMjIzAAAAAl8xBAAAAA1wbXRBc3NldE5hbWVBCAUAAAANJHQwMTMxNDYxMzIyMwAAAAJfMgQAAAAMcG10RGVjaW1hbHNBCAUAAAANJHQwMTMxNDYxMzIyMwAAAAJfMwQAAAANJHQwMTMyMzIxMzMwOQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRCBAAAAA5wbXRTdHJBc3NldElkQggFAAAADSR0MDEzMjMyMTMzMDkAAAACXzEEAAAADXBtdEFzc2V0TmFtZUIIBQAAAA0kdDAxMzIzMjEzMzA5AAAAAl8yBAAAAAxwbXREZWNpbWFsc0IIBQAAAA0kdDAxMzIzMjEzMzA5AAAAAl8zBAAAAAp0b2tlblJhdGlvCQAAawAAAAMJAABrAAAAAwUAAAAKYXNzZXRJbml0QQUAAAALc2NhbGVWYWx1ZTgFAAAACnBtdEFtb3VudEEFAAAAC3NjYWxlVmFsdWUzCQAAawAAAAMFAAAACmFzc2V0SW5pdEIFAAAAC3NjYWxlVmFsdWU4BQAAAApwbXRBbW91bnRCAwkAAAAAAAACBQAAAAtwbXRBc3NldElkQQUAAAALcG10QXNzZXRJZEIJAAACAAAAAQIAAAAYQXNzZXRzIG11c3QgYmUgZGlmZmVyZW50BAAAAA1zaGFyZURlY2ltYWxzCQAAaQAAAAIJAABkAAAAAgUAAAAMcG10RGVjaW1hbHNBBQAAAAxwbXREZWNpbWFsc0IAAAAAAAAAAAIEAAAAEnNoYXJlSW5pdGlhbFN1cHBseQkAAGsAAAADCQAAbAAAAAYFAAAACnBtdEFtb3VudEEFAAAADHBtdERlY2ltYWxzQQAAAAAAAAAABQAAAAAAAAAAAQUAAAAMcG10RGVjaW1hbHNBBQAAAARET1dOCQAAbAAAAAYFAAAACnBtdEFtb3VudEIFAAAADHBtdERlY2ltYWxzQgAAAAAAAAAABQAAAAAAAAAAAQUAAAAMcG10RGVjaW1hbHNCBQAAAARET1dOCQAAbAAAAAYAAAAAAAAAAAoAAAAAAAAAAAAFAAAADXNoYXJlRGVjaW1hbHMAAAAAAAAAAAAAAAAAAAAAAAAFAAAABERPV04DCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQDAwkAAGYAAAACAAAAAAAAAAAABQAAABFzbGlwcGFnZVRvbGVyYW5jZQYJAABmAAAAAgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAKVNsaXBwYWdlIHRvbGVyYW5jZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgCQABpAAAAAEFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyAgAAABYgaW5jbHVzaXZlbHkuIEFjdHVhbDogCQABpAAAAAEFAAAAEXNsaXBwYWdlVG9sZXJhbmNlAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAgkAAAIAAAABAgAAABxUd28gYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkAwMJAABmAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWUzCQAAZQAAAAIFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIFAAAACnRva2VuUmF0aW8GCQAAZgAAAAIFAAAACnRva2VuUmF0aW8JAABpAAAAAgkAAGgAAAACBQAAAAtzY2FsZVZhbHVlMwkAAGQAAAACBQAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyCQAAAgAAAAECAAAAPUluY29ycmVjdCBhc3NldHMgYW1vdW50OiBhbW91bnRzIG11c3QgaGF2ZSB0aGUgY29udHJhY3QgcmF0aW8DAwkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEEFAAAACGFzc2V0SWRBBgkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEIFAAAACGFzc2V0SWRCCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJUluY29ycmVjdCBhc3NldHMgYXR0YWNoZWQuIEV4cGVjdGVkOiAFAAAAC3N0ckFzc2V0SWRBAgAAAAUgYW5kIAUAAAALc3RyQXNzZXRJZEIDCQAAAAAAAAIFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQAAAAAAAAAAAAkAAAIAAAABAgAAAB1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKcG10QW1vdW50QQUAAAALcG10QXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRCBQAAAAtwbXRBc3NldElkQgUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAACQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAMc2hhcmVBc3NldElkBQAAABJzaGFyZUluaXRpYWxTdXBwbHkGCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAAKcG10QW1vdW50QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQUAAAAMc2hhcmVBc3NldElkBQAAAANuaWwEAAAACnRva2VuUmF0aW8JAABrAAAAAwkAAGsAAAADBQAAAAhiYWxhbmNlQQUAAAALc2NhbGVWYWx1ZTgFAAAACnBtdEFtb3VudEEFAAAAC3NjYWxlVmFsdWUzCQAAawAAAAMFAAAACGJhbGFuY2VCBQAAAAtzY2FsZVZhbHVlOAUAAAAKcG10QW1vdW50QgQAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkAAGsAAAADBQAAAApwbXRBbW91bnRBBQAAAAtzY2FsZVZhbHVlOAUAAAAIYmFsYW5jZUEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIJAABrAAAAAwUAAAAKcG10QW1vdW50QgUAAAALc2NhbGVWYWx1ZTgFAAAACGJhbGFuY2VCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAtzY2FsZVZhbHVlOAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBgkAAGYAAAACBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAApU2xpcHBhZ2UgdG9sZXJhbmNlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAJAAGkAAAAAQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXICAAAAFiBpbmNsdXNpdmVseS4gQWN0dWFsOiAJAAGkAAAAAQUAAAARc2xpcHBhZ2VUb2xlcmFuY2UDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAACCQAAAgAAAAECAAAAHFR3byBhdHRhY2hlZCBhc3NldHMgZXhwZWN0ZWQDAwkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEEFAAAACGFzc2V0SWRBBgkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEIFAAAACGFzc2V0SWRCCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJUluY29ycmVjdCBhc3NldHMgYXR0YWNoZWQuIEV4cGVjdGVkOiAFAAAAC3N0ckFzc2V0SWRBAgAAAAUgYW5kIAUAAAALc3RyQXNzZXRJZEIDAwkAAGYAAAACCQAAaQAAAAIJAABoAAAAAgUAAAALc2NhbGVWYWx1ZTMJAABlAAAAAgUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgUAAAAKdG9rZW5SYXRpbwYJAABmAAAAAgUAAAAKdG9rZW5SYXRpbwkAAGkAAAACCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWUzCQAAZAAAAAIFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIJAAACAAAAAQIAAAA9SW5jb3JyZWN0IGFzc2V0cyBhbW91bnQ6IGFtb3VudHMgbXVzdCBoYXZlIHRoZSBjb250cmFjdCByYXRpbwMJAAAAAAAAAgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAAHVRvbyBzbWFsbCBhbW91bnQgdG8gcmVwbGVuaXNoAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRBBQAAAAtwbXRBc3NldElkQQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACnBtdEFtb3VudEIFAAAAC3BtdEFzc2V0SWRCBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAApwbXRBbW91bnRBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQgkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa2V5U2hhcmVBc3NldFN1cHBseQkAAGQAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAAxzaGFyZUFzc2V0SWQFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQFAAAADHNoYXJlQXNzZXRJZAUAAAADbmlsAAAAAWkBAAAACHdpdGhkcmF3AAAAAAQAAAANJHQwMTc3MDgxNzg1OAkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDE3NzA4MTc4NTgAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAxNzcwODE3ODU4AAAAAl8yBAAAAAxhbW91bnRUb1BheUEJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAwkAAGsAAAADBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VBBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAhhc3NldElkQQUAAAAIYXNzZXRJZEIEAAAADGFtb3VudFRvUGF5QgkBAAAAEGRlZHVjdFN0YWtpbmdGZWUAAAADCQAAawAAAAMFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAACGFzc2V0SWRCBQAAAAhhc3NldElkQQMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAxzaGFyZUFzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAACRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAJAAJYAAAAAQUAAAAMc2hhcmVBc3NldElkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMDCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QQUAAAARYXZhaWxhYmxlQmFsYW5jZUEGCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QgUAAAARYXZhaWxhYmxlQmFsYW5jZUIJAQAAACJ0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2VzAAAAAgUAAAAMYW1vdW50VG9QYXlBBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VBCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAAxhbW91bnRUb1BheUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkJAABlAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAJcG10QW1vdW50CQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAAMc2hhcmVBc3NldElkBQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUEFAAAACGFzc2V0SWRBCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAMYW1vdW50VG9QYXlCBQAAAAhhc3NldElkQgUAAAADbmlsAAAAAWkBAAAACGV4Y2hhbmdlAAAAAQAAABJtaW5BbW91bnRUb1JlY2VpdmUEAAAADSR0MDE5MDg0MTkxNTkJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxOTA4NDE5MTU5AAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTkwODQxOTE1OQAAAAJfMgoBAAAADWNhbGN1bGF0ZUZlZXMAAAACAAAACXRva2VuRnJvbQAAAAd0b2tlblRvBAAAABBhbW91bnRXaXRob3V0RmVlCQAAawAAAAMFAAAAB3Rva2VuVG8FAAAACXBtdEFtb3VudAkAAGQAAAACBQAAAAlwbXRBbW91bnQFAAAACXRva2VuRnJvbQQAAAANYW1vdW50V2l0aEZlZQkAAGsAAAADBQAAABBhbW91bnRXaXRob3V0RmVlCQAAZQAAAAIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAKY29tbWlzc2lvbgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyBAAAABBnb3Zlcm5hbmNlUmV3YXJkCQAAawAAAAMFAAAAEGFtb3VudFdpdGhvdXRGZWUFAAAAFGNvbW1pc3Npb25Hb3Zlcm5hbmNlBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIDCQAAZgAAAAIFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAANYW1vdW50V2l0aEZlZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB1DYWxjdWxhdGVkIGFtb3VudCB0byByZWNlaXZlIAkAAaQAAAABBQAAAA1hbW91bnRXaXRoRmVlAgAAACAgaXMgbGVzcyB0aGFuIHNwZWNpZmllZCBtaW5pbXVtIAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUJAAUVAAAAAwUAAAAQYW1vdW50V2l0aG91dEZlZQUAAAANYW1vdW50V2l0aEZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQAAAAAAAAIFAAAACGJhbGFuY2VBAAAAAAAAAAAABgkAAAAAAAACBQAAAAhiYWxhbmNlQgAAAAAAAAAAAAkAAAIAAAABAgAAACBDYW4ndCBleGNoYW5nZSB3aXRoIHplcm8gYmFsYW5jZQMJAABnAAAAAgAAAAAAAAAAAAUAAAASbWluQW1vdW50VG9SZWNlaXZlCQAAAgAAAAEJAAEsAAAAAgIAAAA0TWluaW1hbCBhbW91bnQgdG8gcmVjZWl2ZSBtdXN0IGJlIHBvc2l0aXZlLiBBY3R1YWw6IAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEEAAAAC2Fzc2V0SWRTZW5kBQAAAAhhc3NldElkQgQAAAANJHQwMjA0MzMyMDUyNAkBAAAADWNhbGN1bGF0ZUZlZXMAAAACBQAAAAhiYWxhbmNlQQUAAAAIYmFsYW5jZUIEAAAAEGFtb3VudFdpdGhvdXRGZWUIBQAAAA0kdDAyMDQzMzIwNTI0AAAAAl8xBAAAAA1hbW91bnRXaXRoRmVlCAUAAAANJHQwMjA0MzMyMDUyNAAAAAJfMgQAAAAQZ292ZXJuYW5jZVJld2FyZAgFAAAADSR0MDIwNDMzMjA1MjQAAAACXzMEAAAAC25ld0JhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQEAAAAC25ld0JhbGFuY2VCCQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudFdpdGhGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQDAwkAAGcAAAACBQAAAA1zdGFrZWRBbW91bnRBBQAAAAtuZXdCYWxhbmNlQQYJAABnAAAAAgUAAAANc3Rha2VkQW1vdW50QgUAAAALbmV3QmFsYW5jZUIJAQAAACF0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2UAAAADBQAAAA1hbW91bnRXaXRoRmVlBQAAABFhdmFpbGFibGVCYWxhbmNlQgUAAAAKYXNzZXROYW1lQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQgUAAAALbmV3QmFsYW5jZUIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA1hbW91bnRXaXRoRmVlBQAAAAthc3NldElkU2VuZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA13YWxsZXRBZGRyZXNzBQAAABBnb3Zlcm5hbmNlUmV3YXJkBQAAAAthc3NldElkU2VuZAUAAAADbmlsAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQgQAAAALYXNzZXRJZFNlbmQFAAAACGFzc2V0SWRBBAAAAA0kdDAyMTM0MzIxNDM0CQEAAAANY2FsY3VsYXRlRmVlcwAAAAIFAAAACGJhbGFuY2VCBQAAAAhiYWxhbmNlQQQAAAAQYW1vdW50V2l0aG91dEZlZQgFAAAADSR0MDIxMzQzMjE0MzQAAAACXzEEAAAADWFtb3VudFdpdGhGZWUIBQAAAA0kdDAyMTM0MzIxNDM0AAAAAl8yBAAAABBnb3Zlcm5hbmNlUmV3YXJkCAUAAAANJHQwMjEzNDMyMTQzNAAAAAJfMwQAAAALbmV3QmFsYW5jZUEJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAANYW1vdW50V2l0aEZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAQAAAALbmV3QmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAMDCQAAZwAAAAIFAAAADXN0YWtlZEFtb3VudEEFAAAAC25ld0JhbGFuY2VBBgkAAGcAAAACBQAAAA1zdGFrZWRBbW91bnRCBQAAAAtuZXdCYWxhbmNlQgkBAAAAIXRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZQAAAAMFAAAADWFtb3VudFdpdGhGZWUFAAAAEWF2YWlsYWJsZUJhbGFuY2VBBQAAAAphc3NldE5hbWVBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADWFtb3VudFdpdGhGZWUFAAAAC2Fzc2V0SWRTZW5kCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAADXdhbGxldEFkZHJlc3MFAAAAEGdvdmVybmFuY2VSZXdhcmQFAAAAC2Fzc2V0SWRTZW5kBQAAAANuaWwJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAkSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkLiBFeHBlY3RlZDogBQAAAAtzdHJBc3NldElkQQIAAAAEIG9yIAUAAAALc3RyQXNzZXRJZEIAAAABaQEAAAAIc2h1dGRvd24AAAAAAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABCQABLAAAAAICAAAAIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAIa2V5Q2F1c2UCAAAAGnRoZSBjYXVzZSB3YXNuJ3Qgc3BlY2lmaWVkAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABRhZG1pblB1YktleVN0YXJ0U3RvcAUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCQEAAAAHc3VzcGVuZAAAAAECAAAAD1BhdXNlZCBieSBhZG1pbgAAAAFpAQAAAAhhY3RpdmF0ZQAAAAADBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAABZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABRhZG1pblB1YktleVN0YXJ0U3RvcAUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAlrZXlBY3RpdmUGCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAACGtleUNhdXNlBQAAAANuaWwAAAABaQEAAAAZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwAAAAEAAAALYW1vdW50TGVhdmUEAAAAHXVuY291bnRhYmxlQW1vdW50RW5yb2xsQXNzZXRBCQAAZQAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEFAAAACGJhbGFuY2VBBAAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QgkAAGUAAAACBQAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCBQAAAAhiYWxhbmNlQgQAAAANYW1vdW50RW5yb2xsQQkAAGUAAAACBQAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QQMJAAAAAAAAAgUAAAAIYXNzZXRJZEEFAAAABHVuaXQFAAAAC2Ftb3VudExlYXZlAAAAAAAAAAAABAAAAA1hbW91bnRFbnJvbGxCCQAAZQAAAAIFAAAAHXVuY291bnRhYmxlQW1vdW50RW5yb2xsQXNzZXRCAwkAAAAAAAACBQAAAAhhc3NldElkQgUAAAAEdW5pdAUAAAALYW1vdW50TGVhdmUAAAAAAAAAAAADCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAArT25seSB0aGUgREFwcCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAABmAAAAAgAAAAAAAAAAAAUAAAALYW1vdW50TGVhdmUJAAACAAAAAQkAASwAAAACAgAAADNBcmd1bWVudCAnYW1vdW50TGVhdmUnIGNhbm5vdCBiZSBuZWdhdGl2ZS4gQWN0dWFsOiAJAAGkAAAAAQUAAAALYW1vdW50TGVhdmUDAwkAAGYAAAACAAAAAAAAAAAABQAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QQYJAABmAAAAAgAAAAAAAAAAAAUAAAAddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEIJAQAAAAdzdXNwZW5kAAAAAQIAAAAWRW5yb2xsIGFtb3VudCBuZWdhdGl2ZQMDCQAAZgAAAAIAAAAAAAAAAAAFAAAADWFtb3VudEVucm9sbEEGCQAAZgAAAAIAAAAAAAAAAAAFAAAADWFtb3VudEVucm9sbEIJAAACAAAAAQIAAAAVVG9vIGxhcmdlIGFtb3VudExlYXZlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAANYW1vdW50RW5yb2xsQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudEVucm9sbEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgIAAAAMbGFzdF9pbmNvbWVfBQAAAAtzdHJBc3NldElkQQUAAAANYW1vdW50RW5yb2xsQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACAgAAAAxsYXN0X2luY29tZV8FAAAAC3N0ckFzc2V0SWRCBQAAAA1hbW91bnRFbnJvbGxCBQAAAANuaWwAAAABaQEAAAASZW5hYmxlRmlyc3RIYXJ2ZXN0AAAAAAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAPa2V5Rmlyc3RIYXJ2ZXN0BgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAVa2V5Rmlyc3RIYXJ2ZXN0SGVpZ2h0CQAAZAAAAAIFAAAAC3N0YXJ0SGVpZ2h0CQAAaAAAAAIFAAAAFWZpcnN0SGFydmVzdEVuZFBlcmlvZAUAAAAMcGVyaW9kTGVuZ3RoBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJp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", "height": 1660965, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2eoK9GQgWW5K2imh8paCwLr9nMsCQKbtXd2rCrUEzMBH Next: FFi95nbRcZwVM8XqpTEEH7LamNAcxB9t3H9NCff4ni6R Diff:
OldNewDifferences
3333
3434 let keyFirstHarvestHeight = "first_harvest_height"
3535
36-let kShareLimit = "share_limit_on_first_harvest"
36+let keyShareLimit = "share_limit_on_first_harvest"
3737
38-let kBasePeriod = "base_period"
38+let keyBasePeriod = "base_period"
3939
40-let kPeriodLength = "period_length"
40+let keyPeriodLength = "period_length"
4141
42-let kStartHeight = "start_height"
43-
44-let kFirstHarvestHeight = "first_harvest_height"
42+let keyStartHeight = "start_height"
4543
4644 let keyOracleAssetPriority = "asset_priority_"
4745
9997
10098 let stakingFeeInEURN = 234000
10199
102-let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
100+let basePeriod = valueOrErrorMessage(getInteger(votingAddress, keyBasePeriod), "Empty keyBasePeriod")
103101
104-let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
102+let startHeight = valueOrErrorMessage(getInteger(votingAddress, keyStartHeight), "Empty keyStartHeight")
105103
106-let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
104+let periodLength = valueOrErrorMessage(getInteger(votingAddress, keyPeriodLength), "Empty keyPeriodLength")
107105
108-let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
106+let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 1)
109107
110108 let isActive = getBooleanValue(this, keyActive)
111109
294292
295293
296294 @Callable(i)
297-func init (userAdress) = {
298- let $t083878464 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
299- let pmtAmount1 = $t083878464._1
300- let pmtAssetId1 = $t083878464._2
301- let $t084698546 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
302- let pmtAmount2 = $t084698546._1
303- let pmtAssetId2 = $t084698546._2
304- let $t085518634 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
305- let pmtAmountSWOP = $t085518634._1
306- let pmtAssetIdSWOP = $t085518634._2
295+func init (userAdressStr) = {
296+ let $t083608437 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
297+ let pmtAmount1 = $t083608437._1
298+ let pmtAssetId1 = $t083608437._2
299+ let $t084428519 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
300+ let pmtAmount2 = $t084428519._1
301+ let pmtAssetId2 = $t084428519._2
302+ let $t085248607 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
303+ let pmtAmountSWOP = $t085248607._1
304+ let pmtAssetIdSWOP = $t085248607._2
307305 let check = isDataStorageUntouched(this)
308306 let userScriptHash = scriptHash(this)
307+ let userAddress = addressFromStringValue(userAdressStr)
309308 if ((i.caller == this))
310309 then throw("You can't call yourself")
311310 else if (if ((pmtAssetIdSWOP != SWOP))
341340 case _ =>
342341 throw("Match error")
343342 }
344- let asset1Priority = valueOrElse(getInteger(oracle, ("keyOracleAssetPriority" + pmtStrAssetId1)), 999999)
345- let asset2Priority = valueOrElse(getInteger(oracle, ("keyOracleAssetPriority" + pmtStrAssetId2)), 999999)
346- let $t0993310160 = if ((asset2Priority > asset1Priority))
343+ let asset1Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId1)), 999999)
344+ let asset2Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId2)), 999999)
345+ let $t0996210189 = if ((asset2Priority > asset1Priority))
347346 then $Tuple4(pmtAmount2, pmtAssetId2, pmtAmount1, pmtAssetId1)
348347 else $Tuple4(pmtAmount1, pmtAssetId1, pmtAmount2, pmtAssetId2)
349- let pmtAmountA = $t0993310160._1
350- let pmtAssetIdA = $t0993310160._2
351- let pmtAmountB = $t0993310160._3
352- let pmtAssetIdB = $t0993310160._4
353- let $t01016910246 = getAssetInfo(pmtAssetIdA)
354- let pmtStrAssetIdA = $t01016910246._1
355- let pmtAssetNameA = $t01016910246._2
356- let pmtDecimalsA = $t01016910246._3
357- let $t01025510332 = getAssetInfo(pmtAssetIdB)
358- let pmtStrAssetIdB = $t01025510332._1
359- let pmtAssetNameB = $t01025510332._2
360- let pmtDecimalsB = $t01025510332._3
348+ let pmtAmountA = $t0996210189._1
349+ let pmtAssetIdA = $t0996210189._2
350+ let pmtAmountB = $t0996210189._3
351+ let pmtAssetIdB = $t0996210189._4
352+ let $t01019810275 = getAssetInfo(pmtAssetIdA)
353+ let pmtStrAssetIdA = $t01019810275._1
354+ let pmtAssetNameA = $t01019810275._2
355+ let pmtDecimalsA = $t01019810275._3
356+ let $t01028410361 = getAssetInfo(pmtAssetIdB)
357+ let pmtStrAssetIdB = $t01028410361._1
358+ let pmtAssetNameB = $t01028410361._2
359+ let pmtDecimalsB = $t01028410361._3
361360 let addPool = invoke(oracle, "addPool", [this, ((pmtAssetNameA + "_") + pmtAssetNameB)], nil)
362361 if ((addPool == addPool))
363362 then if (!(isDefined(getString(oracle, ("pool_" + toString(this))))))
372371 let shareInitialSupply = fraction(arg1, arg2, arg3)
373372 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
374373 let shareIssueId = calculateAssetId(shareIssue)
375- 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(walletAddress, shareInitialSupply, shareIssueId), ScriptTransfer(i.caller, comissionForInitalization, SWOP)]
374+ 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)]
376375 baseEntry
377376 }
378377 else throw("Strict value is not equal to itself.")
386385 then throw("DApp is inactive at this moment")
387386 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
388387 then throw("Only admin can call this function")
389- else [IntegerEntry(kShareLimit, shareLimit)]
388+ else [IntegerEntry(keyShareLimit, shareLimit)]
390389
391390
392391
400399 then (balanceB == 0)
401400 else false)
402401 then {
403- let $t01312013197 = getAssetInfo(pmtAssetIdA)
404- let pmtStrAssetIdA = $t01312013197._1
405- let pmtAssetNameA = $t01312013197._2
406- let pmtDecimalsA = $t01312013197._3
407- let $t01320613283 = getAssetInfo(pmtAssetIdB)
408- let pmtStrAssetIdB = $t01320613283._1
409- let pmtAssetNameB = $t01320613283._2
410- let pmtDecimalsB = $t01320613283._3
402+ let $t01314613223 = getAssetInfo(pmtAssetIdA)
403+ let pmtStrAssetIdA = $t01314613223._1
404+ let pmtAssetNameA = $t01314613223._2
405+ let pmtDecimalsA = $t01314613223._3
406+ let $t01323213309 = getAssetInfo(pmtAssetIdB)
407+ let pmtStrAssetIdB = $t01323213309._1
408+ let pmtAssetNameB = $t01323213309._2
409+ let pmtDecimalsB = $t01323213309._3
411410 let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
412411 if ((pmtAssetIdA == pmtAssetIdB))
413412 then throw("Assets must be different")
470469
471470 @Callable(i)
472471 func withdraw () = {
473- let $t01768217832 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474- let pmtAmount = $t01768217832._1
475- let pmtAssetId = $t01768217832._2
472+ let $t01770817858 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
473+ let pmtAmount = $t01770817858._1
474+ let pmtAssetId = $t01770817858._2
476475 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA, assetIdB)
477476 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB, assetIdA)
478477 if (!(isActive))
494493
495494 @Callable(i)
496495 func exchange (minAmountToReceive) = {
497- let $t01905819133 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
498- let pmtAmount = $t01905819133._1
499- let pmtAssetId = $t01905819133._2
496+ let $t01908419159 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
497+ let pmtAmount = $t01908419159._1
498+ let pmtAssetId = $t01908419159._2
500499 func calculateFees (tokenFrom,tokenTo) = {
501500 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
502501 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
521520 else if ((pmtAssetId == assetIdA))
522521 then {
523522 let assetIdSend = assetIdB
524- let $t02040720498 = calculateFees(balanceA, balanceB)
525- let amountWithoutFee = $t02040720498._1
526- let amountWithFee = $t02040720498._2
527- let governanceReward = $t02040720498._3
523+ let $t02043320524 = calculateFees(balanceA, balanceB)
524+ let amountWithoutFee = $t02043320524._1
525+ let amountWithFee = $t02043320524._2
526+ let governanceReward = $t02043320524._3
528527 let newBalanceA = (balanceA + pmtAmount)
529528 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
530529 if (if ((stakedAmountA >= newBalanceA))
536535 else if ((pmtAssetId == assetIdB))
537536 then {
538537 let assetIdSend = assetIdA
539- let $t02131721408 = calculateFees(balanceB, balanceA)
540- let amountWithoutFee = $t02131721408._1
541- let amountWithFee = $t02131721408._2
542- let governanceReward = $t02131721408._3
538+ let $t02134321434 = calculateFees(balanceB, balanceA)
539+ let amountWithoutFee = $t02134321434._1
540+ let amountWithFee = $t02134321434._2
541+ let governanceReward = $t02134321434._3
543542 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
544543 let newBalanceB = (balanceB + pmtAmount)
545544 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
36-let kShareLimit = "share_limit_on_first_harvest"
36+let keyShareLimit = "share_limit_on_first_harvest"
3737
38-let kBasePeriod = "base_period"
38+let keyBasePeriod = "base_period"
3939
40-let kPeriodLength = "period_length"
40+let keyPeriodLength = "period_length"
4141
42-let kStartHeight = "start_height"
43-
44-let kFirstHarvestHeight = "first_harvest_height"
42+let keyStartHeight = "start_height"
4543
4644 let keyOracleAssetPriority = "asset_priority_"
4745
4846 let keyOracleScriptHash = "script_hash_cpmm"
4947
5048 let keyInitPoolHeight = "init_pool_height_"
5149
5250 let keyAdminPubKey1 = "admin_pub_1"
5351
5452 let keyAdminPubKey2 = "admin_pub_2"
5553
5654 let keyAdminPubKey3 = "admin_pub_3"
5755
5856 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
5957
6058 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
6159 case string: String =>
6260 fromBase58String(string)
6361 case nothing =>
6462 throw("Admin public key is empty")
6563 }
6664
6765
6866 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
6967
7068 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
7169
7270 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
7371
7472 let adminPubKeyStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7573
7674 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7775
7876 let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
7977
8078 let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
8179
8280 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
8381
8482 let NSBT = base58'36mg8NZTaFRDygiVwb8uBnLR51hetJruUCZcxhaVcHj9'
8583
8684 let SWOP = base58'2HAJrwa8q4SxBx9cHYaBTQdBjdk5wwqdof7ccpAx2uhZ'
8785
8886 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
8987
9088 let stakingUSDNNSBTAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
9189
9290 let stakingEURNAddress = Address(base58'3MyVqAbmKWh339gF6hy8faWw1jGeTV2wnGE')
9391
9492 let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
9593
9694 let USDNToNSBTExchanger = Address(base58'3Mye9wVR7d2mc6Y5ZJTu11svzgUQ7o8H9dA')
9795
9896 let stakingFeeInUSDN = 270000
9997
10098 let stakingFeeInEURN = 234000
10199
102-let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
100+let basePeriod = valueOrErrorMessage(getInteger(votingAddress, keyBasePeriod), "Empty keyBasePeriod")
103101
104-let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
102+let startHeight = valueOrErrorMessage(getInteger(votingAddress, keyStartHeight), "Empty keyStartHeight")
105103
106-let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
104+let periodLength = valueOrErrorMessage(getInteger(votingAddress, keyPeriodLength), "Empty keyPeriodLength")
107105
108-let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
106+let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 1)
109107
110108 let isActive = getBooleanValue(this, keyActive)
111109
112110 let strAssetIdA = getStringValue(this, keyAssetIdA)
113111
114112 let strAssetIdB = getStringValue(this, keyAssetIdB)
115113
116114 let assetIdA = if ((strAssetIdA == "WAVES"))
117115 then unit
118116 else fromBase58String(strAssetIdA)
119117
120118 let assetIdB = if ((strAssetIdB == "WAVES"))
121119 then unit
122120 else fromBase58String(strAssetIdB)
123121
124122 let assetNameA = match assetIdA {
125123 case id: ByteVector =>
126124 value(assetInfo(id)).name
127125 case waves: Unit =>
128126 "WAVES"
129127 case _ =>
130128 throw("Match error")
131129 }
132130
133131 let assetNameB = match assetIdB {
134132 case id: ByteVector =>
135133 value(assetInfo(id)).name
136134 case waves: Unit =>
137135 "WAVES"
138136 case _ =>
139137 throw("Match error")
140138 }
141139
142140 let balanceA = getIntegerValue(this, keyBalanceA)
143141
144142 let balanceB = getIntegerValue(this, keyBalanceB)
145143
146144 let shareAssetId = fromBase58String(getStringValue(this, keyShareAssetId))
147145
148146 let shareAssetSupply = getIntegerValue(this, keyShareAssetSupply)
149147
150148 let commission = 3000
151149
152150 let commissionGovernance = 1200
153151
154152 let commissionScaleDelimiter = 1000000
155153
156154 let scaleValue3 = 1000
157155
158156 let scaleValue8 = 100000000
159157
160158 let slippageToleranceDelimiter = 1000
161159
162160 let scaleValue8Digits = 8
163161
164162 let comissionForInitalization = 1000000000
165163
166164 func accountBalance (assetId) = match assetId {
167165 case id: ByteVector =>
168166 assetBalance(this, id)
169167 case waves: Unit =>
170168 wavesBalance(this).available
171169 case _ =>
172170 throw("Match error")
173171 }
174172
175173
176174 func stakedAmount (assetId) = {
177175 let stakedAmountCalculated = match assetId {
178176 case aId: ByteVector =>
179177 if (if ((aId == USDN))
180178 then true
181179 else (aId == NSBT))
182180 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
183181 else if ((aId == EURN))
184182 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
185183 else 0
186184 case _: Unit =>
187185 0
188186 case _ =>
189187 throw("Match error")
190188 }
191189 match stakedAmountCalculated {
192190 case i: Int =>
193191 i
194192 case _ =>
195193 0
196194 }
197195 }
198196
199197
200198 func isAllowedAsset (assetId) = match assetId {
201199 case id: ByteVector =>
202200 if (if ((id == USDN))
203201 then true
204202 else (id == SWOP))
205203 then true
206204 else false
207205 case waves: Unit =>
208206 true
209207 case _ =>
210208 throw("Match error")
211209 }
212210
213211
214212 let stakedAmountA = stakedAmount(assetIdA)
215213
216214 let stakedAmountB = stakedAmount(assetIdB)
217215
218216 let assetInitA = getIntegerValue(this, keyBalanceInitA)
219217
220218 let assetInitB = getIntegerValue(this, keyBalanceInitB)
221219
222220 let availableBalanceA = (balanceA - stakedAmountA)
223221
224222 let availableBalanceB = (balanceB - stakedAmountB)
225223
226224 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
227225
228226 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
229227
230228 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
231229 then (accountBalanceWithStakedB >= balanceB)
232230 else false
233231
234232 func getAssetInfo (assetId) = match assetId {
235233 case id: ByteVector =>
236234 let stringId = toBase58String(id)
237235 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
238236 $Tuple3(stringId, info.name, info.decimals)
239237 case waves: Unit =>
240238 $Tuple3("WAVES", "WAVES", 8)
241239 case _ =>
242240 throw("Match error")
243241 }
244242
245243
246244 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
247245 then $Tuple3("WAVES", "WAVES", 8)
248246 else {
249247 let stringId = assetStr
250248 let id = fromBase58String(assetStr)
251249 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
252250 $Tuple3(stringId, info.name, info.decimals)
253251 }
254252
255253
256254 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
257255
258256
259257 func deductStakingFee (amount,assetId,secondAssetId) = if (if ((assetId == USDN))
260258 then true
261259 else (assetId == EURN))
262260 then {
263261 let stakinFee = if ((assetId == USDN))
264262 then (stakingFeeInUSDN * (if ((secondAssetId == NSBT))
265263 then 2
266264 else 1))
267265 else if ((assetId == EURN))
268266 then stakingFeeInEURN
269267 else 0
270268 let result = (amount - stakinFee)
271269 if ((0 >= result))
272270 then throw((((("Insufficient amount " + toString(amount)) + " to deduct staking fee ") + toString(stakinFee)) + "USDN/EURN"))
273271 else result
274272 }
275273 else amount
276274
277275
278276 func getStakingFee (assetId,secondAssetId) = if ((assetId == USDN))
279277 then (stakingFeeInUSDN * (if ((secondAssetId == NSBT))
280278 then 2
281279 else 1))
282280 else if ((assetId == EURN))
283281 then stakingFeeInEURN
284282 else 0
285283
286284
287285 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"))
288286
289287
290288 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"))
291289
292290
293291 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
294292
295293
296294 @Callable(i)
297-func init (userAdress) = {
298- let $t083878464 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
299- let pmtAmount1 = $t083878464._1
300- let pmtAssetId1 = $t083878464._2
301- let $t084698546 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
302- let pmtAmount2 = $t084698546._1
303- let pmtAssetId2 = $t084698546._2
304- let $t085518634 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
305- let pmtAmountSWOP = $t085518634._1
306- let pmtAssetIdSWOP = $t085518634._2
295+func init (userAdressStr) = {
296+ let $t083608437 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
297+ let pmtAmount1 = $t083608437._1
298+ let pmtAssetId1 = $t083608437._2
299+ let $t084428519 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
300+ let pmtAmount2 = $t084428519._1
301+ let pmtAssetId2 = $t084428519._2
302+ let $t085248607 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
303+ let pmtAmountSWOP = $t085248607._1
304+ let pmtAssetIdSWOP = $t085248607._2
307305 let check = isDataStorageUntouched(this)
308306 let userScriptHash = scriptHash(this)
307+ let userAddress = addressFromStringValue(userAdressStr)
309308 if ((i.caller == this))
310309 then throw("You can't call yourself")
311310 else if (if ((pmtAssetIdSWOP != SWOP))
312311 then true
313312 else (pmtAmountSWOP != comissionForInitalization))
314313 then throw("You need to attach 10 SWOP tokens")
315314 else if (if (!(isAllowedAsset(pmtAssetId1)))
316315 then !(isAllowedAsset(pmtAssetId2))
317316 else false)
318317 then throw("One of assets must be USDN, WAVES or SWOP")
319318 else if (if ((userScriptHash == value(getBinary(oracle, keyOracleScriptHash))))
320319 then true
321320 else !(check))
322321 then throw("Unexpected script was found.")
323322 else if (isDefined(getBoolean(this, keyActive)))
324323 then throw("DApp is already active")
325324 else if ((pmtAssetId1 == pmtAssetId2))
326325 then throw("Assets must be different")
327326 else {
328327 let pmtStrAssetId1 = match pmtAssetId1 {
329328 case id: ByteVector =>
330329 toBase58String(id)
331330 case waves: Unit =>
332331 "WAVES"
333332 case _ =>
334333 throw("Match error")
335334 }
336335 let pmtStrAssetId2 = match pmtAssetId2 {
337336 case id: ByteVector =>
338337 toBase58String(id)
339338 case waves: Unit =>
340339 "WAVES"
341340 case _ =>
342341 throw("Match error")
343342 }
344- let asset1Priority = valueOrElse(getInteger(oracle, ("keyOracleAssetPriority" + pmtStrAssetId1)), 999999)
345- let asset2Priority = valueOrElse(getInteger(oracle, ("keyOracleAssetPriority" + pmtStrAssetId2)), 999999)
346- let $t0993310160 = if ((asset2Priority > asset1Priority))
343+ let asset1Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId1)), 999999)
344+ let asset2Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId2)), 999999)
345+ let $t0996210189 = if ((asset2Priority > asset1Priority))
347346 then $Tuple4(pmtAmount2, pmtAssetId2, pmtAmount1, pmtAssetId1)
348347 else $Tuple4(pmtAmount1, pmtAssetId1, pmtAmount2, pmtAssetId2)
349- let pmtAmountA = $t0993310160._1
350- let pmtAssetIdA = $t0993310160._2
351- let pmtAmountB = $t0993310160._3
352- let pmtAssetIdB = $t0993310160._4
353- let $t01016910246 = getAssetInfo(pmtAssetIdA)
354- let pmtStrAssetIdA = $t01016910246._1
355- let pmtAssetNameA = $t01016910246._2
356- let pmtDecimalsA = $t01016910246._3
357- let $t01025510332 = getAssetInfo(pmtAssetIdB)
358- let pmtStrAssetIdB = $t01025510332._1
359- let pmtAssetNameB = $t01025510332._2
360- let pmtDecimalsB = $t01025510332._3
348+ let pmtAmountA = $t0996210189._1
349+ let pmtAssetIdA = $t0996210189._2
350+ let pmtAmountB = $t0996210189._3
351+ let pmtAssetIdB = $t0996210189._4
352+ let $t01019810275 = getAssetInfo(pmtAssetIdA)
353+ let pmtStrAssetIdA = $t01019810275._1
354+ let pmtAssetNameA = $t01019810275._2
355+ let pmtDecimalsA = $t01019810275._3
356+ let $t01028410361 = getAssetInfo(pmtAssetIdB)
357+ let pmtStrAssetIdB = $t01028410361._1
358+ let pmtAssetNameB = $t01028410361._2
359+ let pmtDecimalsB = $t01028410361._3
361360 let addPool = invoke(oracle, "addPool", [this, ((pmtAssetNameA + "_") + pmtAssetNameB)], nil)
362361 if ((addPool == addPool))
363362 then if (!(isDefined(getString(oracle, ("pool_" + toString(this))))))
364363 then throw("Pool is not added")
365364 else {
366365 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
367366 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
368367 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
369368 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
370369 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
371370 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
372371 let shareInitialSupply = fraction(arg1, arg2, arg3)
373372 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
374373 let shareIssueId = calculateAssetId(shareIssue)
375- 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(walletAddress, shareInitialSupply, shareIssueId), ScriptTransfer(i.caller, comissionForInitalization, SWOP)]
374+ 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)]
376375 baseEntry
377376 }
378377 else throw("Strict value is not equal to itself.")
379378 }
380379 }
381380
382381
383382
384383 @Callable(i)
385384 func keepLimitForFirstHarvest (shareLimit) = if (!(isActive))
386385 then throw("DApp is inactive at this moment")
387386 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
388387 then throw("Only admin can call this function")
389- else [IntegerEntry(kShareLimit, shareLimit)]
388+ else [IntegerEntry(keyShareLimit, shareLimit)]
390389
391390
392391
393392 @Callable(i)
394393 func replenishWithTwoTokens (slippageTolerance) = {
395394 let pmtAssetIdA = i.payments[0].assetId
396395 let pmtAssetIdB = i.payments[1].assetId
397396 let pmtAmountA = deductStakingFee(i.payments[0].amount, pmtAssetIdA, pmtAssetIdB)
398397 let pmtAmountB = deductStakingFee(i.payments[1].amount, pmtAssetIdB, pmtAssetIdA)
399398 if (if ((balanceA == 0))
400399 then (balanceB == 0)
401400 else false)
402401 then {
403- let $t01312013197 = getAssetInfo(pmtAssetIdA)
404- let pmtStrAssetIdA = $t01312013197._1
405- let pmtAssetNameA = $t01312013197._2
406- let pmtDecimalsA = $t01312013197._3
407- let $t01320613283 = getAssetInfo(pmtAssetIdB)
408- let pmtStrAssetIdB = $t01320613283._1
409- let pmtAssetNameB = $t01320613283._2
410- let pmtDecimalsB = $t01320613283._3
402+ let $t01314613223 = getAssetInfo(pmtAssetIdA)
403+ let pmtStrAssetIdA = $t01314613223._1
404+ let pmtAssetNameA = $t01314613223._2
405+ let pmtDecimalsA = $t01314613223._3
406+ let $t01323213309 = getAssetInfo(pmtAssetIdB)
407+ let pmtStrAssetIdB = $t01323213309._1
408+ let pmtAssetNameB = $t01323213309._2
409+ let pmtDecimalsB = $t01323213309._3
411410 let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
412411 if ((pmtAssetIdA == pmtAssetIdB))
413412 then throw("Assets must be different")
414413 else {
415414 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
416415 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
417416 if (!(isActive))
418417 then throw("DApp is inactive at this moment")
419418 else if (if ((0 > slippageTolerance))
420419 then true
421420 else (slippageTolerance > slippageToleranceDelimiter))
422421 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
423422 else if ((size(i.payments) != 2))
424423 then throw("Two attached assets expected")
425424 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
426425 then true
427426 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
428427 then throw("Incorrect assets amount: amounts must have the contract ratio")
429428 else if (if ((pmtAssetIdA != assetIdA))
430429 then true
431430 else (pmtAssetIdB != assetIdB))
432431 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
433432 else if ((shareInitialSupply == 0))
434433 then throw("Too small amount to replenish")
435434 else if (!(hasEnoughBalance))
436435 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
437436 else [Reissue(shareAssetId, shareInitialSupply, true), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareAssetId)]
438437 }
439438 }
440439 else {
441440 let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
442441 let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
443442 let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
444443 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
445444 if (!(isActive))
446445 then throw("DApp is inactive at this moment")
447446 else if (if ((0 > slippageTolerance))
448447 then true
449448 else (slippageTolerance > slippageToleranceDelimiter))
450449 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
451450 else if ((size(i.payments) != 2))
452451 then throw("Two attached assets expected")
453452 else if (if ((pmtAssetIdA != assetIdA))
454453 then true
455454 else (pmtAssetIdB != assetIdB))
456455 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
457456 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
458457 then true
459458 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
460459 then throw("Incorrect assets amount: amounts must have the contract ratio")
461460 else if ((shareTokenToPayAmount == 0))
462461 then throw("Too small amount to replenish")
463462 else if (!(hasEnoughBalance))
464463 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
465464 else [IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
466465 }
467466 }
468467
469468
470469
471470 @Callable(i)
472471 func withdraw () = {
473- let $t01768217832 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474- let pmtAmount = $t01768217832._1
475- let pmtAssetId = $t01768217832._2
472+ let $t01770817858 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
473+ let pmtAmount = $t01770817858._1
474+ let pmtAssetId = $t01770817858._2
476475 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA, assetIdB)
477476 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB, assetIdA)
478477 if (!(isActive))
479478 then throw("DApp is inactive at this moment")
480479 else if ((size(i.payments) != 1))
481480 then throw("One attached payment expected")
482481 else if ((pmtAssetId != shareAssetId))
483482 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
484483 else if (!(hasEnoughBalance))
485484 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
486485 else if (if ((amountToPayA > availableBalanceA))
487486 then true
488487 else (amountToPayB > availableBalanceB))
489488 then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
490489 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)]
491490 }
492491
493492
494493
495494 @Callable(i)
496495 func exchange (minAmountToReceive) = {
497- let $t01905819133 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
498- let pmtAmount = $t01905819133._1
499- let pmtAssetId = $t01905819133._2
496+ let $t01908419159 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
497+ let pmtAmount = $t01908419159._1
498+ let pmtAssetId = $t01908419159._2
500499 func calculateFees (tokenFrom,tokenTo) = {
501500 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
502501 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
503502 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
504503 if ((minAmountToReceive > amountWithFee))
505504 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
506505 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
507506 }
508507
509508 if (!(isActive))
510509 then throw("DApp is inactive at this moment")
511510 else if (if ((balanceA == 0))
512511 then true
513512 else (balanceB == 0))
514513 then throw("Can't exchange with zero balance")
515514 else if ((0 >= minAmountToReceive))
516515 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
517516 else if ((size(i.payments) != 1))
518517 then throw("One attached payment expected")
519518 else if (!(hasEnoughBalance))
520519 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
521520 else if ((pmtAssetId == assetIdA))
522521 then {
523522 let assetIdSend = assetIdB
524- let $t02040720498 = calculateFees(balanceA, balanceB)
525- let amountWithoutFee = $t02040720498._1
526- let amountWithFee = $t02040720498._2
527- let governanceReward = $t02040720498._3
523+ let $t02043320524 = calculateFees(balanceA, balanceB)
524+ let amountWithoutFee = $t02043320524._1
525+ let amountWithFee = $t02043320524._2
526+ let governanceReward = $t02043320524._3
528527 let newBalanceA = (balanceA + pmtAmount)
529528 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
530529 if (if ((stakedAmountA >= newBalanceA))
531530 then true
532531 else (stakedAmountB >= newBalanceB))
533532 then throwInsufficientAvailableBalance(amountWithFee, availableBalanceB, assetNameB)
534533 else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
535534 }
536535 else if ((pmtAssetId == assetIdB))
537536 then {
538537 let assetIdSend = assetIdA
539- let $t02131721408 = calculateFees(balanceB, balanceA)
540- let amountWithoutFee = $t02131721408._1
541- let amountWithFee = $t02131721408._2
542- let governanceReward = $t02131721408._3
538+ let $t02134321434 = calculateFees(balanceB, balanceA)
539+ let amountWithoutFee = $t02134321434._1
540+ let amountWithFee = $t02134321434._2
541+ let governanceReward = $t02134321434._3
543542 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
544543 let newBalanceB = (balanceB + pmtAmount)
545544 if (if ((stakedAmountA >= newBalanceA))
546545 then true
547546 else (stakedAmountB >= newBalanceB))
548547 then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
549548 else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
550549 }
551550 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
552551 }
553552
554553
555554
556555 @Callable(i)
557556 func shutdown () = if (!(isActive))
558557 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
559558 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
560559 then throw("Only admin can call this function")
561560 else suspend("Paused by admin")
562561
563562
564563
565564 @Callable(i)
566565 func activate () = if (isActive)
567566 then throw("DApp is already active")
568567 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
569568 then throw("Only admin can call this function")
570569 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
571570
572571
573572
574573 @Callable(i)
575574 func takeIntoAccountExtraFunds (amountLeave) = {
576575 let uncountableAmountEnrollAssetA = (accountBalanceWithStakedA - balanceA)
577576 let uncountableAmountEnrollAssetB = (accountBalanceWithStakedB - balanceB)
578577 let amountEnrollA = (uncountableAmountEnrollAssetA - (if ((assetIdA == unit))
579578 then amountLeave
580579 else 0))
581580 let amountEnrollB = (uncountableAmountEnrollAssetB - (if ((assetIdB == unit))
582581 then amountLeave
583582 else 0))
584583 if (!(isActive))
585584 then throw("DApp is inactive at this moment")
586585 else if ((i.caller != this))
587586 then throw("Only the DApp itself can call this function")
588587 else if ((0 > amountLeave))
589588 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
590589 else if (if ((0 > uncountableAmountEnrollAssetA))
591590 then true
592591 else (0 > uncountableAmountEnrollAssetB))
593592 then suspend("Enroll amount negative")
594593 else if (if ((0 > amountEnrollA))
595594 then true
596595 else (0 > amountEnrollB))
597596 then throw("Too large amountLeave")
598597 else [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
599598 }
600599
601600
602601
603602 @Callable(i)
604603 func enableFirstHarvest () = [BooleanEntry(keyFirstHarvest, true), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]
605604
606605
607606 @Verifier(tx)
608607 func verify () = {
609608 let multiSignedByAdmins = {
610609 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
611610 then 1
612611 else 0
613612 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
614613 then 1
615614 else 0
616615 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
617616 then 1
618617 else 0
619618 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
620619 }
621620 match tx {
622621 case inv: InvokeScriptTransaction =>
623622 let callTakeIntoAccount = if ((inv.dApp == this))
624623 then (inv.function == "takeIntoAccountExtraFunds")
625624 else false
626625 let callEnableFirstHarvest = if ((inv.dApp == this))
627626 then (inv.function == "enableFirstHarvest")
628627 else false
629628 let callStaking = if (if ((inv.dApp == stakingUSDNNSBTAddress))
630629 then if (if (if ((inv.function == "lockNeutrino"))
631630 then (size(inv.payments) == 1)
632631 else false)
633632 then if ((inv.payments[0].assetId == USDN))
634633 then true
635634 else (inv.payments[0].assetId == NSBT)
636635 else false)
637636 then true
638637 else if ((inv.function == "unlockNeutrino"))
639638 then (size(inv.payments) == 0)
640639 else false
641640 else false)
642641 then true
643642 else if ((inv.dApp == stakingEURNAddress))
644643 then if (if (if ((inv.function == "startStaking"))
645644 then (size(inv.payments) == 1)
646645 else false)
647646 then (inv.payments[0].assetId == EURN)
648647 else false)
649648 then true
650649 else if ((inv.function == "stopStaking"))
651650 then (size(inv.payments) == 0)
652651 else false
653652 else false
654653 let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
655654 then (inv.function == "exchange")
656655 else false)
657656 then (assetIdA == USDN)
658657 else false)
659658 then true
660659 else if (if ((assetIdB == USDN))
661660 then (size(inv.payments) == 1)
662661 else false)
663662 then (inv.payments[0].assetId == USDN)
664663 else false
665664 let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
666665 then (inv.function == "exchange")
667666 else false)
668667 then (assetIdA == NSBT)
669668 else false)
670669 then true
671670 else if (if ((assetIdB == NSBT))
672671 then (size(inv.payments) == 1)
673672 else false)
674673 then (inv.payments[0].assetId == USDN)
675674 else false
676675 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
677676 then true
678677 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
679678 then true
680679 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
681680 then true
682681 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
683682 if (if (if (if (if (if (callTakeIntoAccount)
684683 then true
685684 else callEnableFirstHarvest)
686685 then true
687686 else callStaking)
688687 then true
689688 else exchangeToWaves)
690689 then true
691690 else exchangeToNSBTs)
692691 then signedByAdmin
693692 else false)
694693 then true
695694 else multiSignedByAdmins
696695 case _ =>
697696 multiSignedByAdmins
698697 }
699698 }
700699

github/deemru/w8io/873ac7e 
96.85 ms