tx · XUffMTW8u96tuEEdo6pzM95BGXPT9Q8TQw442wiijpa

3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37:  -0.01400000 Waves

2021.09.22 16:10 [1714304] smart account 3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37 > SELF 0.00000000 Waves

{ "type": 13, "id": "XUffMTW8u96tuEEdo6pzM95BGXPT9Q8TQw442wiijpa", "fee": 1400000, "feeAssetId": null, "timestamp": 1632316229224, "version": 2, "chainId": 84, "sender": "3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37", "senderPublicKey": "4bwUHdA4vTBJ1k43dYKiPYTDqm3QqiZXNGXoQstGAD1k", "proofs": [ "51rFXQuViv3GVhPva2QkgNwz4fS7tVzfB7B9dfEdssiyJd74Rh11PMkt3HeYbRBZJw6dYJmYuHic7ne2odstigQ5", "2aRwNYzD78FtxEhC7L3TKdyu3s9vfBv6z6gXEC4VPJiSQ1JumoEx4ZjFxEit8qZ2Wix9cQzSPejug5Jsqu4wMqNd" ], "script": "base64:AAIFAAAAAAAAACMIAhIDCgEIEgMKAQESAwoBARIAEgMKAQESABIAEgMKAQESAAAAAFgAAAAAB3ZlcnNpb24CAAAABTEuMC4wAAAAAAprZXlWZXJzaW9uAgAAAAd2ZXJzaW9uAAAAAAlrZXlBY3RpdmUCAAAABmFjdGl2ZQAAAAALa2V5QXNzZXRJZEECAAAACkFfYXNzZXRfaWQAAAAAC2tleUFzc2V0SWRCAgAAAApCX2Fzc2V0X2lkAAAAAAtrZXlCYWxhbmNlQQIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAtrZXlCYWxhbmNlQgIAAAAPQl9hc3NldF9iYWxhbmNlAAAAAA9rZXlCYWxhbmNlSW5pdEECAAAADEFfYXNzZXRfaW5pdAAAAAAPa2V5QmFsYW5jZUluaXRCAgAAAAxCX2Fzc2V0X2luaXQAAAAAD2tleVNoYXJlQXNzZXRJZAIAAAAOc2hhcmVfYXNzZXRfaWQAAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkCAAAAEnNoYXJlX2Fzc2V0X3N1cHBseQAAAAANa2V5Q29tbWlzc2lvbgIAAAAKY29tbWlzc2lvbgAAAAAba2V5Q29tbWlzc2lvblNjYWxlRGVsaW1pdGVyAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAAIa2V5Q2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAAA9rZXlGaXJzdEhhcnZlc3QCAAAADWZpcnN0X2hhcnZlc3QAAAAAFWtleUZpcnN0SGFydmVzdEhlaWdodAIAAAAUZmlyc3RfaGFydmVzdF9oZWlnaHQAAAAADWtleVNoYXJlTGltaXQCAAAAHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAAAAADWtleUJhc2VQZXJpb2QCAAAAC2Jhc2VfcGVyaW9kAAAAAA9rZXlQZXJpb2RMZW5ndGgCAAAADXBlcmlvZF9sZW5ndGgAAAAADmtleVN0YXJ0SGVpZ2h0AgAAAAxzdGFydF9oZWlnaHQAAAAAFmtleU9yYWNsZUFzc2V0UHJpb3JpdHkCAAAAD2Fzc2V0X3ByaW9yaXR5XwAAAAATa2V5T3JhY2xlU2NyaXB0SGFzaAIAAAAQc2NyaXB0X2hhc2hfY3BtbQAAAAARa2V5SW5pdFBv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eUJhbGFuY2VBAAAAAAhiYWxhbmNlQgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAALa2V5QmFsYW5jZUIAAAAADHNoYXJlQXNzZXRJZAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAAA9rZXlTaGFyZUFzc2V0SWQAAAAAEHNoYXJlQXNzZXRTdXBwbHkJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMFAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkAAAAACmNvbW1pc3Npb24AAAAAAAAAC7gAAAAAFGNvbW1pc3Npb25Hb3Zlcm5hbmNlAAAAAAAAAASwAAAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIAAAAAAAAPQkAAAAAAC3NjYWxlVmFsdWUzAAAAAAAAAAPoAAAAAAtzY2FsZVZhbHVlOAAAAAAABfXhAAAAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIAAAAAAAAAA+gAAAAAEXNjYWxlVmFsdWU4RGlnaXRzAAAAAAAAAAAIAAAAABljb21pc3Npb25Gb3JJbml0YWxpemF0aW9uAAAAAAA7msoAAQAAAA5hY2NvdW50QmFsYW5jZQAAAAEAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACaWQFAAAAByRtYXRjaDAJAAPwAAAAAgUAAAAEdGhpcwUAAAACaWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwCAkAA+8AAAABBQAAAAR0aGlzAAAACWF2YWlsYWJsZQkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAAMc3Rha2VkQW1vdW50AAAAAQAAAAdhc3NldElkBAAAABZzdGFrZWRBbW91bnRDYWxjdWxhdGVkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAANhSWQFAAAAByRtYXRjaDADAwkAAAAAAAACBQAAAANhSWQFAAAABFVTRE4GCQAAAAAAAAIFAAAAA2FJZAUAAAAETlNCVAkABBoAAAACBQAAABZzdGFraW5nVVNETk5TQlRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAxycGRfYmFsYW5jZV8JAAJYAAAAAQUAAAADYUlkAgAAAAFfCQAEJQAAAAEFAAAABHRoaXMDCQAAAAAAAAIFAAAAA2FJZAUAAAAERVVSTgkABBoAAAACBQAAABJzdGFraW5nRVVSTkFkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAGCVzJXMlc19fc3Rha2luZ0JhbGFuY2VfXwkAAlgAAAABBQAAAANhSWQCAAAAAl9fCQAEJQAAAAEFAAAABHRoaXMAAAAAAAAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQAAAAAAAAAAAAJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IEAAAAByRtYXRjaDAFAAAAFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABaQUAAAAHJG1hdGNoMAUAAAABaQAAAAAAAAAAAAEAAAAOaXNBbGxvd2VkQXNzZXQAAAABAAAAB2Fzc2V0SWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAmlkBQAAAAckbWF0Y2gwAwMJAAAAAAAAAgUAAAACaWQFAAAABFVTRE4GCQAAAAAAAAIFAAAAAmlkBQAAAARTV09QBgcDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwBgkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgAAAAANc3Rha2VkQW1vdW50QQkBAAAADHN0YWtlZEFtb3VudAAAAAEFAAAACGFzc2V0SWRBAAAAAA1zdGFrZWRBbW91bnRCCQEAAAAMc3Rha2VkQW1vdW50AAAAAQUAAAAIYXNzZXRJZEIAAAAACmFzc2V0SW5pdEEJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMFAAAAD2tleUJhbGFuY2VJbml0QQAAAAAKYXNzZXRJbml0QgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAAPa2V5QmFsYW5jZUluaXRCAAAAABFhdmFpbGFibGVCYWxhbmNlQQkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAANc3Rha2VkQW1vdW50QQAAAAARYXZhaWxhYmxlQmFsYW5jZUIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADXN0YWtlZEFtb3VudEIAAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEJAABkAAAAAgkBAAAADmFjY291bnRCYWxhbmNlAAAAAQUAAAAIYXNzZXRJZEEFAAAADXN0YWtlZEFtb3VudEEAAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEIJAABkAAAAAgkBAAAADmFjY291bnRCYWxhbmNlAAAAAQUAAAAIYXNzZXRJZEIFAAAADXN0YWtlZEFtb3VudEIAAAAAEGhhc0Vub3VnaEJhbGFuY2UDCQAAZwAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEFAAAACGJhbGFuY2VBCQAAZwAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEIFAAAACGJhbGFuY2VCBwEAAAAMZ2V0QXNzZXRJbmZvAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAQAAAAIc3RyaW5nSWQJAAJYAAAAAQUAAAACaWQEAAAABGluZm8JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAJpZAkAASwAAAACCQABLAAAAAICAAAABkFzc2V0IAUAAAAIc3RyaW5nSWQCAAAADiBkb2Vzbid0IGV4aXN0CQAFFQAAAAMFAAAACHN0cmluZ0lkCAUAAAAEaW5mbwAAAARuYW1lCAUAAAAEaW5mbwAAAAhkZWNpbWFscwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDAJAAUVAAAAAwIAAAAFV0FWRVMCAAAABVdBVkVTAAAAAAAAAAAICQAAAgAAAAEC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dWVPckVsc2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACBQAAABZrZXlPcmFjbGVBc3NldFByaW9yaXR5BQAAAA5wbXRTdHJBc3NldElkMQAAAAAAAA9CPwQAAAAOYXNzZXQyUHJpb3JpdHkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAGb3JhY2xlCQABLAAAAAIFAAAAFmtleU9yYWNsZUFzc2V0UHJpb3JpdHkFAAAADnBtdFN0ckFzc2V0SWQyAAAAAAAAD0I/BAAAAAwkdDA5OTU4MTAxODUDCQAAZgAAAAIFAAAADmFzc2V0MlByaW9yaXR5BQAAAA5hc3NldDFQcmlvcml0eQkABRYAAAAEBQAAAApwbXRBbW91bnQyBQAAAAtwbXRBc3NldElkMgUAAAAKcG10QW1vdW50MQUAAAALcG10QXNzZXRJZDEJAAUWAAAABAUAAAAKcG10QW1vdW50MQUAAAALcG10QXNzZXRJZDEFAAAACnBtdEFtb3VudDIFAAAAC3BtdEFzc2V0SWQyBAAAAApwbXRBbW91bnRBCAUAAAAMJHQwOTk1ODEwMTg1AAAAAl8xBAAAAAtwbXRBc3NldElkQQgFAAAADCR0MDk5NTgxMDE4NQAAAAJfMgQAAAAKcG10QW1vdW50QggFAAAADCR0MDk5NTgxMDE4NQAAAAJfMwQAAAALcG10QXNzZXRJZEIIBQAAAAwkdDA5OTU4MTAxODUAAAACXzQEAAAADSR0MDEwMTk0MTAyNzEJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtwbXRBc3NldElkQQQAAAAOcG10U3RyQXNzZXRJZEEIBQAAAA0kdDAxMDE5NDEwMjcxAAAAAl8xBAAAAA1wbXRBc3NldE5hbWVBCAUAAAANJHQwMTAxOTQxMDI3MQAAAAJfMgQAAAAMcG10RGVjaW1hbHNBCAUAAAANJHQwMTAxOTQxMDI3MQAAAAJfMwQAAAANJHQwMTAyODAxMDM1NwkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRCBAAAAA5wbXRTdHJBc3NldElkQggFAAAADSR0MDEwMjgwMTAzNTcAAAACXzEEAAAADXBtdEFzc2V0TmFtZUIIBQAAAA0kdDAxMDI4MDEwMzU3AAAAAl8yBAAAAAxwbXREZWNpbWFsc0IIBQAAAA0kdDAxMDI4MDEwMzU3AAAAAl8zBAAAAAlhZGRQYXJhbXMJAARMAAAAAgkABCUAAAABBQAAAAR0aGlzCQAETAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAA1wbXRBc3NldE5hbWVBAgAAAAFfBQAAAA1wbXRBc3NldE5hbWVCCQAETAAAAAIFAAAADnBtdFN0ckFzc2V0SWRBCQAETAAAAAIFAAAADnBtdFN0ckFzc2V0SWRCBQAAAANuaWwEAAAAB2FkZFBvb2wJAAP8AAAABAUAAAAGb3JhY2xlAgAAAAdhZGRQb29sBQAAAAlhZGRQYXJhbXMFAAAAA25pbAMJAAAAAAAAAgUAAAAHYWRkUG9vbAUAAAAHYWRkUG9vbAMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAGb3JhY2xlCQABLAAAAAICAAAABXBvb2xfCQAEJQAAAAEFAAAABHRoaXMJAAACAAAAAQIAAAARUG9vbCBpcyBub3QgYWRkZWQEAAAACXNoYXJlTmFtZQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAABcwkAAS8AAAACBQAAAA1wbXRBc3NldE5hbWVBAAAAAAAAAAAHAgAAAAFfCQABLwAAAAIFAAAADXBtdEFzc2V0TmFtZUIAAAAAAAAAAAcEAAAAEHNoYXJlRGVzY3JpcHRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQAAAA1wbXRBc3NldE5hbWVBAgAAAAUgYW5kIAUAAAANcG10QXNzZXROYW1lQgIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAABHRoaXMEAAAADXNoYXJlRGVjaW1hbHMJAABpAAAAAgkAAGQAAAACBQAAAAxwbXREZWNpbWFsc0EFAAAADHBtdERlY2ltYWxzQgAAAAAAAAAAAgQAAAAEYXJnMQkAAGwAAAAGBQAAAApwbXRBbW91bnRBBQAAAAxwbXREZWNpbWFsc0EAAAAAAAAAAAUAAAAAAAAAAAEFAAAADHBtdERlY2ltYWxzQQUAAAAERE9XTgQAAAAEYXJnMgkAAGwAAAAGBQAAAApwbXRBbW91bnRCBQAAAAxwbXREZWNpbWFsc0IAAAAAAAAAAAUAAAAAAAAAAAEFAAAADHBtdERlY2ltYWxzQgUAAAAERE9XTgQAAAAEYXJnMwkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAABQAAAA1zaGFyZURlY2ltYWxzAAAAAAAAAAAAAAAAAAAAAAAABQAAAARET1dOBAAAABJzaGFyZUluaXRpYWxTdXBwbHkJAABrAAAAAwUAAAAEYXJnMQUAAAAEYXJnMgUAAAAEYXJnMwQAAAAKc2hhcmVJc3N1ZQkABEIAAAAFBQAAAAlzaGFyZU5hbWUFAAAAEHNoYXJlRGVzY3JpcHRpb24FAAAAEnNoYXJlSW5pdGlhbFN1cHBseQUAAAANc2hhcmVEZWNpbWFscwYEAAAADHNoYXJlSXNzdWVJZAkABDgAAAABBQAAAApzaGFyZUlzc3VlBAAAAAliYXNlRW50cnkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAKa2V5VmVyc2lvbgUAAAAHdmVyc2lvbgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAJa2V5QWN0aXZlBgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAtrZXlBc3NldElkQQUAAAAOcG10U3RyQXNzZXRJZEEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAALa2V5QXNzZXRJZEIFAAAADnBtdFN0ckFzc2V0SWRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAAKcG10QW1vdW50QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADWtleUNvbW1pc3Npb24FAAAACmNvbW1pc3Npb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAG2tleUNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyCQAETAAAAAIFAAAACnNoYXJlSXNzdWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAPa2V5U2hhcmVBc3NldElkCQACWAAAAAEFAAAADHNoYXJlSXNzdWVJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa2V5U2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrZXlJbml0UG9vbEhlaWdodAUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAC3VzZXJBZGRyZXNzBQAAABJzaGFyZUluaXRpYWxTdXBwbHkFAAAADHNoYXJlSXNzdWVJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA13YWxsZXRBZGRyZXNzBQAAABljb21pc3Npb25Gb3JJbml0YWxpemF0aW9uBQAAAARTV09QBQAAAANuaWwFAAAACWJhc2VFbnRyeQkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAYa2VlcExpbWl0Rm9yRmlyc3RIYXJ2ZXN0AAAAAQAAAApzaGFyZUxpbWl0AwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABJhZG1pblB1YktleVN0YWtpbmcFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANa2V5U2hhcmVMaW1pdAUAAAAKc2hhcmVMaW1pdAUAAAADbmlsAAAAAWkBAAAAFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMAAAABAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAAAtwbXRBc3NldElkQQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAALcG10QXNzZXRJZEIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAAB2Fzc2V0SWQEAAAACnBtdEFtb3VudEEJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAwgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50BQAAAAtwbXRBc3NldElkQQUAAAALcG10QXNzZXRJZEIEAAAACnBtdEFtb3VudEIJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAwgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAGYW1vdW50BQAAAAtwbXRBc3NldElkQgUAAAALcG10QXNzZXRJZEEDAwkAAAAAAAACBQAAAAhiYWxhbmNlQQAAAAAAAAAAAAkAAAAAAAACBQAAAAhiYWxhbmNlQgAAAAAAAAAAAAcEAAAADSR0MDEzMjc3MTMzNTQJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtwbXRBc3NldElkQQQAAAAOcG10U3RyQXNzZXRJZEEIBQAAAA0kdDAxMzI3NzEzMzU0AAAAAl8xBAAAAA1wbXRBc3NldE5hbWVBCAUAAAANJHQwMTMyNzcxMzM1NAAAAAJfMgQAAAAMcG10RGVjaW1hbHNBCAUAAAANJHQwMTMyNzcxMzM1NAAAAAJfMwQAAAANJHQwMTMzNjMxMzQ0MAkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRCBAAAAA5wbXRTdHJBc3NldElkQggFAAAADSR0MDEzMzYzMTM0NDAAAAACXzEEAAAADXBtdEFzc2V0TmFtZUIIBQAAAA0kdDAxMzM2MzEzNDQwAAAAAl8yBAAAAAxwbXREZWNpbWFsc0IIBQAAAA0kdDAxMzM2MzEzNDQwAAAAAl8zBAAAAAp0b2tlblJhdGlvCQAAawAAAAMJAABrAAAAAwUAAAAKYXNzZXRJbml0QQUAAAALc2NhbGVWYWx1ZTgFAAAACnBtdEFtb3VudEEFAAAAC3NjYWxlVmFsdWUzCQAAawAAAAMFAAAACmFzc2V0SW5pdEIFAAAAC3NjYWxlVmFsdWU4BQAAAApwbXRBbW91bnRCAwkAAAAAAAACBQAAAAtwbXRBc3NldElkQQUAAAALcG10QXNzZXRJZEIJAAACAAAAAQIAAAAYQXNzZXRzIG11c3QgYmUgZGlmZmVyZW50BAAAAA1zaGFyZURlY2ltYWxzCQAAaQAAAAIJAABkAAAAAgUAAAAMcG10RGVjaW1hbHNBBQAAAAxwbXREZWNpbWFsc0IAAAAAAAAAAAIEAAAAEnNoYXJlSW5pdGlhbFN1cHBseQkAAGsAAAADCQAAbAAAAAYFAAAACnBtdEFtb3VudEEFAAAADHBtdERlY2ltYWxzQQAAAAAAAAAABQAAAAAAAAAAAQUAAAAMcG10RGVjaW1hbHNBBQAAAARET1dOCQAAbAAAAAYFAAAACnBtdEFtb3VudEIFAAAADHBtdERlY2ltYWxzQgAAAAAAAAAABQAAAAAAAAAAAQUAAAAMcG10RGVjaW1hbHNCBQAAAARET1dOCQAAbAAAAAYAAAAAAAAAAAoAAAAAAAAAAAAFAAAADXNoYXJlRGVjaW1hbHMAAAAAAAAAAAAAAAAAAAAAAAAFAAAABERPV04DCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQDAwkAAGYAAAACAAAAAAAAAAAABQAAABFzbGlwcGFnZVRvbGVyYW5jZQYJAABmAAAAAgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAKVNsaXBwYWdlIHRvbGVyYW5jZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgCQABpAAAAAEFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyAgAAABYgaW5jbHVzaXZlbHkuIEFjdHVhbDogCQABpAAAAAEFAAAAEXNsaXBwYWdlVG9sZXJhbmNlAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAgkAAAIAAAABAgAAABxUd28gYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkAwMJAABmAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWUzCQAAZQAAAAIFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIFAAAACnRva2VuUmF0aW8GCQAAZgAAAAIFAAAACnRva2VuUmF0aW8JAABpAAAAAgkAAGgAAAACBQAAAAtzY2FsZVZhbHVlMwkAAGQAAAACBQAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyCQAAAgAAAAECAAAAPUluY29ycmVjdCBhc3NldHMgYW1vdW50OiBhbW91bnRzIG11c3QgaGF2ZSB0aGUgY29udHJhY3QgcmF0aW8DAwkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEEFAAAACGFzc2V0SWRBBgkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEIFAAAACGFzc2V0SWRCCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJUluY29ycmVjdCBhc3NldHMgYXR0YWNoZWQuIEV4cGVjdGVkOiAFAAAAC3N0ckFzc2V0SWRBAgAAAAUgYW5kIAUAAAALc3RyQXNzZXRJZEIDCQAAAAAAAAIFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQAAAAAAAAAAAAkAAAIAAAABAgAAAB1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKcG10QW1vdW50QQUAAAALcG10QXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRCBQAAAAtwbXRBc3NldElkQgUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAACQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAMc2hhcmVBc3NldElkBQAAABJzaGFyZUluaXRpYWxTdXBwbHkGCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAAKcG10QW1vdW50QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQUAAAAMc2hhcmVBc3NldElkBQAAAANuaWwEAAAACnRva2VuUmF0aW8JAABrAAAAAwkAAGsAAAADBQAAAAhiYWxhbmNlQQUAAAALc2NhbGVWYWx1ZTgFAAAACnBtdEFtb3VudEEFAAAAC3NjYWxlVmFsdWUzCQAAawAAAAMFAAAACGJhbGFuY2VCBQAAAAtzY2FsZVZhbHVlOAUAAAAKcG10QW1vdW50QgQAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkAAGsAAAADBQAAAApwbXRBbW91bnRBBQAAAAtzY2FsZVZhbHVlOAUAAAAIYmFsYW5jZUEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIJAABrAAAAAwUAAAAKcG10QW1vdW50QgUAAAALc2NhbGVWYWx1ZTgFAAAACGJhbGFuY2VCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAtzY2FsZVZhbHVlOAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBgkAAGYAAAACBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAApU2xpcHBhZ2UgdG9sZXJhbmNlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAJAAGkAAAAAQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXICAAAAFiBpbmNsdXNpdmVseS4gQWN0dWFsOiAJAAGkAAAAAQUAAAARc2xpcHBhZ2VUb2xlcmFuY2UDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAACCQAAAgAAAAECAAAAHFR3byBhdHRhY2hlZCBhc3NldHMgZXhwZWN0ZWQDAwkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEEFAAAACGFzc2V0SWRBBgkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEIFAAAACGFzc2V0SWRCCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJUluY29ycmVjdCBhc3NldHMgYXR0YWNoZWQuIEV4cGVjdGVkOiAFAAAAC3N0ckFzc2V0SWRBAgAAAAUgYW5kIAUAAAALc3RyQXNzZXRJZEIDAwkAAGYAAAACCQAAaQAAAAIJAABoAAAAAgUAAAALc2NhbGVWYWx1ZTMJAABlAAAAAgUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgUAAAAKdG9rZW5SYXRpbwYJAABmAAAAAgUAAAAKdG9rZW5SYXRpbwkAAGkAAAACCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWUzCQAAZAAAAAIFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIJAAACAAAAAQIAAAA9SW5jb3JyZWN0IGFzc2V0cyBhbW91bnQ6IGFtb3VudHMgbXVzdCBoYXZlIHRoZSBjb250cmFjdCByYXRpbwMJAAAAAAAAAgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAAHVRvbyBzbWFsbCBhbW91bnQgdG8gcmVwbGVuaXNoAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRBBQAAAAtwbXRBc3NldElkQQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACnBtdEFtb3VudEIFAAAAC3BtdEFzc2V0SWRCBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAApwbXRBbW91bnRBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQgkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa2V5U2hhcmVBc3NldFN1cHBseQkAAGQAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAAxzaGFyZUFzc2V0SWQFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQFAAAADHNoYXJlQXNzZXRJZAUAAAADbmlsAAAAAWkBAAAACHdpdGhkcmF3AAAAAAQAAAANJHQwMTc4MzkxNzk4OQkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDE3ODM5MTc5ODkAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAxNzgzOTE3OTg5AAAAAl8yBAAAAAxhbW91bnRUb1BheUEJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAwkAAGsAAAADBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VBBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAhhc3NldElkQQUAAAAIYXNzZXRJZEIEAAAADGFtb3VudFRvUGF5QgkBAAAAEGRlZHVjdFN0YWtpbmdGZWUAAAADCQAAawAAAAMFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAACGFzc2V0SWRCBQAAAAhhc3NldElkQQMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAxzaGFyZUFzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAACRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAJAAJYAAAAAQUAAAAMc2hhcmVBc3NldElkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMDCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QQUAAAARYXZhaWxhYmxlQmFsYW5jZUEGCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QgUAAAARYXZhaWxhYmxlQmFsYW5jZUIJAQAAACJ0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2VzAAAAAgUAAAAMYW1vdW50VG9QYXlBBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VBCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAAxhbW91bnRUb1BheUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkJAABlAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAJcG10QW1vdW50CQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAAMc2hhcmVBc3NldElkBQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUEFAAAACGFzc2V0SWRBCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAMYW1vdW50VG9QYXlCBQAAAAhhc3NldElkQgUAAAADbmlsAAAAAWkBAAAACGV4Y2hhbmdlAAAAAQAAABJtaW5BbW91bnRUb1JlY2VpdmUEAAAADSR0MDE5MjE1MTkyOTAJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxOTIxNTE5MjkwAAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTkyMTUxOTI5MAAAAAJfMgoBAAAADWNhbGN1bGF0ZUZlZXMAAAACAAAACXRva2VuRnJvbQAAAAd0b2tlblRvBAAAABBhbW91bnRXaXRob3V0RmVlCQAAawAAAAMFAAAAB3Rva2VuVG8FAAAACXBtdEFtb3VudAkAAGQAAAACBQAAAAlwbXRBbW91bnQFAAAACXRva2VuRnJvbQQAAAANYW1vdW50V2l0aEZlZQkAAGsAAAADBQAAABBhbW91bnRXaXRob3V0RmVlCQAAZQAAAAIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAKY29tbWlzc2lvbgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyBAAAABBnb3Zlcm5hbmNlUmV3YXJkCQAAawAAAAMFAAAAEGFtb3VudFdpdGhvdXRGZWUFAAAAFGNvbW1pc3Npb25Hb3Zlcm5hbmNlBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIDCQAAZgAAAAIFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAANYW1vdW50V2l0aEZlZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB1DYWxjdWxhdGVkIGFtb3VudCB0byByZWNlaXZlIAkAAaQAAAABBQAAAA1hbW91bnRXaXRoRmVlAgAAACAgaXMgbGVzcyB0aGFuIHNwZWNpZmllZCBtaW5pbXVtIAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUJAAUVAAAAAwUAAAAQYW1vdW50V2l0aG91dEZlZQUAAAANYW1vdW50V2l0aEZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQAAAAAAAAIFAAAACGJhbGFuY2VBAAAAAAAAAAAABgkAAAAAAAACBQAAAAhiYWxhbmNlQgAAAAAAAAAAAAkAAAIAAAABAgAAACBDYW4ndCBleGNoYW5nZSB3aXRoIHplcm8gYmFsYW5jZQMJAABnAAAAAgAAAAAAAAAAAAUAAAASbWluQW1vdW50VG9SZWNlaXZlCQAAAgAAAAEJAAEsAAAAAgIAAAA0TWluaW1hbCBhbW91bnQgdG8gcmVjZWl2ZSBtdXN0IGJlIHBvc2l0aXZlLiBBY3R1YWw6IAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEEAAAAC2Fzc2V0SWRTZW5kBQAAAAhhc3NldElkQgQAAAANJHQwMjA1NjQyMDY1NQkBAAAADWNhbGN1bGF0ZUZlZXMAAAACBQAAAAhiYWxhbmNlQQUAAAAIYmFsYW5jZUIEAAAAEGFtb3VudFdpdGhvdXRGZWUIBQAAAA0kdDAyMDU2NDIwNjU1AAAAAl8xBAAAAA1hbW91bnRXaXRoRmVlCAUAAAANJHQwMjA1NjQyMDY1NQAAAAJfMgQAAAAQZ292ZXJuYW5jZVJld2FyZAgFAAAADSR0MDIwNTY0MjA2NTUAAAACXzMEAAAAC25ld0JhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQEAAAAC25ld0JhbGFuY2VCCQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudFdpdGhGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQDAwkAAGcAAAACBQAAAA1zdGFrZWRBbW91bnRBBQAAAAtuZXdCYWxhbmNlQQYJAABnAAAAAgUAAAANc3Rha2VkQW1vdW50QgUAAAALbmV3QmFsYW5jZUIJAQAAACF0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2UAAAADBQAAAA1hbW91bnRXaXRoRmVlBQAAABFhdmFpbGFibGVCYWxhbmNlQgUAAAAKYXNzZXROYW1lQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQgUAAAALbmV3QmFsYW5jZUIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA1hbW91bnRXaXRoRmVlBQAAAAthc3NldElkU2VuZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA13YWxsZXRBZGRyZXNzBQAAABBnb3Zlcm5hbmNlUmV3YXJkBQAAAAthc3NldElkU2VuZAUAAAADbmlsAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQgQAAAALYXNzZXRJZFNlbmQFAAAACGFzc2V0SWRBBAAAAA0kdDAyMTQ3NDIxNTY1CQEAAAANY2FsY3VsYXRlRmVlcwAAAAIFAAAACGJhbGFuY2VCBQAAAAhiYWxhbmNlQQQAAAAQYW1vdW50V2l0aG91dEZlZQgFAAAADSR0MDIxNDc0MjE1NjUAAAACXzEEAAAADWFtb3VudFdpdGhGZWUIBQAAAA0kdDAyMTQ3NDIxNTY1AAAAAl8yBAAAABBnb3Zlcm5hbmNlUmV3YXJkCAUAAAANJHQwMjE0NzQyMTU2NQAAAAJfMwQAAAALbmV3QmFsYW5jZUEJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAANYW1vdW50V2l0aEZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAQAAAALbmV3QmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAMDCQAAZwAAAAIFAAAADXN0YWtlZEFtb3VudEEFAAAAC25ld0JhbGFuY2VBBgkAAGcAAAACBQAAAA1zdGFrZWRBbW91bnRCBQAAAAtuZXdCYWxhbmNlQgkBAAAAIXRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZQAAAAMFAAAADWFtb3VudFdpdGhGZWUFAAAAEWF2YWlsYWJsZUJhbGFuY2VBBQAAAAphc3NldE5hbWVBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADWFtb3VudFdpdGhGZWUFAAAAC2Fzc2V0SWRTZW5kCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAADXdhbGxldEFkZHJlc3MFAAAAEGdvdmVybmFuY2VSZXdhcmQFAAAAC2Fzc2V0SWRTZW5kBQAAAANuaWwJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAkSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkLiBFeHBlY3RlZDogBQAAAAtzdHJBc3NldElkQQIAAAAEIG9yIAUAAAALc3RyQXNzZXRJZEIAAAABaQEAAAAIc2h1dGRvd24AAAAAAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABCQABLAAAAAICAAAAIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAIa2V5Q2F1c2UCAAAAGnRoZSBjYXVzZSB3YXNuJ3Qgc3BlY2lmaWVkAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABRhZG1pblB1YktleVN0YXJ0U3RvcAUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCQEAAAAHc3VzcGVuZAAAAAECAAAAD1BhdXNlZCBieSBhZG1pbgAAAAFpAQAAAAhhY3RpdmF0ZQAAAAADBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAABZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABRhZG1pblB1YktleVN0YXJ0U3RvcAUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAlrZXlBY3RpdmUGCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAACGtleUNhdXNlBQAAAANuaWwAAAABaQEAAAAZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwAAAAEAAAALYW1vdW50TGVhdmUEAAAAHXVuY291bnRhYmxlQW1vdW50RW5yb2xsQXNzZXRBCQAAZQAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEFAAAACGJhbGFuY2VBBAAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QgkAAGUAAAACBQAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCBQAAAAhiYWxhbmNlQgQAAAANYW1vdW50RW5yb2xsQQkAAGUAAAACBQAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QQMJAAAAAAAAAgUAAAAIYXNzZXRJZEEFAAAABHVuaXQFAAAAC2Ftb3VudExlYXZlAAAAAAAAAAAABAAAAA1hbW91bnRFbnJvbGxCCQAAZQAAAAIFAAAAHXVuY291bnRhYmxlQW1vdW50RW5yb2xsQXNzZXRCAwkAAAAAAAACBQAAAAhhc3NldElkQgUAAAAEdW5pdAUAAAALYW1vdW50TGVhdmUAAAAAAAAAAAADCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAArT25seSB0aGUgREFwcCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAABmAAAAAgAAAAAAAAAAAAUAAAALYW1vdW50TGVhdmUJAAACAAAAAQkAASwAAAACAgAAADNBcmd1bWVudCAnYW1vdW50TGVhdmUnIGNhbm5vdCBiZSBuZWdhdGl2ZS4gQWN0dWFsOiAJAAGkAAAAAQUAAAALYW1vdW50TGVhdmUDAwkAAGYAAAACAAAAAAAAAAAABQAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QQYJAABmAAAAAgAAAAAAAAAAAAUAAAAddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEIJAQAAAAdzdXNwZW5kAAAAAQIAAAAWRW5yb2xsIGFtb3VudCBuZWdhdGl2ZQMDCQAAZgAAAAIAAAAAAAAAAAAFAAAADWFtb3VudEVucm9sbEEGCQAAZgAAAAIAAAAAAAAAAAAFAAAADWFtb3VudEVucm9sbEIJAAACAAAAAQIAAAAVVG9vIGxhcmdlIGFtb3VudExlYXZlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAANYW1vdW50RW5yb2xsQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudEVucm9sbEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgIAAAAMbGFzdF9pbmNvbWVfBQAAAAtzdHJBc3NldElkQQUAAAANYW1vdW50RW5yb2xsQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACAgAAAAxsYXN0X2luY29tZV8FAAAAC3N0ckFzc2V0SWRCBQAAAA1hbW91bnRFbnJvbGxCBQAAAANuaWwAAAABaQEAAAASZW5hYmxlRmlyc3RIYXJ2ZXN0AAAAAAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAPa2V5Rmlyc3RIYXJ2ZXN0BgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAVa2V5Rmlyc3RIYXJ2ZXN0SGVpZ2h0CQAAZAAAAAIFAAAA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", "height": 1714304, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FoSco38YsY8cB83qsD7Vk1Qmdq6ZPZDcUK51nJXkDh3w Next: none Diff:
OldNewDifferences
4545
4646 let keyOracleScriptHash = "script_hash_cpmm"
4747
48-let keyInitPoolHeight = "init_pool_height"
48+let keyInitPoolHeight = "init_height"
4949
5050 let keyAdminPubKey1 = "admin_pub_1"
5151
5353
5454 let keyAdminPubKey3 = "admin_pub_3"
5555
56-let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
56+let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
5757
5858 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
5959 case string: String =>
293293
294294 @Callable(i)
295295 func init (userAddressStr) = {
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
296+ let $t083558432 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
297+ let pmtAmount1 = $t083558432._1
298+ let pmtAssetId1 = $t083558432._2
299+ let $t084378514 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
300+ let pmtAmount2 = $t084378514._1
301+ let pmtAssetId2 = $t084378514._2
302+ let $t085198602 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
303+ let pmtAmountSWOP = $t085198602._1
304+ let pmtAssetIdSWOP = $t085198602._2
305305 let check = isDataStorageUntouched(this)
306306 let userScriptHash = scriptHash(this)
307307 let userAddress = addressFromStringValue(userAddressStr)
308- let oracleCpmmHash = value(getBinary(oracle, keyOracleScriptHash))
309308 if ((i.caller == this))
310309 then throw("You can't call yourself")
311310 else if (if ((pmtAssetIdSWOP != SWOP))
316315 then !(isAllowedAsset(pmtAssetId2))
317316 else false)
318317 then throw("One of assets must be USDN, WAVES or SWOP")
319- else if (if ((userScriptHash != oracleCpmmHash))
318+ else if (if ((userScriptHash != value(getBinary(oracle, keyOracleScriptHash))))
320319 then true
321320 else !(check))
322321 then throw("Unexpected script was found.")
343342 }
344343 let asset1Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId1)), 999999)
345344 let asset2Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId2)), 999999)
346- let $t01006910296 = if ((asset2Priority > asset1Priority))
345+ let $t0995810185 = if ((asset2Priority > asset1Priority))
347346 then $Tuple4(pmtAmount2, pmtAssetId2, pmtAmount1, pmtAssetId1)
348347 else $Tuple4(pmtAmount1, pmtAssetId1, pmtAmount2, pmtAssetId2)
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
348+ let pmtAmountA = $t0995810185._1
349+ let pmtAssetIdA = $t0995810185._2
350+ let pmtAmountB = $t0995810185._3
351+ let pmtAssetIdB = $t0995810185._4
352+ let $t01019410271 = getAssetInfo(pmtAssetIdA)
353+ let pmtStrAssetIdA = $t01019410271._1
354+ let pmtAssetNameA = $t01019410271._2
355+ let pmtDecimalsA = $t01019410271._3
356+ let $t01028010357 = getAssetInfo(pmtAssetIdB)
357+ let pmtStrAssetIdB = $t01028010357._1
358+ let pmtAssetNameB = $t01028010357._2
359+ let pmtDecimalsB = $t01028010357._3
361360 let addParams = [toString(this), ((pmtAssetNameA + "_") + pmtAssetNameB), pmtStrAssetIdA, pmtStrAssetIdB]
362361 let addPool = invoke(oracle, "addPool", addParams, nil)
363362 if ((addPool == addPool))
401400 then (balanceB == 0)
402401 else false)
403402 then {
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
403+ let $t01327713354 = getAssetInfo(pmtAssetIdA)
404+ let pmtStrAssetIdA = $t01327713354._1
405+ let pmtAssetNameA = $t01327713354._2
406+ let pmtDecimalsA = $t01327713354._3
407+ let $t01336313440 = getAssetInfo(pmtAssetIdB)
408+ let pmtStrAssetIdB = $t01336313440._1
409+ let pmtAssetNameB = $t01336313440._2
410+ let pmtDecimalsB = $t01336313440._3
412411 let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
413412 if ((pmtAssetIdA == pmtAssetIdB))
414413 then throw("Assets must be different")
471470
472471 @Callable(i)
473472 func withdraw () = {
474- let $t01795018100 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
475- let pmtAmount = $t01795018100._1
476- let pmtAssetId = $t01795018100._2
473+ let $t01783917989 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474+ let pmtAmount = $t01783917989._1
475+ let pmtAssetId = $t01783917989._2
477476 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA, assetIdB)
478477 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB, assetIdA)
479478 if (!(isActive))
495494
496495 @Callable(i)
497496 func exchange (minAmountToReceive) = {
498- let $t01932619401 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
499- let pmtAmount = $t01932619401._1
500- let pmtAssetId = $t01932619401._2
497+ let $t01921519290 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
498+ let pmtAmount = $t01921519290._1
499+ let pmtAssetId = $t01921519290._2
501500 func calculateFees (tokenFrom,tokenTo) = {
502501 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
503502 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
522521 else if ((pmtAssetId == assetIdA))
523522 then {
524523 let assetIdSend = assetIdB
525- let $t02067520766 = calculateFees(balanceA, balanceB)
526- let amountWithoutFee = $t02067520766._1
527- let amountWithFee = $t02067520766._2
528- let governanceReward = $t02067520766._3
524+ let $t02056420655 = calculateFees(balanceA, balanceB)
525+ let amountWithoutFee = $t02056420655._1
526+ let amountWithFee = $t02056420655._2
527+ let governanceReward = $t02056420655._3
529528 let newBalanceA = (balanceA + pmtAmount)
530529 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
531530 if (if ((stakedAmountA >= newBalanceA))
537536 else if ((pmtAssetId == assetIdB))
538537 then {
539538 let assetIdSend = assetIdA
540- let $t02158521676 = calculateFees(balanceB, balanceA)
541- let amountWithoutFee = $t02158521676._1
542- let amountWithFee = $t02158521676._2
543- let governanceReward = $t02158521676._3
539+ let $t02147421565 = calculateFees(balanceB, balanceA)
540+ let amountWithoutFee = $t02147421565._1
541+ let amountWithFee = $t02147421565._2
542+ let governanceReward = $t02147421565._3
544543 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
545544 let newBalanceB = (balanceB + pmtAmount)
546545 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
48-let keyInitPoolHeight = "init_pool_height"
48+let keyInitPoolHeight = "init_height"
4949
5050 let keyAdminPubKey1 = "admin_pub_1"
5151
5252 let keyAdminPubKey2 = "admin_pub_2"
5353
5454 let keyAdminPubKey3 = "admin_pub_3"
5555
56-let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
56+let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
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) = {
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
296+ let $t083558432 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
297+ let pmtAmount1 = $t083558432._1
298+ let pmtAssetId1 = $t083558432._2
299+ let $t084378514 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
300+ let pmtAmount2 = $t084378514._1
301+ let pmtAssetId2 = $t084378514._2
302+ let $t085198602 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
303+ let pmtAmountSWOP = $t085198602._1
304+ let pmtAssetIdSWOP = $t085198602._2
305305 let check = isDataStorageUntouched(this)
306306 let userScriptHash = scriptHash(this)
307307 let userAddress = addressFromStringValue(userAddressStr)
308- let oracleCpmmHash = value(getBinary(oracle, keyOracleScriptHash))
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")
319- else if (if ((userScriptHash != oracleCpmmHash))
318+ 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 }
344343 let asset1Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId1)), 999999)
345344 let asset2Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId2)), 999999)
346- let $t01006910296 = if ((asset2Priority > asset1Priority))
345+ let $t0995810185 = if ((asset2Priority > asset1Priority))
347346 then $Tuple4(pmtAmount2, pmtAssetId2, pmtAmount1, pmtAssetId1)
348347 else $Tuple4(pmtAmount1, pmtAssetId1, pmtAmount2, pmtAssetId2)
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
348+ let pmtAmountA = $t0995810185._1
349+ let pmtAssetIdA = $t0995810185._2
350+ let pmtAmountB = $t0995810185._3
351+ let pmtAssetIdB = $t0995810185._4
352+ let $t01019410271 = getAssetInfo(pmtAssetIdA)
353+ let pmtStrAssetIdA = $t01019410271._1
354+ let pmtAssetNameA = $t01019410271._2
355+ let pmtDecimalsA = $t01019410271._3
356+ let $t01028010357 = getAssetInfo(pmtAssetIdB)
357+ let pmtStrAssetIdB = $t01028010357._1
358+ let pmtAssetNameB = $t01028010357._2
359+ let pmtDecimalsB = $t01028010357._3
361360 let addParams = [toString(this), ((pmtAssetNameA + "_") + pmtAssetNameB), pmtStrAssetIdA, pmtStrAssetIdB]
362361 let addPool = invoke(oracle, "addPool", addParams, nil)
363362 if ((addPool == addPool))
364363 then if (!(isDefined(getString(oracle, ("pool_" + toString(this))))))
365364 then throw("Pool is not added")
366365 else {
367366 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
368367 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
369368 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
370369 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
371370 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
372371 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
373372 let shareInitialSupply = fraction(arg1, arg2, arg3)
374373 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
375374 let shareIssueId = calculateAssetId(shareIssue)
376375 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)]
377376 baseEntry
378377 }
379378 else throw("Strict value is not equal to itself.")
380379 }
381380 }
382381
383382
384383
385384 @Callable(i)
386385 func keepLimitForFirstHarvest (shareLimit) = if (!(isActive))
387386 then throw("DApp is inactive at this moment")
388387 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
389388 then throw("Only admin can call this function")
390389 else [IntegerEntry(keyShareLimit, shareLimit)]
391390
392391
393392
394393 @Callable(i)
395394 func replenishWithTwoTokens (slippageTolerance) = {
396395 let pmtAssetIdA = i.payments[0].assetId
397396 let pmtAssetIdB = i.payments[1].assetId
398397 let pmtAmountA = deductStakingFee(i.payments[0].amount, pmtAssetIdA, pmtAssetIdB)
399398 let pmtAmountB = deductStakingFee(i.payments[1].amount, pmtAssetIdB, pmtAssetIdA)
400399 if (if ((balanceA == 0))
401400 then (balanceB == 0)
402401 else false)
403402 then {
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
403+ let $t01327713354 = getAssetInfo(pmtAssetIdA)
404+ let pmtStrAssetIdA = $t01327713354._1
405+ let pmtAssetNameA = $t01327713354._2
406+ let pmtDecimalsA = $t01327713354._3
407+ let $t01336313440 = getAssetInfo(pmtAssetIdB)
408+ let pmtStrAssetIdB = $t01336313440._1
409+ let pmtAssetNameB = $t01336313440._2
410+ let pmtDecimalsB = $t01336313440._3
412411 let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
413412 if ((pmtAssetIdA == pmtAssetIdB))
414413 then throw("Assets must be different")
415414 else {
416415 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
417416 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
418417 if (!(isActive))
419418 then throw("DApp is inactive at this moment")
420419 else if (if ((0 > slippageTolerance))
421420 then true
422421 else (slippageTolerance > slippageToleranceDelimiter))
423422 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
424423 else if ((size(i.payments) != 2))
425424 then throw("Two attached assets expected")
426425 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
427426 then true
428427 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
429428 then throw("Incorrect assets amount: amounts must have the contract ratio")
430429 else if (if ((pmtAssetIdA != assetIdA))
431430 then true
432431 else (pmtAssetIdB != assetIdB))
433432 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
434433 else if ((shareInitialSupply == 0))
435434 then throw("Too small amount to replenish")
436435 else if (!(hasEnoughBalance))
437436 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
438437 else [Reissue(shareAssetId, shareInitialSupply, true), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareAssetId)]
439438 }
440439 }
441440 else {
442441 let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
443442 let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
444443 let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
445444 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
446445 if (!(isActive))
447446 then throw("DApp is inactive at this moment")
448447 else if (if ((0 > slippageTolerance))
449448 then true
450449 else (slippageTolerance > slippageToleranceDelimiter))
451450 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
452451 else if ((size(i.payments) != 2))
453452 then throw("Two attached assets expected")
454453 else if (if ((pmtAssetIdA != assetIdA))
455454 then true
456455 else (pmtAssetIdB != assetIdB))
457456 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
458457 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
459458 then true
460459 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
461460 then throw("Incorrect assets amount: amounts must have the contract ratio")
462461 else if ((shareTokenToPayAmount == 0))
463462 then throw("Too small amount to replenish")
464463 else if (!(hasEnoughBalance))
465464 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
466465 else [IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
467466 }
468467 }
469468
470469
471470
472471 @Callable(i)
473472 func withdraw () = {
474- let $t01795018100 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
475- let pmtAmount = $t01795018100._1
476- let pmtAssetId = $t01795018100._2
473+ let $t01783917989 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474+ let pmtAmount = $t01783917989._1
475+ let pmtAssetId = $t01783917989._2
477476 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA, assetIdB)
478477 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB, assetIdA)
479478 if (!(isActive))
480479 then throw("DApp is inactive at this moment")
481480 else if ((size(i.payments) != 1))
482481 then throw("One attached payment expected")
483482 else if ((pmtAssetId != shareAssetId))
484483 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
485484 else if (!(hasEnoughBalance))
486485 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
487486 else if (if ((amountToPayA > availableBalanceA))
488487 then true
489488 else (amountToPayB > availableBalanceB))
490489 then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
491490 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)]
492491 }
493492
494493
495494
496495 @Callable(i)
497496 func exchange (minAmountToReceive) = {
498- let $t01932619401 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
499- let pmtAmount = $t01932619401._1
500- let pmtAssetId = $t01932619401._2
497+ let $t01921519290 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
498+ let pmtAmount = $t01921519290._1
499+ let pmtAssetId = $t01921519290._2
501500 func calculateFees (tokenFrom,tokenTo) = {
502501 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
503502 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
504503 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
505504 if ((minAmountToReceive > amountWithFee))
506505 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
507506 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
508507 }
509508
510509 if (!(isActive))
511510 then throw("DApp is inactive at this moment")
512511 else if (if ((balanceA == 0))
513512 then true
514513 else (balanceB == 0))
515514 then throw("Can't exchange with zero balance")
516515 else if ((0 >= minAmountToReceive))
517516 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
518517 else if ((size(i.payments) != 1))
519518 then throw("One attached payment expected")
520519 else if (!(hasEnoughBalance))
521520 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
522521 else if ((pmtAssetId == assetIdA))
523522 then {
524523 let assetIdSend = assetIdB
525- let $t02067520766 = calculateFees(balanceA, balanceB)
526- let amountWithoutFee = $t02067520766._1
527- let amountWithFee = $t02067520766._2
528- let governanceReward = $t02067520766._3
524+ let $t02056420655 = calculateFees(balanceA, balanceB)
525+ let amountWithoutFee = $t02056420655._1
526+ let amountWithFee = $t02056420655._2
527+ let governanceReward = $t02056420655._3
529528 let newBalanceA = (balanceA + pmtAmount)
530529 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
531530 if (if ((stakedAmountA >= newBalanceA))
532531 then true
533532 else (stakedAmountB >= newBalanceB))
534533 then throwInsufficientAvailableBalance(amountWithFee, availableBalanceB, assetNameB)
535534 else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
536535 }
537536 else if ((pmtAssetId == assetIdB))
538537 then {
539538 let assetIdSend = assetIdA
540- let $t02158521676 = calculateFees(balanceB, balanceA)
541- let amountWithoutFee = $t02158521676._1
542- let amountWithFee = $t02158521676._2
543- let governanceReward = $t02158521676._3
539+ let $t02147421565 = calculateFees(balanceB, balanceA)
540+ let amountWithoutFee = $t02147421565._1
541+ let amountWithFee = $t02147421565._2
542+ let governanceReward = $t02147421565._3
544543 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
545544 let newBalanceB = (balanceB + pmtAmount)
546545 if (if ((stakedAmountA >= newBalanceA))
547546 then true
548547 else (stakedAmountB >= newBalanceB))
549548 then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
550549 else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
551550 }
552551 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
553552 }
554553
555554
556555
557556 @Callable(i)
558557 func shutdown () = if (!(isActive))
559558 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
560559 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
561560 then throw("Only admin can call this function")
562561 else suspend("Paused by admin")
563562
564563
565564
566565 @Callable(i)
567566 func activate () = if (isActive)
568567 then throw("DApp is already active")
569568 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
570569 then throw("Only admin can call this function")
571570 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
572571
573572
574573
575574 @Callable(i)
576575 func takeIntoAccountExtraFunds (amountLeave) = {
577576 let uncountableAmountEnrollAssetA = (accountBalanceWithStakedA - balanceA)
578577 let uncountableAmountEnrollAssetB = (accountBalanceWithStakedB - balanceB)
579578 let amountEnrollA = (uncountableAmountEnrollAssetA - (if ((assetIdA == unit))
580579 then amountLeave
581580 else 0))
582581 let amountEnrollB = (uncountableAmountEnrollAssetB - (if ((assetIdB == unit))
583582 then amountLeave
584583 else 0))
585584 if (!(isActive))
586585 then throw("DApp is inactive at this moment")
587586 else if ((i.caller != this))
588587 then throw("Only the DApp itself can call this function")
589588 else if ((0 > amountLeave))
590589 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
591590 else if (if ((0 > uncountableAmountEnrollAssetA))
592591 then true
593592 else (0 > uncountableAmountEnrollAssetB))
594593 then suspend("Enroll amount negative")
595594 else if (if ((0 > amountEnrollA))
596595 then true
597596 else (0 > amountEnrollB))
598597 then throw("Too large amountLeave")
599598 else [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
600599 }
601600
602601
603602
604603 @Callable(i)
605604 func enableFirstHarvest () = [BooleanEntry(keyFirstHarvest, true), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]
606605
607606
608607 @Verifier(tx)
609608 func verify () = {
610609 let multiSignedByAdmins = {
611610 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
612611 then 1
613612 else 0
614613 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
615614 then 1
616615 else 0
617616 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
618617 then 1
619618 else 0
620619 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
621620 }
622621 match tx {
623622 case inv: InvokeScriptTransaction =>
624623 let callTakeIntoAccount = if ((inv.dApp == this))
625624 then (inv.function == "takeIntoAccountExtraFunds")
626625 else false
627626 let callEnableFirstHarvest = if ((inv.dApp == this))
628627 then (inv.function == "enableFirstHarvest")
629628 else false
630629 let callStaking = if (if ((inv.dApp == stakingUSDNNSBTAddress))
631630 then if (if (if ((inv.function == "lockNeutrino"))
632631 then (size(inv.payments) == 1)
633632 else false)
634633 then if ((inv.payments[0].assetId == USDN))
635634 then true
636635 else (inv.payments[0].assetId == NSBT)
637636 else false)
638637 then true
639638 else if ((inv.function == "unlockNeutrino"))
640639 then (size(inv.payments) == 0)
641640 else false
642641 else false)
643642 then true
644643 else if ((inv.dApp == stakingEURNAddress))
645644 then if (if (if ((inv.function == "startStaking"))
646645 then (size(inv.payments) == 1)
647646 else false)
648647 then (inv.payments[0].assetId == EURN)
649648 else false)
650649 then true
651650 else if ((inv.function == "stopStaking"))
652651 then (size(inv.payments) == 0)
653652 else false
654653 else false
655654 let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
656655 then (inv.function == "exchange")
657656 else false)
658657 then (assetIdA == USDN)
659658 else false)
660659 then true
661660 else if (if ((assetIdB == USDN))
662661 then (size(inv.payments) == 1)
663662 else false)
664663 then (inv.payments[0].assetId == USDN)
665664 else false
666665 let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
667666 then (inv.function == "exchange")
668667 else false)
669668 then (assetIdA == NSBT)
670669 else false)
671670 then true
672671 else if (if ((assetIdB == NSBT))
673672 then (size(inv.payments) == 1)
674673 else false)
675674 then (inv.payments[0].assetId == USDN)
676675 else false
677676 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
678677 then true
679678 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
680679 then true
681680 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
682681 then true
683682 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
684683 if (if (if (if (if (if (callTakeIntoAccount)
685684 then true
686685 else callEnableFirstHarvest)
687686 then true
688687 else callStaking)
689688 then true
690689 else exchangeToWaves)
691690 then true
692691 else exchangeToNSBTs)
693692 then signedByAdmin
694693 else false)
695694 then true
696695 else multiSignedByAdmins
697696 case _ =>
698697 multiSignedByAdmins
699698 }
700699 }
701700

github/deemru/w8io/873ac7e 
83.88 ms