tx · CP3B6voJ9BFaP5Jh1n1vU3yEQotepaAo51KovJSysVj 3N3UHNYQ8xwe2WWLKgXX628JyUtF6kYK4wS: -0.01400000 Waves 2020.11.03 11:10 [1248857] smart account 3N3UHNYQ8xwe2WWLKgXX628JyUtF6kYK4wS > SELF 0.00000000 Waves
{ "type": 13, "id": "CP3B6voJ9BFaP5Jh1n1vU3yEQotepaAo51KovJSysVj", "fee": 1400000, "feeAssetId": null, "timestamp": 1604391035133, "version": 1, "sender": "3N3UHNYQ8xwe2WWLKgXX628JyUtF6kYK4wS", "senderPublicKey": "Hxyif8HnnHh34SZ7PZewDcNUgrZfHNJsQvLNCcPbCW27", "proofs": [ "5tZNBLcY8WDP36hN1iTTqNaz8kfXvLvHFbxfN7s6Xsdmdh6Hh1YYcUbb7uAu3CgvA3VaSkMCmhL8BerLEj3QGAw7" ], "script": "base64:AAIEAAAAAAAAADwIAhIKCggICAEIAQEICBIRCg8ICAEIAQgBAQEBAQEBAQESAwoBCBIDCgEIEgQKAggBEgQKAggIEgMKAQgAAABpAQAAABZjb252ZXJ0SnNvbkFycmF5VG9MaXN0AAAAAgAAAAlqc29uQXJyYXkAAAALc3BsaXRTeW1ib2wJAAS1AAAAAgUAAAAJanNvbkFycmF5BQAAAAtzcGxpdFN5bWJvbAEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkCAAAAAAEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwUAAAADa2V5BwAAAAADU0VQAgAAAAJfXwAAAAAMa2V5QXNzZXRDb2RlAAAAAAAAAAABAAAAAAprZXlBc3NldElkAAAAAAAAAAACAAAAAA5rZXlBc3NldFN0YXR1cwAAAAAAAAAAAwAAAAAVa2V5QXNzZXRQcmljZURlY2ltYWxzAAAAAAAAAAAEAAAAABNrZXlBc3NldEJha2luZ0Fzc2V0AAAAAAAAAAAFAAAAABtrZXlPdmVyY29sbGF0ZXJhbFBlcmNlbnRhZ2UAAAAAAAAAAAYAAAAACmtleU1pblBvb2wAAAAAAAAAAAcAAAAAFWtleVByaWNlT3JhY2xlQWRkcmVzcwAAAAAAAAAACAAAAAAQa2V5TWluQnV5UGF5bWVudAAAAAAAAAAACQAAAAARa2V5TWluU2VsbFBheW1lbnQAAAAAAAAAAAoAAAAAEmtleUJ1eUxvY2tJbnRlcnZhbAAAAAAAAAAACwAAAAATa2V5U2VsbExvY2tJbnRlcnZhbAAAAAAAAAAADAAAAAAJa2V5QnV5RmVlAAAAAAAAAAANAAAAAAprZXlTZWxsRmVlAAAAAAAAAAAOAAAAABhrZXlQb29sUmVkZW1wdGlvblRpbWVvdXQAAAAAAAAAAA8AAAAAIWtleVdlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAAAAAAAAAAAEAAAAAAOYWRtaW5QdWJsaWNLZXkCAAAALEcxRWJ1NUFNSGFUSkZFYlpOa1pRY0pGVVE5S2ZpWVV3dXB5TEc4NTdEY0ZyAAAAABpuZXV0cmlub0NvbnRyYWN0QWRkcmVzc0tleQIAAAArJXMlc19fY29tbW9uQ29uZmlnX19uZXV0cmlub0NvbnRyYWN0QWRkcmVzcwAAAAAZbmV1dHJpbm9TdGFraW5nQWRkcmVzc0tleQIAAAAqJXMlc19fY29tbW9uQ29uZmlnX19uZXV0cmlub1N0YWtpbmdBZGRyZXNzAAAAABttaW5pbXVuUG9vbEZ1bmRpbmdBbW91bnRLZXkCAAAALCVzJXNfX2NvbW1vbkNvbmZpZ19fbWluaW11bVBvb2xGdW5kaW5nQW1vdW50AAAAABBpc0luaXRpYWxpemVkS2V5AgAAAB8lcyVzX19jb21tb25Db25maWdfX2luaXRpYWxpemVkAAAAABRjdXJyZW50QXNzZXRJbmRleEtleQIAAAAvJXMlc19fY29tbW9uQ29uZmlnX19wcmVkZWZpbmVkQXNzZXRzQWN0aXZlSW5kZXgAAAAAFGFzc2V0c0FkZHJlc3NMaXN0S2V5AgAAACglcyVzX19jb21tb25Db25maWdfX3ByZWRlZmluZWRBc3NldHNMaXN0AAAAAA5kZWJ0VG9rZW5JZEtleQIAAAAfJXMlc19fY29tbW9uQ29uZmlnX19kZWJ0QXNzZXRJZAAAAAAZZGVidFRva2VuRXRhbG9uQmFsYW5jZUtleQIAAAAqJXMlc19fY29tbW9uQ29uZmlnX19kZWJ0QXNzZXRFdGFsb25CYWxhbmNlAAAAABVkZWZvU3Rha2luZ0FkZHJlc3NLZXkCAAAAJiVzJXNfX2NvbW1vbkNvbmZpZ19fZGVmb1N0YWtpbmdBZGRyZXNzAAAAABpkZWZvU3Rha2luZ1BhY2VtYWtlclB1YktleQIAAAArJXMlc19fY29tbW9uQ29uZmlnX19kZWZvU3Rha2luZ1BhY2VtYWtlclB1YgAAAAAWbWluUG9vbEludmVzdEFtb3VudEtleQIAAAAnJXMlc19fY29tbW9uQ29uZmlnX19taW5Qb29sSW52ZXN0QW1vdW50AAAAABJuZXV0cmlub0Fzc2V0SWRLZXkCAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAAAAAA5uc2J0QXNzZXRJZEtleQIAAAANYm9uZF9hc3NldF9pZAAAAAAObmV1dHJpbm9ScGRLZXkCAAAADHJwZF9jb250cmFjdAAAAAAOZGVmb0Fzc2V0SWRLZXkCAAAADyVzX19kZWZvQXNzZXRJZAAAAAAVc2V0QXNzZXRTY3JpcHRUeElkS2V5AgAAABMlc19fYXNzZXRTY3JpcHRUeElkAQAAABFnZXRBc3NldENvbmZpZ0tleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAATJXMlcyVzX19kZWZvQXNzZXRfXwUAAAAMYXNzZXRBZGRyZXNzAgAAAAhfX2NvbmZpZwEAAAAQZ2V0QXNzZXRQcmljZUtleQAAAAEAAAAJYXNzZXRDb2RlCQABLAAAAAICAAAAEiVzJXNfX2Fzc2V0UHJpY2VfXwUAAAAJYXNzZXRDb2RlAQAAABVnZXRBc3NldEluaXRIZWlnaHRLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAADGFzc2V0QWRkcmVzcwIAAAAMX19pbml0SGVpZ2h0AQAAABlnZXRBc3NldEFjdGl2YXRlSGVpZ2h0S2V5AAAAAQAAAAxhc3NldEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAABMlcyVzJXNfX2RlZm9Bc3NldF9fBQAAAAxhc3NldEFkZHJlc3MCAAAAEF9fYWN0aXZhdGVIZWlnaHQBAAAAHWdldEFzc2V0Q3VycnJlbnRQb29sQW1vdW50S2V5AAAAAQAAAAxhc3NldEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAABMlcyVzJXNfX2RlZm9Bc3NldF9fBQAAAAxhc3NldEFkZHJlc3MCAAAADV9fY3VycmVudFBvb2wBAAAAGGdldEFzc2V0TWF4UG9vbEFtb3VudEtleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAATJXMlcyVzX19kZWZvQXNzZXRfXwUAAAAMYXNzZXRBZGRyZXNzAgAAAAlfX21heFBvb2wBAAAAD2dldEFzc2V0TWV0YUtleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAATJXMlcyVzX19kZWZvQXNzZXRfXwUAAAAMYXNzZXRBZGRyZXNzAgAAAAZfX21ldGEBAAAAFWdldEFzc2V0UG9vbE1ha2Vyc0tleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAATJXMlcyVzX19kZWZvQXNzZXRfXwUAAAAMYXNzZXRBZGRyZXNzAgAAAAxfX3Bvb2xNYWtlcnMBAAAAGGdldEFzc2V0QWRkcmVzc0J5Q29kZUtleQAAAAEAAAAJYXNzZXRDb2RlCQABLAAAAAIJAAEsAAAAAgIAAAATJXMlcyVzX19kZWZvQXNzZXRfXwUAAAAJYXNzZXRDb2RlAgAAABRfX2FkZHJlc3NCeUFzc2V0Q29kZQEAAAAbZ2V0QXNzZXRBZGRyZXNzQnlBc3NldElkS2V5AAAAAQAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgIAAAATJXMlcyVzX19kZWZvQXNzZXRfXwUAAAAHYXNzZXRJZAIAAAASX19hZGRyZXNzQnlBc3NldElkAQAAACJnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uQW1vdW50S2V5AAAAAgAAAAxhc3NldEFkZHJlc3MAAAAQcG9vbE1ha2VyQWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAADiVzJXMlcyVzX19wb29sCQAETAAAAAIFAAAADGFzc2V0QWRkcmVzcwkABEwAAAACBQAAABBwb29sTWFrZXJBZGRyZXNzCQAETAAAAAICAAAABmFtb3VudAUAAAADbmlsBQAAAANTRVABAAAAJWdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25NYXhBbW91bnRLZXkAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAOJXMlcyVzJXNfX3Bvb2wJAARMAAAAAgUAAAAMYXNzZXRBZGRyZXNzCQAETAAAAAIFAAAAEHBvb2xNYWtlckFkZHJlc3MJAARMAAAAAgIAAAAJbWF4QW1vdW50BQAAAANuaWwFAAAAA1NFUAEAAAAbZ2V0UG9vbE1ha2VyTG9ja2VkQW1vdW50S2V5AAAAAgAAAAxhc3NldEFkZHJlc3MAAAAQcG9vbE1ha2VyQWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAADiVzJXMlcyVzX19wb29sCQAETAAAAAIFAAAADGFzc2V0QWRkcmVzcwkABEwAAAACBQAAABBwb29sTWFrZXJBZGRyZXNzCQAETAAAAAICAAAADGxvY2tlZEFtb3VudAUAAAADbmlsBQAAAANTRVABAAAAG2dldFBvb2xNYWtlclVubG9ja0hlaWdodEtleQAAAAIAAAAMYXNzZXRBZGRyZXNzAAAAEHBvb2xNYWtlckFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAAAA4lcyVzJXMlc19fcG9vbAkABEwAAAACBQAAAAxhc3NldEFkZHJlc3MJAARMAAAAAgUAAAAQcG9vbE1ha2VyQWRkcmVzcwkABEwAAAACAgAAAAx1bmxvY2tIZWlnaHQFAAAAA25pbAUAAAADU0VQAQAAAB9nZXRQb29sTWFrZXJMaXF1aWRpdHlSZXF1ZXN0S2V5AAAAAwAAAAxhc3NldEFkZHJlc3MAAAAQcG9vbE1ha2VyQWRkcmVzcwAAAAFoCQAEuQAAAAIJAARMAAAAAgIAAAAQJXMlcyVzJWQlc19fcG9vbAkABEwAAAACBQAAAAxhc3NldEFkZHJlc3MJAARMAAAAAgUAAAAQcG9vbE1ha2VyQWRkcmVzcwkABEwAAAACCQABpAAAAAEFAAAAAWgJAARMAAAAAgIAAAAQbGlxdWlkaXR5UmVxdWVzdAUAAAADbmlsBQAAAANTRVABAAAAG2dldFBvb2xUb3RhbExvY2tlZEFtb3VudEtleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAMJXMlcyVzX19wb29sCQAETAAAAAIFAAAADGFzc2V0QWRkcmVzcwkABEwAAAACAgAAABF0b3RhbExvY2tlZEFtb3VudAUAAAADbmlsBQAAAANTRVABAAAAE2dldEFzc2V0Q29uZmlnQXJyYXkAAAABAAAADGFzc2V0QWRkcmVzcwkBAAAAFmNvbnZlcnRKc29uQXJyYXlUb0xpc3QAAAACCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAQAAABhnZXRTdHJpbmdCeUFkZHJlc3NBbmRLZXkAAAACBQAAAAR0aGlzCQEAAAARZ2V0QXNzZXRDb25maWdLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAAA5ObyBERUZPIEFzc2V0IAUAAAAMYXNzZXRBZGRyZXNzAgAAAA5jb25maWcgcHJlc2VudAIAAAACX18AAAAADW11bHRpcGxpY2F0b3IAAAAAAAAPQkAAAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAABpuZXV0cmlub0NvbnRyYWN0QWRkcmVzc0tleQIAAAAfTm8gbmV1dHJpbm8gY29udHJhY3Qgc3BlY2lmaWVkLgAAAAASbmV1dHJpbm9Bc3NldElkU3RyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAASbmV1dHJpbm9Bc3NldElkS2V5AgAAABdObyBVU0ROIGFzc2V0IGlkIGZvdW5kLgAAAAAPbmV1dHJpbm9Bc3NldElkCQACWQAAAAEFAAAAEm5ldXRyaW5vQXNzZXRJZFN0cgAAAAALbnNidEFzc2V0SWQJAAJZAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAADm5zYnRBc3NldElkS2V5AgAAABZObyBOU0JUIGFzc2V0IGlkIGZvdW5kAAAAABJtaW5pbXVtUG9vbEZ1bmRpbmcJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABttaW5pbXVuUG9vbEZ1bmRpbmdBbW91bnRLZXkCAAAALU1pbmltdW0gcG9vbCBmdW5kaW5nIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLgAAAAATbWluUG9vbEludmVzdEFtb3VudAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABZtaW5Qb29sSW52ZXN0QW1vdW50S2V5CQAAaAAAAAIAAAAAAAAAAAoFAAAADW11bHRpcGxpY2F0b3IAAAAADUFTU0V0UFJPUE9TRUQCAAAACFBST1BPU0VEAAAAAApBU1NFdFJFQURZAgAAAAVSRUFEWQAAAAALQVNTRXRJU1NVRUQCAAAABklTU1VFRAAAAAALYXNzZXRTdGF0dXMJAAUVAAAAAwUAAAANQVNTRXRQUk9QT1NFRAUAAAAKQVNTRXRSRUFEWQUAAAALQVNTRXRJU1NVRUQAAAAAGHByZWRlZmluZWRBc3NldENvbnRyYWN0cwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAFGFzc2V0c0FkZHJlc3NMaXN0S2V5AgAAAC1ObyBwb29sIG9mIHByZWRlcGxveWVkIGFzc2V0IGNvbnRyYWN0cyBmb3VuZC4AAAAAFHByZWRlZmluZWRBc3NldHNMaXN0CQEAAAAWY29udmVydEpzb25BcnJheVRvTGlzdAAAAAIFAAAAGHByZWRlZmluZWRBc3NldENvbnRyYWN0cwIAAAABLAAAAAARY3VycmVudEFzc2V0SW5kZXgJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAUY3VycmVudEFzc2V0SW5kZXhLZXkAAAAAAAAAAAAAAAAACWRlYnRUb2tlbgkAAlkAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAOZGVidFRva2VuSWRLZXkCAAAAE05vIGRlYnQgdG9rZW4gZm91bmQAAAAAFmRlYnRUb2tlblJlaXNzdWVBbW91bnQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAZZGVidFRva2VuRXRhbG9uQmFsYW5jZUtleQAAAAAAAAAAAAAAAAATbmV1dHJpbm9ScGRDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAObmV1dHJpbm9ScGRLZXkBAAAAFWdldE5ldXRyaW5vUnBkQmFsYW5jZQAAAAEAAAALdXNlckFkZHJlc3MEAAAAFnVzZXJOZXV0cmlub1JwZEJhbGFuY2UJAAS5AAAAAgkABEwAAAACAgAAAAtycGRfYmFsYW5jZQkABEwAAAACBQAAABJuZXV0cmlub0Fzc2V0SWRTdHIJAARMAAAAAgUAAAALdXNlckFkZHJlc3MFAAAAA25pbAIAAAABXwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAABNuZXV0cmlub1JwZENvbnRyYWN0BQAAABZ1c2VyTmV1dHJpbm9ScGRCYWxhbmNlAAAAAAAAAAAAAQAAABVnZXRBc3NldEFkZHJlc3NCeUNvZGUAAAABAAAAC2Fzc2V0U3ltYm9sCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAQAAABhnZXRBc3NldEFkZHJlc3NCeUNvZGVLZXkAAAABBQAAAAthc3NldFN5bWJvbAIAAAAAAQAAABtnZXRBc3NldEFkZHJlc3NCeUNvZGVPckZhaWwAAAABAAAAC2Fzc2V0U3ltYm9sCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwkBAAAAGGdldEFzc2V0QWRkcmVzc0J5Q29kZUtleQAAAAEFAAAAC2Fzc2V0U3ltYm9sCQABLAAAAAIJAAEsAAAAAgIAAAAdQ2Fubm90IGZpbmQgYXNzZXQgYWRkcmVzcyBieSAFAAAAC2Fzc2V0U3ltYm9sAgAAAAUgY29kZQEAAAAMZ2V0QXNzZXRDb2RlAAAAAQAAAAthc3NldENvbmZpZwkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAMa2V5QXNzZXRDb2RlAQAAAApnZXRBc3NldElEAAAAAQAAAAthc3NldENvbmZpZwkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAKa2V5QXNzZXRJZAEAAAAOZ2V0QXNzZXRTdGF0dXMAAAABAAAAC2Fzc2V0Q29uZmlnCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAAA5rZXlBc3NldFN0YXR1cwEAAAAVZ2V0QXNzZXRQcmljZURlY2ltYWxzAAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABVrZXlBc3NldFByaWNlRGVjaW1hbHMBAAAAFWdldEFzc2V0QmFraW5nQXNzZXRJZAAAAAEAAAALYXNzZXRDb25maWcJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAAE2tleUFzc2V0QmFraW5nQXNzZXQBAAAAHWdldEFzc2V0T3ZlckNvbGxhdGVyYWxQZXJjZW50AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABtrZXlPdmVyY29sbGF0ZXJhbFBlcmNlbnRhZ2UBAAAAHWdldEFzc2V0TWluUmVxdWlyZWRQb29sQW1vdW50AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAAAprZXlNaW5Qb29sAQAAABpnZXRBc3NldFByaWNlT3JhY2xlQWRkcmVzcwAAAAEAAAALYXNzZXRDb25maWcJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAAFWtleVByaWNlT3JhY2xlQWRkcmVzcwEAAAAYZ2V0TWluQnV5UGF5bWVudFBlckFzc2V0AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABBrZXlNaW5CdXlQYXltZW50AQAAABlnZXRNaW5TZWxsUGF5bWVudFBlckFzc2V0AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABFrZXlNaW5TZWxsUGF5bWVudAEAAAAaZ2V0QnV5TG9ja0ludGVydmFsUGVyQXNzZXQAAAABAAAAC2Fzc2V0Q29uZmlnCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAAEmtleUJ1eUxvY2tJbnRlcnZhbAEAAAAbZ2V0U2VsbExvY2tJbnRlcnZhbFBlckFzc2V0AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABNrZXlTZWxsTG9ja0ludGVydmFsAQAAABFnZXRCdXlGZWVQZXJBc3NldAAAAAEAAAALYXNzZXRDb25maWcJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAJa2V5QnV5RmVlAQAAABJnZXRTZWxsRmVlUGVyQXNzZXQAAAABAAAAC2Fzc2V0Q29uZmlnCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAACmtleVNlbGxGZWUBAAAAGmdldFJlZGVtcHRpb25UaW1lb3V0QmxvY2tzAAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABhrZXlQb29sUmVkZW1wdGlvblRpbWVvdXQBAAAAIWdldFdlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAAAAAEAAAALYXNzZXRDb25maWcJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAha2V5V2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50AQAAABJnZXRBc3NldFBvb2xNYWtlcnMAAAABAAAADGFzc2V0QWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAAVZ2V0QXNzZXRQb29sTWFrZXJzS2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzAgAAAAABAAAAEmdldEFzc2V0SW5pdEhlaWdodAAAAAEAAAAMYXNzZXRBZGRyZXNzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABVnZXRBc3NldEluaXRIZWlnaHRLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MAAAAAAAAAAAABAAAAFmdldEFzc2V0QWN0aXZhdGVIZWlnaHQAAAABAAAADGFzc2V0QWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAZZ2V0QXNzZXRBY3RpdmF0ZUhlaWdodEtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwAAAAAAAAAAAAEAAAAZZ2V0QXNzZXRDdXJyZW50UG9vbEFtb3VudAAAAAEAAAAMYXNzZXRBZGRyZXNzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAB1nZXRBc3NldEN1cnJyZW50UG9vbEFtb3VudEtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwAAAAAAAAAAAAEAAAAVZ2V0QXNzZXRNYXhQb29sQW1vdW50AAAAAQAAAAxhc3NldEFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAGGdldEFzc2V0TWF4UG9vbEFtb3VudEtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwAAAAAAAAAAAAEAAAAMZ2V0QXNzZXRNZXRhAAAAAQAAAAxhc3NldEFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwkBAAAAD2dldEFzc2V0TWV0YUtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwIAAAAAAQAAAB9nZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uQW1vdW50AAAAAgAAAAxhc3NldEFkZHJlc3MAAAAQcG9vbE1ha2VyQWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAiZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudEtleQAAAAIFAAAADGFzc2V0QWRkcmVzcwUAAAAQcG9vbE1ha2VyQWRkcmVzcwAAAAAAAAAAAAEAAAAiZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbk1heEFtb3VudAAAAAIAAAAMYXNzZXRBZGRyZXNzAAAAEHBvb2xNYWtlckFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAJWdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25NYXhBbW91bnRLZXkAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAAEHBvb2xNYWtlckFkZHJlc3MAAAAAAAAAAAABAAAAGGdldFBvb2xNYWtlckxvY2tlZEFtb3VudAAAAAIAAAAMYXNzZXRBZGRyZXNzAAAAEHBvb2xNYWtlckFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAG2dldFBvb2xNYWtlckxvY2tlZEFtb3VudEtleQAAAAIFAAAADGFzc2V0QWRkcmVzcwUAAAAQcG9vbE1ha2VyQWRkcmVzcwAAAAAAAAAAAAEAAAAYZ2V0UG9vbE1ha2VyVW5sb2NrSGVpZ2h0AAAAAgAAAAxhc3NldEFkZHJlc3MAAAAQcG9vbE1ha2VyQWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAbZ2V0UG9vbE1ha2VyVW5sb2NrSGVpZ2h0S2V5AAAAAgUAAAAMYXNzZXRBZGRyZXNzBQAAABBwb29sTWFrZXJBZGRyZXNzAAAAAAAAAAAAAQAAAA1nZXRBc3NldFByaWNlAAAAAgAAABJwcmljZU9yYWNsZUFkZHJlc3MAAAAJYXNzZXRDb2RlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAScHJpY2VPcmFjbGVBZGRyZXNzCQEAAAAQZ2V0QXNzZXRQcmljZUtleQAAAAEFAAAACWFzc2V0Q29kZQIAAAAUTm8gQXNzZXQgcHJpY2UgZm91bmQBAAAAGGdldFBvb2xUb3RhbExvY2tlZEFtb3VudAAAAAEAAAAMYXNzZXRBZGRyZXNzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABtnZXRQb29sVG90YWxMb2NrZWRBbW91bnRLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MAAAAAAAAAAAABAAAAH2NvbXBvc2VBc3NldENvbmZpZ3VyYXRpb25TdHJpbmcAAAAQAAAACWFzc2V0Q29kZQAAAAdhc3NldElkAAAAC2Fzc2V0U3RhdHVzAAAADXByaWNlRGVjaW1hbHMAAAAOYmFja2luZ0Fzc2V0SWQAAAAVb3ZlckNvbGxhdGVyYWxQZXJjZW50AAAAB21pblBvb2wAAAAScHJpY2VPcmFjbGVBZGRyZXNzAAAADW1pbkJ1eVBheW1lbnQAAAAObWluU2VsbFBheW1lbnQAAAAPYnV5TG9ja0ludGVydmFsAAAAEHNlbGxMb2NrSW50ZXJ2YWwAAAAGYnV5RmVlAAAAB3NlbGxGZWUAAAAVcG9vbFJlZGVtcHRpb25UaW1lb3V0AAAAHndlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAkABLkAAAACCQAETAAAAAICAAAAHiVzJXMlcyVkJXMlZCVkJXMlZCVkJWQlZCVkJWQlZAkABEwAAAACBQAAAAlhc3NldENvZGUJAARMAAAAAgUAAAAHYXNzZXRJZAkABEwAAAACBQAAAAthc3NldFN0YXR1cwkABEwAAAACCQABpAAAAAEFAAAADXByaWNlRGVjaW1hbHMJAARMAAAAAgUAAAAOYmFja2luZ0Fzc2V0SWQJAARMAAAAAgkAAaQAAAABBQAAABVvdmVyQ29sbGF0ZXJhbFBlcmNlbnQJAARMAAAAAgkAAaQAAAABBQAAAAdtaW5Qb29sCQAETAAAAAIFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwkABEwAAAACCQABpAAAAAEFAAAADW1pbkJ1eVBheW1lbnQJAARMAAAAAgkAAaQAAAABBQAAAA5taW5TZWxsUGF5bWVudAkABEwAAAACCQABpAAAAAEFAAAAD2J1eUxvY2tJbnRlcnZhbAkABEwAAAACCQABpAAAAAEFAAAAEHNlbGxMb2NrSW50ZXJ2YWwJAARMAAAAAgkAAaQAAAABBQAAAAZidXlGZWUJAARMAAAAAgkAAaQAAAABBQAAAAdzZWxsRmVlCQAETAAAAAIJAAGkAAAAAQUAAAAVcG9vbFJlZGVtcHRpb25UaW1lb3V0CQAETAAAAAIJAAGkAAAAAQUAAAAed2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50BQAAAANuaWwCAAAAAl9fAQAAABR1cGRhdGVBc3NldENmZ1N0YXR1cwAAAAIAAAAJbmV3U3RhdHVzAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAABWFDb2RlCQEAAAAMZ2V0QXNzZXRDb2RlAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAADYUlECQEAAAAKZ2V0QXNzZXRJRAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAADmFQcmljZURlY2ltYWxzCQEAAAAVZ2V0QXNzZXRQcmljZURlY2ltYWxzAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAOYUJha2luZ0Fzc2V0SWQJAQAAABVnZXRBc3NldEJha2luZ0Fzc2V0SWQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAABZhT3ZlckNvbGxhdGVyYWxQZXJjZW50CQEAAAAdZ2V0QXNzZXRPdmVyQ29sbGF0ZXJhbFBlcmNlbnQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAABBhTWluUmVxdWlyZWRQb29sCQEAAAAdZ2V0QXNzZXRNaW5SZXF1aXJlZFBvb2xBbW91bnQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAABNhUHJpY2VPcmFjbGVBZGRyZXNzCQEAAAAaZ2V0QXNzZXRQcmljZU9yYWNsZUFkZHJlc3MAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAA5hTWluQnV5UGF5bWVudAkBAAAAGGdldE1pbkJ1eVBheW1lbnRQZXJBc3NldAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAAD2FNaW5TZWxsUGF5bWVudAkBAAAAGWdldE1pblNlbGxQYXltZW50UGVyQXNzZXQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAABBhQnV5TG9ja0ludGVydmFsCQEAAAAaZ2V0QnV5TG9ja0ludGVydmFsUGVyQXNzZXQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAABFhU2VsbExvY2tJbnRlcnZhbAkBAAAAG2dldFNlbGxMb2NrSW50ZXJ2YWxQZXJBc3NldAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAAB2FCdXlGZWUJAQAAABFnZXRCdXlGZWVQZXJBc3NldAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAACGFTZWxsRmVlCQEAAAASZ2V0U2VsbEZlZVBlckFzc2V0AAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAYYVJlZGVtcHRpb25UaW1lb3V0QmxvY2tzCQEAAAAaZ2V0UmVkZW1wdGlvblRpbWVvdXRCbG9ja3MAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAB53ZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQJAQAAACFnZXRXZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0CQEAAAAfY29tcG9zZUFzc2V0Q29uZmlndXJhdGlvblN0cmluZwAAABAFAAAABWFDb2RlBQAAAANhSUQFAAAACW5ld1N0YXR1cwUAAAAOYVByaWNlRGVjaW1hbHMFAAAADmFCYWtpbmdBc3NldElkBQAAABZhT3ZlckNvbGxhdGVyYWxQZXJjZW50BQAAABBhTWluUmVxdWlyZWRQb29sBQAAABNhUHJpY2VPcmFjbGVBZGRyZXNzBQAAAA5hTWluQnV5UGF5bWVudAUAAAAPYU1pblNlbGxQYXltZW50BQAAABBhQnV5TG9ja0ludGVydmFsBQAAABFhU2VsbExvY2tJbnRlcnZhbAUAAAAHYUJ1eUZlZQUAAAAIYVNlbGxGZWUFAAAAGGFSZWRlbXB0aW9uVGltZW91dEJsb2NrcwUAAAAed2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50AQAAABljYWxjQWxsb3dlZEFtb3VudFRvUmVkZWVtAAAAAgAAAAlhc3NldENvZGUAAAAQcG9vbE1ha2VyQWRkcmVzcwQAAAAPYXNzZXRBZGRyZXNzU3RyCQEAAAAbZ2V0QXNzZXRBZGRyZXNzQnlDb2RlT3JGYWlsAAAAAQUAAAAJYXNzZXRDb2RlBAAAAAxhc3NldEFkZHJlc3MJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgQAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAkBAAAAE2dldEFzc2V0Q29uZmlnQXJyYXkAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIEAAAACmFzc2V0SWRTdHIJAQAAAApnZXRBc3NldElEAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAHYXNzZXRJZAkAAlkAAAABBQAAAAphc3NldElkU3RyBAAAAA5wb29sQWN0dWFsU2l6ZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAdZ2V0QXNzZXRDdXJycmVudFBvb2xBbW91bnRLZXkAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIAAAAAAAAAAAAEAAAAC3Bvb2xNYXhTaXplCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABhnZXRBc3NldE1heFBvb2xBbW91bnRLZXkAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIAAAAAAAAAAAAEAAAAGHBvb2xUb3RhbExvY2tlZEFtb3VudEtleQkBAAAAG2dldFBvb2xUb3RhbExvY2tlZEFtb3VudEtleQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgQAAAAPcG9vbFRvdGFsTG9ja2VkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAGHBvb2xUb3RhbExvY2tlZEFtb3VudEtleQAAAAAAAAAAAAQAAAAVYXNzZXRVc2RuU3Rha2VkQW1vdW50CQEAAAAVZ2V0TmV1dHJpbm9ScGRCYWxhbmNlAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyBAAAABZhc3NldFVzZG5CYWxhbmNlQW1vdW50CQAD8AAAAAIFAAAADGFzc2V0QWRkcmVzcwUAAAAPbmV1dHJpbm9Bc3NldElkBAAAABRhc3NldFRvdGFsVXNkbkFtb3VudAkAAGUAAAACCQAAZAAAAAIFAAAAFWFzc2V0VXNkblN0YWtlZEFtb3VudAUAAAAWYXNzZXRVc2RuQmFsYW5jZUFtb3VudAUAAAAPcG9vbFRvdGFsTG9ja2VkBAAAAAt1Y29sbGF0ZXJhbAkAAGUAAAACBQAAABRhc3NldFRvdGFsVXNkbkFtb3VudAUAAAAOcG9vbEFjdHVhbFNpemUEAAAAEGRlZm9Bc3NldEJhbGFuY2UJAAPwAAAAAgUAAAAMYXNzZXRBZGRyZXNzBQAAAAdhc3NldElkBAAAABJhc3NldEVtaXNzaW9uRGlydHkICQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAPsAAAAAQUAAAAHYXNzZXRJZAkAASwAAAACAgAAABhDYW5ub3QgZmluZCBhc3NldCBieSBpZCAFAAAACmFzc2V0SWRTdHIAAAAIcXVhbnRpdHkEAAAADWFzc2V0RW1pc3Npb24JAABlAAAAAgUAAAASYXNzZXRFbWlzc2lvbkRpcnR5BQAAABBkZWZvQXNzZXRCYWxhbmNlBAAAABJwcmljZU9yYWNsZUFkZHJlc3MJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAABpnZXRBc3NldFByaWNlT3JhY2xlQWRkcmVzcwAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAADGN1cnJlbnRQcmljZQkBAAAADWdldEFzc2V0UHJpY2UAAAACBQAAABJwcmljZU9yYWNsZUFkZHJlc3MFAAAACWFzc2V0Q29kZQQAAAAbcHJpY2VXaXRoT3ZlcmNvbGxhdGVyYWxSYXRlCQAAaQAAAAIJAABoAAAAAgkAAGQAAAACBQAAAA1tdWx0aXBsaWNhdG9yCQEAAAAdZ2V0QXNzZXRPdmVyQ29sbGF0ZXJhbFBlcmNlbnQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BQAAAAxjdXJyZW50UHJpY2UFAAAADW11bHRpcGxpY2F0b3IEAAAAGXVzZG5OZWVkZWRUb0NvdmVyRW1pc3Npb24JAABoAAAAAgUAAAAbcHJpY2VXaXRoT3ZlcmNvbGxhdGVyYWxSYXRlBQAAAA1hc3NldEVtaXNzaW9uBAAAABJwb29sTWFrZXJNYXhBbW91bnQJAQAAACJnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uTWF4QW1vdW50AAAAAgUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAABBwb29sTWFrZXJBZGRyZXNzBAAAAB9wb29sTWFrZXJQYXJ0aWNpcGF0aW9uQW1vdW50S2V5CQEAAAAiZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudEtleQAAAAIFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAAQcG9vbE1ha2VyQWRkcmVzcwQAAAAVcG9vbE1ha2VyQWN0dWFsQW1vdW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAH3Bvb2xNYWtlclBhcnRpY2lwYXRpb25BbW91bnRLZXkAAAAAAAAAAAAEAAAAFXBvb2xNYWtlckxvY2tlZEFtb3VudAkBAAAAGGdldFBvb2xNYWtlckxvY2tlZEFtb3VudAAAAAIFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAAQcG9vbE1ha2VyQWRkcmVzcwQAAAAHc3VycGx1cwkAAGUAAAACBQAAAAt1Y29sbGF0ZXJhbAUAAAAZdXNkbk5lZWRlZFRvQ292ZXJFbWlzc2lvbgQAAAAQcGVyY2VudFZpYUFjdHVhbAkAAGsAAAADBQAAABVwb29sTWFrZXJBY3R1YWxBbW91bnQFAAAADW11bHRpcGxpY2F0b3IFAAAADnBvb2xBY3R1YWxTaXplBAAAAA1wZXJjZW50VmlhTWF4CQAAawAAAAMFAAAAEnBvb2xNYWtlck1heEFtb3VudAUAAAANbXVsdGlwbGljYXRvcgUAAAALcG9vbE1heFNpemUEAAAACmZyb3plblBhcnQDCQAAZwAAAAIFAAAAB3N1cnBsdXMAAAAAAAAAAAAAAAAAAAAAAAAJAAGWAAAAAQkABEwAAAACBQAAABBwZXJjZW50VmlhQWN0dWFsCQAETAAAAAIFAAAADXBlcmNlbnRWaWFNYXgFAAAAA25pbAQAAAAVYWxsb3dlZEFtb3VudFRvUmVkZWVtCQAAawAAAAMJAABlAAAAAgUAAAANbXVsdGlwbGljYXRvcgUAAAAKZnJvemVuUGFydAUAAAAVcG9vbE1ha2VyQWN0dWFsQW1vdW50BQAAAA1tdWx0aXBsaWNhdG9yBAAAAA53aXRoZHJhd0hlaWdodAkAAGQAAAACBQAAAAZoZWlnaHQJAQAAABpnZXRSZWRlbXB0aW9uVGltZW91dEJsb2NrcwAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QJAAUaAAAACAUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAABVhbGxvd2VkQW1vdW50VG9SZWRlZW0FAAAAD3Bvb2xUb3RhbExvY2tlZAUAAAAOcG9vbEFjdHVhbFNpemUFAAAAFXBvb2xNYWtlckFjdHVhbEFtb3VudAUAAAAOd2l0aGRyYXdIZWlnaHQFAAAAFXBvb2xNYWtlckxvY2tlZEFtb3VudAkABLkAAAACCQAETAAAAAIFAAAAD2Fzc2V0QWRkcmVzc1N0cgkABEwAAAACBQAAAAphc3NldElkU3RyCQAETAAAAAIFAAAAEHBvb2xNYWtlckFkZHJlc3MJAARMAAAAAgkAAaQAAAABBQAAABVhc3NldFVzZG5TdGFrZWRBbW91bnQJAARMAAAAAgkAAaQAAAABBQAAABZhc3NldFVzZG5CYWxhbmNlQW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAUYXNzZXRUb3RhbFVzZG5BbW91bnQJAARMAAAAAgkAAaQAAAABBQAAAA5wb29sQWN0dWFsU2l6ZQkABEwAAAACCQABpAAAAAEFAAAAC3Bvb2xNYXhTaXplCQAETAAAAAIJAAGkAAAAAQUAAAALdWNvbGxhdGVyYWwJAARMAAAAAgkAAaQAAAABBQAAAA1hc3NldEVtaXNzaW9uCQAETAAAAAIJAAGkAAAAAQUAAAAMY3VycmVudFByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAbcHJpY2VXaXRoT3ZlcmNvbGxhdGVyYWxSYXRlCQAETAAAAAIJAAGkAAAAAQUAAAAScG9vbE1ha2VyTWF4QW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAVcG9vbE1ha2VyQWN0dWFsQW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAVcG9vbE1ha2VyTG9ja2VkQW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAHc3VycGx1cwkABEwAAAACCQABpAAAAAEFAAAAEHBlcmNlbnRWaWFBY3R1YWwJAARMAAAAAgkAAaQAAAABBQAAAA1wZXJjZW50VmlhTWF4CQAETAAAAAIJAAGkAAAAAQUAAAAKZnJvemVuUGFydAkABEwAAAACCQABpAAAAAEFAAAAFWFsbG93ZWRBbW91bnRUb1JlZGVlbQUAAAADbmlsBQAAAANTRVAAAAAHAAAAAWkBAAAABGluaXQAAAAIAAAAF25ldXRyaW5vQ29udHJhY3RBZGRyZXNzAAAAFm5ldXRyaW5vU3Rha2luZ0FkZHJlc3MAAAAYbWluaW11blBvb2xGdW5kaW5nQW1vdW50AAAAE3ByZWRlZmluZWRBc3NldExpc3QAAAARY3VycmVudEFzc2V0SW5kZXgAAAASZGVidEV0aGFsb25CYWxhbmNlAAAAEmRlZm9TdGFraW5nQWRkcmVzcwAAABdkZWZvU3Rha2luZ1BhY2VtYWtlclB1YgMJAQAAAAIhPQAAAAIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAA5hZG1pblB1YmxpY0tleQkAAAIAAAABAgAAACpPbmx5IEFkbWluIGNhbiBwZXJmb3JtIGNvbnRyYWN0IG9wZXJhdGlvbi4DCQAAAAAAAAIJAQAAAAxnZXRCb29sQnlLZXkAAAABBQAAABBpc0luaXRpYWxpemVkS2V5BgkAAAIAAAABAgAAACFDb250cmFjdCB3YXMgYWxyZWFkeSBpbml0aWFsaXplZC4EAAAACWlzc3VlRGVidAkABEIAAAAFAgAAAAlERUZPX0RFQlQCAAAAEERFRk8gRGVidCBUb2tlbi4AAAAAAAAAAAEAAAAAAAAAAAYGBAAAAAtkZWJ0VG9rZW5JZAkABDgAAAABBQAAAAlpc3N1ZURlYnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAabmV1dHJpbm9Db250cmFjdEFkZHJlc3NLZXkFAAAAF25ldXRyaW5vQ29udHJhY3RBZGRyZXNzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAGW5ldXRyaW5vU3Rha2luZ0FkZHJlc3NLZXkFAAAAFm5ldXRyaW5vU3Rha2luZ0FkZHJlc3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAG21pbmltdW5Qb29sRnVuZGluZ0Ftb3VudEtleQUAAAAYbWluaW11blBvb2xGdW5kaW5nQW1vdW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAFGFzc2V0c0FkZHJlc3NMaXN0S2V5BQAAABNwcmVkZWZpbmVkQXNzZXRMaXN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABRjdXJyZW50QXNzZXRJbmRleEtleQUAAAARY3VycmVudEFzc2V0SW5kZXgJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAGWRlYnRUb2tlbkV0YWxvbkJhbGFuY2VLZXkFAAAAEmRlYnRFdGhhbG9uQmFsYW5jZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA5kZWJ0VG9rZW5JZEtleQkAAlgAAAABBQAAAAtkZWJ0VG9rZW5JZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABVkZWZvU3Rha2luZ0FkZHJlc3NLZXkFAAAAEmRlZm9TdGFraW5nQWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABpkZWZvU3Rha2luZ1BhY2VtYWtlclB1YktleQUAAAAXZGVmb1N0YWtpbmdQYWNlbWFrZXJQdWIJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAAEGlzSW5pdGlhbGl6ZWRLZXkGCQAETAAAAAIFAAAACWlzc3VlRGVidAkABEwAAAACCQEAAAAEQnVybgAAAAIFAAAAC2RlYnRUb2tlbklkAAAAAAAAAAABBQAAAANuaWwAAAABaQEAAAAMcHJvcG9zZUFzc2V0AAAADwAAAAlhc3NldENvZGUAAAAEbWV0YQAAAAdtaW5Qb29sAAAAEnByaWNlT3JhY2xlQWRkcmVzcwAAABVvdmVyQ29sbGF0ZXJhbFBlcmNlbnQAAAAOYmFja2luZ0Fzc2V0SWQAAAANcHJpY2VEZWNpbWFscwAAAA1taW5CdXlQYXltZW50AAAADm1pblNlbGxQYXltZW50AAAAD2J1eUxvY2tJbnRlcnZhbAAAABBzZWxsTG9ja0ludGVydmFsAAAABmJ1eUZlZQAAAAdzZWxsRmVlAAAAFXBvb2xSZWRlbXB0aW9uVGltZW91dAAAAB53ZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQDCQEAAAACIT0AAAACCQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAOYWRtaW5QdWJsaWNLZXkJAAACAAAAAQIAAAAqT25seSBBZG1pbiBjYW4gcGVyZm9ybSBjb250cmFjdCBvcGVyYXRpb24uAwkAAAAAAAACCQEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQUAAAAQaXNJbml0aWFsaXplZEtleQcJAAACAAAAAQIAAAAaQ29udHJhY3QgaXMgbm90IHlldCByZWFkeS4DCQEAAAACIT0AAAACCQACWQAAAAEFAAAADmJhY2tpbmdBc3NldElkBQAAAA9uZXV0cmlub0Fzc2V0SWQJAAACAAAAAQIAAAAjQmFraW5nIGFzc2V0IGlkIGNvdWxkIGJlIFVTRE4gb25seS4DCQEAAAACIT0AAAACCQEAAAAVZ2V0QXNzZXRBZGRyZXNzQnlDb2RlAAAAAQUAAAAJYXNzZXRDb2RlAgAAAAAJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAF0Fzc2V0IHdpdGggcGFzc2VkIGNvZGUgBQAAAAlhc3NldENvZGUCAAAAGyBoYXMgYWxyZWFkeSBiZWVuIHByb3Bvc2VkLgMJAABmAAAAAgUAAAASbWluaW11bVBvb2xGdW5kaW5nBQAAAAdtaW5Qb29sCQAAAgAAAAEJAAEsAAAAAgIAAAAzTWluaW11bSBwb29sIGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciBvciBlcXVhbHMgdG8gCQABpAAAAAEFAAAAEm1pbmltdW1Qb29sRnVuZGluZwMDAwMDAwMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAFW92ZXJDb2xsYXRlcmFsUGVyY2VudAYJAABmAAAAAgAAAAAAAAAAAAUAAAANcHJpY2VEZWNpbWFscwYJAABmAAAAAgAAAAAAAAAAAAUAAAANbWluQnV5UGF5bWVudAYJAABmAAAAAgAAAAAAAAAAAAUAAAAObWluU2VsbFBheW1lbnQGCQAAZgAAAAIAAAAAAAAAAAAFAAAAD2J1eUxvY2tJbnRlcnZhbAYJAABmAAAAAgAAAAAAAAAAAAUAAAAQc2VsbExvY2tJbnRlcnZhbAYJAABmAAAAAgAAAAAAAAAAAAUAAAAGYnV5RmVlBgkAAGYAAAACAAAAAAAAAAAABQAAAAdzZWxsRmVlCQAAAgAAAAECAAAAKE9uZSBvZiB0aGUgcGFzc2VkIHBhcmFtZXRlcnMgaXMgaW52YWxpZC4EAAAAF3ByaWNlT3JhY2xlQWRkcmVzc1ZhbGlkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwIAAAApUGFzc2VkIFByaWNlIE9yYWNsZSBBZGRyZXNzIGlzIG5vdCB2YWxpZC4EAAAADGFzc2V0QWRkcmVzcwkAAZEAAAACBQAAABRwcmVkZWZpbmVkQXNzZXRzTGlzdAUAAAARY3VycmVudEFzc2V0SW5kZXgEAAAAC2RlZm9Bc3NldElkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEFAAAADGFzc2V0QWRkcmVzcwIAAAAABQAAAA5kZWZvQXNzZXRJZEtleQIAAAAXTm8gZGVmbyBhc3NldCBJRCBmb3VuZC4JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWdldEFzc2V0Q29uZmlnS2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzCQEAAAAfY29tcG9zZUFzc2V0Q29uZmlndXJhdGlvblN0cmluZwAAABAFAAAACWFzc2V0Q29kZQUAAAALZGVmb0Fzc2V0SWQIBQAAAAthc3NldFN0YXR1cwAAAAJfMQUAAAANcHJpY2VEZWNpbWFscwUAAAAOYmFja2luZ0Fzc2V0SWQFAAAAFW92ZXJDb2xsYXRlcmFsUGVyY2VudAUAAAAHbWluUG9vbAUAAAAScHJpY2VPcmFjbGVBZGRyZXNzBQAAAA1taW5CdXlQYXltZW50BQAAAA5taW5TZWxsUGF5bWVudAUAAAAPYnV5TG9ja0ludGVydmFsBQAAABBzZWxsTG9ja0ludGVydmFsBQAAAAZidXlGZWUFAAAAB3NlbGxGZWUFAAAAFXBvb2xSZWRlbXB0aW9uVGltZW91dAUAAAAed2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABhnZXRBc3NldEFkZHJlc3NCeUNvZGVLZXkAAAABBQAAAAlhc3NldENvZGUFAAAADGFzc2V0QWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2V0QXNzZXRNZXRhS2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzBQAAAARtZXRhCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAVZ2V0QXNzZXRJbml0SGVpZ2h0S2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzBQAAAAZoZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFGN1cnJlbnRBc3NldEluZGV4S2V5CQAAZAAAAAIFAAAAEWN1cnJlbnRBc3NldEluZGV4AAAAAAAAAAABCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABtnZXRBc3NldEFkZHJlc3NCeUFzc2V0SWRLZXkAAAABBQAAAAtkZWZvQXNzZXRJZAUAAAAMYXNzZXRBZGRyZXNzBQAAAANuaWwAAAABaQEAAAARZnVuZExpcXVpZGl0eVBvb2wAAAABAAAACWFzc2V0Q29kZQQAAAAPYXNzZXRBZGRyZXNzU3RyCQEAAAAbZ2V0QXNzZXRBZGRyZXNzQnlDb2RlT3JGYWlsAAAAAQUAAAAJYXNzZXRDb2RlBAAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0CQEAAAATZ2V0QXNzZXRDb25maWdBcnJheQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgQAAAAPYXR0YWNoZWRQYXltZW50CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAABBwb29sTWFrZXJBZGRyZXNzCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgMJAAAAAAAAAgkBAAAADGdldEJvb2xCeUtleQAAAAEFAAAAEGlzSW5pdGlhbGl6ZWRLZXkHCQAAAgAAAAECAAAAGkNvbnRyYWN0IGlzIG5vdCB5ZXQgcmVhZHkuAwkBAAAAAiE9AAAAAggFAAAAD2F0dGFjaGVkUGF5bWVudAAAAAdhc3NldElkBQAAAA9uZXV0cmlub0Fzc2V0SWQJAAACAAAAAQIAAAAuTGlxdWlkaXR5IHBvb2wgY291bGQgYmUgZnVuZGVkIHdpdGggVVNETiBvbmx5LgMJAABmAAAAAgUAAAATbWluUG9vbEludmVzdEFtb3VudAgFAAAAD2F0dGFjaGVkUGF5bWVudAAAAAZhbW91bnQJAAACAAAAAQkAASwAAAACAgAAADFBdHRhY2hlZCBwYXltZW50IGFtb3VudCBpcyBsZXNzIHRoYSBtaW4gYWxsb3dlZDogCQABpAAAAAEFAAAAE21pblBvb2xJbnZlc3RBbW91bnQEAAAAFG5ld0N1cnJlbnRQb29sQW1vdW50CQAAZAAAAAIIBQAAAA9hdHRhY2hlZFBheW1lbnQAAAAGYW1vdW50CQEAAAAZZ2V0QXNzZXRDdXJyZW50UG9vbEFtb3VudAAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgQAAAANbWF4UG9vbEFtb3VudAkBAAAAFWdldEFzc2V0TWF4UG9vbEFtb3VudAAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgQAAAAXY3VycmVudFBvb2xNYWtlckJhbGFuY2UJAQAAAB9nZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uQW1vdW50AAAAAgUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAABBwb29sTWFrZXJBZGRyZXNzBAAAABNtYXhQb29sTWFrZXJCYWxhbmNlCQEAAAAiZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbk1heEFtb3VudAAAAAIFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAAQcG9vbE1ha2VyQWRkcmVzcwQAAAASY3VycmVudEFzc2V0U3RhdHVzCQEAAAAOZ2V0QXNzZXRTdGF0dXMAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAA5uZXdBc3NldFN0YXR1cwMDCQAAAAAAAAIFAAAAEmN1cnJlbnRBc3NldFN0YXR1cwUAAAANQVNTRXRQUk9QT1NFRAkAAGcAAAACBQAAABRuZXdDdXJyZW50UG9vbEFtb3VudAkBAAAAHWdldEFzc2V0TWluUmVxdWlyZWRQb29sQW1vdW50AAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAcFAAAACkFTU0V0UkVBRFkFAAAAEmN1cnJlbnRBc3NldFN0YXR1cwQAAAATbmV3UG9vbE1ha2VyQmFsYW5jZQkAAGQAAAACBQAAABdjdXJyZW50UG9vbE1ha2VyQmFsYW5jZQgFAAAAD2F0dGFjaGVkUGF5bWVudAAAAAZhbW91bnQEAAAAGWltbWVkaWF0ZVRyYW5zZmVySWZJc3N1ZWQDCQAAAAAAAAIFAAAAEmN1cnJlbnRBc3NldFN0YXR1cwUAAAALQVNTRXRJU1NVRUQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyCAUAAAAPYXR0YWNoZWRQYXltZW50AAAABmFtb3VudAUAAAAPbmV1dHJpbm9Bc3NldElkBQAAAANuaWwFAAAAA25pbAkABE4AAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAiZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudEtleQAAAAIFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAAQcG9vbE1ha2VyQWRkcmVzcwUAAAATbmV3UG9vbE1ha2VyQmFsYW5jZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAJWdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25NYXhBbW91bnRLZXkAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAAEHBvb2xNYWtlckFkZHJlc3MJAAGWAAAAAQkABEwAAAACBQAAABNuZXdQb29sTWFrZXJCYWxhbmNlCQAETAAAAAIFAAAAE21heFBvb2xNYWtlckJhbGFuY2UFAAAAA25pbAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAHWdldEFzc2V0Q3VycnJlbnRQb29sQW1vdW50S2V5AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAABRuZXdDdXJyZW50UG9vbEFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAGGdldEFzc2V0TWF4UG9vbEFtb3VudEtleQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgkAAZYAAAABCQAETAAAAAIFAAAADW1heFBvb2xBbW91bnQJAARMAAAAAgUAAAAUbmV3Q3VycmVudFBvb2xBbW91bnQFAAAAA25pbAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARZ2V0QXNzZXRDb25maWdLZXkAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIJAQAAABR1cGRhdGVBc3NldENmZ1N0YXR1cwAAAAIFAAAADm5ld0Fzc2V0U3RhdHVzBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BQAAAANuaWwFAAAAGWltbWVkaWF0ZVRyYW5zZmVySWZJc3N1ZWQAAAABaQEAAAANYWN0aXZhdGVBc3NldAAAAAEAAAAJYXNzZXRDb2RlBAAAAAxhc3NldEFkZHJlc3MJAQAAABVnZXRBc3NldEFkZHJlc3NCeUNvZGUAAAABBQAAAAlhc3NldENvZGUEAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QJAQAAABNnZXRBc3NldENvbmZpZ0FycmF5AAAAAQUAAAAMYXNzZXRBZGRyZXNzBAAAABZhc3NldEN1cnJlbnRQb29sQW1vdW50CQEAAAAZZ2V0QXNzZXRDdXJyZW50UG9vbEFtb3VudAAAAAEFAAAADGFzc2V0QWRkcmVzcwQAAAAOYUN1cnJlbnRTdGF0dXMJAQAAAA5nZXRBc3NldFN0YXR1cwAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QDCQEAAAACIT0AAAACCQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAOYWRtaW5QdWJsaWNLZXkJAAACAAAAAQIAAAAqT25seSBBZG1pbiBjYW4gcGVyZm9ybSBjb250cmFjdCBvcGVyYXRpb24uAwkAAAAAAAACCQEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQUAAAAQaXNJbml0aWFsaXplZEtleQcJAAACAAAAAQIAAAAaQ29udHJhY3QgaXMgbm90IHlldCByZWFkeS4DCQEAAAACIT0AAAACBQAAAA5hQ3VycmVudFN0YXR1cwgFAAAAC2Fzc2V0U3RhdHVzAAAAAl8yCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAADBBc3NldCBpcyBub3QgaW4gUkVBRFkgc3RhdHVzLiBDdXJyZW50IHN0YXR1cyBpcyAFAAAADmFDdXJyZW50U3RhdHVzAgAAAAEuAwkAAAAAAAACBQAAAAxhc3NldEFkZHJlc3MCAAAAAAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAASQ2Fubm90IGZpbmQgYXNzZXQgBQAAAAlhc3NldENvZGUCAAAAAS4DCQAAZgAAAAIFAAAAEm1pbmltdW1Qb29sRnVuZGluZwUAAAAWYXNzZXRDdXJyZW50UG9vbEFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAALUNhbm5vdCBpc3N1ZSBhc3NldCBhcyBsaXF1aWRpdHkgcG9vbCBhbW91bnQgKAkAAaQAAAABBQAAABZhc3NldEN1cnJlbnRQb29sQW1vdW50AgAAABkpIGlzIGxlc3MgdGhhbiByZXF1aXJlZCAoCQABpAAAAAEFAAAAEm1pbmltdW1Qb29sRnVuZGluZwIAAAABKQQAAAAJaXNzdWVEZWJ0CQEAAAAHUmVpc3N1ZQAAAAMFAAAACWRlYnRUb2tlbgUAAAAWZGVidFRva2VuUmVpc3N1ZUFtb3VudAYJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABlnZXRBc3NldEFjdGl2YXRlSGVpZ2h0S2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzBQAAAAZoZWlnaHQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWdldEFzc2V0Q29uZmlnS2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzCQEAAAAUdXBkYXRlQXNzZXRDZmdTdGF0dXMAAAACCAUAAAALYXNzZXRTdGF0dXMAAAACXzMFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QJAARMAAAAAgUAAAAJaXNzdWVEZWJ0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAADGFzc2V0QWRkcmVzcwUAAAAWYXNzZXRDdXJyZW50UG9vbEFtb3VudAUAAAAPbmV1dHJpbm9Bc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAADGFzc2V0QWRkcmVzcwUAAAAWZGVidFRva2VuUmVpc3N1ZUFtb3VudAUAAAAJZGVidFRva2VuBQAAAANuaWwAAAABaQEAAAAOcmVkZWVtRnJvbVBvb2wAAAACAAAACWFzc2V0Q29kZQAAAAZhbW91bnQEAAAADWNhbGxlckFkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAtyZWRlZW1UdXBsZQkBAAAAGWNhbGNBbGxvd2VkQW1vdW50VG9SZWRlZW0AAAACBQAAAAlhc3NldENvZGUFAAAADWNhbGxlckFkZHJlc3MEAAAAD2Fzc2V0QWRkcmVzc1N0cggFAAAAC3JlZGVlbVR1cGxlAAAAAl8xBAAAABVhbGxvd2VkQW1vdW50VG9SZWRlZW0IBQAAAAtyZWRlZW1UdXBsZQAAAAJfMgQAAAAPcG9vbFRvdGFsTG9ja2VkCAUAAAALcmVkZWVtVHVwbGUAAAACXzMEAAAADnBvb2xBY3R1YWxTaXplCAUAAAALcmVkZWVtVHVwbGUAAAACXzQEAAAAFXBvb2xNYWtlckFjdHVhbEFtb3VudAgFAAAAC3JlZGVlbVR1cGxlAAAAAl81BAAAAA53aXRoZHJhd0hlaWdodAgFAAAAC3JlZGVlbVR1cGxlAAAAAl82BAAAABVwb29sTWFrZXJMb2NrZWRBbW91bnQIBQAAAAtyZWRlZW1UdXBsZQAAAAJfNwQAAAAJdHJhY2VEYXRhCAUAAAALcmVkZWVtVHVwbGUAAAACXzgEAAAAHHBvb2xNYWtlckxpcXVpZGl0eVJlcXVlc3RLZXkJAQAAAB9nZXRQb29sTWFrZXJMaXF1aWRpdHlSZXF1ZXN0S2V5AAAAAwUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAAA1jYWxsZXJBZGRyZXNzBQAAAA53aXRoZHJhd0hlaWdodAMJAAAAAAAAAgkBAAAADGdldEJvb2xCeUtleQAAAAEFAAAAEGlzSW5pdGlhbGl6ZWRLZXkHCQAAAgAAAAECAAAAGkNvbnRyYWN0IGlzIG5vdCB5ZXQgcmVhZHkuAwMDCQAAZgAAAAIAAAAAAAAAAAAFAAAABmFtb3VudAYJAABnAAAAAgAAAAAAAAAAAAUAAAAVcG9vbE1ha2VyQWN0dWFsQW1vdW50BgkAAGYAAAACBQAAAAZhbW91bnQFAAAAFWFsbG93ZWRBbW91bnRUb1JlZGVlbQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAiQ2Fubm90IGZpbmQgcG9vbCBtYWtlciBieSBhZGRyZXNzIAUAAAANY2FsbGVyQWRkcmVzcwIAAAAhIG9yIGFtb3VudCBwYXNzZWQgaXMgbm90IGNvcnJlY3QuAwkAAGYAAAACCQAAaAAAAAIAAAAAAAAAAAEFAAAADW11bHRpcGxpY2F0b3IFAAAABmFtb3VudAkAAAIAAAABAgAAACZSZWRlZW0gYW1vdW50IGlzIGxlc3MgdGhlbiBtaW4gYWxsb3dlZAMJAABmAAAAAgUAAAAVcG9vbE1ha2VyTG9ja2VkQW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAARlBvb2wgbWFrZXIgYWxyZWFkeSBoYXMgaW5pdGlhdGVkIHJlZGVtcHRpb24gdGhhdCBpcyBub3Qgd2l0aGRyYXduIHlldC4DCQEAAAAJaXNEZWZpbmVkAAAAAQkABBoAAAACBQAAAAR0aGlzBQAAABxwb29sTWFrZXJMaXF1aWRpdHlSZXF1ZXN0S2V5CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAADBQb29sIG1ha2VyIGhhcyBhbHJlYWR5IGluaXRpYXRlZCByZWRlbXB0aW9uIGZvciAJAAGkAAAAAQUAAAAGaGVpZ2h0AgAAAAcgaGVpZ2h0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAbZ2V0UG9vbFRvdGFsTG9ja2VkQW1vdW50S2V5AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyCQAAZAAAAAIFAAAAD3Bvb2xUb3RhbExvY2tlZAUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAdZ2V0QXNzZXRDdXJycmVudFBvb2xBbW91bnRLZXkAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIJAABlAAAAAgUAAAAOcG9vbEFjdHVhbFNpemUFAAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAImdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25BbW91bnRLZXkAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAADWNhbGxlckFkZHJlc3MJAABlAAAAAgUAAAAVcG9vbE1ha2VyQWN0dWFsQW1vdW50BQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAHHBvb2xNYWtlckxpcXVpZGl0eVJlcXVlc3RLZXkFAAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAG2dldFBvb2xNYWtlckxvY2tlZEFtb3VudEtleQAAAAIFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAANY2FsbGVyQWRkcmVzcwUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAbZ2V0UG9vbE1ha2VyVW5sb2NrSGVpZ2h0S2V5AAAAAgUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAAA1jYWxsZXJBZGRyZXNzBQAAAA53aXRoZHJhd0hlaWdodAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACAgAAABklcyVzX3RyYWNlX3JlZGVlbUZyb21Qb29sBQAAAAl0cmFjZURhdGEFAAAAA25pbAAAAAFpAQAAABtnZXRNYXhBbGxvd2VkQW1vdW50VG9SZWRlZW0AAAACAAAACWFzc2V0Q29kZQAAABBwb29sTWFrZXJBZGRyZXNzBAAAAAtyZWRlZW1UdXBsZQkBAAAAGWNhbGNBbGxvd2VkQW1vdW50VG9SZWRlZW0AAAACBQAAAAlhc3NldENvZGUFAAAAEHBvb2xNYWtlckFkZHJlc3MEAAAAD2Fzc2V0QWRkcmVzc1N0cggFAAAAC3JlZGVlbVR1cGxlAAAAAl8xBAAAABVhbGxvd2VkQW1vdW50VG9SZWRlZW0IBQAAAAtyZWRlZW1UdXBsZQAAAAJfMgQAAAAPcG9vbFRvdGFsTG9ja2VkCAUAAAALcmVkZWVtVHVwbGUAAAACXzMEAAAADnBvb2xBY3R1YWxTaXplCAUAAAALcmVkZWVtVHVwbGUAAAACXzQEAAAAFXBvb2xNYWtlckFjdHVhbEFtb3VudAgFAAAAC3JlZGVlbVR1cGxlAAAAAl81BAAAAA53aXRoZHJhd0hlaWdodAgFAAAAC3JlZGVlbVR1cGxlAAAAAl82BAAAABVwb29sTWFrZXJMb2NrZWRBbW91bnQIBQAAAAtyZWRlZW1UdXBsZQAAAAJfNwkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAAXsCAAAAF2FsbG93ZWRBbW91bnRUb1JlZGVlbTogCQABpAAAAAEFAAAAFWFsbG93ZWRBbW91bnRUb1JlZGVlbQIAAAANLCBhc3NldENvZGU6IAUAAAAJYXNzZXRDb2RlAgAAAA0sIHBvb2xNYWtlcjogBQAAABBwb29sTWFrZXJBZGRyZXNzAgAAAAF9AAAAAWkBAAAACHdpdGhkcmF3AAAAAQAAAAlhc3NldENvZGUEAAAADWNhbGxlckFkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA9hc3NldEFkZHJlc3NTdHIJAQAAABtnZXRBc3NldEFkZHJlc3NCeUNvZGVPckZhaWwAAAABBQAAAAlhc3NldENvZGUEAAAADGFzc2V0QWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyBAAAABhwb29sTWFrZXJMb2NrZWRBbW91bnRLZXkJAQAAABtnZXRQb29sTWFrZXJMb2NrZWRBbW91bnRLZXkAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAADWNhbGxlckFkZHJlc3MEAAAAGXJlZ2lzdGVyZWRBbW91bnQ0V2l0aGRyYXcJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAYcG9vbE1ha2VyTG9ja2VkQW1vdW50S2V5AAAAAAAAAAAABAAAABhwb29sTWFrZXJVbmxvY2tIZWlnaHRLZXkJAQAAABtnZXRQb29sTWFrZXJVbmxvY2tIZWlnaHRLZXkAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAADWNhbGxlckFkZHJlc3MEAAAADndpdGhkcmF3SGVpZ2h0CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAGHBvb2xNYWtlclVubG9ja0hlaWdodEtleQAAAAAAAAAAAAQAAAAYcG9vbFRvdGFsTG9ja2VkQW1vdW50S2V5CQEAAAAbZ2V0UG9vbFRvdGFsTG9ja2VkQW1vdW50S2V5AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyBAAAAA9wb29sVG90YWxMb2NrZWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAYcG9vbFRvdGFsTG9ja2VkQW1vdW50S2V5AAAAAAAAAAAABAAAABxwb29sTWFrZXJMaXF1aWRpdHlSZXF1ZXN0S2V5CQEAAAAfZ2V0UG9vbE1ha2VyTGlxdWlkaXR5UmVxdWVzdEtleQAAAAMFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAANY2FsbGVyQWRkcmVzcwUAAAAOd2l0aGRyYXdIZWlnaHQDCQAAAAAAAAIJAQAAAAxnZXRCb29sQnlLZXkAAAABBQAAABBpc0luaXRpYWxpemVkS2V5BwkAAAIAAAABAgAAABpDb250cmFjdCBpcyBub3QgeWV0IHJlYWR5LgMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQaAAAAAgUAAAAMYXNzZXRBZGRyZXNzBQAAABxwb29sTWFrZXJMaXF1aWRpdHlSZXF1ZXN0S2V5CQAAAgAAAAECAAAAM05lZWQgdG8gdHJhbnNmZXIgbGlxdWlkaXR5IGZyb20gYXNzZXQgYWNjb3VudCBmaXJzdAMJAABnAAAAAgAAAAAAAAAAAAUAAAAZcmVnaXN0ZXJlZEFtb3VudDRXaXRoZHJhdwkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAiQ2Fubm90IGZpbmQgcG9vbCBtYWtlciBieSBhZGRyZXNzIAUAAAANY2FsbGVyQWRkcmVzcwIAAAAVIG9yIG5vIGxvY2tlZCBhbW91bnQuAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAADndpdGhkcmF3SGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAxQbGVhc2Ugd2FpdCAJAAGkAAAAAQUAAAAOd2l0aGRyYXdIZWlnaHQCAAAAESBiZWZvcmUgd2l0aGRyYXcuCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABhwb29sTWFrZXJMb2NrZWRBbW91bnRLZXkAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAGHBvb2xUb3RhbExvY2tlZEFtb3VudEtleQkAAGUAAAACBQAAAA9wb29sVG90YWxMb2NrZWQFAAAAGXJlZ2lzdGVyZWRBbW91bnQ0V2l0aGRyYXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAGHBvb2xNYWtlclVubG9ja0hlaWdodEtleQAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAA1jYWxsZXJBZGRyZXNzBQAAABlyZWdpc3RlcmVkQW1vdW50NFdpdGhkcmF3BQAAAA9uZXV0cmlub0Fzc2V0SWQFAAAAA25pbAAAAABZPDXA", "chainId": 84, "height": 1248857, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7PcvzfQ9UnNNZNHjvmxiZshdndexZF2Vt1CERk4o8Vq8 Next: 9MqbrqgMMp8aMDgXAZuv5wYQrBUcLtSd7CJFELKmgLHw Diff:
Old | New | Differences | |
---|---|---|---|
10 | 10 | func g (f) = valueOrElse(getBoolean(this, f), false) | |
11 | 11 | ||
12 | 12 | ||
13 | - | let h = | |
13 | + | let h = "__" | |
14 | 14 | ||
15 | - | let i = | |
15 | + | let i = 1 | |
16 | 16 | ||
17 | - | let j = | |
17 | + | let j = 2 | |
18 | 18 | ||
19 | - | let k = | |
19 | + | let k = 3 | |
20 | 20 | ||
21 | - | let l = | |
21 | + | let l = 4 | |
22 | 22 | ||
23 | - | let m = | |
23 | + | let m = 5 | |
24 | 24 | ||
25 | - | let n = | |
25 | + | let n = 6 | |
26 | 26 | ||
27 | - | let o = | |
27 | + | let o = 7 | |
28 | 28 | ||
29 | - | let p = | |
29 | + | let p = 8 | |
30 | 30 | ||
31 | - | let q = | |
31 | + | let q = 9 | |
32 | 32 | ||
33 | - | let r = | |
33 | + | let r = 10 | |
34 | 34 | ||
35 | - | let s = | |
35 | + | let s = 11 | |
36 | 36 | ||
37 | - | let t = | |
37 | + | let t = 12 | |
38 | 38 | ||
39 | - | let u = | |
39 | + | let u = 13 | |
40 | 40 | ||
41 | - | let v = | |
41 | + | let v = 14 | |
42 | 42 | ||
43 | - | let w = | |
43 | + | let w = 15 | |
44 | 44 | ||
45 | - | let x = | |
45 | + | let x = 16 | |
46 | 46 | ||
47 | - | let y = " | |
47 | + | let y = "G1Ebu5AMHaTJFEbZNkZQcJFUQ9KfiYUwupyLG857DcFr" | |
48 | 48 | ||
49 | - | let z = "%s%s__commonConfig__ | |
49 | + | let z = "%s%s__commonConfig__neutrinoContractAddress" | |
50 | 50 | ||
51 | - | let A = "%s%s__commonConfig__ | |
51 | + | let A = "%s%s__commonConfig__neutrinoStakingAddress" | |
52 | 52 | ||
53 | - | let B = "%s%s__commonConfig__ | |
53 | + | let B = "%s%s__commonConfig__minimumPoolFundingAmount" | |
54 | 54 | ||
55 | - | let C = "%s%s__commonConfig__ | |
55 | + | let C = "%s%s__commonConfig__initialized" | |
56 | 56 | ||
57 | - | let D = "%s%s__commonConfig__ | |
57 | + | let D = "%s%s__commonConfig__predefinedAssetsActiveIndex" | |
58 | 58 | ||
59 | - | let E = "%s%s__commonConfig__ | |
59 | + | let E = "%s%s__commonConfig__predefinedAssetsList" | |
60 | 60 | ||
61 | - | let F = "%s%s__commonConfig__ | |
61 | + | let F = "%s%s__commonConfig__debtAssetId" | |
62 | 62 | ||
63 | - | let G = "%s%s__commonConfig__ | |
63 | + | let G = "%s%s__commonConfig__debtAssetEtalonBalance" | |
64 | 64 | ||
65 | - | let H = "%s%s__commonConfig__ | |
65 | + | let H = "%s%s__commonConfig__defoStakingAddress" | |
66 | 66 | ||
67 | - | let I = " | |
67 | + | let I = "%s%s__commonConfig__defoStakingPacemakerPub" | |
68 | 68 | ||
69 | - | let J = " | |
69 | + | let J = "%s%s__commonConfig__minPoolInvestAmount" | |
70 | 70 | ||
71 | - | let K = " | |
71 | + | let K = "neutrino_asset_id" | |
72 | 72 | ||
73 | - | let L = " | |
73 | + | let L = "bond_asset_id" | |
74 | 74 | ||
75 | - | func M (N) = (("%s%s%s__defoAsset__" + N) + "__config") | |
75 | + | let M = "rpd_contract" | |
76 | + | ||
77 | + | let N = "%s__defoAssetId" | |
78 | + | ||
79 | + | let O = "%s__assetScriptTxId" | |
80 | + | ||
81 | + | func P (Q) = (("%s%s%s__defoAsset__" + Q) + "__config") | |
76 | 82 | ||
77 | 83 | ||
78 | - | func | |
84 | + | func R (S) = ("%s%s__assetPrice__" + S) | |
79 | 85 | ||
80 | 86 | ||
81 | - | func | |
87 | + | func T (Q) = (("%s%s%s__defoAsset__" + Q) + "__initHeight") | |
82 | 88 | ||
83 | 89 | ||
84 | - | func | |
90 | + | func U (Q) = (("%s%s%s__defoAsset__" + Q) + "__activateHeight") | |
85 | 91 | ||
86 | 92 | ||
87 | - | func | |
93 | + | func V (Q) = (("%s%s%s__defoAsset__" + Q) + "__currentPool") | |
88 | 94 | ||
89 | 95 | ||
90 | - | func | |
96 | + | func W (Q) = (("%s%s%s__defoAsset__" + Q) + "__maxPool") | |
91 | 97 | ||
92 | 98 | ||
93 | - | func | |
99 | + | func X (Q) = (("%s%s%s__defoAsset__" + Q) + "__meta") | |
94 | 100 | ||
95 | 101 | ||
96 | - | func | |
102 | + | func Y (Q) = (("%s%s%s__defoAsset__" + Q) + "__poolMakers") | |
97 | 103 | ||
98 | 104 | ||
99 | - | func | |
105 | + | func Z (S) = (("%s%s%s__defoAsset__" + S) + "__addressByAssetCode") | |
100 | 106 | ||
101 | 107 | ||
102 | - | func | |
108 | + | func aa (ab) = (("%s%s%s__defoAsset__" + ab) + "__addressByAssetId") | |
103 | 109 | ||
104 | 110 | ||
105 | - | func | |
111 | + | func ac (Q,ad) = makeString(["%s%s%s%s__pool", Q, ad, "amount"], h) | |
106 | 112 | ||
107 | 113 | ||
108 | - | func | |
114 | + | func ae (Q,ad) = makeString(["%s%s%s%s__pool", Q, ad, "maxAmount"], h) | |
109 | 115 | ||
110 | 116 | ||
111 | - | func | |
117 | + | func af (Q,ad) = makeString(["%s%s%s%s__pool", Q, ad, "lockedAmount"], h) | |
112 | 118 | ||
113 | 119 | ||
114 | - | func | |
120 | + | func ag (Q,ad) = makeString(["%s%s%s%s__pool", Q, ad, "unlockHeight"], h) | |
115 | 121 | ||
116 | 122 | ||
117 | - | func | |
123 | + | func ah (Q,ad,ai) = makeString(["%s%s%s%d%s__pool", Q, ad, toString(ai), "liquidityRequest"], h) | |
118 | 124 | ||
119 | 125 | ||
120 | - | let af = addressFromStringValue(valueOrErrorMessage(getString(this, y), "No neutrino contract specified.")) | |
121 | - | ||
122 | - | let ag = fromBase58String(valueOrErrorMessage(getString(af, I), "No USDN asset id found.")) | |
123 | - | ||
124 | - | let ah = fromBase58String(valueOrErrorMessage(getString(af, J), "No NSBT asset id found")) | |
125 | - | ||
126 | - | let ai = valueOrErrorMessage(getInteger(this, A), "Minimum pool funding amount is not specified.") | |
127 | - | ||
128 | - | let aj = $Tuple3("PROPOSED", "READY", "ISSUED") | |
129 | - | ||
130 | - | let ak = valueOrErrorMessage(getString(this, D), "No pool of predeployed asset contracts found.") | |
131 | - | ||
132 | - | let al = a(ak, ",") | |
133 | - | ||
134 | - | let am = valueOrElse(getInteger(this, C), 0) | |
135 | - | ||
136 | - | let an = fromBase58String(valueOrErrorMessage(getString(this, E), "No debt token found")) | |
137 | - | ||
138 | - | let ao = 1000000 | |
139 | - | ||
140 | - | let ap = valueOrElse(getInteger(this, F), 0) | |
141 | - | ||
142 | - | func aq (ar) = valueOrElse(getString(this, W(ar)), "") | |
126 | + | func aj (Q) = makeString(["%s%s%s__pool", Q, "totalLockedAmount"], h) | |
143 | 127 | ||
144 | 128 | ||
145 | - | func | |
129 | + | func ak (Q) = a(valueOrErrorMessage(d(this, P(Q)), (("No DEFO Asset " + Q) + "config present")), "__") | |
146 | 130 | ||
147 | 131 | ||
148 | - | ||
132 | + | let al = 1000000 | |
149 | 133 | ||
134 | + | let am = addressFromStringValue(valueOrErrorMessage(getString(this, z), "No neutrino contract specified.")) | |
150 | 135 | ||
151 | - | ||
136 | + | let an = valueOrErrorMessage(getString(am, K), "No USDN asset id found.") | |
152 | 137 | ||
138 | + | let ao = fromBase58String(an) | |
153 | 139 | ||
154 | - | ||
140 | + | let ap = fromBase58String(valueOrErrorMessage(getString(am, L), "No NSBT asset id found")) | |
155 | 141 | ||
142 | + | let aq = valueOrErrorMessage(getInteger(this, B), "Minimum pool funding amount is not specified.") | |
156 | 143 | ||
157 | - | ||
144 | + | let ar = valueOrElse(getInteger(this, J), (10 * al)) | |
158 | 145 | ||
146 | + | let as = "PROPOSED" | |
159 | 147 | ||
160 | - | ||
148 | + | let at = "READY" | |
161 | 149 | ||
150 | + | let au = "ISSUED" | |
162 | 151 | ||
163 | - | ||
152 | + | let av = $Tuple3(as, at, au) | |
164 | 153 | ||
154 | + | let aw = valueOrErrorMessage(getString(this, E), "No pool of predeployed asset contracts found.") | |
165 | 155 | ||
166 | - | ||
156 | + | let ax = a(aw, ",") | |
167 | 157 | ||
158 | + | let ay = valueOrElse(getInteger(this, D), 0) | |
168 | 159 | ||
169 | - | ||
160 | + | let az = fromBase58String(valueOrErrorMessage(getString(this, F), "No debt token found")) | |
170 | 161 | ||
162 | + | let aA = valueOrElse(getInteger(this, G), 0) | |
171 | 163 | ||
172 | - | ||
164 | + | let aB = addressFromStringValue(getStringValue(am, M)) | |
173 | 165 | ||
174 | - | ||
175 | - | func aD (at) = parseIntValue(at[r]) | |
176 | - | ||
177 | - | ||
178 | - | func aE (at) = parseIntValue(at[s]) | |
179 | - | ||
180 | - | ||
181 | - | func aF (at) = parseIntValue(at[t]) | |
182 | - | ||
183 | - | ||
184 | - | func aG (at) = parseIntValue(at[u]) | |
185 | - | ||
186 | - | ||
187 | - | func aH (at) = parseIntValue(at[v]) | |
188 | - | ||
189 | - | ||
190 | - | func aI (at) = parseIntValue(at[w]) | |
191 | - | ||
192 | - | ||
193 | - | func aJ (N) = valueOrElse(getString(this, V(N)), "") | |
194 | - | ||
195 | - | ||
196 | - | func aK (N) = valueOrElse(getInteger(this, Q(N)), 0) | |
197 | - | ||
198 | - | ||
199 | - | func aL (N) = valueOrElse(getInteger(this, R(N)), 0) | |
200 | - | ||
201 | - | ||
202 | - | func aM (N) = valueOrElse(getInteger(this, S(N)), 0) | |
203 | - | ||
204 | - | ||
205 | - | func aN (N) = valueOrElse(getInteger(this, T(N)), 0) | |
206 | - | ||
207 | - | ||
208 | - | func aO (N) = valueOrElse(getString(this, U(N)), "") | |
209 | - | ||
210 | - | ||
211 | - | func aP (N,aa) = valueOrElse(getInteger(this, Z(N, aa)), 0) | |
212 | - | ||
213 | - | ||
214 | - | func aQ (N,aa) = valueOrElse(getInteger(this, ab(N, aa)), 0) | |
215 | - | ||
216 | - | ||
217 | - | func aR (N,aa) = valueOrElse(getInteger(this, ac(N, aa)), 0) | |
218 | - | ||
219 | - | ||
220 | - | func aS (N,aa) = valueOrElse(getInteger(this, ad(N, aa)), 0) | |
221 | - | ||
222 | - | ||
223 | - | func aT (aU,P) = valueOrErrorMessage(getInteger(aU, O(P)), "No Asset price found") | |
224 | - | ||
225 | - | ||
226 | - | func aV (P,Y,aj,aW,aX,aY,aZ,aU,ba,bb,bc,bd,be,bf,bg,bh) = makeString(["%s%s%s%d%s%d%d%s%d%d%d%d%d%d%d", P, Y, aj, toString(aW), aX, toString(aY), toString(aZ), aU, toString(ba), toString(bb), toString(bc), toString(bd), toString(be), toString(bf), toString(bg), toString(bh)], "__") | |
227 | - | ||
228 | - | ||
229 | - | func bi (bj,bk) = { | |
230 | - | let bl = as(bk) | |
231 | - | let bm = au(bk) | |
232 | - | let bn = aw(bk) | |
233 | - | let bo = ax(bk) | |
234 | - | let bp = ay(bk) | |
235 | - | let bq = az(bk) | |
236 | - | let br = aA(bk) | |
237 | - | let bs = aB(bk) | |
238 | - | let bt = aC(bk) | |
239 | - | let bu = aD(bk) | |
240 | - | let bv = aE(bk) | |
241 | - | let bw = aF(bk) | |
242 | - | let bx = aG(bk) | |
243 | - | let by = aH(bk) | |
244 | - | let bh = aI(bk) | |
245 | - | aV(bl, bm, bj, bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bh) | |
166 | + | func aC (aD) = { | |
167 | + | let aE = makeString(["rpd_balance", an, aD], "_") | |
168 | + | valueOrElse(getInteger(aB, aE), 0) | |
246 | 169 | } | |
247 | 170 | ||
248 | 171 | ||
249 | - | @Callable(bz) | |
250 | - | func init (bA,bB,bC,bD,am,bE,bF,bG) = if ((toBase58String(bz.callerPublicKey) != x)) | |
172 | + | func aF (aG) = valueOrElse(getString(this, Z(aG)), "") | |
173 | + | ||
174 | + | ||
175 | + | func aH (aG) = valueOrErrorMessage(getString(this, Z(aG)), (("Cannot find asset address by " + aG) + " code")) | |
176 | + | ||
177 | + | ||
178 | + | func aI (aJ) = aJ[i] | |
179 | + | ||
180 | + | ||
181 | + | func aK (aJ) = aJ[j] | |
182 | + | ||
183 | + | ||
184 | + | func aL (aJ) = aJ[k] | |
185 | + | ||
186 | + | ||
187 | + | func aM (aJ) = parseIntValue(aJ[l]) | |
188 | + | ||
189 | + | ||
190 | + | func aN (aJ) = aJ[m] | |
191 | + | ||
192 | + | ||
193 | + | func aO (aJ) = parseIntValue(aJ[n]) | |
194 | + | ||
195 | + | ||
196 | + | func aP (aJ) = parseIntValue(aJ[o]) | |
197 | + | ||
198 | + | ||
199 | + | func aQ (aJ) = aJ[p] | |
200 | + | ||
201 | + | ||
202 | + | func aR (aJ) = parseIntValue(aJ[q]) | |
203 | + | ||
204 | + | ||
205 | + | func aS (aJ) = parseIntValue(aJ[r]) | |
206 | + | ||
207 | + | ||
208 | + | func aT (aJ) = parseIntValue(aJ[s]) | |
209 | + | ||
210 | + | ||
211 | + | func aU (aJ) = parseIntValue(aJ[t]) | |
212 | + | ||
213 | + | ||
214 | + | func aV (aJ) = parseIntValue(aJ[u]) | |
215 | + | ||
216 | + | ||
217 | + | func aW (aJ) = parseIntValue(aJ[v]) | |
218 | + | ||
219 | + | ||
220 | + | func aX (aJ) = parseIntValue(aJ[w]) | |
221 | + | ||
222 | + | ||
223 | + | func aY (aJ) = parseIntValue(aJ[x]) | |
224 | + | ||
225 | + | ||
226 | + | func aZ (Q) = valueOrElse(getString(this, Y(Q)), "") | |
227 | + | ||
228 | + | ||
229 | + | func ba (Q) = valueOrElse(getInteger(this, T(Q)), 0) | |
230 | + | ||
231 | + | ||
232 | + | func bb (Q) = valueOrElse(getInteger(this, U(Q)), 0) | |
233 | + | ||
234 | + | ||
235 | + | func bc (Q) = valueOrElse(getInteger(this, V(Q)), 0) | |
236 | + | ||
237 | + | ||
238 | + | func bd (Q) = valueOrElse(getInteger(this, W(Q)), 0) | |
239 | + | ||
240 | + | ||
241 | + | func be (Q) = valueOrElse(getString(this, X(Q)), "") | |
242 | + | ||
243 | + | ||
244 | + | func bf (Q,ad) = valueOrElse(getInteger(this, ac(Q, ad)), 0) | |
245 | + | ||
246 | + | ||
247 | + | func bg (Q,ad) = valueOrElse(getInteger(this, ae(Q, ad)), 0) | |
248 | + | ||
249 | + | ||
250 | + | func bh (Q,ad) = valueOrElse(getInteger(this, af(Q, ad)), 0) | |
251 | + | ||
252 | + | ||
253 | + | func bi (Q,ad) = valueOrElse(getInteger(this, ag(Q, ad)), 0) | |
254 | + | ||
255 | + | ||
256 | + | func bj (bk,S) = valueOrErrorMessage(getInteger(bk, R(S)), "No Asset price found") | |
257 | + | ||
258 | + | ||
259 | + | func bl (Q) = valueOrElse(getInteger(this, aj(Q)), 0) | |
260 | + | ||
261 | + | ||
262 | + | func bm (S,ab,av,bn,bo,bp,bq,bk,br,bs,bt,bu,bv,bw,bx,by) = makeString(["%s%s%s%d%s%d%d%s%d%d%d%d%d%d%d", S, ab, av, toString(bn), bo, toString(bp), toString(bq), bk, toString(br), toString(bs), toString(bt), toString(bu), toString(bv), toString(bw), toString(bx), toString(by)], "__") | |
263 | + | ||
264 | + | ||
265 | + | func bz (bA,bB) = { | |
266 | + | let bC = aI(bB) | |
267 | + | let bD = aK(bB) | |
268 | + | let bE = aM(bB) | |
269 | + | let bF = aN(bB) | |
270 | + | let bG = aO(bB) | |
271 | + | let bH = aP(bB) | |
272 | + | let bI = aQ(bB) | |
273 | + | let bJ = aR(bB) | |
274 | + | let bK = aS(bB) | |
275 | + | let bL = aT(bB) | |
276 | + | let bM = aU(bB) | |
277 | + | let bN = aV(bB) | |
278 | + | let bO = aW(bB) | |
279 | + | let bP = aX(bB) | |
280 | + | let by = aY(bB) | |
281 | + | bm(bC, bD, bA, bE, bF, bG, bH, bI, bJ, bK, bL, bM, bN, bO, bP, by) | |
282 | + | } | |
283 | + | ||
284 | + | ||
285 | + | func bQ (S,ad) = { | |
286 | + | let bR = aH(S) | |
287 | + | let Q = addressFromStringValue(bR) | |
288 | + | let bB = ak(bR) | |
289 | + | let bS = aK(bB) | |
290 | + | let ab = fromBase58String(bS) | |
291 | + | let bT = valueOrElse(getInteger(this, V(bR)), 0) | |
292 | + | let bU = valueOrElse(getInteger(this, W(bR)), 0) | |
293 | + | let bV = aj(bR) | |
294 | + | let bW = valueOrElse(getInteger(this, bV), 0) | |
295 | + | let bX = aC(bR) | |
296 | + | let bY = assetBalance(Q, ao) | |
297 | + | let bZ = ((bX + bY) - bW) | |
298 | + | let ca = (bZ - bT) | |
299 | + | let cb = assetBalance(Q, ab) | |
300 | + | let cc = valueOrErrorMessage(assetInfo(ab), ("Cannot find asset by id " + bS)).quantity | |
301 | + | let cd = (cc - cb) | |
302 | + | let bk = addressFromStringValue(aQ(bB)) | |
303 | + | let ce = bj(bk, S) | |
304 | + | let cf = (((al + aO(bB)) * ce) / al) | |
305 | + | let cg = (cf * cd) | |
306 | + | let ch = bg(bR, ad) | |
307 | + | let ci = ac(bR, ad) | |
308 | + | let cj = valueOrElse(getInteger(this, ci), 0) | |
309 | + | let ck = bh(bR, ad) | |
310 | + | let cl = (ca - cg) | |
311 | + | let cm = fraction(cj, al, bT) | |
312 | + | let cn = fraction(ch, al, bU) | |
313 | + | let co = if ((cl >= 0)) | |
314 | + | then 0 | |
315 | + | else max([cm, cn]) | |
316 | + | let cp = fraction((al - co), cj, al) | |
317 | + | let cq = (height + aX(bB)) | |
318 | + | $Tuple8(bR, cp, bW, bT, cj, cq, ck, makeString([bR, bS, ad, toString(bX), toString(bY), toString(bZ), toString(bT), toString(bU), toString(ca), toString(cd), toString(ce), toString(cf), toString(ch), toString(cj), toString(ck), toString(cl), toString(cm), toString(cn), toString(co), toString(cp)], h)) | |
319 | + | } | |
320 | + | ||
321 | + | ||
322 | + | @Callable(cr) | |
323 | + | func init (cs,ct,cu,cv,ay,cw,cx,cy) = if ((toBase58String(cr.callerPublicKey) != y)) | |
251 | 324 | then throw("Only Admin can perform contract operation.") | |
252 | - | else if ((g( | |
325 | + | else if ((g(C) == true)) | |
253 | 326 | then throw("Contract was already initialized.") | |
254 | 327 | else { | |
255 | - | let | |
256 | - | let | |
257 | - | [StringEntry( | |
328 | + | let cz = Issue("DEFO_DEBT", "DEFO Debt Token.", 1, 6, true) | |
329 | + | let cA = calculateAssetId(cz) | |
330 | + | [StringEntry(z, cs), StringEntry(A, ct), IntegerEntry(B, cu), StringEntry(E, cv), IntegerEntry(D, ay), IntegerEntry(G, cw), StringEntry(F, toBase58String(cA)), StringEntry(H, cx), StringEntry(I, cy), BooleanEntry(C, true), cz, Burn(cA, 1)] | |
258 | 331 | } | |
259 | 332 | ||
260 | 333 | ||
261 | 334 | ||
262 | - | @Callable( | |
263 | - | func proposeAsset ( | |
335 | + | @Callable(cr) | |
336 | + | func proposeAsset (S,cB,bq,bk,bp,bo,bn,br,bs,bt,bu,bv,bw,bx,by) = if ((toBase58String(cr.callerPublicKey) != y)) | |
264 | 337 | then throw("Only Admin can perform contract operation.") | |
265 | - | else if ((g( | |
338 | + | else if ((g(C) == false)) | |
266 | 339 | then throw("Contract is not yet ready.") | |
267 | - | else if ((fromBase58String( | |
340 | + | else if ((fromBase58String(bo) != ao)) | |
268 | 341 | then throw("Baking asset id could be USDN only.") | |
269 | - | else if (( | |
270 | - | then throw((("Asset with passed code " + | |
271 | - | else if (( | |
272 | - | then throw(("Minimum pool amount should be greater or equals to " + toString( | |
273 | - | else if (if (if (if (if (if (if (if ((0 > | |
342 | + | else if ((aF(S) != "")) | |
343 | + | then throw((("Asset with passed code " + S) + " has already been proposed.")) | |
344 | + | else if ((aq > bq)) | |
345 | + | then throw(("Minimum pool amount should be greater or equals to " + toString(aq))) | |
346 | + | else if (if (if (if (if (if (if (if ((0 > bp)) | |
274 | 347 | then true | |
275 | - | else (0 > | |
348 | + | else (0 > bn)) | |
276 | 349 | then true | |
277 | - | else (0 > | |
350 | + | else (0 > br)) | |
278 | 351 | then true | |
279 | - | else (0 > | |
352 | + | else (0 > bs)) | |
280 | 353 | then true | |
281 | - | else (0 > | |
354 | + | else (0 > bt)) | |
282 | 355 | then true | |
283 | - | else (0 > | |
356 | + | else (0 > bu)) | |
284 | 357 | then true | |
285 | - | else (0 > | |
358 | + | else (0 > bv)) | |
286 | 359 | then true | |
287 | - | else (0 > | |
360 | + | else (0 > bw)) | |
288 | 361 | then throw("One of the passed parameters is invalid.") | |
289 | 362 | else { | |
290 | - | let | |
291 | - | let | |
292 | - | let | |
293 | - | [StringEntry( | |
363 | + | let cC = valueOrErrorMessage(addressFromStringValue(bk), "Passed Price Oracle Address is not valid.") | |
364 | + | let Q = ax[ay] | |
365 | + | let cD = valueOrErrorMessage(getString(valueOrErrorMessage(addressFromString(Q), ""), N), "No defo asset ID found.") | |
366 | + | [StringEntry(P(Q), bm(S, cD, av._1, bn, bo, bp, bq, bk, br, bs, bt, bu, bv, bw, bx, by)), StringEntry(Z(S), Q), StringEntry(X(Q), cB), IntegerEntry(T(Q), height), IntegerEntry(D, (ay + 1)), StringEntry(aa(cD), Q)] | |
294 | 367 | } | |
295 | 368 | ||
296 | 369 | ||
297 | 370 | ||
298 | - | @Callable(bz) | |
299 | - | func fundLiquidityPool (P) = { | |
300 | - | let N = aq(P) | |
301 | - | let bk = ae(N) | |
302 | - | let bM = value(bz.payments[0]) | |
303 | - | if ((toBase58String(bz.callerPublicKey) != x)) | |
371 | + | @Callable(cr) | |
372 | + | func fundLiquidityPool (S) = { | |
373 | + | let bR = aH(S) | |
374 | + | let bB = ak(bR) | |
375 | + | let cE = value(cr.payments[0]) | |
376 | + | let ad = toString(cr.caller) | |
377 | + | if ((g(C) == false)) | |
378 | + | then throw("Contract is not yet ready.") | |
379 | + | else if ((cE.assetId != ao)) | |
380 | + | then throw("Liquidity pool could be funded with USDN only.") | |
381 | + | else if ((ar > cE.amount)) | |
382 | + | then throw(("Attached payment amount is less tha min allowed: " + toString(ar))) | |
383 | + | else { | |
384 | + | let cF = (cE.amount + bc(bR)) | |
385 | + | let cG = bd(bR) | |
386 | + | let cH = bf(bR, ad) | |
387 | + | let cI = bg(bR, ad) | |
388 | + | let cJ = aL(bB) | |
389 | + | let cK = if (if ((cJ == as)) | |
390 | + | then (cF >= aP(bB)) | |
391 | + | else false) | |
392 | + | then at | |
393 | + | else cJ | |
394 | + | let cL = (cH + cE.amount) | |
395 | + | let cM = if ((cJ == au)) | |
396 | + | then [ScriptTransfer(addressFromStringValue(bR), cE.amount, ao)] | |
397 | + | else nil | |
398 | + | ([IntegerEntry(ac(bR, ad), cL), IntegerEntry(ae(bR, ad), max([cL, cI])), IntegerEntry(V(bR), cF), IntegerEntry(W(bR), max([cG, cF])), StringEntry(P(bR), bz(cK, bB))] ++ cM) | |
399 | + | } | |
400 | + | } | |
401 | + | ||
402 | + | ||
403 | + | ||
404 | + | @Callable(cr) | |
405 | + | func activateAsset (S) = { | |
406 | + | let Q = aF(S) | |
407 | + | let bB = ak(Q) | |
408 | + | let cN = bc(Q) | |
409 | + | let cO = aL(bB) | |
410 | + | if ((toBase58String(cr.callerPublicKey) != y)) | |
304 | 411 | then throw("Only Admin can perform contract operation.") | |
305 | - | else if ((g( | |
412 | + | else if ((g(C) == false)) | |
306 | 413 | then throw("Contract is not yet ready.") | |
307 | - | else if (( | |
308 | - | then throw(" | |
309 | - | else if (( | |
310 | - | then throw(" | |
311 | - | else if (( | |
312 | - | then throw((("Cannot | |
414 | + | else if ((cO != av._2)) | |
415 | + | then throw((("Asset is not in READY status. Current status is " + cO) + ".")) | |
416 | + | else if ((Q == "")) | |
417 | + | then throw((("Cannot find asset " + S) + ".")) | |
418 | + | else if ((aq > cN)) | |
419 | + | then throw((((("Cannot issue asset as liquidity pool amount (" + toString(cN)) + ") is less than required (") + toString(aq)) + ")")) | |
313 | 420 | else { | |
314 | - | let bN = (bM.amount + aM(N)) | |
315 | - | let bO = aN(N) | |
316 | - | let aa = toString(bz.caller) | |
317 | - | let bP = aP(N, aa) | |
318 | - | let bQ = aQ(N, aa) | |
319 | - | let bR = av(bk) | |
320 | - | let bS = if (if ((bN >= az(bk))) | |
321 | - | then (bR == aj._1) | |
322 | - | else false) | |
323 | - | then aj._2 | |
324 | - | else bR | |
325 | - | let bT = aJ(N) | |
326 | - | let bU = if ((bT == "")) | |
327 | - | then aa | |
328 | - | else if (contains(bT, aa)) | |
329 | - | then bT | |
330 | - | else ((bT + ",") + toString(bz.caller)) | |
331 | - | let bV = (bP + bz.payments[0].amount) | |
332 | - | let bW = [IntegerEntry(Z(N, toString(bz.caller)), bV), IntegerEntry(ab(N, toString(bz.caller)), if ((bV > bQ)) | |
333 | - | then bV | |
334 | - | else bQ), IntegerEntry(S(N), bN), IntegerEntry(T(N), if ((bN > bO)) | |
335 | - | then bN | |
336 | - | else bO), StringEntry(V(N), bU), StringEntry(M(N), bi(bS, bk))] | |
337 | - | if ((bR == aj._3)) | |
338 | - | then (bW :+ ScriptTransfer(addressFromStringValue(N), bM.amount, ag)) | |
339 | - | else bW | |
421 | + | let cz = Reissue(az, aA, true) | |
422 | + | [IntegerEntry(U(Q), height), StringEntry(P(Q), bz(av._3, bB)), cz, ScriptTransfer(addressFromStringValue(Q), cN, ao), ScriptTransfer(addressFromStringValue(Q), aA, az)] | |
340 | 423 | } | |
341 | 424 | } | |
342 | 425 | ||
343 | 426 | ||
344 | 427 | ||
345 | - | @Callable(bz) | |
346 | - | func activateAsset (P) = { | |
347 | - | let N = aq(P) | |
348 | - | let bk = ae(N) | |
349 | - | let bX = aM(N) | |
350 | - | let bY = av(bk) | |
351 | - | if ((toBase58String(bz.callerPublicKey) != x)) | |
352 | - | then throw("Only Admin can perform contract operation.") | |
353 | - | else if ((g(B) == false)) | |
354 | - | then throw("Contract is not yet ready.") | |
355 | - | else if ((bY != aj._2)) | |
356 | - | then throw((("Asset is not in READY status. Current status is " + bY) + ".")) | |
357 | - | else if ((N == "")) | |
358 | - | then throw((("Cannot find asset " + P) + ".")) | |
359 | - | else if ((ai > bX)) | |
360 | - | then throw((((("Cannot issue asset as liquidity pool amount (" + toString(bX)) + ") is less than required (") + toString(ai)) + ")")) | |
361 | - | else { | |
362 | - | let bH = Reissue(an, ap, true) | |
363 | - | [IntegerEntry(R(N), height), StringEntry(M(N), bi(aj._3, bk)), bH, ScriptTransfer(addressFromStringValue(N), bX, ag), ScriptTransfer(addressFromStringValue(N), ap, an)] | |
364 | - | } | |
428 | + | @Callable(cr) | |
429 | + | func redeemFromPool (S,cP) = { | |
430 | + | let cQ = toString(cr.caller) | |
431 | + | let cR = bQ(S, cQ) | |
432 | + | let bR = cR._1 | |
433 | + | let cp = cR._2 | |
434 | + | let bW = cR._3 | |
435 | + | let bT = cR._4 | |
436 | + | let cj = cR._5 | |
437 | + | let cq = cR._6 | |
438 | + | let ck = cR._7 | |
439 | + | let cS = cR._8 | |
440 | + | let cT = ah(bR, cQ, cq) | |
441 | + | if ((g(C) == false)) | |
442 | + | then throw("Contract is not yet ready.") | |
443 | + | else if (if (if ((0 > cP)) | |
444 | + | then true | |
445 | + | else (0 >= cj)) | |
446 | + | then true | |
447 | + | else (cP > cp)) | |
448 | + | then throw((("Cannot find pool maker by address " + cQ) + " or amount passed is not correct.")) | |
449 | + | else if (((1 * al) > cP)) | |
450 | + | then throw("Redeem amount is less then min allowed") | |
451 | + | else if ((ck > 0)) | |
452 | + | then throw("Pool maker already has initiated redemption that is not withdrawn yet.") | |
453 | + | else if (isDefined(getInteger(this, cT))) | |
454 | + | then throw((("Pool maker has already initiated redemption for " + toString(height)) + " height")) | |
455 | + | else [IntegerEntry(aj(bR), (bW + cP)), IntegerEntry(V(bR), (bT - cP)), IntegerEntry(ac(bR, cQ), (cj - cP)), IntegerEntry(cT, cP), IntegerEntry(af(bR, cQ), cP), IntegerEntry(ag(bR, cQ), cq), StringEntry("%s%s_trace_redeemFromPool", cS)] | |
365 | 456 | } | |
366 | 457 | ||
367 | 458 | ||
368 | 459 | ||
369 | - | @Callable(bz) | |
370 | - | func redeemFromPool (P,bZ) = { | |
371 | - | let N = aq(P) | |
372 | - | let bk = ae(N) | |
373 | - | let ca = toString(bz.caller) | |
374 | - | let cb = aP(N, ca) | |
375 | - | let cc = aR(N, ca) | |
376 | - | if ((toBase58String(bz.callerPublicKey) != x)) | |
377 | - | then throw("Only Admin can perform contract operation.") | |
378 | - | else if ((g(B) == false)) | |
379 | - | then throw("Contract is not yet ready.") | |
380 | - | else if ((N == "")) | |
381 | - | then throw((("Cannot find asset " + P) + ".")) | |
382 | - | else if (if (if ((0 > bZ)) | |
383 | - | then true | |
384 | - | else (cb == 0)) | |
385 | - | then true | |
386 | - | else (bZ > cb)) | |
387 | - | then throw((("Cannot find pool maker by address " + ca) + " or amount passed is not correct.")) | |
388 | - | else if ((cc > 0)) | |
389 | - | then throw("Pool maker already has initiated redemption that is not withdrawn yet.") | |
390 | - | else [IntegerEntry(ac(N, ca), bZ), IntegerEntry(ad(N, ca), (height + aH(bk)))] | |
460 | + | @Callable(cr) | |
461 | + | func getMaxAllowedAmountToRedeem (S,ad) = { | |
462 | + | let cR = bQ(S, ad) | |
463 | + | let bR = cR._1 | |
464 | + | let cp = cR._2 | |
465 | + | let bW = cR._3 | |
466 | + | let bT = cR._4 | |
467 | + | let cj = cR._5 | |
468 | + | let cq = cR._6 | |
469 | + | let ck = cR._7 | |
470 | + | throw(((((((("{" + "allowedAmountToRedeem: ") + toString(cp)) + ", assetCode: ") + S) + ", poolMaker: ") + ad) + "}")) | |
391 | 471 | } | |
392 | 472 | ||
393 | 473 | ||
394 | 474 | ||
395 | - | @Callable(bz) | |
396 | - | func getMaxAllowedAmountToRedeem (P,cd) = throw((((("{allowedAmountToRedeem: 1000, assetCode: " + P) + ", poolMaker: ") + cd) + "}")) | |
397 | - | ||
398 | - | ||
399 | - | ||
400 | - | @Callable(bz) | |
401 | - | func withdraw (P) = { | |
402 | - | let bk = ae(P) | |
403 | - | let N = aq(P) | |
404 | - | let aU = addressFromStringValue(aA(bk)) | |
405 | - | let ca = toString(bz.caller) | |
406 | - | let ce = valueOrErrorMessage(assetInfo(fromBase58String(N)), ("Cannot find asset by id " + N)) | |
407 | - | let cf = assetBalance(this, ag) | |
408 | - | let cg = aP(N, ca) | |
409 | - | let cc = aR(N, ca) | |
410 | - | let ch = aS(N, ca) | |
411 | - | let ci = (aN(N) / aQ(N, ca)) | |
412 | - | if ((toBase58String(bz.callerPublicKey) != x)) | |
413 | - | then throw("Only Admin can perform contract operation.") | |
414 | - | else if ((g(B) == false)) | |
415 | - | then throw("Contract is not yet ready.") | |
416 | - | else if ((g(B) == false)) | |
417 | - | then throw("Contract is not yet ready.") | |
418 | - | else if ((N == "")) | |
419 | - | then throw((("Cannot find asset " + P) + ".")) | |
420 | - | else if ((cg == 0)) | |
421 | - | then throw((("Cannot find pool maker by address " + ca) + " or no locked amount.")) | |
422 | - | else if ((height > ch)) | |
423 | - | then throw((("Please wait " + toString(ch)) + " before withdraw.")) | |
424 | - | else { | |
425 | - | let cj = ce.quantity | |
426 | - | let ck = aT(aU, P) | |
427 | - | let cl = aR(N, ca) | |
428 | - | let cm = (ay(bk) * ck) | |
429 | - | let cn = (cm * cj) | |
430 | - | if ((cf > cn)) | |
431 | - | then { | |
432 | - | let co = (cf - cn) | |
433 | - | let cp = (ci * co) | |
434 | - | let cq = (aR(N, ca) - cp) | |
435 | - | [IntegerEntry(S(N), (aM(N) - cp)), IntegerEntry(Z(N, ca), (aP(N, ca) - cp)), IntegerEntry(ac(N, ca), cq), ScriptTransfer(addressFromStringValue(ca), cp, ag)] | |
436 | - | } | |
437 | - | else nil | |
438 | - | } | |
475 | + | @Callable(cr) | |
476 | + | func withdraw (S) = { | |
477 | + | let cQ = toString(cr.caller) | |
478 | + | let bR = aH(S) | |
479 | + | let Q = addressFromStringValue(bR) | |
480 | + | let cU = af(bR, cQ) | |
481 | + | let cV = valueOrElse(getInteger(this, cU), 0) | |
482 | + | let cW = ag(bR, cQ) | |
483 | + | let cq = valueOrElse(getInteger(this, cW), 0) | |
484 | + | let bV = aj(bR) | |
485 | + | let bW = valueOrElse(getInteger(this, bV), 0) | |
486 | + | let cT = ah(bR, cQ, cq) | |
487 | + | if ((g(C) == false)) | |
488 | + | then throw("Contract is not yet ready.") | |
489 | + | else if (!(isDefined(getInteger(Q, cT)))) | |
490 | + | then throw("Need to transfer liquidity from asset account first") | |
491 | + | else if ((0 >= cV)) | |
492 | + | then throw((("Cannot find pool maker by address " + cQ) + " or no locked amount.")) | |
493 | + | else if ((height > cq)) | |
494 | + | then throw((("Please wait " + toString(cq)) + " before withdraw.")) | |
495 | + | else [IntegerEntry(cU, 0), IntegerEntry(bV, (bW - cV)), IntegerEntry(cW, 0), ScriptTransfer(addressFromStringValue(cQ), cV, ao)] | |
439 | 496 | } | |
440 | 497 | ||
441 | 498 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func a (b,c) = split(b, c) | |
5 | 5 | ||
6 | 6 | ||
7 | 7 | func d (e,f) = valueOrElse(getString(e, f), "") | |
8 | 8 | ||
9 | 9 | ||
10 | 10 | func g (f) = valueOrElse(getBoolean(this, f), false) | |
11 | 11 | ||
12 | 12 | ||
13 | - | let h = | |
13 | + | let h = "__" | |
14 | 14 | ||
15 | - | let i = | |
15 | + | let i = 1 | |
16 | 16 | ||
17 | - | let j = | |
17 | + | let j = 2 | |
18 | 18 | ||
19 | - | let k = | |
19 | + | let k = 3 | |
20 | 20 | ||
21 | - | let l = | |
21 | + | let l = 4 | |
22 | 22 | ||
23 | - | let m = | |
23 | + | let m = 5 | |
24 | 24 | ||
25 | - | let n = | |
25 | + | let n = 6 | |
26 | 26 | ||
27 | - | let o = | |
27 | + | let o = 7 | |
28 | 28 | ||
29 | - | let p = | |
29 | + | let p = 8 | |
30 | 30 | ||
31 | - | let q = | |
31 | + | let q = 9 | |
32 | 32 | ||
33 | - | let r = | |
33 | + | let r = 10 | |
34 | 34 | ||
35 | - | let s = | |
35 | + | let s = 11 | |
36 | 36 | ||
37 | - | let t = | |
37 | + | let t = 12 | |
38 | 38 | ||
39 | - | let u = | |
39 | + | let u = 13 | |
40 | 40 | ||
41 | - | let v = | |
41 | + | let v = 14 | |
42 | 42 | ||
43 | - | let w = | |
43 | + | let w = 15 | |
44 | 44 | ||
45 | - | let x = | |
45 | + | let x = 16 | |
46 | 46 | ||
47 | - | let y = " | |
47 | + | let y = "G1Ebu5AMHaTJFEbZNkZQcJFUQ9KfiYUwupyLG857DcFr" | |
48 | 48 | ||
49 | - | let z = "%s%s__commonConfig__ | |
49 | + | let z = "%s%s__commonConfig__neutrinoContractAddress" | |
50 | 50 | ||
51 | - | let A = "%s%s__commonConfig__ | |
51 | + | let A = "%s%s__commonConfig__neutrinoStakingAddress" | |
52 | 52 | ||
53 | - | let B = "%s%s__commonConfig__ | |
53 | + | let B = "%s%s__commonConfig__minimumPoolFundingAmount" | |
54 | 54 | ||
55 | - | let C = "%s%s__commonConfig__ | |
55 | + | let C = "%s%s__commonConfig__initialized" | |
56 | 56 | ||
57 | - | let D = "%s%s__commonConfig__ | |
57 | + | let D = "%s%s__commonConfig__predefinedAssetsActiveIndex" | |
58 | 58 | ||
59 | - | let E = "%s%s__commonConfig__ | |
59 | + | let E = "%s%s__commonConfig__predefinedAssetsList" | |
60 | 60 | ||
61 | - | let F = "%s%s__commonConfig__ | |
61 | + | let F = "%s%s__commonConfig__debtAssetId" | |
62 | 62 | ||
63 | - | let G = "%s%s__commonConfig__ | |
63 | + | let G = "%s%s__commonConfig__debtAssetEtalonBalance" | |
64 | 64 | ||
65 | - | let H = "%s%s__commonConfig__ | |
65 | + | let H = "%s%s__commonConfig__defoStakingAddress" | |
66 | 66 | ||
67 | - | let I = " | |
67 | + | let I = "%s%s__commonConfig__defoStakingPacemakerPub" | |
68 | 68 | ||
69 | - | let J = " | |
69 | + | let J = "%s%s__commonConfig__minPoolInvestAmount" | |
70 | 70 | ||
71 | - | let K = " | |
71 | + | let K = "neutrino_asset_id" | |
72 | 72 | ||
73 | - | let L = " | |
73 | + | let L = "bond_asset_id" | |
74 | 74 | ||
75 | - | func M (N) = (("%s%s%s__defoAsset__" + N) + "__config") | |
75 | + | let M = "rpd_contract" | |
76 | + | ||
77 | + | let N = "%s__defoAssetId" | |
78 | + | ||
79 | + | let O = "%s__assetScriptTxId" | |
80 | + | ||
81 | + | func P (Q) = (("%s%s%s__defoAsset__" + Q) + "__config") | |
76 | 82 | ||
77 | 83 | ||
78 | - | func | |
84 | + | func R (S) = ("%s%s__assetPrice__" + S) | |
79 | 85 | ||
80 | 86 | ||
81 | - | func | |
87 | + | func T (Q) = (("%s%s%s__defoAsset__" + Q) + "__initHeight") | |
82 | 88 | ||
83 | 89 | ||
84 | - | func | |
90 | + | func U (Q) = (("%s%s%s__defoAsset__" + Q) + "__activateHeight") | |
85 | 91 | ||
86 | 92 | ||
87 | - | func | |
93 | + | func V (Q) = (("%s%s%s__defoAsset__" + Q) + "__currentPool") | |
88 | 94 | ||
89 | 95 | ||
90 | - | func | |
96 | + | func W (Q) = (("%s%s%s__defoAsset__" + Q) + "__maxPool") | |
91 | 97 | ||
92 | 98 | ||
93 | - | func | |
99 | + | func X (Q) = (("%s%s%s__defoAsset__" + Q) + "__meta") | |
94 | 100 | ||
95 | 101 | ||
96 | - | func | |
102 | + | func Y (Q) = (("%s%s%s__defoAsset__" + Q) + "__poolMakers") | |
97 | 103 | ||
98 | 104 | ||
99 | - | func | |
105 | + | func Z (S) = (("%s%s%s__defoAsset__" + S) + "__addressByAssetCode") | |
100 | 106 | ||
101 | 107 | ||
102 | - | func | |
108 | + | func aa (ab) = (("%s%s%s__defoAsset__" + ab) + "__addressByAssetId") | |
103 | 109 | ||
104 | 110 | ||
105 | - | func | |
111 | + | func ac (Q,ad) = makeString(["%s%s%s%s__pool", Q, ad, "amount"], h) | |
106 | 112 | ||
107 | 113 | ||
108 | - | func | |
114 | + | func ae (Q,ad) = makeString(["%s%s%s%s__pool", Q, ad, "maxAmount"], h) | |
109 | 115 | ||
110 | 116 | ||
111 | - | func | |
117 | + | func af (Q,ad) = makeString(["%s%s%s%s__pool", Q, ad, "lockedAmount"], h) | |
112 | 118 | ||
113 | 119 | ||
114 | - | func | |
120 | + | func ag (Q,ad) = makeString(["%s%s%s%s__pool", Q, ad, "unlockHeight"], h) | |
115 | 121 | ||
116 | 122 | ||
117 | - | func | |
123 | + | func ah (Q,ad,ai) = makeString(["%s%s%s%d%s__pool", Q, ad, toString(ai), "liquidityRequest"], h) | |
118 | 124 | ||
119 | 125 | ||
120 | - | let af = addressFromStringValue(valueOrErrorMessage(getString(this, y), "No neutrino contract specified.")) | |
121 | - | ||
122 | - | let ag = fromBase58String(valueOrErrorMessage(getString(af, I), "No USDN asset id found.")) | |
123 | - | ||
124 | - | let ah = fromBase58String(valueOrErrorMessage(getString(af, J), "No NSBT asset id found")) | |
125 | - | ||
126 | - | let ai = valueOrErrorMessage(getInteger(this, A), "Minimum pool funding amount is not specified.") | |
127 | - | ||
128 | - | let aj = $Tuple3("PROPOSED", "READY", "ISSUED") | |
129 | - | ||
130 | - | let ak = valueOrErrorMessage(getString(this, D), "No pool of predeployed asset contracts found.") | |
131 | - | ||
132 | - | let al = a(ak, ",") | |
133 | - | ||
134 | - | let am = valueOrElse(getInteger(this, C), 0) | |
135 | - | ||
136 | - | let an = fromBase58String(valueOrErrorMessage(getString(this, E), "No debt token found")) | |
137 | - | ||
138 | - | let ao = 1000000 | |
139 | - | ||
140 | - | let ap = valueOrElse(getInteger(this, F), 0) | |
141 | - | ||
142 | - | func aq (ar) = valueOrElse(getString(this, W(ar)), "") | |
126 | + | func aj (Q) = makeString(["%s%s%s__pool", Q, "totalLockedAmount"], h) | |
143 | 127 | ||
144 | 128 | ||
145 | - | func | |
129 | + | func ak (Q) = a(valueOrErrorMessage(d(this, P(Q)), (("No DEFO Asset " + Q) + "config present")), "__") | |
146 | 130 | ||
147 | 131 | ||
148 | - | ||
132 | + | let al = 1000000 | |
149 | 133 | ||
134 | + | let am = addressFromStringValue(valueOrErrorMessage(getString(this, z), "No neutrino contract specified.")) | |
150 | 135 | ||
151 | - | ||
136 | + | let an = valueOrErrorMessage(getString(am, K), "No USDN asset id found.") | |
152 | 137 | ||
138 | + | let ao = fromBase58String(an) | |
153 | 139 | ||
154 | - | ||
140 | + | let ap = fromBase58String(valueOrErrorMessage(getString(am, L), "No NSBT asset id found")) | |
155 | 141 | ||
142 | + | let aq = valueOrErrorMessage(getInteger(this, B), "Minimum pool funding amount is not specified.") | |
156 | 143 | ||
157 | - | ||
144 | + | let ar = valueOrElse(getInteger(this, J), (10 * al)) | |
158 | 145 | ||
146 | + | let as = "PROPOSED" | |
159 | 147 | ||
160 | - | ||
148 | + | let at = "READY" | |
161 | 149 | ||
150 | + | let au = "ISSUED" | |
162 | 151 | ||
163 | - | ||
152 | + | let av = $Tuple3(as, at, au) | |
164 | 153 | ||
154 | + | let aw = valueOrErrorMessage(getString(this, E), "No pool of predeployed asset contracts found.") | |
165 | 155 | ||
166 | - | ||
156 | + | let ax = a(aw, ",") | |
167 | 157 | ||
158 | + | let ay = valueOrElse(getInteger(this, D), 0) | |
168 | 159 | ||
169 | - | ||
160 | + | let az = fromBase58String(valueOrErrorMessage(getString(this, F), "No debt token found")) | |
170 | 161 | ||
162 | + | let aA = valueOrElse(getInteger(this, G), 0) | |
171 | 163 | ||
172 | - | ||
164 | + | let aB = addressFromStringValue(getStringValue(am, M)) | |
173 | 165 | ||
174 | - | ||
175 | - | func aD (at) = parseIntValue(at[r]) | |
176 | - | ||
177 | - | ||
178 | - | func aE (at) = parseIntValue(at[s]) | |
179 | - | ||
180 | - | ||
181 | - | func aF (at) = parseIntValue(at[t]) | |
182 | - | ||
183 | - | ||
184 | - | func aG (at) = parseIntValue(at[u]) | |
185 | - | ||
186 | - | ||
187 | - | func aH (at) = parseIntValue(at[v]) | |
188 | - | ||
189 | - | ||
190 | - | func aI (at) = parseIntValue(at[w]) | |
191 | - | ||
192 | - | ||
193 | - | func aJ (N) = valueOrElse(getString(this, V(N)), "") | |
194 | - | ||
195 | - | ||
196 | - | func aK (N) = valueOrElse(getInteger(this, Q(N)), 0) | |
197 | - | ||
198 | - | ||
199 | - | func aL (N) = valueOrElse(getInteger(this, R(N)), 0) | |
200 | - | ||
201 | - | ||
202 | - | func aM (N) = valueOrElse(getInteger(this, S(N)), 0) | |
203 | - | ||
204 | - | ||
205 | - | func aN (N) = valueOrElse(getInteger(this, T(N)), 0) | |
206 | - | ||
207 | - | ||
208 | - | func aO (N) = valueOrElse(getString(this, U(N)), "") | |
209 | - | ||
210 | - | ||
211 | - | func aP (N,aa) = valueOrElse(getInteger(this, Z(N, aa)), 0) | |
212 | - | ||
213 | - | ||
214 | - | func aQ (N,aa) = valueOrElse(getInteger(this, ab(N, aa)), 0) | |
215 | - | ||
216 | - | ||
217 | - | func aR (N,aa) = valueOrElse(getInteger(this, ac(N, aa)), 0) | |
218 | - | ||
219 | - | ||
220 | - | func aS (N,aa) = valueOrElse(getInteger(this, ad(N, aa)), 0) | |
221 | - | ||
222 | - | ||
223 | - | func aT (aU,P) = valueOrErrorMessage(getInteger(aU, O(P)), "No Asset price found") | |
224 | - | ||
225 | - | ||
226 | - | func aV (P,Y,aj,aW,aX,aY,aZ,aU,ba,bb,bc,bd,be,bf,bg,bh) = makeString(["%s%s%s%d%s%d%d%s%d%d%d%d%d%d%d", P, Y, aj, toString(aW), aX, toString(aY), toString(aZ), aU, toString(ba), toString(bb), toString(bc), toString(bd), toString(be), toString(bf), toString(bg), toString(bh)], "__") | |
227 | - | ||
228 | - | ||
229 | - | func bi (bj,bk) = { | |
230 | - | let bl = as(bk) | |
231 | - | let bm = au(bk) | |
232 | - | let bn = aw(bk) | |
233 | - | let bo = ax(bk) | |
234 | - | let bp = ay(bk) | |
235 | - | let bq = az(bk) | |
236 | - | let br = aA(bk) | |
237 | - | let bs = aB(bk) | |
238 | - | let bt = aC(bk) | |
239 | - | let bu = aD(bk) | |
240 | - | let bv = aE(bk) | |
241 | - | let bw = aF(bk) | |
242 | - | let bx = aG(bk) | |
243 | - | let by = aH(bk) | |
244 | - | let bh = aI(bk) | |
245 | - | aV(bl, bm, bj, bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bh) | |
166 | + | func aC (aD) = { | |
167 | + | let aE = makeString(["rpd_balance", an, aD], "_") | |
168 | + | valueOrElse(getInteger(aB, aE), 0) | |
246 | 169 | } | |
247 | 170 | ||
248 | 171 | ||
249 | - | @Callable(bz) | |
250 | - | func init (bA,bB,bC,bD,am,bE,bF,bG) = if ((toBase58String(bz.callerPublicKey) != x)) | |
172 | + | func aF (aG) = valueOrElse(getString(this, Z(aG)), "") | |
173 | + | ||
174 | + | ||
175 | + | func aH (aG) = valueOrErrorMessage(getString(this, Z(aG)), (("Cannot find asset address by " + aG) + " code")) | |
176 | + | ||
177 | + | ||
178 | + | func aI (aJ) = aJ[i] | |
179 | + | ||
180 | + | ||
181 | + | func aK (aJ) = aJ[j] | |
182 | + | ||
183 | + | ||
184 | + | func aL (aJ) = aJ[k] | |
185 | + | ||
186 | + | ||
187 | + | func aM (aJ) = parseIntValue(aJ[l]) | |
188 | + | ||
189 | + | ||
190 | + | func aN (aJ) = aJ[m] | |
191 | + | ||
192 | + | ||
193 | + | func aO (aJ) = parseIntValue(aJ[n]) | |
194 | + | ||
195 | + | ||
196 | + | func aP (aJ) = parseIntValue(aJ[o]) | |
197 | + | ||
198 | + | ||
199 | + | func aQ (aJ) = aJ[p] | |
200 | + | ||
201 | + | ||
202 | + | func aR (aJ) = parseIntValue(aJ[q]) | |
203 | + | ||
204 | + | ||
205 | + | func aS (aJ) = parseIntValue(aJ[r]) | |
206 | + | ||
207 | + | ||
208 | + | func aT (aJ) = parseIntValue(aJ[s]) | |
209 | + | ||
210 | + | ||
211 | + | func aU (aJ) = parseIntValue(aJ[t]) | |
212 | + | ||
213 | + | ||
214 | + | func aV (aJ) = parseIntValue(aJ[u]) | |
215 | + | ||
216 | + | ||
217 | + | func aW (aJ) = parseIntValue(aJ[v]) | |
218 | + | ||
219 | + | ||
220 | + | func aX (aJ) = parseIntValue(aJ[w]) | |
221 | + | ||
222 | + | ||
223 | + | func aY (aJ) = parseIntValue(aJ[x]) | |
224 | + | ||
225 | + | ||
226 | + | func aZ (Q) = valueOrElse(getString(this, Y(Q)), "") | |
227 | + | ||
228 | + | ||
229 | + | func ba (Q) = valueOrElse(getInteger(this, T(Q)), 0) | |
230 | + | ||
231 | + | ||
232 | + | func bb (Q) = valueOrElse(getInteger(this, U(Q)), 0) | |
233 | + | ||
234 | + | ||
235 | + | func bc (Q) = valueOrElse(getInteger(this, V(Q)), 0) | |
236 | + | ||
237 | + | ||
238 | + | func bd (Q) = valueOrElse(getInteger(this, W(Q)), 0) | |
239 | + | ||
240 | + | ||
241 | + | func be (Q) = valueOrElse(getString(this, X(Q)), "") | |
242 | + | ||
243 | + | ||
244 | + | func bf (Q,ad) = valueOrElse(getInteger(this, ac(Q, ad)), 0) | |
245 | + | ||
246 | + | ||
247 | + | func bg (Q,ad) = valueOrElse(getInteger(this, ae(Q, ad)), 0) | |
248 | + | ||
249 | + | ||
250 | + | func bh (Q,ad) = valueOrElse(getInteger(this, af(Q, ad)), 0) | |
251 | + | ||
252 | + | ||
253 | + | func bi (Q,ad) = valueOrElse(getInteger(this, ag(Q, ad)), 0) | |
254 | + | ||
255 | + | ||
256 | + | func bj (bk,S) = valueOrErrorMessage(getInteger(bk, R(S)), "No Asset price found") | |
257 | + | ||
258 | + | ||
259 | + | func bl (Q) = valueOrElse(getInteger(this, aj(Q)), 0) | |
260 | + | ||
261 | + | ||
262 | + | func bm (S,ab,av,bn,bo,bp,bq,bk,br,bs,bt,bu,bv,bw,bx,by) = makeString(["%s%s%s%d%s%d%d%s%d%d%d%d%d%d%d", S, ab, av, toString(bn), bo, toString(bp), toString(bq), bk, toString(br), toString(bs), toString(bt), toString(bu), toString(bv), toString(bw), toString(bx), toString(by)], "__") | |
263 | + | ||
264 | + | ||
265 | + | func bz (bA,bB) = { | |
266 | + | let bC = aI(bB) | |
267 | + | let bD = aK(bB) | |
268 | + | let bE = aM(bB) | |
269 | + | let bF = aN(bB) | |
270 | + | let bG = aO(bB) | |
271 | + | let bH = aP(bB) | |
272 | + | let bI = aQ(bB) | |
273 | + | let bJ = aR(bB) | |
274 | + | let bK = aS(bB) | |
275 | + | let bL = aT(bB) | |
276 | + | let bM = aU(bB) | |
277 | + | let bN = aV(bB) | |
278 | + | let bO = aW(bB) | |
279 | + | let bP = aX(bB) | |
280 | + | let by = aY(bB) | |
281 | + | bm(bC, bD, bA, bE, bF, bG, bH, bI, bJ, bK, bL, bM, bN, bO, bP, by) | |
282 | + | } | |
283 | + | ||
284 | + | ||
285 | + | func bQ (S,ad) = { | |
286 | + | let bR = aH(S) | |
287 | + | let Q = addressFromStringValue(bR) | |
288 | + | let bB = ak(bR) | |
289 | + | let bS = aK(bB) | |
290 | + | let ab = fromBase58String(bS) | |
291 | + | let bT = valueOrElse(getInteger(this, V(bR)), 0) | |
292 | + | let bU = valueOrElse(getInteger(this, W(bR)), 0) | |
293 | + | let bV = aj(bR) | |
294 | + | let bW = valueOrElse(getInteger(this, bV), 0) | |
295 | + | let bX = aC(bR) | |
296 | + | let bY = assetBalance(Q, ao) | |
297 | + | let bZ = ((bX + bY) - bW) | |
298 | + | let ca = (bZ - bT) | |
299 | + | let cb = assetBalance(Q, ab) | |
300 | + | let cc = valueOrErrorMessage(assetInfo(ab), ("Cannot find asset by id " + bS)).quantity | |
301 | + | let cd = (cc - cb) | |
302 | + | let bk = addressFromStringValue(aQ(bB)) | |
303 | + | let ce = bj(bk, S) | |
304 | + | let cf = (((al + aO(bB)) * ce) / al) | |
305 | + | let cg = (cf * cd) | |
306 | + | let ch = bg(bR, ad) | |
307 | + | let ci = ac(bR, ad) | |
308 | + | let cj = valueOrElse(getInteger(this, ci), 0) | |
309 | + | let ck = bh(bR, ad) | |
310 | + | let cl = (ca - cg) | |
311 | + | let cm = fraction(cj, al, bT) | |
312 | + | let cn = fraction(ch, al, bU) | |
313 | + | let co = if ((cl >= 0)) | |
314 | + | then 0 | |
315 | + | else max([cm, cn]) | |
316 | + | let cp = fraction((al - co), cj, al) | |
317 | + | let cq = (height + aX(bB)) | |
318 | + | $Tuple8(bR, cp, bW, bT, cj, cq, ck, makeString([bR, bS, ad, toString(bX), toString(bY), toString(bZ), toString(bT), toString(bU), toString(ca), toString(cd), toString(ce), toString(cf), toString(ch), toString(cj), toString(ck), toString(cl), toString(cm), toString(cn), toString(co), toString(cp)], h)) | |
319 | + | } | |
320 | + | ||
321 | + | ||
322 | + | @Callable(cr) | |
323 | + | func init (cs,ct,cu,cv,ay,cw,cx,cy) = if ((toBase58String(cr.callerPublicKey) != y)) | |
251 | 324 | then throw("Only Admin can perform contract operation.") | |
252 | - | else if ((g( | |
325 | + | else if ((g(C) == true)) | |
253 | 326 | then throw("Contract was already initialized.") | |
254 | 327 | else { | |
255 | - | let | |
256 | - | let | |
257 | - | [StringEntry( | |
328 | + | let cz = Issue("DEFO_DEBT", "DEFO Debt Token.", 1, 6, true) | |
329 | + | let cA = calculateAssetId(cz) | |
330 | + | [StringEntry(z, cs), StringEntry(A, ct), IntegerEntry(B, cu), StringEntry(E, cv), IntegerEntry(D, ay), IntegerEntry(G, cw), StringEntry(F, toBase58String(cA)), StringEntry(H, cx), StringEntry(I, cy), BooleanEntry(C, true), cz, Burn(cA, 1)] | |
258 | 331 | } | |
259 | 332 | ||
260 | 333 | ||
261 | 334 | ||
262 | - | @Callable( | |
263 | - | func proposeAsset ( | |
335 | + | @Callable(cr) | |
336 | + | func proposeAsset (S,cB,bq,bk,bp,bo,bn,br,bs,bt,bu,bv,bw,bx,by) = if ((toBase58String(cr.callerPublicKey) != y)) | |
264 | 337 | then throw("Only Admin can perform contract operation.") | |
265 | - | else if ((g( | |
338 | + | else if ((g(C) == false)) | |
266 | 339 | then throw("Contract is not yet ready.") | |
267 | - | else if ((fromBase58String( | |
340 | + | else if ((fromBase58String(bo) != ao)) | |
268 | 341 | then throw("Baking asset id could be USDN only.") | |
269 | - | else if (( | |
270 | - | then throw((("Asset with passed code " + | |
271 | - | else if (( | |
272 | - | then throw(("Minimum pool amount should be greater or equals to " + toString( | |
273 | - | else if (if (if (if (if (if (if (if ((0 > | |
342 | + | else if ((aF(S) != "")) | |
343 | + | then throw((("Asset with passed code " + S) + " has already been proposed.")) | |
344 | + | else if ((aq > bq)) | |
345 | + | then throw(("Minimum pool amount should be greater or equals to " + toString(aq))) | |
346 | + | else if (if (if (if (if (if (if (if ((0 > bp)) | |
274 | 347 | then true | |
275 | - | else (0 > | |
348 | + | else (0 > bn)) | |
276 | 349 | then true | |
277 | - | else (0 > | |
350 | + | else (0 > br)) | |
278 | 351 | then true | |
279 | - | else (0 > | |
352 | + | else (0 > bs)) | |
280 | 353 | then true | |
281 | - | else (0 > | |
354 | + | else (0 > bt)) | |
282 | 355 | then true | |
283 | - | else (0 > | |
356 | + | else (0 > bu)) | |
284 | 357 | then true | |
285 | - | else (0 > | |
358 | + | else (0 > bv)) | |
286 | 359 | then true | |
287 | - | else (0 > | |
360 | + | else (0 > bw)) | |
288 | 361 | then throw("One of the passed parameters is invalid.") | |
289 | 362 | else { | |
290 | - | let | |
291 | - | let | |
292 | - | let | |
293 | - | [StringEntry( | |
363 | + | let cC = valueOrErrorMessage(addressFromStringValue(bk), "Passed Price Oracle Address is not valid.") | |
364 | + | let Q = ax[ay] | |
365 | + | let cD = valueOrErrorMessage(getString(valueOrErrorMessage(addressFromString(Q), ""), N), "No defo asset ID found.") | |
366 | + | [StringEntry(P(Q), bm(S, cD, av._1, bn, bo, bp, bq, bk, br, bs, bt, bu, bv, bw, bx, by)), StringEntry(Z(S), Q), StringEntry(X(Q), cB), IntegerEntry(T(Q), height), IntegerEntry(D, (ay + 1)), StringEntry(aa(cD), Q)] | |
294 | 367 | } | |
295 | 368 | ||
296 | 369 | ||
297 | 370 | ||
298 | - | @Callable(bz) | |
299 | - | func fundLiquidityPool (P) = { | |
300 | - | let N = aq(P) | |
301 | - | let bk = ae(N) | |
302 | - | let bM = value(bz.payments[0]) | |
303 | - | if ((toBase58String(bz.callerPublicKey) != x)) | |
371 | + | @Callable(cr) | |
372 | + | func fundLiquidityPool (S) = { | |
373 | + | let bR = aH(S) | |
374 | + | let bB = ak(bR) | |
375 | + | let cE = value(cr.payments[0]) | |
376 | + | let ad = toString(cr.caller) | |
377 | + | if ((g(C) == false)) | |
378 | + | then throw("Contract is not yet ready.") | |
379 | + | else if ((cE.assetId != ao)) | |
380 | + | then throw("Liquidity pool could be funded with USDN only.") | |
381 | + | else if ((ar > cE.amount)) | |
382 | + | then throw(("Attached payment amount is less tha min allowed: " + toString(ar))) | |
383 | + | else { | |
384 | + | let cF = (cE.amount + bc(bR)) | |
385 | + | let cG = bd(bR) | |
386 | + | let cH = bf(bR, ad) | |
387 | + | let cI = bg(bR, ad) | |
388 | + | let cJ = aL(bB) | |
389 | + | let cK = if (if ((cJ == as)) | |
390 | + | then (cF >= aP(bB)) | |
391 | + | else false) | |
392 | + | then at | |
393 | + | else cJ | |
394 | + | let cL = (cH + cE.amount) | |
395 | + | let cM = if ((cJ == au)) | |
396 | + | then [ScriptTransfer(addressFromStringValue(bR), cE.amount, ao)] | |
397 | + | else nil | |
398 | + | ([IntegerEntry(ac(bR, ad), cL), IntegerEntry(ae(bR, ad), max([cL, cI])), IntegerEntry(V(bR), cF), IntegerEntry(W(bR), max([cG, cF])), StringEntry(P(bR), bz(cK, bB))] ++ cM) | |
399 | + | } | |
400 | + | } | |
401 | + | ||
402 | + | ||
403 | + | ||
404 | + | @Callable(cr) | |
405 | + | func activateAsset (S) = { | |
406 | + | let Q = aF(S) | |
407 | + | let bB = ak(Q) | |
408 | + | let cN = bc(Q) | |
409 | + | let cO = aL(bB) | |
410 | + | if ((toBase58String(cr.callerPublicKey) != y)) | |
304 | 411 | then throw("Only Admin can perform contract operation.") | |
305 | - | else if ((g( | |
412 | + | else if ((g(C) == false)) | |
306 | 413 | then throw("Contract is not yet ready.") | |
307 | - | else if (( | |
308 | - | then throw(" | |
309 | - | else if (( | |
310 | - | then throw(" | |
311 | - | else if (( | |
312 | - | then throw((("Cannot | |
414 | + | else if ((cO != av._2)) | |
415 | + | then throw((("Asset is not in READY status. Current status is " + cO) + ".")) | |
416 | + | else if ((Q == "")) | |
417 | + | then throw((("Cannot find asset " + S) + ".")) | |
418 | + | else if ((aq > cN)) | |
419 | + | then throw((((("Cannot issue asset as liquidity pool amount (" + toString(cN)) + ") is less than required (") + toString(aq)) + ")")) | |
313 | 420 | else { | |
314 | - | let bN = (bM.amount + aM(N)) | |
315 | - | let bO = aN(N) | |
316 | - | let aa = toString(bz.caller) | |
317 | - | let bP = aP(N, aa) | |
318 | - | let bQ = aQ(N, aa) | |
319 | - | let bR = av(bk) | |
320 | - | let bS = if (if ((bN >= az(bk))) | |
321 | - | then (bR == aj._1) | |
322 | - | else false) | |
323 | - | then aj._2 | |
324 | - | else bR | |
325 | - | let bT = aJ(N) | |
326 | - | let bU = if ((bT == "")) | |
327 | - | then aa | |
328 | - | else if (contains(bT, aa)) | |
329 | - | then bT | |
330 | - | else ((bT + ",") + toString(bz.caller)) | |
331 | - | let bV = (bP + bz.payments[0].amount) | |
332 | - | let bW = [IntegerEntry(Z(N, toString(bz.caller)), bV), IntegerEntry(ab(N, toString(bz.caller)), if ((bV > bQ)) | |
333 | - | then bV | |
334 | - | else bQ), IntegerEntry(S(N), bN), IntegerEntry(T(N), if ((bN > bO)) | |
335 | - | then bN | |
336 | - | else bO), StringEntry(V(N), bU), StringEntry(M(N), bi(bS, bk))] | |
337 | - | if ((bR == aj._3)) | |
338 | - | then (bW :+ ScriptTransfer(addressFromStringValue(N), bM.amount, ag)) | |
339 | - | else bW | |
421 | + | let cz = Reissue(az, aA, true) | |
422 | + | [IntegerEntry(U(Q), height), StringEntry(P(Q), bz(av._3, bB)), cz, ScriptTransfer(addressFromStringValue(Q), cN, ao), ScriptTransfer(addressFromStringValue(Q), aA, az)] | |
340 | 423 | } | |
341 | 424 | } | |
342 | 425 | ||
343 | 426 | ||
344 | 427 | ||
345 | - | @Callable(bz) | |
346 | - | func activateAsset (P) = { | |
347 | - | let N = aq(P) | |
348 | - | let bk = ae(N) | |
349 | - | let bX = aM(N) | |
350 | - | let bY = av(bk) | |
351 | - | if ((toBase58String(bz.callerPublicKey) != x)) | |
352 | - | then throw("Only Admin can perform contract operation.") | |
353 | - | else if ((g(B) == false)) | |
354 | - | then throw("Contract is not yet ready.") | |
355 | - | else if ((bY != aj._2)) | |
356 | - | then throw((("Asset is not in READY status. Current status is " + bY) + ".")) | |
357 | - | else if ((N == "")) | |
358 | - | then throw((("Cannot find asset " + P) + ".")) | |
359 | - | else if ((ai > bX)) | |
360 | - | then throw((((("Cannot issue asset as liquidity pool amount (" + toString(bX)) + ") is less than required (") + toString(ai)) + ")")) | |
361 | - | else { | |
362 | - | let bH = Reissue(an, ap, true) | |
363 | - | [IntegerEntry(R(N), height), StringEntry(M(N), bi(aj._3, bk)), bH, ScriptTransfer(addressFromStringValue(N), bX, ag), ScriptTransfer(addressFromStringValue(N), ap, an)] | |
364 | - | } | |
428 | + | @Callable(cr) | |
429 | + | func redeemFromPool (S,cP) = { | |
430 | + | let cQ = toString(cr.caller) | |
431 | + | let cR = bQ(S, cQ) | |
432 | + | let bR = cR._1 | |
433 | + | let cp = cR._2 | |
434 | + | let bW = cR._3 | |
435 | + | let bT = cR._4 | |
436 | + | let cj = cR._5 | |
437 | + | let cq = cR._6 | |
438 | + | let ck = cR._7 | |
439 | + | let cS = cR._8 | |
440 | + | let cT = ah(bR, cQ, cq) | |
441 | + | if ((g(C) == false)) | |
442 | + | then throw("Contract is not yet ready.") | |
443 | + | else if (if (if ((0 > cP)) | |
444 | + | then true | |
445 | + | else (0 >= cj)) | |
446 | + | then true | |
447 | + | else (cP > cp)) | |
448 | + | then throw((("Cannot find pool maker by address " + cQ) + " or amount passed is not correct.")) | |
449 | + | else if (((1 * al) > cP)) | |
450 | + | then throw("Redeem amount is less then min allowed") | |
451 | + | else if ((ck > 0)) | |
452 | + | then throw("Pool maker already has initiated redemption that is not withdrawn yet.") | |
453 | + | else if (isDefined(getInteger(this, cT))) | |
454 | + | then throw((("Pool maker has already initiated redemption for " + toString(height)) + " height")) | |
455 | + | else [IntegerEntry(aj(bR), (bW + cP)), IntegerEntry(V(bR), (bT - cP)), IntegerEntry(ac(bR, cQ), (cj - cP)), IntegerEntry(cT, cP), IntegerEntry(af(bR, cQ), cP), IntegerEntry(ag(bR, cQ), cq), StringEntry("%s%s_trace_redeemFromPool", cS)] | |
365 | 456 | } | |
366 | 457 | ||
367 | 458 | ||
368 | 459 | ||
369 | - | @Callable(bz) | |
370 | - | func redeemFromPool (P,bZ) = { | |
371 | - | let N = aq(P) | |
372 | - | let bk = ae(N) | |
373 | - | let ca = toString(bz.caller) | |
374 | - | let cb = aP(N, ca) | |
375 | - | let cc = aR(N, ca) | |
376 | - | if ((toBase58String(bz.callerPublicKey) != x)) | |
377 | - | then throw("Only Admin can perform contract operation.") | |
378 | - | else if ((g(B) == false)) | |
379 | - | then throw("Contract is not yet ready.") | |
380 | - | else if ((N == "")) | |
381 | - | then throw((("Cannot find asset " + P) + ".")) | |
382 | - | else if (if (if ((0 > bZ)) | |
383 | - | then true | |
384 | - | else (cb == 0)) | |
385 | - | then true | |
386 | - | else (bZ > cb)) | |
387 | - | then throw((("Cannot find pool maker by address " + ca) + " or amount passed is not correct.")) | |
388 | - | else if ((cc > 0)) | |
389 | - | then throw("Pool maker already has initiated redemption that is not withdrawn yet.") | |
390 | - | else [IntegerEntry(ac(N, ca), bZ), IntegerEntry(ad(N, ca), (height + aH(bk)))] | |
460 | + | @Callable(cr) | |
461 | + | func getMaxAllowedAmountToRedeem (S,ad) = { | |
462 | + | let cR = bQ(S, ad) | |
463 | + | let bR = cR._1 | |
464 | + | let cp = cR._2 | |
465 | + | let bW = cR._3 | |
466 | + | let bT = cR._4 | |
467 | + | let cj = cR._5 | |
468 | + | let cq = cR._6 | |
469 | + | let ck = cR._7 | |
470 | + | throw(((((((("{" + "allowedAmountToRedeem: ") + toString(cp)) + ", assetCode: ") + S) + ", poolMaker: ") + ad) + "}")) | |
391 | 471 | } | |
392 | 472 | ||
393 | 473 | ||
394 | 474 | ||
395 | - | @Callable(bz) | |
396 | - | func getMaxAllowedAmountToRedeem (P,cd) = throw((((("{allowedAmountToRedeem: 1000, assetCode: " + P) + ", poolMaker: ") + cd) + "}")) | |
397 | - | ||
398 | - | ||
399 | - | ||
400 | - | @Callable(bz) | |
401 | - | func withdraw (P) = { | |
402 | - | let bk = ae(P) | |
403 | - | let N = aq(P) | |
404 | - | let aU = addressFromStringValue(aA(bk)) | |
405 | - | let ca = toString(bz.caller) | |
406 | - | let ce = valueOrErrorMessage(assetInfo(fromBase58String(N)), ("Cannot find asset by id " + N)) | |
407 | - | let cf = assetBalance(this, ag) | |
408 | - | let cg = aP(N, ca) | |
409 | - | let cc = aR(N, ca) | |
410 | - | let ch = aS(N, ca) | |
411 | - | let ci = (aN(N) / aQ(N, ca)) | |
412 | - | if ((toBase58String(bz.callerPublicKey) != x)) | |
413 | - | then throw("Only Admin can perform contract operation.") | |
414 | - | else if ((g(B) == false)) | |
415 | - | then throw("Contract is not yet ready.") | |
416 | - | else if ((g(B) == false)) | |
417 | - | then throw("Contract is not yet ready.") | |
418 | - | else if ((N == "")) | |
419 | - | then throw((("Cannot find asset " + P) + ".")) | |
420 | - | else if ((cg == 0)) | |
421 | - | then throw((("Cannot find pool maker by address " + ca) + " or no locked amount.")) | |
422 | - | else if ((height > ch)) | |
423 | - | then throw((("Please wait " + toString(ch)) + " before withdraw.")) | |
424 | - | else { | |
425 | - | let cj = ce.quantity | |
426 | - | let ck = aT(aU, P) | |
427 | - | let cl = aR(N, ca) | |
428 | - | let cm = (ay(bk) * ck) | |
429 | - | let cn = (cm * cj) | |
430 | - | if ((cf > cn)) | |
431 | - | then { | |
432 | - | let co = (cf - cn) | |
433 | - | let cp = (ci * co) | |
434 | - | let cq = (aR(N, ca) - cp) | |
435 | - | [IntegerEntry(S(N), (aM(N) - cp)), IntegerEntry(Z(N, ca), (aP(N, ca) - cp)), IntegerEntry(ac(N, ca), cq), ScriptTransfer(addressFromStringValue(ca), cp, ag)] | |
436 | - | } | |
437 | - | else nil | |
438 | - | } | |
475 | + | @Callable(cr) | |
476 | + | func withdraw (S) = { | |
477 | + | let cQ = toString(cr.caller) | |
478 | + | let bR = aH(S) | |
479 | + | let Q = addressFromStringValue(bR) | |
480 | + | let cU = af(bR, cQ) | |
481 | + | let cV = valueOrElse(getInteger(this, cU), 0) | |
482 | + | let cW = ag(bR, cQ) | |
483 | + | let cq = valueOrElse(getInteger(this, cW), 0) | |
484 | + | let bV = aj(bR) | |
485 | + | let bW = valueOrElse(getInteger(this, bV), 0) | |
486 | + | let cT = ah(bR, cQ, cq) | |
487 | + | if ((g(C) == false)) | |
488 | + | then throw("Contract is not yet ready.") | |
489 | + | else if (!(isDefined(getInteger(Q, cT)))) | |
490 | + | then throw("Need to transfer liquidity from asset account first") | |
491 | + | else if ((0 >= cV)) | |
492 | + | then throw((("Cannot find pool maker by address " + cQ) + " or no locked amount.")) | |
493 | + | else if ((height > cq)) | |
494 | + | then throw((("Please wait " + toString(cq)) + " before withdraw.")) | |
495 | + | else [IntegerEntry(cU, 0), IntegerEntry(bV, (bW - cV)), IntegerEntry(cW, 0), ScriptTransfer(addressFromStringValue(cQ), cV, ao)] | |
439 | 496 | } | |
440 | 497 | ||
441 | 498 |
github/deemru/w8io/169f3d6 143.45 ms ◑