tx · 2vyYkZp4HF8Fq8RcgVPTwG1FMP26XuELpzZEhUuieEDg

3Mp3nG9T5fKGziHW8mcCqx3jMFx3towh3WA:  -0.02800000 Waves

2022.10.05 13:35 [2258915] smart account 3Mp3nG9T5fKGziHW8mcCqx3jMFx3towh3WA > SELF 0.00000000 Waves

{ "type": 13, "id": "2vyYkZp4HF8Fq8RcgVPTwG1FMP26XuELpzZEhUuieEDg", "fee": 2800000, "feeAssetId": null, "timestamp": 1664966178772, "version": 1, "sender": "3Mp3nG9T5fKGziHW8mcCqx3jMFx3towh3WA", "senderPublicKey": "D46gQxzmdzdCTYRg6dMcwFoUrc6ZmxF6GKd5ZoTkvzp1", "proofs": [ "4Sc583Fap7YaqwJyGDRaprjnW4CCjh7JJaQ9DSE9MksozGAWGLmyCvWJZHVUxwXWtX8faovxdo6bt8GvYRdE6hkC" ], "script": "base64:BgJbCAISAwoBCBIAEgQKAggBEgcKBQgICAgBEgQKAggIEgUKAwgIARIECgIICBIDCgEBEgMKAQESBAoCCAgSAwoBCBIAEgMKAQESABIECgIICBIECgIICBIECgIICDEACXNlcGFyYXRvcgICX18ADnBvb2xXZWlnaHRNdWx0AIDC1y8AD21heERlcHRoRGVmYXVsdAAKABZmaW5hbGl6YXRpb25TdGFnZVRvdGFsAAAAF2ZpbmFsaXphdGlvblN0YWdlU2hhcmVzAAEADmtleUVwb2NoTGVuZ3RoCQC5CQIJAMwIAgICJXMJAMwIAgILZXBvY2hMZW5ndGgFA25pbAUJc2VwYXJhdG9yAA9rZXlDdXJyZW50RXBvY2gJALkJAgkAzAgCAgIlcwkAzAgCAgxjdXJyZW50RXBvY2gFA25pbAUJc2VwYXJhdG9yAAtrZXlNYXhEZXB0aAkAuQkCCQDMCAICAiVzCQDMCAICCG1heERlcHRoBQNuaWwFCXNlcGFyYXRvcgAia2V5Vm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAkAuQkCCQDMCAICAiVzCQDMCAICH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QFA25pbAUJc2VwYXJhdG9yABJrZXlGYWN0b3J5Q29udHJhY3QJALkJAgkAzAgCAgIlcwkAzAgCAg9mYWN0b3J5Q29udHJhY3QFA25pbAUJc2VwYXJhdG9yABNrZXlCb29zdGluZ0NvbnRyYWN0CQC5CQIJAMwIAgICJXMJAMwIAgIQYm9vc3RpbmdDb250cmFjdAUDbmlsBQlzZXBhcmF0b3IAEmtleVN0YWtpbmdDb250cmFjdAkAuQkCCQDMCAICAiVzCQDMCAICD3N0YWtpbmdDb250cmFjdAUDbmlsBQlzZXBhcmF0b3IAFGtleUZpbmFsaXphdGlvblN0YWdlCQC5CQIJAMwIAgICJXMJAMwIAgIRZmluYWxpemF0aW9uU3RhZ2UFA25pbAUJc2VwYXJhdG9yAAtrZXlOZXh0UG9vbAkAuQkCCQDMCAICAiVzCQDMCAICCG5leHRQb29sBQNuaWwFCXNlcGFyYXRvcgALa2V5TmV4dFVzZXIJALkJAgkAzAgCAgIlcwkAzAgCAghuZXh0VXNlcgUDbmlsBQlzZXBhcmF0b3IADmtleVN0YXJ0SGVpZ2h0CQC5CQIJAMwIAgICJXMJAMwIAgILc3RhcnRIZWlnaHQFA25pbAUJc2VwYXJhdG9yABFrZXlDdXJyZW50RXBvY2hVaQkAuQkCCQDMCAICAiVzCQDMCAICDmN1cnJlbnRFcG9jaFVpBQNuaWwFCXNlcGFyYXRvcgAQa2V5U3RhcnRIZWlnaHRVaQkAuQkCCQDMCAICAiVzCQDMCAICDXN0YXJ0SGVpZ2h0VWkFA25pbAUJc2VwYXJhdG9yARVrZXlTdGFydEhlaWdodEJ5RXBvY2gBBWVwb2NoCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgtzdGFydEhlaWdodAkAzAgCCQCkAwEFBWVwb2NoBQNuaWwFCXNlcGFyYXRvcgEMa2V5RmluYWxpemVkAQVlcG9jaAkAuQkCCQDMCAICBCVzJWQJAMwIAgIJZmluYWxpemVkCQDMCAIJAKQDAQUFZXBvY2gFA25pbAUJc2VwYXJhdG9yAQlrZXlJbkxpc3QBBHBvb2wECyR0MDE0MzYxNDc2BQRwb29sBA1hbW91bnRBc3NldElkCAULJHQwMTQzNjE0NzYCXzEEDHByaWNlQXNzZXRJZAgFCyR0MDE0MzYxNDc2Al8yCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICBmluTGlzdAkAzAgCBQ1hbW91bnRBc3NldElkCQDMCAIFDHByaWNlQXNzZXRJZAUDbmlsBQlzZXBhcmF0b3IBB2tleVVzZWQCB2FkZHJlc3MFZXBvY2gJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIEdXNlZAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgkApAMBBQVlcG9jaAUDbmlsBQlzZXBhcmF0b3IBB2tleVZvdGUDBHBvb2wHYWRkcmVzcwVlcG9jaAQLJHQwMTc1MDE3OTAFBHBvb2wEDWFtb3VudEFzc2V0SWQIBQskdDAxNzUwMTc5MAJfMQQMcHJpY2VBc3NldElkCAULJHQwMTc1MDE3OTACXzIJALkJAgkAzAgCAgolcyVzJXMlcyVkCQDMCAICBHZvdGUJAMwIAgUNYW1vdW50QXNzZXRJZAkAzAgCBQxwcmljZUFzc2V0SWQJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAIJAKQDAQUFZXBvY2gFA25pbAUJc2VwYXJhdG9yAQ9rZXlWb3RpbmdSZXN1bHQCBHBvb2wFZXBvY2gECyR0MDE5NzIyMDEyBQRwb29sBA1hbW91bnRBc3NldElkCAULJHQwMTk3MjIwMTICXzEEDHByaWNlQXNzZXRJZAgFCyR0MDE5NzIyMDEyAl8yCQC5CQIJAMwIAgIIJXMlcyVzJWQJAMwIAgIMdm90aW5nUmVzdWx0CQDMCAIFDWFtb3VudEFzc2V0SWQJAMwIAgUMcHJpY2VBc3NldElkCQDMCAIJAKQDAQUFZXBvY2gFA25pbAUJc2VwYXJhdG9yAQxrZXlQb29sU2hhcmUCBHBvb2wFZXBvY2gECyR0MDIxNzcyMjE3BQRwb29sBA1hbW91bnRBc3NldElkCAULJHQwMjE3NzIyMTcCXzEEDHByaWNlQXNzZXRJZAgFCyR0MDIxNzcyMjE3Al8yCQC5CQIJAMwIAgIIJXMlcyVzJWQJAMwIAgIJcG9vbFNoYXJlCQDMCAIFDWFtb3VudEFzc2V0SWQJAMwIAgUMcHJpY2VBc3NldElkCQDMCAIJAKQDAQUFZXBvY2gFA25pbAUJc2VwYXJhdG9yAQ1rZXlUb3RhbFZvdGVzAQVlcG9jaAkAuQkCCQDMCAICBCVzJWQJAMwIAgIKdG90YWxWb3RlcwkAzAgCCQCkAwEFBWVwb2NoBQNuaWwFCXNlcGFyYXRvcgEOZ2V0VmFsdWVPckZhaWwDB2FkZHJlc3MDa2V5BHR5cGUEBWVycm9yCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBAckbWF0Y2gwBQR0eXBlAwkAAQIFByRtYXRjaDACBlN0cmluZwQDc3RyBQckbWF0Y2gwCQCdCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAkAmggCBQdhZGRyZXNzBQNrZXkJAAIBAhJpbnZhbGlkIGVudHJ5IHR5cGUFBWVycm9yAQxnZXRTdHJPckZhaWwCB2FkZHJlc3MDa2V5CgABQAkBDmdldFZhbHVlT3JGYWlsAwUHYWRkcmVzcwUDa2V5AgADCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAQxnZXRJbnRPckZhaWwCB2FkZHJlc3MDa2V5CgABQAkBDmdldFZhbHVlT3JGYWlsAwUHYWRkcmVzcwUDa2V5AAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQxwb29sVG9TdHJpbmcBBHBvb2wJAKwCAgkArAICCAUEcG9vbAJfMQUJc2VwYXJhdG9yCAUEcG9vbAJfMgEMc3RyaW5nVG9Qb29sAQNzdHIEBXBhcnRzCQC1CQIFA3N0cgUJc2VwYXJhdG9yAwkAAAIJAJADAQUFcGFydHMAAgkAlAoCCQCRAwIFBXBhcnRzAAAJAJEDAgUFcGFydHMAAQkAAgECE2ludmFsaWQgcG9vbCBzdHJpbmcBFmdldExwQXNzZXRCeVBvb2xBc3NldHMCDWFtb3VudEFzc2V0SWQMcHJpY2VBc3NldElkCgEfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAEMYmFzZUFzc2V0U3RyCQCsAgICKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FDGJhc2VBc3NldFN0cgoBKWtleU1hcHBpbmdQb29sQXNzZXRzVG9Qb29sQ29udHJhY3RBZGRyZXNzAhhpbnRlcm5hbEFtb3VudEFzc2V0SWRTdHIXaW50ZXJuYWxQcmljZUFzc2V0SWRTdHIJAKwCAgkArAICCQCsAgIJAKwCAgIKJWQlZCVzJXNfXwkApAMBBRhpbnRlcm5hbEFtb3VudEFzc2V0SWRTdHICAl9fCQCkAwEFF2ludGVybmFsUHJpY2VBc3NldElkU3RyAiNfX21hcHBpbmdzX19wb29sQXNzZXRzMlBvb2xDb250cmFjdAoBH2tleU1hcHBpbmdQb29sQ29udHJhY3RUb0xQQXNzZXQBE3Bvb2xDb250cmFjdEFkZHJlc3MJAKwCAgkArAICAgglcyVzJXNfXwUTcG9vbENvbnRyYWN0QWRkcmVzcwIgX19tYXBwaW5nc19fcG9vbENvbnRyYWN0MkxwQXNzZXQED2ZhY3RvcnlDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBDGdldFN0ck9yRmFpbAIFBHRoaXMFEmtleUZhY3RvcnlDb250cmFjdAQVYW1vdW50QXNzZXRJbnRlcm5hbElkCQEMZ2V0SW50T3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0CQEfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAEFDWFtb3VudEFzc2V0SWQEFHByaWNlQXNzZXRJbnRlcm5hbElkCQEMZ2V0SW50T3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0CQEfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAEFDHByaWNlQXNzZXRJZAQTcG9vbENvbnRyYWN0QWRkcmVzcwkBDGdldFN0ck9yRmFpbAIFD2ZhY3RvcnlDb250cmFjdAkBKWtleU1hcHBpbmdQb29sQXNzZXRzVG9Qb29sQ29udHJhY3RBZGRyZXNzAgUVYW1vdW50QXNzZXRJbnRlcm5hbElkBRRwcmljZUFzc2V0SW50ZXJuYWxJZAQJbHBBc3NldElkCQEMZ2V0U3RyT3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0CQEfa2V5TWFwcGluZ1Bvb2xDb250cmFjdFRvTFBBc3NldAEFE3Bvb2xDb250cmFjdEFkZHJlc3MFCWxwQXNzZXRJZAEYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsAQRwb29sBAskdDA0NDU5NDQ5OQUEcG9vbAQNYW1vdW50QXNzZXRJZAgFCyR0MDQ0NTk0NDk5Al8xBAxwcmljZUFzc2V0SWQIBQskdDA0NDU5NDQ5OQJfMgQPZmFjdG9yeUNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQEMZ2V0U3RyT3JGYWlsAgUEdGhpcwUSa2V5RmFjdG9yeUNvbnRyYWN0CgABQAkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCGGNoZWNrV3hFbWlzc2lvblBvb2xMYWJlbAkAzAgCBQ1hbW91bnRBc3NldElkCQDMCAIFDHByaWNlQXNzZXRJZAUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEFAUACHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4ADXBvb2xzTGlzdE5hbWUCBXBvb2xzARBnZXRWb3Rlc0xpc3ROYW1lAQRwb29sBAskdDA0ODAwNDg0MAUEcG9vbAQNYW1vdW50QXNzZXRJZAgFCyR0MDQ4MDA0ODQwAl8xBAxwcmljZUFzc2V0SWQIBQskdDA0ODAwNDg0MAJfMgkAuQkCCQDMCAICBXZvdGVzCQDMCAIFDWFtb3VudEFzc2V0SWQJAMwIAgUMcHJpY2VBc3NldElkBQNuaWwFCXNlcGFyYXRvcgELa2V5TGlzdEhlYWQBCGxpc3ROYW1lBARtZXRhAwkAAAIFCGxpc3ROYW1lBQ1wb29sc0xpc3ROYW1lAgQlcyVzAgglcyVzJXMlcwkAuQkCCQDMCAIFBG1ldGEJAMwIAgUIbGlzdE5hbWUJAMwIAgIEaGVhZAUDbmlsBQlzZXBhcmF0b3IBC2tleUxpc3RTaXplAQhsaXN0TmFtZQQEbWV0YQMJAAACBQhsaXN0TmFtZQUNcG9vbHNMaXN0TmFtZQIEJXMlcwIIJXMlcyVzJXMJALkJAgkAzAgCBQRtZXRhCQDMCAIFCGxpc3ROYW1lCQDMCAICBHNpemUFA25pbAUJc2VwYXJhdG9yAQtrZXlMaXN0UHJldgIIbGlzdE5hbWUCaWQEBG1ldGEDCQAAAgUIbGlzdE5hbWUFDXBvb2xzTGlzdE5hbWUCCCVzJXMlcyVzAgolcyVzJXMlcyVzCQC5CQIJAMwIAgUEbWV0YQkAzAgCBQhsaXN0TmFtZQkAzAgCBQJpZAkAzAgCAgRwcmV2BQNuaWwFCXNlcGFyYXRvcgELa2V5TGlzdE5leHQCCGxpc3ROYW1lAmlkBARtZXRhAwkAAAIFCGxpc3ROYW1lBQ1wb29sc0xpc3ROYW1lAgglcyVzJXMlcwIKJXMlcyVzJXMlcwkAuQkCCQDMCAIFBG1ldGEJAMwIAgUIbGlzdE5hbWUJAMwIAgUCaWQJAMwIAgIEbmV4dAUDbmlsBQlzZXBhcmF0b3IBDGNvbnRhaW5zTm9kZQIIbGlzdE5hbWUCaWQECmhlYWRPclVuaXQJAJ0IAgUEdGhpcwkBC2tleUxpc3RIZWFkAQUIbGlzdE5hbWUECnByZXZPclVuaXQJAJ0IAgUEdGhpcwkBC2tleUxpc3RQcmV2AgUIbGlzdE5hbWUFAmlkBApuZXh0T3JVbml0CQCdCAIFBHRoaXMJAQtrZXlMaXN0TmV4dAIFCGxpc3ROYW1lBQJpZAMDCQAAAgUCaWQJAQt2YWx1ZU9yRWxzZQIFCmhlYWRPclVuaXQCAAYJAQIhPQIFCnByZXZPclVuaXQFBHVuaXQGCQECIT0CBQpuZXh0T3JVbml0BQR1bml0ARFpbnNlcnROb2RlQWN0aW9ucwIIbGlzdE5hbWUCaWQECmhlYWRPclVuaXQJAJ0IAgUEdGhpcwkBC2tleUxpc3RIZWFkAQUIbGlzdE5hbWUECGxpc3RTaXplCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQtrZXlMaXN0U2l6ZQEFCGxpc3ROYW1lAAAECWNoZWNrTm9kZQMJAQEhAQkBDGNvbnRhaW5zTm9kZQIFCGxpc3ROYW1lBQJpZAYJAAIBAgtOb2RlIGV4aXN0cwMJAAACBQljaGVja05vZGUFCWNoZWNrTm9kZQkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtrZXlMaXN0U2l6ZQEFCGxpc3ROYW1lCQBkAgUIbGlzdFNpemUAAQUDbmlsAwkBAiE9AgUKaGVhZE9yVW5pdAUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQELa2V5TGlzdE5leHQCBQhsaXN0TmFtZQUCaWQJAQV2YWx1ZQEFCmhlYWRPclVuaXQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBC2tleUxpc3RQcmV2AgUIbGlzdE5hbWUJAQV2YWx1ZQEFCmhlYWRPclVuaXQFAmlkBQNuaWwFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQELa2V5TGlzdEhlYWQBBQhsaXN0TmFtZQUCaWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERZGVsZXRlTm9kZUFjdGlvbnMCCGxpc3ROYW1lAmlkBApoZWFkT3JVbml0CQCdCAIFBHRoaXMJAQtrZXlMaXN0SGVhZAEFCGxpc3ROYW1lBAhsaXN0U2l6ZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQELa2V5TGlzdFNpemUBBQhsaXN0TmFtZQAABApwcmV2T3JVbml0CQCdCAIFBHRoaXMJAQtrZXlMaXN0UHJldgIFCGxpc3ROYW1lBQJpZAQKbmV4dE9yVW5pdAkAnQgCBQR0aGlzCQELa2V5TGlzdE5leHQCBQhsaXN0TmFtZQUCaWQJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBC2tleUxpc3RTaXplAQUIbGlzdE5hbWUJAGUCBQhsaXN0U2l6ZQABBQNuaWwDAwkBAiE9AgUKcHJldk9yVW5pdAUEdW5pdAkBAiE9AgUKbmV4dE9yVW5pdAUEdW5pdAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBC2tleUxpc3ROZXh0AgUIbGlzdE5hbWUJAQV2YWx1ZQEFCnByZXZPclVuaXQJAQV2YWx1ZQEFCm5leHRPclVuaXQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBC2tleUxpc3RQcmV2AgUIbGlzdE5hbWUJAQV2YWx1ZQEFCm5leHRPclVuaXQJAQV2YWx1ZQEFCnByZXZPclVuaXQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBC2tleUxpc3RQcmV2AgUIbGlzdE5hbWUFAmlkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQtrZXlMaXN0TmV4dAIFCGxpc3ROYW1lBQJpZAUDbmlsAwkBAiE9AgUKbmV4dE9yVW5pdAUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQELa2V5TGlzdEhlYWQBBQhsaXN0TmFtZQkBBXZhbHVlAQUKbmV4dE9yVW5pdAkAzAgCCQELRGVsZXRlRW50cnkBCQELa2V5TGlzdE5leHQCBQhsaXN0TmFtZQUCaWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBC2tleUxpc3RQcmV2AgUIbGlzdE5hbWUJAQV2YWx1ZQEFCm5leHRPclVuaXQFA25pbAMJAQIhPQIFCnByZXZPclVuaXQFBHVuaXQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBC2tleUxpc3RQcmV2AgUIbGlzdE5hbWUFAmlkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQtrZXlMaXN0TmV4dAIFCGxpc3ROYW1lCQEFdmFsdWUBBQpwcmV2T3JVbml0BQNuaWwDCQAAAgUCaWQJAQt2YWx1ZU9yRWxzZQIFCmhlYWRPclVuaXQCAAkAzAgCCQELRGVsZXRlRW50cnkBCQELa2V5TGlzdEhlYWQBBQhsaXN0TmFtZQUDbmlsCQACAQkArAICCQCsAgIJAKwCAgIOaW52YWxpZCBub2RlOiAFCGxpc3ROYW1lAgEuBQJpZAETa2V5TWFuYWdlclB1YmxpY0tleQACFCVzX19tYW5hZ2VyUHVibGljS2V5ARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgEdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwCQCiCAEJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABVwZXJtaXNzaW9uRGVuaWVkRXJyb3IJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAEIbXVzdFRoaXMBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgUVcGVybWlzc2lvbkRlbmllZEVycm9yAQttdXN0TWFuYWdlcgEBaQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUCcGsGBRVwZXJtaXNzaW9uRGVuaWVkRXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAkBCG11c3RUaGlzAQUBaQkAAgECC01hdGNoIGVycm9yEQFpAQpzZXRNYW5hZ2VyARdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQQLY2hlY2tDYWxsZXIJAQttdXN0TWFuYWdlcgEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBBVjaGVja01hbmFnZXJQdWJsaWNLZXkJANkEAQUXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkDCQAAAgUVY2hlY2tNYW5hZ2VyUHVibGljS2V5BRVjaGVja01hbmFnZXJQdWJsaWNLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAUXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jb25maXJtTWFuYWdlcgAEAnBtCQEdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQABAVoYXNQTQMJAQlpc0RlZmluZWQBBQJwbQYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUFaGFzUE0FBWhhc1BNBAdjaGVja1BNAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCcG0GCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFB2NoZWNrUE0FB2NoZWNrUE0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBE2tleU1hbmFnZXJQdWJsaWNLZXkACQDYBAEJAQV2YWx1ZQEFAnBtCQDMCAIJAQtEZWxldGVFbnRyeQEJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQCC3VzZXJBZGRyZXNzDHRhcmdldEhlaWdodAQXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQEMZ2V0U3RyT3JGYWlsAgUEdGhpcwUTa2V5Qm9vc3RpbmdDb250cmFjdAIhaW52YWxpZCBib29zdGluZyBjb250cmFjdCBhZGRyZXNzCQCUCgIFA25pbAoAAUAJAPwHBAUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MCIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFDHRhcmdldEhlaWdodAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AWkBC2NvbnN0cnVjdG9yBQ9mYWN0b3J5Q29udHJhY3Qfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdBBib29zdGluZ0NvbnRyYWN0D3N0YWtpbmdDb250cmFjdAtlcG9jaExlbmd0aAQGY2hlY2tzCQDMCAIJAQttdXN0TWFuYWdlcgEFAWkJAMwIAgMJAQIhPQIJAKYIAQUPZmFjdG9yeUNvbnRyYWN0BQR1bml0BgIgaW52YWxpZCBmYWN0b3J5IGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAQIhPQIJAKYIAQUfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAUEdW5pdAYCMmludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNhbmRpZGF0ZSBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQECIT0CCQCmCAEFEGJvb3N0aW5nQ29udHJhY3QFBHVuaXQGAiFpbnZhbGlkIGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAQIhPQIJAKYIAQUPc3Rha2luZ0NvbnRyYWN0BQR1bml0BgIgaW52YWxpZCBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAGYCBQtlcG9jaExlbmd0aAAABgkAAgECFGludmFsaWQgZXBvY2ggbGVuZ3RoBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBRJrZXlGYWN0b3J5Q29udHJhY3QFD2ZhY3RvcnlDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBSJrZXlWb3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0BR92b3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFE2tleUJvb3N0aW5nQ29udHJhY3QFEGJvb3N0aW5nQ29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUSa2V5U3Rha2luZ0NvbnRyYWN0BQ9zdGFraW5nQ29udHJhY3QJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtleUVwb2NoTGVuZ3RoBQtlcG9jaExlbmd0aAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBmNyZWF0ZQINYW1vdW50QXNzZXRJZAxwcmljZUFzc2V0SWQEBmNoZWNrcwkAzAgCAwkAAAIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBSJrZXlWb3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0AgAGCQELbXVzdE1hbmFnZXIBBQFpBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEBHBvb2wJAJQKAgUNYW1vdW50QXNzZXRJZAUMcHJpY2VBc3NldElkBA1pbkxpc3RBY3Rpb25zCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlJbkxpc3QBBQRwb29sBgUDbmlsCQERaW5zZXJ0Tm9kZUFjdGlvbnMCBQ1wb29sc0xpc3ROYW1lCQEMcG9vbFRvU3RyaW5nAQUEcG9vbAQYY3VycmVudEVwb2NoSXNOb3REZWZpbmVkCQAAAgkAmggCBQR0aGlzBQ9rZXlDdXJyZW50RXBvY2gFBHVuaXQEEnN0YXJ0SGVpZ2h0QWN0aW9ucwMFGGN1cnJlbnRFcG9jaElzTm90RGVmaW5lZAQFZXBvY2gAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa2V5Q3VycmVudEVwb2NoBQVlcG9jaAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaAEFBWVwb2NoBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtleVN0YXJ0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtleUN1cnJlbnRFcG9jaFVpBQVlcG9jaAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa2V5U3RhcnRIZWlnaHRVaQUGaGVpZ2h0BQNuaWwFA25pbAkAlAoCCQDOCAIFDWluTGlzdEFjdGlvbnMFEnN0YXJ0SGVpZ2h0QWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQR2b3RlAw1hbW91bnRBc3NldElkDHByaWNlQXNzZXRJZAZhbW91bnQEBHBvb2wJAJQKAgUNYW1vdW50QXNzZXRJZAUMcHJpY2VBc3NldElkBAVlcG9jaAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9rZXlDdXJyZW50RXBvY2gAAAQLc3RhcnRIZWlnaHQJAQxnZXRJbnRPckZhaWwCBQR0aGlzCQEVa2V5U3RhcnRIZWlnaHRCeUVwb2NoAQUFZXBvY2gEC2Vwb2NoTGVuZ3RoCQEMZ2V0SW50T3JGYWlsAgUEdGhpcwUOa2V5RXBvY2hMZW5ndGgECWVuZEhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0BQtlcG9jaExlbmd0aAQXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQJAJoIAgUEdGhpcwUUa2V5RmluYWxpemF0aW9uU3RhZ2UEBHVzZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBB2tleVVzZWQCCAUBaQZjYWxsZXIFBWVwb2NoAAAEBHZvdGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBB2tleVZvdGUDBQRwb29sCAUBaQZjYWxsZXIFBWVwb2NoAAAECnBvb2xSZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBD2tleVZvdGluZ1Jlc3VsdAIFBHBvb2wFBWVwb2NoAAAECnRvdGFsVm90ZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDWtleVRvdGFsVm90ZXMBBQVlcG9jaAAABBNnd3hBbW91bnRBdEVuZFRvdGFsCgABQAkA/AcEBQR0aGlzAhhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQJAMwIAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIFCWVuZEhlaWdodAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAlhdmFpbGFibGUJAGUCBRNnd3hBbW91bnRBdEVuZFRvdGFsBQR1c2VkBAduZXdWb3RlCQBkAgUEdm90ZQUGYW1vdW50BAp3eEVtaXNzaW9uCQEYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsAQUEcG9vbAQGY2hlY2tzCQDMCAIDCQECIT0CCQCgCAEJAQlrZXlJbkxpc3QBBQRwb29sBQR1bml0BgkAAgECDmludmFsaWQgYXNzZXRzCQDMCAIDCQBmAgUJZW5kSGVpZ2h0BQZoZWlnaHQGCQACAQIOaW52YWxpZCBoZWlnaHQJAMwIAgMJAAACBRdmaW5hbGl6YXRpb25TdGFnZU9yVW5pdAUEdW5pdAYJAAIBAhhmaW5hbGl6YXRpb24gaW4gcHJvZ3Jlc3MJAMwIAgMJAGYCBRNnd3hBbW91bnRBdEVuZFRvdGFsAAAGCQACAQITeW91IGRvIG5vdCBoYXZlIGdXWAkAzAgCAwMJAGYCBQZhbW91bnQAAAkAZwIFCWF2YWlsYWJsZQUGYW1vdW50BwYJAAIBAg5pbnZhbGlkIGFtb3VudAkAzAgCAwUKd3hFbWlzc2lvbgYJAAIBAh1wb29sIGhhc24ndCBXWF9FTUlTU0lPTiBsYWJlbAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA12b3Rlc0xpc3ROYW1lCQEQZ2V0Vm90ZXNMaXN0TmFtZQEFBHBvb2wEDnVzZXJBZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQQdm90ZXNMaXN0QWN0aW9ucwMJAQxjb250YWluc05vZGUCBQ12b3Rlc0xpc3ROYW1lBQ51c2VyQWRkcmVzc1N0cgUDbmlsCQERaW5zZXJ0Tm9kZUFjdGlvbnMCBQ12b3Rlc0xpc3ROYW1lBQ51c2VyQWRkcmVzc1N0cgkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQdrZXlVc2VkAggFAWkGY2FsbGVyBQVlcG9jaAkAZAIFBHVzZWQFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBB2tleVZvdGUDBQRwb29sCAUBaQZjYWxsZXIFBWVwb2NoBQduZXdWb3RlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5Vm90aW5nUmVzdWx0AgUEcG9vbAUFZXBvY2gJAGQCBQpwb29sUmVzdWx0BQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1rZXlUb3RhbFZvdGVzAQUFZXBvY2gJAGQCBQp0b3RhbFZvdGVzBQZhbW91bnQFA25pbAUQdm90ZXNMaXN0QWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpjYW5jZWxWb3RlAg1hbW91bnRBc3NldElkDHByaWNlQXNzZXRJZAQEcG9vbAkAlAoCBQ1hbW91bnRBc3NldElkBQxwcmljZUFzc2V0SWQEBWVwb2NoCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFD2tleUN1cnJlbnRFcG9jaAAABAtzdGFydEhlaWdodAkBDGdldEludE9yRmFpbAIFBHRoaXMJARVrZXlTdGFydEhlaWdodEJ5RXBvY2gBBQVlcG9jaAQLZXBvY2hMZW5ndGgJAQxnZXRJbnRPckZhaWwCBQR0aGlzBQ5rZXlFcG9jaExlbmd0aAQJZW5kSGVpZ2h0CQBkAgULc3RhcnRIZWlnaHQFC2Vwb2NoTGVuZ3RoBBdmaW5hbGl6YXRpb25TdGFnZU9yVW5pdAkAmggCBQR0aGlzBRRrZXlGaW5hbGl6YXRpb25TdGFnZQQEdXNlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEHa2V5VXNlZAIIBQFpBmNhbGxlcgUFZXBvY2gAAAQEdm90ZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEHa2V5Vm90ZQMFBHBvb2wIBQFpBmNhbGxlcgUFZXBvY2gAAAQKcG9vbFJlc3VsdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPa2V5Vm90aW5nUmVzdWx0AgUEcG9vbAUFZXBvY2gAAAQKdG90YWxWb3RlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQENa2V5VG90YWxWb3RlcwEFBWVwb2NoAAAEBmNoZWNrcwkAzAgCAwkBAiE9AgkAoAgBCQEJa2V5SW5MaXN0AQUEcG9vbAUEdW5pdAYJAAIBAg5pbnZhbGlkIGFzc2V0cwkAzAgCAwkAZgIFCWVuZEhlaWdodAUGaGVpZ2h0BgkAAgECDmludmFsaWQgaGVpZ2h0CQDMCAIDCQAAAgUXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQFBHVuaXQGCQACAQIYZmluYWxpemF0aW9uIGluIHByb2dyZXNzCQDMCAIDCQBmAgUEdm90ZQAABgkAAgECB25vIHZvdGUFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQNdm90ZXNMaXN0TmFtZQkBEGdldFZvdGVzTGlzdE5hbWUBBQRwb29sBA51c2VyQWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEHa2V5VXNlZAIIBQFpBmNhbGxlcgUFZXBvY2gJAJYDAQkAzAgCCQBlAgUEdXNlZAUEdm90ZQkAzAgCAAAFA25pbAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5Vm90ZQMFBHBvb2wIBQFpBmNhbGxlcgUFZXBvY2gJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlWb3RpbmdSZXN1bHQCBQRwb29sBQVlcG9jaAkAZQIFCnBvb2xSZXN1bHQFBHZvdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1rZXlUb3RhbFZvdGVzAQUFZXBvY2gJAGUCBQp0b3RhbFZvdGVzBQR2b3RlBQNuaWwJARFkZWxldGVOb2RlQWN0aW9ucwIFDXZvdGVzTGlzdE5hbWUFDnVzZXJBZGRyZXNzU3RyBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDnNldEVwb2NoTGVuZ3RoAQ5uZXdFcG9jaExlbmd0aAQGY2hlY2tzCQDMCAIJAQttdXN0TWFuYWdlcgEFAWkJAMwIAgMJAGYCBQ5uZXdFcG9jaExlbmd0aAAABgkAAgECFGludmFsaWQgZXBvY2ggbGVuZ3RoBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUOa2V5RXBvY2hMZW5ndGgFDm5ld0Vwb2NoTGVuZ3RoBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc2V0TWF4RGVwdGgBC25ld01heERlcHRoBAZjaGVja3MJAMwIAgkBC211c3RNYW5hZ2VyAQUBaQkAzAgCAwkAZgIFC25ld01heERlcHRoAAAGCQACAQIRaW52YWxpZCBtYXggZGVwdGgFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrZXlNYXhEZXB0aAULbmV3TWF4RGVwdGgFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNwcm9jZXNzVm90ZUlOVEVSTkFMAgdwb29sU3RyDnVzZXJBZGRyZXNzU3RyBAtjaGVja0NhbGxlcgkBCG11c3RUaGlzAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3VzZXJBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUOdXNlckFkZHJlc3NTdHIJAKwCAgIqcHJvY2Vzc1ZvdGVJTlRFUk5BTDogaW52YWxpZCB1c2VyIGFkZHJlc3MgBQ51c2VyQWRkcmVzc1N0cgQFZXBvY2gJAQxnZXRJbnRPckZhaWwCBQR0aGlzBQ9rZXlDdXJyZW50RXBvY2gEDWVwb2NoUHJldmlvdXMJAGUCBQVlcG9jaAABBAtlcG9jaExlbmd0aAkBDGdldEludE9yRmFpbAIFBHRoaXMFDmtleUVwb2NoTGVuZ3RoBAtzdGFydEhlaWdodAkBDGdldEludE9yRmFpbAIFBHRoaXMJARVrZXlTdGFydEhlaWdodEJ5RXBvY2gBBQVlcG9jaAQJZW5kSGVpZ2h0CQBkAgULc3RhcnRIZWlnaHQFC2Vwb2NoTGVuZ3RoBBNzdGFydEhlaWdodFByZXZpb3VzCQEMZ2V0SW50T3JGYWlsAgUEdGhpcwkBFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaAEFDWVwb2NoUHJldmlvdXMEEWVuZEhlaWdodFByZXZpb3VzCQBkAgUTc3RhcnRIZWlnaHRQcmV2aW91cwULZXBvY2hMZW5ndGgEEGNoZWNrVGFyZ2V0RXBvY2gDCQBnAgUNZXBvY2hQcmV2aW91cwAABgkAAgECK3Byb2Nlc3NWb3RlSU5URVJOQUw6IGludmFsaWQgcHJldmlvdXMgZXBvY2gDCQAAAgUQY2hlY2tUYXJnZXRFcG9jaAUQY2hlY2tUYXJnZXRFcG9jaAQEcG9vbAkBDHN0cmluZ1RvUG9vbAEFB3Bvb2xTdHIEDSR0MDE3MTk1MTcyMzUFBHBvb2wEDWFtb3VudEFzc2V0SWQIBQ0kdDAxNzE5NTE3MjM1Al8xBAxwcmljZUFzc2V0SWQIBQ0kdDAxNzE5NTE3MjM1Al8yBAp3eEVtaXNzaW9uCQEYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsAQUEcG9vbAQTZ3d4QW1vdW50QXRFbmRUb3RhbAoAAUAJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIFDnVzZXJBZGRyZXNzU3RyCQDMCAIFCWVuZEhlaWdodAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BBtnd3hBbW91bnRBdEVuZFRvdGFsUHJldmlvdXMKAAFACQD8BwQFBHRoaXMCGGdldFVzZXJHd3hBbW91bnRBdEhlaWdodAkAzAgCBQ51c2VyQWRkcmVzc1N0cgkAzAgCBRFlbmRIZWlnaHRQcmV2aW91cwUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAp0b3RhbFZvdGVzCQELdmFsdWVPckVsc2UCCQCfCAEJAQ1rZXlUb3RhbFZvdGVzAQUFZXBvY2gAAAQMdm90aW5nUmVzdWx0CQELdmFsdWVPckVsc2UCCQCfCAEJAQ9rZXlWb3RpbmdSZXN1bHQCBQRwb29sBQVlcG9jaAAABAx2b3RlUHJldmlvdXMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQEHa2V5Vm90ZQMFBHBvb2wFC3VzZXJBZGRyZXNzBQ1lcG9jaFByZXZpb3VzCQCsAgIJAKwCAgkArAICCQCsAgICFHByb2Nlc3NWb3RlSU5URVJOQUwgBQdwb29sU3RyAgEgBQ51c2VyQWRkcmVzc1N0cgISOiBubyBwcmV2aW91cyB2b3RlBAR1c2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQdrZXlVc2VkAgULdXNlckFkZHJlc3MFBWVwb2NoAAAEB25ld1ZvdGUDCQBmAgUbZ3d4QW1vdW50QXRFbmRUb3RhbFByZXZpb3VzAAAJAGsDBQx2b3RlUHJldmlvdXMFE2d3eEFtb3VudEF0RW5kVG90YWwFG2d3eEFtb3VudEF0RW5kVG90YWxQcmV2aW91cwAABAdhY3Rpb25zAwMJAGYCBQduZXdWb3RlAAAFCnd4RW1pc3Npb24HCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEHa2V5Vm90ZQMFBHBvb2wFC3VzZXJBZGRyZXNzBQVlcG9jaAUHbmV3Vm90ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDWtleVRvdGFsVm90ZXMBBQVlcG9jaAkAZAIFCnRvdGFsVm90ZXMFB25ld1ZvdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlWb3RpbmdSZXN1bHQCBQRwb29sBQVlcG9jaAkAZAIFDHZvdGluZ1Jlc3VsdAUHbmV3Vm90ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBB2tleVVzZWQCBQt1c2VyQWRkcmVzcwUFZXBvY2gJAGQCBQR1c2VkBQduZXdWb3RlBQNuaWwJARFkZWxldGVOb2RlQWN0aW9ucwIJARBnZXRWb3Rlc0xpc3ROYW1lAQUEcG9vbAUOdXNlckFkZHJlc3NTdHIJAJQKAgUHYWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNwcm9jZXNzUG9vbElOVEVSTkFMAQdwb29sU3RyBAtjaGVja0NhbGxlcgkBCG11c3RUaGlzAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3RhcmdldEVwb2NoCQBlAgkBDGdldEludE9yRmFpbAIFBHRoaXMFD2tleUN1cnJlbnRFcG9jaAABBBBjaGVja1RhcmdldEVwb2NoAwkAZwIFC3RhcmdldEVwb2NoAAAGCQACAQIpcHJvY2Vzc1Bvb2xJTlRFUk5BTDogaW52YWxpZCB0YXJnZXQgZXBvY2gDCQAAAgUQY2hlY2tUYXJnZXRFcG9jaAUQY2hlY2tUYXJnZXRFcG9jaAQEcG9vbAkBDHN0cmluZ1RvUG9vbAEFB3Bvb2xTdHIEDSR0MDE4ODAxMTg4NDEFBHBvb2wEDWFtb3VudEFzc2V0SWQIBQ0kdDAxODgwMTE4ODQxAl8xBAxwcmljZUFzc2V0SWQIBQ0kdDAxODgwMTE4ODQxAl8yBA9zdGFraW5nQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQxnZXRTdHJPckZhaWwCBQR0aGlzBRJrZXlTdGFraW5nQ29udHJhY3QED2ZhY3RvcnlDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBDGdldFN0ck9yRmFpbAIFBHRoaXMFEmtleUZhY3RvcnlDb250cmFjdAQJbHBBc3NldElkCQEWZ2V0THBBc3NldEJ5UG9vbEFzc2V0cwIFDWFtb3VudEFzc2V0SWQFDHByaWNlQXNzZXRJZAQBcgoAAUAJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhJ1c2Vyc0xpc3RUcmF2ZXJzYWwJAMwIAgUJbHBBc3NldElkBQNuaWwFA25pbAMJAAECBQFAAgdCb29sZWFuBQFACQACAQkArAICCQADAQUBQAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQFyBQFyAwUBcgkAlAoCBQNuaWwGBAp3eEVtaXNzaW9uCQEYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsAQUEcG9vbAQKdG90YWxWb3RlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQENa2V5VG90YWxWb3RlcwEFC3RhcmdldEVwb2NoAAAEDHZvdGluZ1Jlc3VsdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPa2V5Vm90aW5nUmVzdWx0AgUEcG9vbAULdGFyZ2V0RXBvY2gAAAQFc2hhcmUDAwkAAAIFCnRvdGFsVm90ZXMAAAYJAQEhAQUKd3hFbWlzc2lvbgAACQBrAwUMdm90aW5nUmVzdWx0BQ5wb29sV2VpZ2h0TXVsdAUKdG90YWxWb3RlcwQPbW9kaWZ5V2VpZ2h0SW52CQD8BwQFD2ZhY3RvcnlDb250cmFjdAIMbW9kaWZ5V2VpZ2h0CQDMCAIFCWxwQXNzZXRJZAkAzAgCBQVzaGFyZQUDbmlsBQNuaWwDCQAAAgUPbW9kaWZ5V2VpZ2h0SW52BQ9tb2RpZnlXZWlnaHRJbnYEEHBvb2xzTGlzdEFjdGlvbnMDBQp3eEVtaXNzaW9uBQNuaWwJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5SW5MaXN0AQUEcG9vbAUDbmlsCQERZGVsZXRlTm9kZUFjdGlvbnMCBQ1wb29sc0xpc3ROYW1lBQdwb29sU3RyCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGtleVBvb2xTaGFyZQIFBHBvb2wFC3RhcmdldEVwb2NoBQVzaGFyZQUDbmlsBRBwb29sc0xpc3RBY3Rpb25zBwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5maW5hbGl6ZUhlbHBlcgAEBWVwb2NoCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFD2tleUN1cnJlbnRFcG9jaAAABA1wcmV2aW91c0Vwb2NoCQBlAgUFZXBvY2gAAQQLc3RhcnRIZWlnaHQJAQxnZXRJbnRPckZhaWwCBQR0aGlzCQEVa2V5U3RhcnRIZWlnaHRCeUVwb2NoAQUFZXBvY2gEC2Vwb2NoTGVuZ3RoCQEMZ2V0SW50T3JGYWlsAgUEdGhpcwUOa2V5RXBvY2hMZW5ndGgECWVuZEhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0BQtlcG9jaExlbmd0aAQXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQJAJoIAgUEdGhpcwUUa2V5RmluYWxpemF0aW9uU3RhZ2UDAwkAZwIFBmhlaWdodAUJZW5kSGVpZ2h0CQAAAgUXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQFBHVuaXQHBAhuZXdFcG9jaAkAZAIFBWVwb2NoAAEJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaAEFCG5ld0Vwb2NoBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtleVN0YXJ0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tleUN1cnJlbnRFcG9jaAUIbmV3RXBvY2gJAMwIAgkBDEludGVnZXJFbnRyeQIFFGtleUZpbmFsaXphdGlvblN0YWdlBRZmaW5hbGl6YXRpb25TdGFnZVRvdGFsBQNuaWwGAwkAAAIFF2ZpbmFsaXphdGlvblN0YWdlT3JVbml0BQR1bml0CQCUCgIFA25pbAcDCQAAAgUXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQFFmZpbmFsaXphdGlvblN0YWdlVG90YWwECnBvb2xPclVuaXQJAKIIAQULa2V5TmV4dFBvb2wECnVzZXJPclVuaXQJAKIIAQULa2V5TmV4dFVzZXIEByRtYXRjaDAFCnBvb2xPclVuaXQDCQABAgUHJG1hdGNoMAIEVW5pdAQHJG1hdGNoMQkAoggBCQELa2V5TGlzdEhlYWQBBQ1wb29sc0xpc3ROYW1lAwkAAQIFByRtYXRjaDECBFVuaXQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa2V5RmluYWxpemF0aW9uU3RhZ2UFF2ZpbmFsaXphdGlvblN0YWdlU2hhcmVzCQDMCAIJAQtEZWxldGVFbnRyeQEFC2tleU5leHRQb29sCQDMCAIJAQtEZWxldGVFbnRyeQEFC2tleU5leHRVc2VyBQNuaWwGAwkAAQIFByRtYXRjaDECBlN0cmluZwQMcG9vbHNIZWFkU3RyBQckbWF0Y2gxCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa2V5TmV4dFBvb2wFDHBvb2xzSGVhZFN0cgUDbmlsBgkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBlN0cmluZwQHcG9vbFN0cgUHJG1hdGNoMAQEcG9vbAkBDHN0cmluZ1RvUG9vbAEFB3Bvb2xTdHIEDm5leHRVc2VyT3JVbml0BAckbWF0Y2gxBQp1c2VyT3JVbml0AwkAAQIFByRtYXRjaDECBFVuaXQJAKIIAQkBC2tleUxpc3RIZWFkAQkBEGdldFZvdGVzTGlzdE5hbWUBBQRwb29sAwkAAQIFByRtYXRjaDECBlN0cmluZwQEdXNlcgUHJG1hdGNoMQQEbmV4dAkAoggBCQELa2V5TGlzdE5leHQCCQEQZ2V0Vm90ZXNMaXN0TmFtZQEFBHBvb2wFBHVzZXIDCQAAAgUEbmV4dAUEbmV4dAQOcHJvY2Vzc1ZvdGVJbnYJAPwHBAUEdGhpcwITcHJvY2Vzc1ZvdGVJTlRFUk5BTAkAzAgCBQdwb29sU3RyCQDMCAIFBHVzZXIFA25pbAUDbmlsAwkAAAIFDnByb2Nlc3NWb3RlSW52BQ5wcm9jZXNzVm90ZUludgUEbmV4dAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECC01hdGNoIGVycm9yBAckbWF0Y2gxBQ5uZXh0VXNlck9yVW5pdAMJAAECBQckbWF0Y2gxAgRVbml0BA5uZXh0UG9vbE9yVW5pdAkAoggBCQELa2V5TGlzdE5leHQCBQ1wb29sc0xpc3ROYW1lBQdwb29sU3RyBAckbWF0Y2gyBQ5uZXh0UG9vbE9yVW5pdAMJAAECBQckbWF0Y2gyAgRVbml0CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFFGtleUZpbmFsaXphdGlvblN0YWdlBRdmaW5hbGl6YXRpb25TdGFnZVNoYXJlcwkAzAgCCQELRGVsZXRlRW50cnkBBQtrZXlOZXh0UG9vbAkAzAgCCQELRGVsZXRlRW50cnkBBQtrZXlOZXh0VXNlcgUDbmlsBgMJAAECBQckbWF0Y2gyAgZTdHJpbmcEAXMFByRtYXRjaDIJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQtrZXlOZXh0UG9vbAUBcwkAzAgCCQELRGVsZXRlRW50cnkBBQtrZXlOZXh0VXNlcgUDbmlsBgkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDECBlN0cmluZwQIbmV4dFVzZXIFByRtYXRjaDEJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQtrZXlOZXh0VXNlcgUIbmV4dFVzZXIFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgkAAgECC01hdGNoIGVycm9yAwkAAAIFF2ZpbmFsaXphdGlvblN0YWdlT3JVbml0BRdmaW5hbGl6YXRpb25TdGFnZVNoYXJlcwQKcG9vbE9yVW5pdAkAoggBBQtrZXlOZXh0UG9vbAQHJG1hdGNoMAUKcG9vbE9yVW5pdAMJAAECBQckbWF0Y2gwAgRVbml0BAckbWF0Y2gxCQCiCAEJAQtrZXlMaXN0SGVhZAEFDXBvb2xzTGlzdE5hbWUDCQABAgUHJG1hdGNoMQIEVW5pdAkAlAoCCQDMCAIJAQtEZWxldGVFbnRyeQEFFGtleUZpbmFsaXphdGlvblN0YWdlCQDMCAIJAQxCb29sZWFuRW50cnkCCQEMa2V5RmluYWxpemVkAQUNcHJldmlvdXNFcG9jaAYJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtleUN1cnJlbnRFcG9jaFVpBQVlcG9jaAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa2V5U3RhcnRIZWlnaHRVaQULc3RhcnRIZWlnaHQFA25pbAYDCQABAgUHJG1hdGNoMQIGU3RyaW5nBAtuZXh0UG9vbFN0cgUHJG1hdGNoMQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFC2tleU5leHRQb29sBQtuZXh0UG9vbFN0cgUDbmlsBgkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBlN0cmluZwQHcG9vbFN0cgUHJG1hdGNoMAQObmV4dFBvb2xPclVuaXQJAKIIAQkBC2tleUxpc3ROZXh0AgUNcG9vbHNMaXN0TmFtZQUHcG9vbFN0cgMJAAACBQ5uZXh0UG9vbE9yVW5pdAUObmV4dFBvb2xPclVuaXQEAXIKAAFACQD8BwQFBHRoaXMCE3Byb2Nlc3NQb29sSU5URVJOQUwJAMwIAgUHcG9vbFN0cgUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEFAUACHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4DCQAAAgUBcgUBcgMFAXIJAJQKAgUDbmlsBgQHJG1hdGNoMQUObmV4dFBvb2xPclVuaXQDCQABAgUHJG1hdGNoMQIEVW5pdAkAlAoCCQDMCAIJAQtEZWxldGVFbnRyeQEFFGtleUZpbmFsaXphdGlvblN0YWdlCQDMCAIJAQxCb29sZWFuRW50cnkCCQEMa2V5RmluYWxpemVkAQUNcHJldmlvdXNFcG9jaAYJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtleUN1cnJlbnRFcG9jaFVpBQVlcG9jaAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa2V5U3RhcnRIZWlnaHRVaQULc3RhcnRIZWlnaHQJAMwIAgkBC0RlbGV0ZUVudHJ5AQULa2V5TmV4dFBvb2wFA25pbAYDCQABAgUHJG1hdGNoMQIGU3RyaW5nBAtuZXh0UG9vbFN0cgUHJG1hdGNoMQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFC2tleU5leHRQb29sBQtuZXh0UG9vbFN0cgUDbmlsBgkAAgECC01hdGNoIGVycm9yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQILTWF0Y2ggZXJyb3IJAAIBAhZmaW5hbGl6YXRpb24gaXMgYnJva2VuAWkBD2ZpbmFsaXplV3JhcHBlcgEHY291bnRlcgQGcmVzdWx0CgABQAkA/AcEBQR0aGlzAg5maW5hbGl6ZUhlbHBlcgUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEFAUACHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4DCQAAAgUGcmVzdWx0BQZyZXN1bHQDCQEBIQEFBnJlc3VsdAMJAAACBQdjb3VudGVyAAAJAAIBAh5DdXJyZW50IHZvdGluZyBpcyBub3Qgb3ZlciB5ZXQJAJQKAgUDbmlsBQR1bml0BAhtYXhEZXB0aAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtrZXlNYXhEZXB0aAUPbWF4RGVwdGhEZWZhdWx0AwkAZgIFCG1heERlcHRoBQdjb3VudGVyBANpbnYJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIJAGQCBQdjb3VudGVyAAEFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52CQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIZmluYWxpemUABANpbnYJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFGNvbnRhaW5zTm9kZVJFQURPTkxZAghsaXN0TmFtZQJpZAkAlAoCBQNuaWwJAQxjb250YWluc05vZGUCBQhsaXN0TmFtZQUCaWQBaQEKaW5zZXJ0Tm9kZQIIbGlzdE5hbWUCaWQEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgkAlAoCCQERaW5zZXJ0Tm9kZUFjdGlvbnMCBQhsaXN0TmFtZQUCaWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKZGVsZXRlTm9kZQIIbGlzdE5hbWUCaWQEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgkAlAoCCQERZGVsZXRlTm9kZUFjdGlvbnMCBQhsaXN0TmFtZQUCaWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXlg7L+s", "chainId": 84, "height": 2258915, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9EmYibUukjrhExF2mDz1tMrxeVZNbkr5UzvzWQU2U25s Next: 7kgLpjyXegDCmDuWXnPDFboirXWvnwiMqHX2pS7dR5fE Diff:
OldNewDifferences
9898 let @ = getValueOrFail(address, key, "")
9999 if ($isInstanceOf(@, "String"))
100100 then @
101- else throw(($getType(getValueOrFail(address, key, "")) + " couldn't be cast to String"))
101+ else throw(($getType(@) + " couldn't be cast to String"))
102102 }
103103
104104
106106 let @ = getValueOrFail(address, key, 0)
107107 if ($isInstanceOf(@, "Int"))
108108 then @
109- else throw(($getType(getValueOrFail(address, key, 0)) + " couldn't be cast to Int"))
109+ else throw(($getType(@) + " couldn't be cast to Int"))
110110 }
111111
112112
145145 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
146146 if ($isInstanceOf(@, "Boolean"))
147147 then @
148- else throw(($getType(invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)) + " couldn't be cast to Boolean"))
148+ else throw(($getType(@) + " couldn't be cast to Boolean"))
149149 }
150150
151151
323323 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
324324 if ($isInstanceOf(@, "Int"))
325325 then @
326- else throw(($getType(invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)) + " couldn't be cast to Int"))
326+ else throw(($getType(@) + " couldn't be cast to Int"))
327327 })
328328 }
329329
388388 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
389389 if ($isInstanceOf(@, "Int"))
390390 then @
391- else throw(($getType(invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)) + " couldn't be cast to Int"))
391+ else throw(($getType(@) + " couldn't be cast to Int"))
392392 }
393393 let available = (gwxAmountAtEndTotal - used)
394394 let newVote = (vote + amount)
505505 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
506506 if ($isInstanceOf(@, "Int"))
507507 then @
508- else throw(($getType(invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)) + " couldn't be cast to Int"))
508+ else throw(($getType(@) + " couldn't be cast to Int"))
509509 }
510510 let gwxAmountAtEndTotalPrevious = {
511511 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)
512512 if ($isInstanceOf(@, "Int"))
513513 then @
514- else throw(($getType(invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)) + " couldn't be cast to Int"))
514+ else throw(($getType(@) + " couldn't be cast to Int"))
515515 }
516516 let totalVotes = valueOrElse(getInteger(keyTotalVotes(epoch)), 0)
517517 let votingResult = valueOrElse(getInteger(keyVotingResult(pool, epoch)), 0)
556556 let @ = invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)
557557 if ($isInstanceOf(@, "Boolean"))
558558 then @
559- else throw(($getType(invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)) + " couldn't be cast to Boolean"))
559+ else throw(($getType(@) + " couldn't be cast to Boolean"))
560560 }
561561 if ((r == r))
562562 then if (r)
679679 let @ = invoke(this, "processPoolINTERNAL", [poolStr], nil)
680680 if ($isInstanceOf(@, "Boolean"))
681681 then @
682- else throw(($getType(invoke(this, "processPoolINTERNAL", [poolStr], nil)) + " couldn't be cast to Boolean"))
682+ else throw(($getType(@) + " couldn't be cast to Boolean"))
683683 }
684684 if ((r == r))
685685 then if (r)
710710 let @ = invoke(this, "finalizeHelper", nil, nil)
711711 if ($isInstanceOf(@, "Boolean"))
712712 then @
713- else throw(($getType(invoke(this, "finalizeHelper", nil, nil)) + " couldn't be cast to Boolean"))
713+ else throw(($getType(@) + " couldn't be cast to Boolean"))
714714 }
715715 if ((result == result))
716716 then if (!(result))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let poolWeightMult = 100000000
77
88 let maxDepthDefault = 10
99
1010 let finalizationStageTotal = 0
1111
1212 let finalizationStageShares = 1
1313
1414 let keyEpochLength = makeString(["%s", "epochLength"], separator)
1515
1616 let keyCurrentEpoch = makeString(["%s", "currentEpoch"], separator)
1717
1818 let keyMaxDepth = makeString(["%s", "maxDepth"], separator)
1919
2020 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], separator)
2121
2222 let keyFactoryContract = makeString(["%s", "factoryContract"], separator)
2323
2424 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
2525
2626 let keyStakingContract = makeString(["%s", "stakingContract"], separator)
2727
2828 let keyFinalizationStage = makeString(["%s", "finalizationStage"], separator)
2929
3030 let keyNextPool = makeString(["%s", "nextPool"], separator)
3131
3232 let keyNextUser = makeString(["%s", "nextUser"], separator)
3333
3434 let keyStartHeight = makeString(["%s", "startHeight"], separator)
3535
3636 let keyCurrentEpochUi = makeString(["%s", "currentEpochUi"], separator)
3737
3838 let keyStartHeightUi = makeString(["%s", "startHeightUi"], separator)
3939
4040 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], separator)
4141
4242
4343 func keyFinalized (epoch) = makeString(["%s%d", "finalized", toString(epoch)], separator)
4444
4545
4646 func keyInList (pool) = {
4747 let $t014361476 = pool
4848 let amountAssetId = $t014361476._1
4949 let priceAssetId = $t014361476._2
5050 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
5151 }
5252
5353
5454 func keyUsed (address,epoch) = makeString(["%s%s%d", "used", toString(address), toString(epoch)], separator)
5555
5656
5757 func keyVote (pool,address,epoch) = {
5858 let $t017501790 = pool
5959 let amountAssetId = $t017501790._1
6060 let priceAssetId = $t017501790._2
6161 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
6262 }
6363
6464
6565 func keyVotingResult (pool,epoch) = {
6666 let $t019722012 = pool
6767 let amountAssetId = $t019722012._1
6868 let priceAssetId = $t019722012._2
6969 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
7070 }
7171
7272
7373 func keyPoolShare (pool,epoch) = {
7474 let $t021772217 = pool
7575 let amountAssetId = $t021772217._1
7676 let priceAssetId = $t021772217._2
7777 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
7878 }
7979
8080
8181 func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
8282
8383
8484 func getValueOrFail (address,key,type) = {
8585 let error = makeString(["mandatory ", toString(address), ".", key, " is not defined"], "")
8686 valueOrErrorMessage( match type {
8787 case str: String =>
8888 getString(address, key)
8989 case int: Int =>
9090 getInteger(address, key)
9191 case _ =>
9292 throw("invalid entry type")
9393 }, error)
9494 }
9595
9696
9797 func getStrOrFail (address,key) = {
9898 let @ = getValueOrFail(address, key, "")
9999 if ($isInstanceOf(@, "String"))
100100 then @
101- else throw(($getType(getValueOrFail(address, key, "")) + " couldn't be cast to String"))
101+ else throw(($getType(@) + " couldn't be cast to String"))
102102 }
103103
104104
105105 func getIntOrFail (address,key) = {
106106 let @ = getValueOrFail(address, key, 0)
107107 if ($isInstanceOf(@, "Int"))
108108 then @
109- else throw(($getType(getValueOrFail(address, key, 0)) + " couldn't be cast to Int"))
109+ else throw(($getType(@) + " couldn't be cast to Int"))
110110 }
111111
112112
113113 func poolToString (pool) = ((pool._1 + separator) + pool._2)
114114
115115
116116 func stringToPool (str) = {
117117 let parts = split(str, separator)
118118 if ((size(parts) == 2))
119119 then $Tuple2(parts[0], parts[1])
120120 else throw("invalid pool string")
121121 }
122122
123123
124124 func getLpAssetByPoolAssets (amountAssetId,priceAssetId) = {
125125 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
126126
127127 func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract")
128128
129129 func keyMappingPoolContractToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
130130
131131 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
132132 let amountAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amountAssetId))
133133 let priceAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAssetId))
134134 let poolContractAddress = getStrOrFail(factoryContract, keyMappingPoolAssetsToPoolContractAddress(amountAssetInternalId, priceAssetInternalId))
135135 let lpAssetId = getStrOrFail(factoryContract, keyMappingPoolContractToLPAsset(poolContractAddress))
136136 lpAssetId
137137 }
138138
139139
140140 func checkWxEmissionPoolLabel (pool) = {
141141 let $t044594499 = pool
142142 let amountAssetId = $t044594499._1
143143 let priceAssetId = $t044594499._2
144144 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
145145 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
146146 if ($isInstanceOf(@, "Boolean"))
147147 then @
148- else throw(($getType(invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)) + " couldn't be cast to Boolean"))
148+ else throw(($getType(@) + " couldn't be cast to Boolean"))
149149 }
150150
151151
152152 let poolsListName = "pools"
153153
154154 func getVotesListName (pool) = {
155155 let $t048004840 = pool
156156 let amountAssetId = $t048004840._1
157157 let priceAssetId = $t048004840._2
158158 makeString(["votes", amountAssetId, priceAssetId], separator)
159159 }
160160
161161
162162 func keyListHead (listName) = {
163163 let meta = if ((listName == poolsListName))
164164 then "%s%s"
165165 else "%s%s%s%s"
166166 makeString([meta, listName, "head"], separator)
167167 }
168168
169169
170170 func keyListSize (listName) = {
171171 let meta = if ((listName == poolsListName))
172172 then "%s%s"
173173 else "%s%s%s%s"
174174 makeString([meta, listName, "size"], separator)
175175 }
176176
177177
178178 func keyListPrev (listName,id) = {
179179 let meta = if ((listName == poolsListName))
180180 then "%s%s%s%s"
181181 else "%s%s%s%s%s"
182182 makeString([meta, listName, id, "prev"], separator)
183183 }
184184
185185
186186 func keyListNext (listName,id) = {
187187 let meta = if ((listName == poolsListName))
188188 then "%s%s%s%s"
189189 else "%s%s%s%s%s"
190190 makeString([meta, listName, id, "next"], separator)
191191 }
192192
193193
194194 func containsNode (listName,id) = {
195195 let headOrUnit = getString(this, keyListHead(listName))
196196 let prevOrUnit = getString(this, keyListPrev(listName, id))
197197 let nextOrUnit = getString(this, keyListNext(listName, id))
198198 if (if ((id == valueOrElse(headOrUnit, "")))
199199 then true
200200 else (prevOrUnit != unit))
201201 then true
202202 else (nextOrUnit != unit)
203203 }
204204
205205
206206 func insertNodeActions (listName,id) = {
207207 let headOrUnit = getString(this, keyListHead(listName))
208208 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
209209 let checkNode = if (!(containsNode(listName, id)))
210210 then true
211211 else throw("Node exists")
212212 if ((checkNode == checkNode))
213213 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
214214 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
215215 else nil)) ++ [StringEntry(keyListHead(listName), id)])
216216 else throw("Strict value is not equal to itself.")
217217 }
218218
219219
220220 func deleteNodeActions (listName,id) = {
221221 let headOrUnit = getString(this, keyListHead(listName))
222222 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
223223 let prevOrUnit = getString(this, keyListPrev(listName, id))
224224 let nextOrUnit = getString(this, keyListNext(listName, id))
225225 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
226226 then (nextOrUnit != unit)
227227 else false)
228228 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
229229 else if ((nextOrUnit != unit))
230230 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
231231 else if ((prevOrUnit != unit))
232232 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
233233 else if ((id == valueOrElse(headOrUnit, "")))
234234 then [DeleteEntry(keyListHead(listName))]
235235 else throw(((("invalid node: " + listName) + ".") + id))))
236236 }
237237
238238
239239 func keyManagerPublicKey () = "%s__managerPublicKey"
240240
241241
242242 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
243243
244244
245245 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
246246 case s: String =>
247247 fromBase58String(s)
248248 case _: Unit =>
249249 unit
250250 case _ =>
251251 throw("Match error")
252252 }
253253
254254
255255 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
256256 case s: String =>
257257 fromBase58String(s)
258258 case _: Unit =>
259259 unit
260260 case _ =>
261261 throw("Match error")
262262 }
263263
264264
265265 let permissionDeniedError = throw("Permission denied")
266266
267267 func mustThis (i) = if ((i.caller == this))
268268 then true
269269 else permissionDeniedError
270270
271271
272272 func mustManager (i) = match managerPublicKeyOrUnit() {
273273 case pk: ByteVector =>
274274 if ((i.callerPublicKey == pk))
275275 then true
276276 else permissionDeniedError
277277 case _: Unit =>
278278 mustThis(i)
279279 case _ =>
280280 throw("Match error")
281281 }
282282
283283
284284 @Callable(i)
285285 func setManager (pendingManagerPublicKey) = {
286286 let checkCaller = mustManager(i)
287287 if ((checkCaller == checkCaller))
288288 then {
289289 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
290290 if ((checkManagerPublicKey == checkManagerPublicKey))
291291 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
292292 else throw("Strict value is not equal to itself.")
293293 }
294294 else throw("Strict value is not equal to itself.")
295295 }
296296
297297
298298
299299 @Callable(i)
300300 func confirmManager () = {
301301 let pm = pendingManagerPublicKeyOrUnit()
302302 let hasPM = if (isDefined(pm))
303303 then true
304304 else throw("No pending manager")
305305 if ((hasPM == hasPM))
306306 then {
307307 let checkPM = if ((i.callerPublicKey == value(pm)))
308308 then true
309309 else throw("You are not pending manager")
310310 if ((checkPM == checkPM))
311311 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
312312 else throw("Strict value is not equal to itself.")
313313 }
314314 else throw("Strict value is not equal to itself.")
315315 }
316316
317317
318318
319319 @Callable(i)
320320 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
321321 let boostingContractAddress = valueOrErrorMessage(addressFromString(getStrOrFail(this, keyBoostingContract)), "invalid boosting contract address")
322322 $Tuple2(nil, {
323323 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
324324 if ($isInstanceOf(@, "Int"))
325325 then @
326- else throw(($getType(invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)) + " couldn't be cast to Int"))
326+ else throw(($getType(@) + " couldn't be cast to Int"))
327327 })
328328 }
329329
330330
331331
332332 @Callable(i)
333333 func constructor (factoryContract,votingEmissionCandidateContract,boostingContract,stakingContract,epochLength) = {
334334 let checks = [mustManager(i), if ((addressFromString(factoryContract) != unit))
335335 then true
336336 else "invalid factory contract address", if ((addressFromString(votingEmissionCandidateContract) != unit))
337337 then true
338338 else "invalid voting emission candidate contract address", if ((addressFromString(boostingContract) != unit))
339339 then true
340340 else "invalid boosting contract address", if ((addressFromString(stakingContract) != unit))
341341 then true
342342 else "invalid staking contract address", if ((epochLength > 0))
343343 then true
344344 else throw("invalid epoch length")]
345345 if ((checks == checks))
346346 then $Tuple2([StringEntry(keyFactoryContract, factoryContract), StringEntry(keyVotingEmissionCandidateContract, votingEmissionCandidateContract), StringEntry(keyBoostingContract, boostingContract), StringEntry(keyStakingContract, stakingContract), IntegerEntry(keyEpochLength, epochLength)], unit)
347347 else throw("Strict value is not equal to itself.")
348348 }
349349
350350
351351
352352 @Callable(i)
353353 func create (amountAssetId,priceAssetId) = {
354354 let checks = [if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionCandidateContract), "")))
355355 then true
356356 else mustManager(i)]
357357 if ((checks == checks))
358358 then {
359359 let pool = $Tuple2(amountAssetId, priceAssetId)
360360 let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
361361 let currentEpochIsNotDefined = (getInteger(this, keyCurrentEpoch) == unit)
362362 let startHeightActions = if (currentEpochIsNotDefined)
363363 then {
364364 let epoch = 0
365365 [IntegerEntry(keyCurrentEpoch, epoch), IntegerEntry(keyStartHeightByEpoch(epoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, height)]
366366 }
367367 else nil
368368 $Tuple2((inListActions ++ startHeightActions), unit)
369369 }
370370 else throw("Strict value is not equal to itself.")
371371 }
372372
373373
374374
375375 @Callable(i)
376376 func vote (amountAssetId,priceAssetId,amount) = {
377377 let pool = $Tuple2(amountAssetId, priceAssetId)
378378 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
379379 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
380380 let epochLength = getIntOrFail(this, keyEpochLength)
381381 let endHeight = (startHeight + epochLength)
382382 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
383383 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
384384 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
385385 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
386386 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
387387 let gwxAmountAtEndTotal = {
388388 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
389389 if ($isInstanceOf(@, "Int"))
390390 then @
391- else throw(($getType(invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)) + " couldn't be cast to Int"))
391+ else throw(($getType(@) + " couldn't be cast to Int"))
392392 }
393393 let available = (gwxAmountAtEndTotal - used)
394394 let newVote = (vote + amount)
395395 let wxEmission = checkWxEmissionPoolLabel(pool)
396396 let checks = [if ((getBoolean(keyInList(pool)) != unit))
397397 then true
398398 else throw("invalid assets"), if ((endHeight > height))
399399 then true
400400 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
401401 then true
402402 else throw("finalization in progress"), if ((gwxAmountAtEndTotal > 0))
403403 then true
404404 else throw("you do not have gWX"), if (if ((amount > 0))
405405 then (available >= amount)
406406 else false)
407407 then true
408408 else throw("invalid amount"), if (wxEmission)
409409 then true
410410 else throw("pool hasn't WX_EMISSION label")]
411411 if ((checks == checks))
412412 then {
413413 let votesListName = getVotesListName(pool)
414414 let userAddressStr = toString(i.caller)
415415 let votesListActions = if (containsNode(votesListName, userAddressStr))
416416 then nil
417417 else insertNodeActions(votesListName, userAddressStr)
418418 $Tuple2(([IntegerEntry(keyUsed(i.caller, epoch), (used + amount)), IntegerEntry(keyVote(pool, i.caller, epoch), newVote), IntegerEntry(keyVotingResult(pool, epoch), (poolResult + amount)), IntegerEntry(keyTotalVotes(epoch), (totalVotes + amount))] ++ votesListActions), unit)
419419 }
420420 else throw("Strict value is not equal to itself.")
421421 }
422422
423423
424424
425425 @Callable(i)
426426 func cancelVote (amountAssetId,priceAssetId) = {
427427 let pool = $Tuple2(amountAssetId, priceAssetId)
428428 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
429429 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
430430 let epochLength = getIntOrFail(this, keyEpochLength)
431431 let endHeight = (startHeight + epochLength)
432432 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
433433 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
434434 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
435435 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
436436 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
437437 let checks = [if ((getBoolean(keyInList(pool)) != unit))
438438 then true
439439 else throw("invalid assets"), if ((endHeight > height))
440440 then true
441441 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
442442 then true
443443 else throw("finalization in progress"), if ((vote > 0))
444444 then true
445445 else throw("no vote")]
446446 if ((checks == checks))
447447 then {
448448 let votesListName = getVotesListName(pool)
449449 let userAddressStr = toString(i.caller)
450450 $Tuple2(([IntegerEntry(keyUsed(i.caller, epoch), max([(used - vote), 0])), DeleteEntry(keyVote(pool, i.caller, epoch)), IntegerEntry(keyVotingResult(pool, epoch), (poolResult - vote)), IntegerEntry(keyTotalVotes(epoch), (totalVotes - vote))] ++ deleteNodeActions(votesListName, userAddressStr)), unit)
451451 }
452452 else throw("Strict value is not equal to itself.")
453453 }
454454
455455
456456
457457 @Callable(i)
458458 func setEpochLength (newEpochLength) = {
459459 let checks = [mustManager(i), if ((newEpochLength > 0))
460460 then true
461461 else throw("invalid epoch length")]
462462 if ((checks == checks))
463463 then $Tuple2([IntegerEntry(keyEpochLength, newEpochLength)], unit)
464464 else throw("Strict value is not equal to itself.")
465465 }
466466
467467
468468
469469 @Callable(i)
470470 func setMaxDepth (newMaxDepth) = {
471471 let checks = [mustManager(i), if ((newMaxDepth > 0))
472472 then true
473473 else throw("invalid max depth")]
474474 if ((checks == checks))
475475 then $Tuple2([IntegerEntry(keyMaxDepth, newMaxDepth)], unit)
476476 else throw("Strict value is not equal to itself.")
477477 }
478478
479479
480480
481481 @Callable(i)
482482 func processVoteINTERNAL (poolStr,userAddressStr) = {
483483 let checkCaller = mustThis(i)
484484 if ((checkCaller == checkCaller))
485485 then {
486486 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), ("processVoteINTERNAL: invalid user address " + userAddressStr))
487487 let epoch = getIntOrFail(this, keyCurrentEpoch)
488488 let epochPrevious = (epoch - 1)
489489 let epochLength = getIntOrFail(this, keyEpochLength)
490490 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
491491 let endHeight = (startHeight + epochLength)
492492 let startHeightPrevious = getIntOrFail(this, keyStartHeightByEpoch(epochPrevious))
493493 let endHeightPrevious = (startHeightPrevious + epochLength)
494494 let checkTargetEpoch = if ((epochPrevious >= 0))
495495 then true
496496 else throw("processVoteINTERNAL: invalid previous epoch")
497497 if ((checkTargetEpoch == checkTargetEpoch))
498498 then {
499499 let pool = stringToPool(poolStr)
500500 let $t01719517235 = pool
501501 let amountAssetId = $t01719517235._1
502502 let priceAssetId = $t01719517235._2
503503 let wxEmission = checkWxEmissionPoolLabel(pool)
504504 let gwxAmountAtEndTotal = {
505505 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
506506 if ($isInstanceOf(@, "Int"))
507507 then @
508- else throw(($getType(invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)) + " couldn't be cast to Int"))
508+ else throw(($getType(@) + " couldn't be cast to Int"))
509509 }
510510 let gwxAmountAtEndTotalPrevious = {
511511 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)
512512 if ($isInstanceOf(@, "Int"))
513513 then @
514- else throw(($getType(invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)) + " couldn't be cast to Int"))
514+ else throw(($getType(@) + " couldn't be cast to Int"))
515515 }
516516 let totalVotes = valueOrElse(getInteger(keyTotalVotes(epoch)), 0)
517517 let votingResult = valueOrElse(getInteger(keyVotingResult(pool, epoch)), 0)
518518 let votePrevious = valueOrErrorMessage(getInteger(keyVote(pool, userAddress, epochPrevious)), (((("processVoteINTERNAL " + poolStr) + " ") + userAddressStr) + ": no previous vote"))
519519 let used = valueOrElse(getInteger(this, keyUsed(userAddress, epoch)), 0)
520520 let newVote = if ((gwxAmountAtEndTotalPrevious > 0))
521521 then fraction(votePrevious, gwxAmountAtEndTotal, gwxAmountAtEndTotalPrevious)
522522 else 0
523523 let actions = if (if ((newVote > 0))
524524 then wxEmission
525525 else false)
526526 then [IntegerEntry(keyVote(pool, userAddress, epoch), newVote), IntegerEntry(keyTotalVotes(epoch), (totalVotes + newVote)), IntegerEntry(keyVotingResult(pool, epoch), (votingResult + newVote)), IntegerEntry(keyUsed(userAddress, epoch), (used + newVote))]
527527 else deleteNodeActions(getVotesListName(pool), userAddressStr)
528528 $Tuple2(actions, unit)
529529 }
530530 else throw("Strict value is not equal to itself.")
531531 }
532532 else throw("Strict value is not equal to itself.")
533533 }
534534
535535
536536
537537 @Callable(i)
538538 func processPoolINTERNAL (poolStr) = {
539539 let checkCaller = mustThis(i)
540540 if ((checkCaller == checkCaller))
541541 then {
542542 let targetEpoch = (getIntOrFail(this, keyCurrentEpoch) - 1)
543543 let checkTargetEpoch = if ((targetEpoch >= 0))
544544 then true
545545 else throw("processPoolINTERNAL: invalid target epoch")
546546 if ((checkTargetEpoch == checkTargetEpoch))
547547 then {
548548 let pool = stringToPool(poolStr)
549549 let $t01880118841 = pool
550550 let amountAssetId = $t01880118841._1
551551 let priceAssetId = $t01880118841._2
552552 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
553553 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
554554 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
555555 let r = {
556556 let @ = invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)
557557 if ($isInstanceOf(@, "Boolean"))
558558 then @
559- else throw(($getType(invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)) + " couldn't be cast to Boolean"))
559+ else throw(($getType(@) + " couldn't be cast to Boolean"))
560560 }
561561 if ((r == r))
562562 then if (r)
563563 then $Tuple2(nil, true)
564564 else {
565565 let wxEmission = checkWxEmissionPoolLabel(pool)
566566 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
567567 let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
568568 let share = if (if ((totalVotes == 0))
569569 then true
570570 else !(wxEmission))
571571 then 0
572572 else fraction(votingResult, poolWeightMult, totalVotes)
573573 let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, share], nil)
574574 if ((modifyWeightInv == modifyWeightInv))
575575 then {
576576 let poolsListActions = if (wxEmission)
577577 then nil
578578 else ([DeleteEntry(keyInList(pool))] ++ deleteNodeActions(poolsListName, poolStr))
579579 $Tuple2(([IntegerEntry(keyPoolShare(pool, targetEpoch), share)] ++ poolsListActions), false)
580580 }
581581 else throw("Strict value is not equal to itself.")
582582 }
583583 else throw("Strict value is not equal to itself.")
584584 }
585585 else throw("Strict value is not equal to itself.")
586586 }
587587 else throw("Strict value is not equal to itself.")
588588 }
589589
590590
591591
592592 @Callable(i)
593593 func finalizeHelper () = {
594594 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
595595 let previousEpoch = (epoch - 1)
596596 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
597597 let epochLength = getIntOrFail(this, keyEpochLength)
598598 let endHeight = (startHeight + epochLength)
599599 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
600600 if (if ((height >= endHeight))
601601 then (finalizationStageOrUnit == unit)
602602 else false)
603603 then {
604604 let newEpoch = (epoch + 1)
605605 $Tuple2([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageTotal)], true)
606606 }
607607 else if ((finalizationStageOrUnit == unit))
608608 then $Tuple2(nil, false)
609609 else if ((finalizationStageOrUnit == finalizationStageTotal))
610610 then {
611611 let poolOrUnit = getString(keyNextPool)
612612 let userOrUnit = getString(keyNextUser)
613613 match poolOrUnit {
614614 case _: Unit =>
615615 match getString(keyListHead(poolsListName)) {
616616 case _: Unit =>
617617 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
618618 case poolsHeadStr: String =>
619619 $Tuple2([StringEntry(keyNextPool, poolsHeadStr)], true)
620620 case _ =>
621621 throw("Match error")
622622 }
623623 case poolStr: String =>
624624 let pool = stringToPool(poolStr)
625625 let nextUserOrUnit = match userOrUnit {
626626 case _: Unit =>
627627 getString(keyListHead(getVotesListName(pool)))
628628 case user: String =>
629629 let next = getString(keyListNext(getVotesListName(pool), user))
630630 if ((next == next))
631631 then {
632632 let processVoteInv = invoke(this, "processVoteINTERNAL", [poolStr, user], nil)
633633 if ((processVoteInv == processVoteInv))
634634 then next
635635 else throw("Strict value is not equal to itself.")
636636 }
637637 else throw("Strict value is not equal to itself.")
638638 case _ =>
639639 throw("Match error")
640640 }
641641 match nextUserOrUnit {
642642 case _: Unit =>
643643 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
644644 match nextPoolOrUnit {
645645 case _: Unit =>
646646 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
647647 case s: String =>
648648 $Tuple2([StringEntry(keyNextPool, s), DeleteEntry(keyNextUser)], true)
649649 case _ =>
650650 throw("Match error")
651651 }
652652 case nextUser: String =>
653653 $Tuple2([StringEntry(keyNextUser, nextUser)], true)
654654 case _ =>
655655 throw("Match error")
656656 }
657657 case _ =>
658658 throw("Match error")
659659 }
660660 }
661661 else if ((finalizationStageOrUnit == finalizationStageShares))
662662 then {
663663 let poolOrUnit = getString(keyNextPool)
664664 match poolOrUnit {
665665 case _: Unit =>
666666 match getString(keyListHead(poolsListName)) {
667667 case _: Unit =>
668668 $Tuple2([DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight)], true)
669669 case nextPoolStr: String =>
670670 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
671671 case _ =>
672672 throw("Match error")
673673 }
674674 case poolStr: String =>
675675 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
676676 if ((nextPoolOrUnit == nextPoolOrUnit))
677677 then {
678678 let r = {
679679 let @ = invoke(this, "processPoolINTERNAL", [poolStr], nil)
680680 if ($isInstanceOf(@, "Boolean"))
681681 then @
682- else throw(($getType(invoke(this, "processPoolINTERNAL", [poolStr], nil)) + " couldn't be cast to Boolean"))
682+ else throw(($getType(@) + " couldn't be cast to Boolean"))
683683 }
684684 if ((r == r))
685685 then if (r)
686686 then $Tuple2(nil, true)
687687 else match nextPoolOrUnit {
688688 case _: Unit =>
689689 $Tuple2([DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight), DeleteEntry(keyNextPool)], true)
690690 case nextPoolStr: String =>
691691 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
692692 case _ =>
693693 throw("Match error")
694694 }
695695 else throw("Strict value is not equal to itself.")
696696 }
697697 else throw("Strict value is not equal to itself.")
698698 case _ =>
699699 throw("Match error")
700700 }
701701 }
702702 else throw("finalization is broken")
703703 }
704704
705705
706706
707707 @Callable(i)
708708 func finalizeWrapper (counter) = {
709709 let result = {
710710 let @ = invoke(this, "finalizeHelper", nil, nil)
711711 if ($isInstanceOf(@, "Boolean"))
712712 then @
713- else throw(($getType(invoke(this, "finalizeHelper", nil, nil)) + " couldn't be cast to Boolean"))
713+ else throw(($getType(@) + " couldn't be cast to Boolean"))
714714 }
715715 if ((result == result))
716716 then if (!(result))
717717 then if ((counter == 0))
718718 then throw("Current voting is not over yet")
719719 else $Tuple2(nil, unit)
720720 else {
721721 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
722722 if ((maxDepth > counter))
723723 then {
724724 let inv = invoke(this, "finalizeWrapper", [(counter + 1)], nil)
725725 if ((inv == inv))
726726 then $Tuple2(nil, unit)
727727 else throw("Strict value is not equal to itself.")
728728 }
729729 else $Tuple2(nil, unit)
730730 }
731731 else throw("Strict value is not equal to itself.")
732732 }
733733
734734
735735
736736 @Callable(i)
737737 func finalize () = {
738738 let inv = invoke(this, "finalizeWrapper", [0], nil)
739739 if ((inv == inv))
740740 then $Tuple2(nil, unit)
741741 else throw("Strict value is not equal to itself.")
742742 }
743743
744744
745745
746746 @Callable(i)
747747 func containsNodeREADONLY (listName,id) = $Tuple2(nil, containsNode(listName, id))
748748
749749
750750
751751 @Callable(i)
752752 func insertNode (listName,id) = {
753753 let checkCaller = mustManager(i)
754754 if ((checkCaller == checkCaller))
755755 then $Tuple2(insertNodeActions(listName, id), unit)
756756 else throw("Strict value is not equal to itself.")
757757 }
758758
759759
760760
761761 @Callable(i)
762762 func deleteNode (listName,id) = {
763763 let checkCaller = mustManager(i)
764764 if ((checkCaller == checkCaller))
765765 then $Tuple2(deleteNodeActions(listName, id), unit)
766766 else throw("Strict value is not equal to itself.")
767767 }
768768
769769
770770 @Verifier(tx)
771771 func verify () = {
772772 let targetPublicKey = match managerPublicKeyOrUnit() {
773773 case pk: ByteVector =>
774774 pk
775775 case _: Unit =>
776776 tx.senderPublicKey
777777 case _ =>
778778 throw("Match error")
779779 }
780780 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
781781 }
782782

github/deemru/w8io/169f3d6 
124.76 ms