tx · GA2UU9F6mipcYYJXiK8DyuuXwDmb63ccEcor7gfsiL85

3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh:  -0.02900000 Waves

2024.11.29 20:41 [3393031] smart account 3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh > SELF 0.00000000 Waves

{ "type": 13, "id": "GA2UU9F6mipcYYJXiK8DyuuXwDmb63ccEcor7gfsiL85", "fee": 2900000, "feeAssetId": null, "timestamp": 1732902195603, "version": 2, "chainId": 84, "sender": "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh", "senderPublicKey": "3QtfC1XbLZXdeawMDeSERy9vvjUmj1XYd2GFmrvx7pWQ", "proofs": [ "5jQ9VvqVT58SqJSrqfGwvwjEnsvuMtTyraS2oF54z2bLjSo32tvGmJurLzbbf2ASvC6Vus81rcFjXevo87p5wMmq" ], "script": "base64:BgJHCAISABIECgIICBIDCgEEEgMKAQESABIAEgMKAQESABIECgIIARIAEgMKAQgSAwoBCBIECgIIARIDCgEIEgASAwoBCBIAEgB2AANTRVACAl9fAAVNVUxUNgDAhD0ABU1VTFQ3AICt4gQABU1VTFQ4AIDC1y8ACkRBWV9NSUxMSVMAgLiZKQAVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAAoAE09ORV9QRVJDRU5UX0RJVklTT1IAZAAFY2hhaW4JAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAC1dFRUtfQkxPQ0tTBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAOBOAwkAAAIBAVQFByRtYXRjaDAAtAEJAAIBAg1Vbmtub3duIGNoYWluAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABZkZWZhdWx0UmVzdDJBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUEZ3WXRhOGJpRXozMXpwZUZlNURKSzh3RTV0clNwUVZGOAMJAAACAQFUBQckbWF0Y2gwAiMzTjdVdVlhcjYyNjRQNThGQmhWV0tQUUFoNFl1YTJoZ25ndgkAAgECDVVua25vd24gY2hhaW4ADmFyYml0cmFnZURlbGF5BAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwBQpEQVlfTUlMTElTAwkAAAIBAVQFByRtYXRjaDAA4NQDCQACAQINVW5rbm93biBjaGFpbgAVb2xkU3Rha2luZ0NvbnRyYWN0U3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUExuY1h0UzFVODNENmNRYkZEM0g4ckJIUExnenhTRktaMQMJAAACAQFUBQckbWF0Y2gwAiMzTkRDeUJHNXE4NUp1YVJpaWdVZUV0YWlueWpDUVQzWHBabQkAAgECDVVua25vd24gY2hhaW4BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAABBJZHhDZmdBY3JlczJEYXBwAAEADUlkeENmZ1dsZ0RhcHAAAgAUSWR4Q2ZnSW52ZXN0RnVuZERhcHAABQEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ9rZXlSZXN0MkFkZHJlc3MAAg0lc19fcmVzdDJBZGRyARFyZWFkUmVzdENmZ09yRmFpbAEEcmVzdAkAvAkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEcmVzdAkBCmtleVJlc3RDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIIcmVzdDJDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQhyZXN0MkNmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgADXJlc3QyQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBD2tleVJlc3QyQWRkcmVzcwAFFmRlZmF1bHRSZXN0MkFkZHJlc3NTdHIACHJlc3QyQ2ZnCQERcmVhZFJlc3RDZmdPckZhaWwBBQ1yZXN0MkNvbnRyYWN0AA5hY3JlczJDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCHJlc3QyQ2ZnBRBJZHhDZmdBY3JlczJEYXBwAAt3bGdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCHJlc3QyQ2ZnBQ1JZHhDZmdXbGdEYXBwABJpbnZlc3RGdW5kQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQhyZXN0MkNmZwUUSWR4Q2ZnSW52ZXN0RnVuZERhcHAAE29sZEFjcmVzQ29udHJhY3RLZXkCEG9sZEFjcmVzQ29udHJhY3QBCmtleUJsb2NrZWQAAhBjb250cmFjdHNCbG9ja2VkARVrZXlMYXN0V2Vla1R4SWRCeVVzZXIBBGFkZHIJAKwCAgITbGFzdFdlZWtUeElkQnlVc2VyXwUEYWRkcgEUa2V5Q3VyV2Vla1R4SWRCeVVzZXIBBGFkZHIJAKwCAgISY3VyV2Vla1R4SWRCeVVzZXJfBQRhZGRyAA13bGdBc3NldElkS2V5Agt3bGdfYXNzZXRJZAAKd2xnQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFC3dsZ0NvbnRyYWN0BQ13bGdBc3NldElkS2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQAFGFjcmVzSXNzdWVkQW1vdW50S2V5AhFhY3Jlc0lzc3VlZEFtb3VudAAPYWNyZXNBc3NldElkS2V5AgxhY3Jlc0Fzc2V0SWQADGFjcmVzQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFDmFjcmVzMkNvbnRyYWN0BQ9hY3Jlc0Fzc2V0SWRLZXkCF0FDUkVTIGlzIG5vdCBpc3N1ZWQgeWV0ARhrZXlBY3Jlc1N0YWtlZFRpbWVCeVVzZXIBBGFkZHIJAKwCAgIWYWNyZXNTdGFrZWRUaW1lQnlVc2VyXwUEYWRkcgEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQlvd25lckFkZHIJAKwCAgITc3Rha2VkTGFuZHNCeU93bmVyXwUJb3duZXJBZGRyARRrZXlTdGFrZWREdWNrQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZER1Y2tCeU93bmVyXwUJb3duZXJBZGRyAR5rZXlTdGFrZWRUaW1lQnlBc3NldElkQW5kT3duZXICB2Fzc2V0SWQEYWRkcgkArAICCQCsAgIJAKwCAgIDc3RfBQdhc3NldElkAgFfBQRhZGRyARRrZXlTdGFrZWRORlRzQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZE5GVHNCeU93bmVyXwUJb3duZXJBZGRyAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBDGFzVHVwbGU1SW50cwEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIZKEludCwgSW50LCBJbnQsIEludCwgSW50KQQBdAUHJG1hdGNoMAUBdAkAAgECK2ZhaWwgdG8gY2FzdCBpbnRvIChJbnQsIEludCwgSW50LCBJbnQsIEludCkBDGFzVHVwbGU0SW50cwEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIUKEludCwgSW50LCBJbnQsIEludCkEAXQFByRtYXRjaDAFAXQJAAIBAiZmYWlsIHRvIGNhc3QgaW50byAoSW50LCBJbnQsIEludCwgSW50KQEMYXNUdXBsZTNJbnRzAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAg8oSW50LCBJbnQsIEludCkEAXQFByRtYXRjaDAFAXQJAAIBAiFmYWlsIHRvIGNhc3QgaW50byAoSW50LCBJbnQsIEludCkBDGFzVHVwbGUySW50cwEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQBdAUHJG1hdGNoMAUBdAkAAgECHGZhaWwgdG8gY2FzdCBpbnRvIChJbnQsIEludCkBCmZpeGVkUG9pbnQCA3ZhbAhkZWNpbWFscwQGdGVuUG93CQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgQHbG93UGFydAkApAMBCQBqAgUDdmFsBQZ0ZW5Qb3cEBnplcm9lcwkAsAICCQCkAwEFBnRlblBvdwkAZAIAAQkAsQIBBQdsb3dQYXJ0CQCsAgIJAKwCAgkArAICCQCkAwEJAGkCBQN2YWwFBnRlblBvdwIBLgUGemVyb2VzBQdsb3dQYXJ0AANNNl8AwIQ9AANNOF8AgMLXLwAPd2xnSXNzdWVkQW10S2V5AhB3bGdfaXNzdWVkQW1vdW50AA56Yklzc3VlZEFtdEtleQISemJpbGxfaXNzdWVkQW1vdW50ARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEEYWRkcgkArAICAhhhY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcl8FBGFkZHIBFWtleUZhcm1pbmdQb3dlckJ5VXNlcgEEYWRkcgkArAICAhNmYXJtaW5nUG93ZXJCeVVzZXJfBQRhZGRyABJhY3Jlc1N0YWtkVG90YWxLZXkCFmFjcmVzU3Rha2VkQW1vdW50VG90YWwAFHRvdGFsRmFybWluZ1Bvd2VyS2V5AhF0b3RhbEZhcm1pbmdQb3dlcgALTUFYX1dMX05GVFMAAwAMTUFYX0FSS19ORlRTAAEADUFSS19ORlRfQk9OVVMAiCcAF01BWF9ORlRTX1NUQUtFRF9CWV9VU0VSAAQAEWtleU5mdFRvdGFsSXNzdWVkAg5uZnRUb3RhbElzc3VlZAARa2V5TmZ0VG90YWxCdXJuZWQCDm5mdFRvdGFsQnVybmVkABNrZXlXbE5mdFRvdGFsU3Rha2VkAhBXbE5mdFRvdGFsU3Rha2VkABRrZXlBcmtOZnRUb3RhbFN0YWtlZAIRQXJrTmZ0VG90YWxTdGFrZWQBFWtleU5mdE51bWJlckJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAhNuZnROdW1iZXJCeUFzc2V0SWRfBQdhc3NldElkARJrZXlVc2VyV2xOZnROdW1iZXIBBGFkZHIJAKwCAgIQdXNlcldsTmZ0TnVtYmVyXwUEYWRkcgETa2V5VXNlckFya05mdE51bWJlcgEEYWRkcgkArAICAhF1c2VyQXJrTmZ0TnVtYmVyXwUEYWRkcgEQa2V5VXNlckZ1bGxCb251cwEEYWRkcgkArAICAg51c2VyRnVsbEJvbnVzXwUEYWRkcgAKbGV2ZWxBY3JlcwkAzAgCAAAJAMwIAgAKCQDMCAIAFAkAzAgCACgJAMwIAgBQCQDMCAIAlgEJAMwIAgD6AQkAzAgCAJADCQDMCAIAvAUJAMwIAgDoBwUDbmlsAQ9nZXRMZXZlbEJ5QWNyZXMBBWFjcmVzBANhY3IJAGkCCQBkAgUFYWNyZXMA/8HXLwUDTThfCgEHY2hlY2tlcgIDYWNjBGl0ZW0DCQBnAgUEaXRlbQUDYWNyBQNhY2MJAGQCBQNhY2MAAQoAAiRsBQpsZXZlbEFjcmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdjaGVja2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQVhY3JlcwkAaAIJAGgCBQVhY3JlcwAUCQBkAgkBD2dldExldmVsQnlBY3JlcwEFBWFjcmVzAAQBHmdldEZhcm1pbmdQb3dlckJ5QWNyZXNBbmRCb251cwIFYWNyZXMGYm9udXM2BApub3RCb251c2VkCQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFBWFjcmVzCQCUCgIJAGsDBQpub3RCb251c2VkCQBkAgUDTTZfBQZib251czYFA002XwUKbm90Qm9udXNlZAALdGVhbUFkZHJLZXkCCHRlYW1BZGRyARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQRhZGRyCQCsAgICEGxhc3RBcmJUaW1lVXNlcl8FBGFkZHIAFGtleUxhc3RBY3Jlc1NlbGxUaW1lAhFsYXN0QWNyZXNTZWxsVGltZQAQa2V5TGFzdExpbWl0TGVmdAINbGFzdExpbWl0TGVmdAAFbmFtZXMJAMwIAgILR29sZCBzaG92ZWwJAMwIAgIHUGlja2F4ZQUDbmlsAAxkZXNjcmlwdGlvbnMJAMwIAgIWUmV3YXJkIGZvciBlYXJseSBiaXJkcwkAzAgCAhNJbmNyZWFzZXMgRmFybVBvd2VyBQNuaWwADmlkeERlc2NyU2hvdmVsAAAAD2lkeERlc2NyUGlja2F4ZQABABByYXJpdHlUaHJlc2hvbGRzCQDMCAIABQkAzAgCAAoJAMwIAgAUBQNuaWwADWlkeFRocmVzaG9sZEMAAAANaWR4VGhyZXNob2xkVQABAA1pZHhUaHJlc2hvbGRMAAIABW5hbWV6CQDMCAICBlNIT1ZFTAkAzAgCAgdQSUNLQVhFBQNuaWwADWlkeE5hbWVTaG92ZWwAAAAOaWR4TmFtZVBpY2theGUAAQALY29udGVudEtleXoJAMwIAgIPY29udGVudFBpY2theGVDCQDMCAICD2NvbnRlbnRQaWNrYXhlVQkAzAgCAg9jb250ZW50UGlja2F4ZUwJAMwIAgIPY29udGVudFBpY2theGVFCQDMCAICDmNvbnRlbnRTaG92ZWxQBQNuaWwAB2lkeEtleUMAAAAHaWR4S2V5UAAEAAtyYXJpdHlOYW1lcwkAzAgCAgZDb21tb24JAMwIAgIIVW5jb21tb24JAMwIAgIJTGVnZW5kYXJ5CQDMCAICBEVwaWMJAMwIAgIFUHJvbW8FA25pbAAKaWR4UmFyaXR5QwAAAAppZHhSYXJpdHlVAAEACmlkeFJhcml0eUwAAgAKaWR4UmFyaXR5RQADAAppZHhSYXJpdHlQAAQAC2NvbGxlY3Rpb256CQDMCAICDURpZ2dpbmcgdG9vbHMFA25pbAAKaWR4Q29sbERpZwAAAApib251c1R5cGV6CQDMCAICCUZhcm1Qb3dlcgUDbmlsAA5pZHhCb251c1R5cGVGcAAAAQZwcm9sb2cBAWkDAwkBAiE9AggFAWkMb3JpZ2luQ2FsbGVyBQ1yZXN0MkNvbnRyYWN0CQELdmFsdWVPckVsc2UCCQCgCAEJAQprZXlCbG9ja2VkAAcHCQACAQIfQ29udHJhY3RzIGFyZSB1bmRlciBtYWludGVuYW5jZQQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEBHdlZWsJAGkCBQZoZWlnaHQFC1dFRUtfQkxPQ0tTBAtsYXN0V2Vla0tleQkBFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEFBGFkZHIEEmxhc3RXZWVrVHhJZEJ5VXNlcgkAoggBBQtsYXN0V2Vla0tleQQEdHhJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAN3dHgJAKwCAgkArAICCQCkAwEFBHdlZWsCAV8FBHR4SWQECmN1cldlZWtLZXkJARRrZXlDdXJXZWVrVHhJZEJ5VXNlcgEFBGFkZHIDCQEJaXNEZWZpbmVkAQUSbGFzdFdlZWtUeElkQnlVc2VyBApsYXN0V2Vla1R4CQC1CQIJAQV2YWx1ZQEFEmxhc3RXZWVrVHhJZEJ5VXNlcgIBXwMJAAACCQCRAwIFCmxhc3RXZWVrVHgAAAkApAMBBQR3ZWVrCQDMCAIJAQtTdHJpbmdFbnRyeQIFC2xhc3RXZWVrS2V5BQN3dHgJAMwIAgkBC1N0cmluZ0VudHJ5AgUKY3VyV2Vla0tleQUDd3R4BQNuaWwDCQAAAgkAkQMCBQpsYXN0V2Vla1R4AAAJAKQDAQkAZQIFBHdlZWsAAQkAzAgCCQELU3RyaW5nRW50cnkCBQpjdXJXZWVrS2V5BQN3dHgFA25pbAQRY3VyV2Vla1R4SWRCeVVzZXIJARFAZXh0ck5hdGl2ZSgxMDU4KQEFCmN1cldlZWtLZXkECWN1cldlZWtUeAkAtQkCBRFjdXJXZWVrVHhJZEJ5VXNlcgIBXwMJAAACCQCRAwIFCWN1cldlZWtUeAAACQCkAwEFBHdlZWsJAMwIAgkBC1N0cmluZ0VudHJ5AgUKY3VyV2Vla0tleQUDd3R4BQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgULbGFzdFdlZWtLZXkFEWN1cldlZWtUeElkQnlVc2VyCQDMCAIJAQtTdHJpbmdFbnRyeQIFCmN1cldlZWtLZXkFA3d0eAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIFC2xhc3RXZWVrS2V5BQN3dHgJAMwIAgkBC1N0cmluZ0VudHJ5AgUKY3VyV2Vla0tleQUDd3R4BQNuaWwBFGNyZWF0ZU5mdERlc2NyQ3VzdG9tCAdjb250S2V5CW5mdFNlcmlhbApjb2xsZWN0aW9uBG5hbWUFZGVzY3IGcmFyaXR5BWJvbnVzCWJvbnVzVHlwZQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIieyJ1cmwiOiAiaHR0cHM6Ly93YXZlc2xhbmRzLmNvbSIsIAIPImNvbnRlbnRLZXkiOiAiBQdjb250S2V5AgMiLCACCiJudW1iZXIiOiAJAKQDAQUJbmZ0U2VyaWFsAgIsIAIPImNvbGxlY3Rpb24iOiAiBQpjb2xsZWN0aW9uAgMiLCACCSJuYW1lIjogIgUEbmFtZQIDIiwgAhAiZGVzY3JpcHRpb24iOiAiBQVkZXNjcgIDIiwgAgkicmFyZSI6ICIFBnJhcml0eQIDIiwgAgkiYm9udXMiOiAJAKQDAQUFYm9udXMCAiwgAg4iYm9udXNUeXBlIjogIgUJYm9udXNUeXBlAgIifQEOaXNzdWVOZnRDdXN0b20IB25hbWVJZHgKY29udEtleUlkeAdjb2xsSWR4CXJhcml0eUlkeAlib251c1BlcmMIZGVzY3JJZHgMYm9udXNUeXBlSWR4BGFkZHIECW5mdFNlcmlhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRFrZXlOZnRUb3RhbElzc3VlZAAABAZyYXJpdHkJAJEDAgULcmFyaXR5TmFtZXMFCXJhcml0eUlkeAQEbmFtZQkArAICCQCsAgIJAKwCAgkAkQMCBQVuYW1legUHbmFtZUlkeAIBLQkArwICBQZyYXJpdHkAAQkApAMBBQlib251c1BlcmMEBWlzc3VlCQDCCAUFBG5hbWUJARRjcmVhdGVOZnREZXNjckN1c3RvbQgJAJEDAgULY29udGVudEtleXoFCmNvbnRLZXlJZHgFCW5mdFNlcmlhbAkAkQMCBQtjb2xsZWN0aW9uegUHY29sbElkeAkAkQMCBQVuYW1lcwUHbmFtZUlkeAkAkQMCBQxkZXNjcmlwdGlvbnMFCGRlc2NySWR4CQCRAwIFC3Jhcml0eU5hbWVzBQlyYXJpdHlJZHgFCWJvbnVzUGVyYwkAkQMCBQpib251c1R5cGV6BQxib251c1R5cGVJZHgAAQAABwQKbmZ0QXNzZXRJZAkAuAgBBQVpc3N1ZQkAlAoCCQDMCAIFBWlzc3VlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrZXlOZnRUb3RhbElzc3VlZAkAZAIFCW5mdFNlcmlhbAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEVa2V5TmZ0TnVtYmVyQnlBc3NldElkAQkA2AQBBQpuZnRBc3NldElkBQluZnRTZXJpYWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUEYWRkcgABBQpuZnRBc3NldElkBQNuaWwFCm5mdEFzc2V0SWQBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwDA2FtdAdhZGRyZXNzCmJvbnVzRGVsdGEDAwkAAAIFA2FtdAAACQAAAgUKYm9udXNEZWx0YQAABwkAAgECDU5vdGhpbmcgdG8gZG8ECXdsZ1Jlc3VsdAkA/AcEBQt3bGdDb250cmFjdAISb25TdGFrZVVuc3Rha2VMYW5kCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsAwkAAAIFCXdsZ1Jlc3VsdAUJd2xnUmVzdWx0BANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAd0aW1lS2V5CQEYa2V5QWNyZXNTdGFrZWRUaW1lQnlVc2VyAQUHYWRkcmVzcwQJYW1vdW50S2V5CQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQdhZGRyZXNzBA5vbGRBY3Jlc0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlhbW91bnRLZXkAAAMDCQBmAgAABQNhbXQJAGYCAAAJAGQCBQ5vbGRBY3Jlc0Ftb3VudAUDYW10BwkAAgEJAKwCAgkArAICCQCsAgICDllvdSBoYXZlIG9ubHkgCQEKZml4ZWRQb2ludAIFDm9sZEFjcmVzQW1vdW50AAgCICBBQ1JFUyBzdGFrZWQsIHRyaWVkIHRvIHVuc3Rha2UgCQEKZml4ZWRQb2ludAIJAQEtAQUDYW10AAgEDm5ld0FjcmVzQW1vdW50CQBkAgUOb2xkQWNyZXNBbW91bnQFA2FtdAQIb2xkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSYWNyZXNTdGFrZFRvdGFsS2V5AAAECXVzZXJGcEtleQkBFWtleUZhcm1pbmdQb3dlckJ5VXNlcgEFB2FkZHJlc3MEBW9sZEZwCQELdmFsdWVPckVsc2UCCQCfCAEFCXVzZXJGcEtleQAABAhib251c0tleQkBEGtleVVzZXJGdWxsQm9udXMBBQdhZGRyZXNzBAhvbGRCb251cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ5hY3JlczJDb250cmFjdAUIYm9udXNLZXkAAAMDCQBmAgAABQpib251c0RlbHRhCQBmAgAACQBkAgUIb2xkQm9udXMFCmJvbnVzRGVsdGEHCQACAQkArAICCQCsAgIJAKwCAgkArAICAg5Zb3UgaGF2ZSBvbmx5IAkBCmZpeGVkUG9pbnQCBQhvbGRCb251cwAEAh4lIGJvbnVzLCBhbmQgdHJpZWQgdG8gdW5zdGFrZSAJAQpmaXhlZFBvaW50AgkBAS0BBQpib251c0RlbHRhAAQCASUECyR0MDY4Mzg2OTM3CQEeZ2V0RmFybWluZ1Bvd2VyQnlBY3Jlc0FuZEJvbnVzAgUObmV3QWNyZXNBbW91bnQJAGQCBQhvbGRCb251cwUKYm9udXNEZWx0YQQMbmV3Qm9udXNlZEZwCAULJHQwNjgzODY5MzcCXzEEB2lnbm9yZWQIBQskdDA2ODM4NjkzNwJfMgQKb2xkVG90YWxGcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRR0b3RhbEZhcm1pbmdQb3dlcktleQAABAxhY3Jlc0FjdGlvbnMDCQAAAgUDYW10AAAFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJYW1vdW50S2V5BQ5uZXdBY3Jlc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSYWNyZXNTdGFrZFRvdGFsS2V5CQBkAgUIb2xkVG90YWwFA2FtdAUDbmlsCQCUCgIJAM0IAgkAzQgCCQDNCAIJAM0IAgUMYWNyZXNBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAQxJbnRlZ2VyRW50cnkCBQl1c2VyRnBLZXkFDG5ld0JvbnVzZWRGcAkBDEludGVnZXJFbnRyeQIFFHRvdGFsRmFybWluZ1Bvd2VyS2V5CQBlAgkAZAIFCm9sZFRvdGFsRnAFDG5ld0JvbnVzZWRGcAUFb2xkRnAJAQxJbnRlZ2VyRW50cnkCBQhib251c0tleQkAZAIFCG9sZEJvbnVzBQpib251c0RlbHRhBQl3bGdSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BC2dldFdsZ1ByaWNlARV1c2R0QmFsYW5jZUNvcnJlY3Rpb24EDGlzc3VlZEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFC3dsZ0NvbnRyYWN0BQ93bGdJc3N1ZWRBbXRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAQGd2xnVXNkCQDwBwIFC3dsZ0NvbnRyYWN0BQt1c2R0QXNzZXRJZAQJYWNyZXMyVXNkCQBlAgkA8AcCBQ5hY3JlczJDb250cmFjdAULdXNkdEFzc2V0SWQFFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRJpbnZlc3RGdW5kQ29udHJhY3QFC3VzZHRBc3NldElkCQELdmFsdWVPckVsc2UCCQCaCAIFEmludmVzdEZ1bmRDb250cmFjdAUOemJJc3N1ZWRBbXRLZXkAAAQNdG90YWxGdW5kc1VzZAkAZAIJAGQCBQlhY3JlczJVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsCQBrAwUNdG90YWxGdW5kc1VzZAUFTVVMVDgFDGlzc3VlZEFtb3VudAERZ2V0U3dhcExpbWl0QWNyZXMABAZ3bGdVc2QJAPAHAgULd2xnQ29udHJhY3QFC3VzZHRBc3NldElkBAlhY3JlczJVc2QJAPAHAgUEdGhpcwULdXNkdEFzc2V0SWQED2ludmVzdEZ1bmRUb3RhbAkAZAIJAPAHAgUSaW52ZXN0RnVuZENvbnRyYWN0BQt1c2R0QXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJpbnZlc3RGdW5kQ29udHJhY3QFDnpiSXNzdWVkQW10S2V5AAAEDGRlZmF1bHRMaW1pdAkAaQIJAGQCCQBkAgUJYWNyZXMyVXNkBQZ3bGdVc2QFD2ludmVzdEZ1bmRUb3RhbAUTT05FX1BFUkNFTlRfRElWSVNPUgQNbGFzdExpbWl0TGVmdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRBrZXlMYXN0TGltaXRMZWZ0BQxkZWZhdWx0TGltaXQECGxhc3RUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFFGtleUxhc3RBY3Jlc1NlbGxUaW1lAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEDGN1cnJlbnRMaW1pdAkAZAIFDWxhc3RMaW1pdExlZnQJAGsDBQxkZWZhdWx0TGltaXQJAGUCBQNub3cFCGxhc3RUaW1lBQpEQVlfTUlMTElTBA1saW1pdExlZnRVc2R0CQCXAwEJAMwIAgUMY3VycmVudExpbWl0CQDMCAIFDGRlZmF1bHRMaW1pdAUDbmlsCQCUCgIJAQxJbnRlZ2VyRW50cnkCBRRrZXlMYXN0QWNyZXNTZWxsVGltZQUDbm93BQ1saW1pdExlZnRVc2R0AAlhcmtPcmFjbGUJARFAZXh0ck5hdGl2ZSgxMDYyKQECIzNQSmdaNkFLMVdWQ3BkQ21FWnBlc0htYUt2clFEZFhHNW9nAAlpbmN1YmF0b3IJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUJYXJrT3JhY2xlAhdzdGF0aWNfaW5jdWJhdG9yQWRkcmVzcwIAAAdicmVlZGVyCQELdmFsdWVPckVsc2UCCQCdCAIFCWFya09yYWNsZQIVc3RhdGljX2JyZWVkZXJBZGRyZXNzAgAAD3R1cnRsZUluY3ViYXRvcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQlhcmtPcmFjbGUCHXN0YXRpY190dXJ0bGVJbmN1YmF0b3JBZGRyZXNzAgAADXR1cnRsZUJyZWVkZXIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUJYXJrT3JhY2xlAhtzdGF0aWNfdHVydGxlQnJlZWRlckFkZHJlc3MCAAAPY2FuaW5lSW5jdWJhdG9yCQELdmFsdWVPckVsc2UCCQCdCAIFCWFya09yYWNsZQIdc3RhdGljX2NhbmluZUluY3ViYXRvckFkZHJlc3MCAAANY2FuaW5lQnJlZWRlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQlhcmtPcmFjbGUCG3N0YXRpY19jYW5pbmVCcmVlZGVyQWRkcmVzcwIAAA9mZWxpbmVJbmN1YmF0b3IJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUJYXJrT3JhY2xlAh1zdGF0aWNfZmVsaW5lSW5jdWJhdG9yQWRkcmVzcwIAAA1mZWxpbmVCcmVlZGVyCQELdmFsdWVPckVsc2UCCQCdCAIFCWFya09yYWNsZQIbc3RhdGljX2ZlbGluZUJyZWVkZXJBZGRyZXNzAgAADW11dGFudEJyZWVkZXIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUJYXJrT3JhY2xlAh1zdGF0aWNfbXV0YW50SW5jdWJhdG9yQWRkcmVzcwIAAQ9pc0Fya2ltYWxJc3N1ZWQBA25mbwQGaXNzdWVyCQClCAEIBQNuZm8GaXNzdWVyAwMDAwMDAwMDAwkAAAIFBWNoYWluAQFUCQAAAgUGaXNzdWVyBRVvbGRTdGFraW5nQ29udHJhY3RTdHIHBgkAAAIFBmlzc3VlcgUJaW5jdWJhdG9yBgkAAAIFBmlzc3VlcgUHYnJlZWRlcgYJAAACBQZpc3N1ZXIFD3R1cnRsZUluY3ViYXRvcgYJAAACBQZpc3N1ZXIFDXR1cnRsZUJyZWVkZXIGCQAAAgUGaXNzdWVyBQ9jYW5pbmVJbmN1YmF0b3IGCQAAAgUGaXNzdWVyBQ1jYW5pbmVCcmVlZGVyBgkAAAIFBmlzc3VlcgUPZmVsaW5lSW5jdWJhdG9yBgkAAAIFBmlzc3VlcgUNZmVsaW5lQnJlZWRlcggFA25mbwRuYW1lAwkAAAIFBmlzc3VlcgUNbXV0YW50QnJlZWRlcggFA25mbwtkZXNjcmlwdGlvbgIAARJib251c0J5RGVzY3JpcHRpb24BBWRlc2NyAwkBASEBCQEIY29udGFpbnMCBQVkZXNjcgIYImJvbnVzVHlwZSI6ICJGYXJtUG93ZXIiCQACAQkArAICAhZORlQgaXMgbm90IHN1cHBvcnRlZDogBQVkZXNjcgQIYm9udXNTdHIJAJEDAgkAvAkCCQCRAwIJALwJAgUFZGVzY3ICCCJib251cyI6AAECASwAAAkBDXBhcnNlSW50VmFsdWUBCQCwAgIFCGJvbnVzU3RyCQBkAgkBC3ZhbHVlT3JFbHNlAgkAtwkCBQhib251c1N0cgIBIAD///////////8BAAEBFnJhcml0eUlkeEJ5RGVzY3JpcHJpb24BBWRlc2NyAwkBASEBCQEIY29udGFpbnMCBQVkZXNjcgIGInJhcmUiCQACAQkArAICAhZORlQgaXMgbm90IHN1cHBvcnRlZDogBQVkZXNjcgQJcmFyaXR5U3RyCQCRAwIJALwJAgkAkQMCCQC8CQIJAJEDAgkAvAkCBQVkZXNjcgIGInJhcmUiAAECASwAAAIBIgABCQEFdmFsdWUBCQDPCAIFC3Jhcml0eU5hbWVzBQlyYXJpdHlTdHIBEHN0YWtlTmZ0SW50ZXJuYWwGBGFkZHIKYXNzZXRJZFN0cgZib251czYKdXNlck51bUtleQt0b3RhbE51bUtleQVsaW1pdAQJbmZ0TnVtYmVyCQELdmFsdWVPckVsc2UCCQCfCAEFCnVzZXJOdW1LZXkAAAMJAGcCBQluZnROdW1iZXIFBWxpbWl0CQACAQkArAICCQCsAgICEllvdSBjYW4gc3Rha2UgbWF4IAkApAMBBQVsaW1pdAINIG9mIHN1Y2ggTkZUcwQNJHQwMTE3NTcxMTgzMwkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwDAAAFBGFkZHIFBmJvbnVzNgQHYWN0aW9ucwgFDSR0MDExNzU3MTE4MzMCXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAxMTc1NzExODMzAl8yCQCUCgIJAM0IAgkAzQgCCQDNCAIFB2FjdGlvbnMJAQxJbnRlZ2VyRW50cnkCBQp1c2VyTnVtS2V5CQBkAgUJbmZ0TnVtYmVyAAEJAQxJbnRlZ2VyRW50cnkCBQt0b3RhbE51bUtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQULdG90YWxOdW1LZXkAAAABCQEMSW50ZWdlckVudHJ5AgkBHmtleVN0YWtlZFRpbWVCeUFzc2V0SWRBbmRPd25lcgIFCmFzc2V0SWRTdHIFBGFkZHIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBRB3bGdDbGFpbWVkQW1vdW50EgFpAQpzYXZlTGFzdFR4AAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgULd2xnQ29udHJhY3QFA25pbAgFAWkGY2FsbGVyCQACAQINQWNjZXNzIGRlbmllZAkAlAoCCQEGcHJvbG9nAQUBaQAqAWkBDWNvbnN0cnVjdG9yVjECCXJlc3QyQWRkcg5vbGRBY3JDb250cmFjdAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA5vbGRBY3JDb250QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUOb2xkQWNyQ29udHJhY3QJAMwIAgkBDEludGVnZXJFbnRyeQIFFGFjcmVzSXNzdWVkQW1vdW50S2V5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ5vbGRBY3JDb250QWRkcgUUYWNyZXNJc3N1ZWRBbW91bnRLZXkJAMwIAgkBC0JpbmFyeUVudHJ5AgUPYWNyZXNBc3NldElkS2V5CQERQGV4dHJOYXRpdmUoMTA1MikCBQ5vbGRBY3JDb250QWRkcgUPYWNyZXNBc3NldElkS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlSZXN0MkFkZHJlc3MABQlyZXN0MkFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUTb2xkQWNyZXNDb250cmFjdEtleQUOb2xkQWNyQ29udHJhY3QFA25pbAFpAQpzZXRCbG9ja2VkAQlpc0Jsb2NrZWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCmtleUJsb2NrZWQABQlpc0Jsb2NrZWQFA25pbAFpAQx1bnN0YWtlQWNyZXMBBmFtb3VudAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQBnAgAABQZhbW91bnQJAAIBAhlBbW91bnQgc2hvdWxkIGJlIHBvc2l0aXZlBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBA5hcmJSZWxlYXNlVGltZQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgULd2xnQ29udHJhY3QJARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQUHYWRkcmVzcwAABQ5hcmJpdHJhZ2VEZWxheQMJAGYCBQ5hcmJSZWxlYXNlVGltZQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAAIBCQCsAgICLVlvdSB0cmFkZWQgc29tZSBXTEdPTEQsIGNhbm5vdCB1bnN0YWtlIHVudGlsIAkApAMBBQ5hcmJSZWxlYXNlVGltZQQNJHQwMTM0MDcxMzQ4NwkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwDCQEBLQEFBmFtb3VudAUHYWRkcmVzcwAABAdhY3Rpb25zCAUNJHQwMTM0MDcxMzQ4NwJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDEzNDA3MTM0ODcCXzIJAJQKAgkAzggCCQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGYW1vdW50BQxhY3Jlc0Fzc2V0SWQFDXByb2xvZ0FjdGlvbnMFEHdsZ0NsYWltZWRBbW91bnQBaQEKc3Rha2VBY3JlcwAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAUMYWNyZXNBc3NldElkCQACAQIUQUNSRVMgcGF5bWVudHMgb25seSEEDSR0MDEzOTM4MTQwMTQJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAwUDYW10BQdhZGRyZXNzAAAEB2FjdGlvbnMIBQ0kdDAxMzkzODE0MDE0Al8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMTM5MzgxNDAxNAJfMgkAlAoCCQDOCAIFB2FjdGlvbnMFDXByb2xvZ0FjdGlvbnMFEHdsZ0NsYWltZWRBbW91bnQBaQEIYnV5QWNyZXMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAp1c2R0QW1vdW50CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQMJAGYCBQVNVUxUNgUKdXNkdEFtb3VudAkAAgEJAKwCAgkArAICAhZNaW4gcGF5bWVudCBzaG91bGQgYmUgCQEKZml4ZWRQb2ludAIFBU1VTFQ2AAYCBSBVU0RUBAthY3Jlc0Ftb3VudAkAaAIFCnVzZHRBbW91bnQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgQJd2xnQW1vdW50CQBrAwUKdXNkdEFtb3VudAUFTVVMVDgJAQtnZXRXbGdQcmljZQEFCnVzZHRBbW91bnQED29sZEFjcmVzQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUTb2xkQWNyZXNDb250cmFjdEtleQQDcmVxCQD8BwQFD29sZEFjcmVzQWRkcmVzcwIUcmVxdWVzdEFjcmVzQ2FsbGJhY2sJAMwIAgULYWNyZXNBbW91bnQFA25pbAUDbmlsAwkAAAIFA3JlcQUDcmVxBAl3bGdSZW1haW4JAQVhc0ludAEJAPwHBAULd2xnQ29udHJhY3QCCmJ1cm5XbGdvbGQJAMwIAgUJd2xnQW1vdW50BQNuaWwFA25pbAkAlAoCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQthY3Jlc0Ftb3VudAUMYWNyZXNBc3NldElkBQNuaWwFDXByb2xvZ0FjdGlvbnMFCXdsZ1JlbWFpbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBidXlBY3Jlc1JFQURPTkxZAQp1c2R0QW1vdW50BAthY3Jlc0Ftb3VudAkAaAIFCnVzZHRBbW91bnQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgQJd2xnVG9CdXJuCQBrAwUKdXNkdEFtb3VudAUFTVVMVDgJAQtnZXRXbGdQcmljZQEFCnVzZHRBbW91bnQJAJQKAgUDbmlsCQDMCAIFC2FjcmVzQW1vdW50CQDMCAIFBU1VTFQ2CQDMCAIFC2FjcmVzQW1vdW50CQDMCAIFCXdsZ1RvQnVybgUDbmlsAWkBCXNlbGxBY3JlcwAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEC2FjcmVzQW1vdW50CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFDGFjcmVzQXNzZXRJZAkAAgECFEFDUkVTIHBheW1lbnRzIG9ubHkhAwkAZgIFBU1VTFQ3BQthY3Jlc0Ftb3VudAkAAgEJAKwCAgkArAICAhZNaW4gcGF5bWVudCBzaG91bGQgYmUgCQEKZml4ZWRQb2ludAIFBU1VTFQ3AAgCBiBBQ1JFUwQEYWRkcgkApQgBCAUBaQZjYWxsZXIEDSR0MDE1ODcxMTU5MTkJARFnZXRTd2FwTGltaXRBY3JlcwAEC2xpbWl0QWN0aW9uCAUNJHQwMTU4NzExNTkxOQJfMQQHbWF4VXNkdAgFDSR0MDE1ODcxMTU5MTkCXzIECG1heEFjcmVzCQBoAgUHbWF4VXNkdAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAwkAZgIFC2FjcmVzQW1vdW50BQhtYXhBY3JlcwkAAgEJAKwCAgkArAICAhFZb3UgY2FuIHNlbGwgbWF4IAkBCmZpeGVkUG9pbnQCBQhtYXhBY3JlcwAIAgYgQUNSRVMECnVzZHRBbW91bnQJAGkCCQBpAgULYWNyZXNBbW91bnQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgACCQCUCgIJAM4IAgkAzAgCBQtsaW1pdEFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa2V5TGFzdExpbWl0TGVmdAkAZQIFB21heFVzZHQFCnVzZHRBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQp1c2R0QW1vdW50BQt1c2R0QXNzZXRJZAUDbmlsBQ1wcm9sb2dBY3Rpb25zBQp1c2R0QW1vdW50AWkBEXNlbGxBY3Jlc1JFQURPTkxZAgdhZGRyZXNzC2FjcmVzQW1vdW50BA0kdDAxNjQxNTE2NDYzCQERZ2V0U3dhcExpbWl0QWNyZXMABAtsaW1pdEFjdGlvbggFDSR0MDE2NDE1MTY0NjMCXzEEB21heFVzZHQIBQ0kdDAxNjQxNTE2NDYzAl8yBAp1c2R0QW1vdW50CQBpAgkAaQIFC2FjcmVzQW1vdW50BRVVU0RUMkFDUkVTX01VTFRJUExJRVIAAgkAlAoCBQNuaWwJAMwIAgUKdXNkdEFtb3VudAkAzAgCBQVNVUxUNwkAzAgCCQBoAgUHbWF4VXNkdAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSCQDMCAIAAAUDbmlsAWkBEGNvbnZlcnRPbGRTdGFrZXMAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIUVGVtcG9yYXJpbHkgZGlzYWJsZWQEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQED29sZEFjcmVzQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUTb2xkQWNyZXNDb250cmFjdEtleQQGYW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFD29sZEFjcmVzQWRkcmVzcwkBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQUHYWRkcmVzcwAABAlnb3RBY3JlczADCQBmAgUGYW1vdW50AAAJAQxhc1R1cGxlMkludHMBCQD8BwQFD29sZEFjcmVzQWRkcmVzcwIUdW5zdGFrZUFjcmVzQ2FsbGJhY2sJAMwIAgUGYW1vdW50CQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsCQCUCgIAAAAABBFvbGRTdGFraW5nQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUVb2xkU3Rha2luZ0NvbnRyYWN0U3RyBAhsYW5kc1N0cgkAnQgCBRFvbGRTdGFraW5nQWRkcmVzcwkBFWtleVN0YWtlZExhbmRzQnlPd25lcgEFB2FkZHJlc3MEC2xhbmRzUmVzdWx0AwkBCWlzRGVmaW5lZAEFCGxhbmRzU3RyBAVsYW5kcwkAvQkCCQEFdmFsdWUBBQhsYW5kc1N0cgIBXwoBB29uZUxhbmQCA2FjYwtsYW5kQXNzZXRJZAMJAAACBQtsYW5kQXNzZXRJZAIACQACAQIXbGFuZEFzc2V0SWQgaXMgcmVxdWlyZWQEAXIJAQxhc1R1cGxlNUludHMBCQD8BwQFEW9sZFN0YWtpbmdBZGRyZXNzAhN1bnN0YWtlTGFuZENhbGxiYWNrCQDMCAIFC2xhbmRBc3NldElkCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsCQCWCgQJAGQCCAUDYWNjAl8xCAUBcgJfMQkAZAIIBQNhY2MCXzIIBQFyAl8yCQBkAggFA2FjYwJfMwgFAXICXzMJAGQCCAUDYWNjAl80CAUBcgJfNAQCcnIKAAIkbAUFbGFuZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAAAAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHb25lTGFuZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIVTGlzdCBzaXplIGV4Y2VlZHMgMTAwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAYgBjAGQECGZpbmFsaXplCQD8BwQFEW9sZFN0YWtpbmdBZGRyZXNzAhx1bnN0YWtlTGFuZHNGaW5hbGl6ZUNhbGxiYWNrCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsAwkAAAIFCGZpbmFsaXplBQhmaW5hbGl6ZQQDcmVxCQD8BwQFD29sZEFjcmVzQWRkcmVzcwIUcmVxdWVzdEFjcmVzQ2FsbGJhY2sJAMwIAgkAZAIJAGQCCQBkAggFAnJyAl8xCAUCcnICXzIIBQJycgJfMwgFAnJyAl80BQNuaWwFA25pbAMJAAACBQNyZXEFA3JlcQQNJHQwMTgzMzIxODQ3MAkBDmlzc3VlTmZ0Q3VzdG9tCAUNaWR4TmFtZVNob3ZlbAUHaWR4S2V5UAUKaWR4Q29sbERpZwUKaWR4UmFyaXR5UAADBQ5pZHhEZXNjclNob3ZlbAUOaWR4Qm9udXNUeXBlRnAIBQFpBmNhbGxlcgQKbmZ0QWN0aW9ucwgFDSR0MDE4MzMyMTg0NzACXzEECm5mdEFzc2V0SWQIBQ0kdDAxODMzMjE4NDcwAl8yCQCXCgUIBQJycgJfMQgFAnJyAl8yCAUCcnICXzMIBQJycgJfNAUKbmZ0QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlwoFAAAAAAAAAAAFA25pbAQLZHVja0Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgURb2xkU3Rha2luZ0FkZHJlc3MJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MCAAQKZHVja1Jlc3VsdAMJAQIhPQIFC2R1Y2tBc3NldElkAgAJAQxhc1R1cGxlM0ludHMBCQD8BwQFEW9sZFN0YWtpbmdBZGRyZXNzAhN1bnN0YWtlRHVja0NhbGxiYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsCQCVCgMAAAAAAAAEAXgJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAwkAZAIJAGQCCQBkAgkAZAIJAGQCCQBkAgkAZAIIBQlnb3RBY3JlczACXzEIBQtsYW5kc1Jlc3VsdAJfMQgFC2xhbmRzUmVzdWx0Al8yCAULbGFuZHNSZXN1bHQCXzMIBQtsYW5kc1Jlc3VsdAJfNAgFCmR1Y2tSZXN1bHQCXzEIBQpkdWNrUmVzdWx0Al8yCAUKZHVja1Jlc3VsdAJfMwUHYWRkcmVzcwAACQCUCgIJAM4IAggFC2xhbmRzUmVzdWx0Al81CAUBeAJfMQgFAXgCXzIBaQEUdW5zdGFrZUxhbmRzUkVBRE9OTFkBB2FkZHJlc3MEEW9sZFN0YWtpbmdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRVvbGRTdGFraW5nQ29udHJhY3RTdHIECGxhbmRzU3RyCQCdCAIFEW9sZFN0YWtpbmdBZGRyZXNzCQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUHYWRkcmVzcwQLbGFuZHNSZXN1bHQDCQEJaXNEZWZpbmVkAQUIbGFuZHNTdHIEBWxhbmRzCQC9CQIJAQV2YWx1ZQEFCGxhbmRzU3RyAgFfCgEHb25lTGFuZAIDYWNjC2xhbmRBc3NldElkAwkAAAIFC2xhbmRBc3NldElkAgAJAAIBAhdsYW5kQXNzZXRJZCBpcyByZXF1aXJlZAQBcgkBDGFzVHVwbGU0SW50cwEJAPwHBAURb2xkU3Rha2luZ0FkZHJlc3MCE3Vuc3Rha2VMYW5kUkVBRE9OTFkJAMwIAgULbGFuZEFzc2V0SWQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJYKBAkAZAIIBQNhY2MCXzEIBQFyAl8xCQBkAggFA2FjYwJfMggFAXICXzIJAGQCCAUDYWNjAl8zCAUBcgJfMwkAZAIIBQNhY2MCXzQIBQFyAl80CgACJGwFBWxhbmRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAAAAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB29uZUxhbmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFUxpc3Qgc2l6ZSBleGNlZWRzIDEwMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkCQCWCgQAAAAAAAAAAAkAlAoCBQNuaWwFC2xhbmRzUmVzdWx0AWkBEnN0YWtlQWNyZXNDYWxsYmFjawEEYWRkcgMJAQIhPQIIBQFpBmNhbGxlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUVb2xkU3Rha2luZ0NvbnRyYWN0U3RyCQACAQIRUGVybWlzc2lvbiBkZW5pZWQJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBGFkZHIAAAFpARpzaW11bGF0ZVN0YWtlQWNyZXNSRUFET05MWQIHYWRkcmVzcwthZGRlZEFtb3VudAQJYW1vdW50S2V5CQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQdhZGRyZXNzBA5uZXdBY3Jlc0Ftb3VudAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJYW1vdW50S2V5AAAFC2FkZGVkQW1vdW50BAhvbGRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRJhY3Jlc1N0YWtkVG90YWxLZXkAAAQJdXNlckZwS2V5CQEVa2V5RmFybWluZ1Bvd2VyQnlVc2VyAQUHYWRkcmVzcwQFb2xkRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJdXNlckZwS2V5AAAECXVzZXJCb251cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ5hY3JlczJDb250cmFjdAkBEGtleVVzZXJGdWxsQm9udXMBBQdhZGRyZXNzAAAEDSR0MDIwNjM1MjA3MjIJAR5nZXRGYXJtaW5nUG93ZXJCeUFjcmVzQW5kQm9udXMCBQ5uZXdBY3Jlc0Ftb3VudAUJdXNlckJvbnVzBAxuZXdCb251c2VkRnAIBQ0kdDAyMDYzNTIwNzIyAl8xBAdpZ25vcmVkCAUNJHQwMjA2MzUyMDcyMgJfMgQKb2xkVG90YWxGcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRR0b3RhbEZhcm1pbmdQb3dlcktleQAABApuZXdUb3RhbEZwCQBlAgkAZAIFCm9sZFRvdGFsRnAFDG5ld0JvbnVzZWRGcAUFb2xkRnAJAJQKAgUDbmlsCQDMCAIFBW9sZEZwCQDMCAIFDG5ld0JvbnVzZWRGcAkAzAgCBQpvbGRUb3RhbEZwCQDMCAIFCm5ld1RvdGFsRnAFA25pbAFpAQtpc3N1ZVBpY2tDMQEKZm9yQWRkcmVzcwMJAQIhPQIIBQFpBmNhbGxlcgULd2xnQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkBDmlzc3VlTmZ0Q3VzdG9tCAUOaWR4TmFtZVBpY2theGUFB2lkeEtleUMFCmlkeENvbGxEaWcFCmlkeFJhcml0eUMAAQUPaWR4RGVzY3JQaWNrYXhlBQ5pZHhCb251c1R5cGVGcAkBEUBleHRyTmF0aXZlKDEwNjIpAQUKZm9yQWRkcmVzcwFpAQhzdGFrZU5GVAAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIcRXhhY3RseSBvbmUgcGF5bWVudCByZXF1aXJlZAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAADCQECIT0CCAUDcG10BmFtb3VudAABCQACAQInTkZUIHRva2VuIHNob3VsZCBiZSBhdHRhY2hlZCBhcyBwYXltZW50BAdhc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQECmFzc2V0SWRTdHIJANgEAQUHYXNzZXRJZAQEYWRkcgkApQgBCAUBaQZjYWxsZXIEB25mdHNLZXkJARRrZXlTdGFrZWRORlRzQnlPd25lcgEFBGFkZHIEB25mdHNTdHIJAKIIAQUHbmZ0c0tleQQEbmZ0cwMJAQlpc0RlZmluZWQBBQduZnRzU3RyCQC8CQIJAQV2YWx1ZQEFB25mdHNTdHICAV8FA25pbAMJAQ9jb250YWluc0VsZW1lbnQCBQRuZnRzBQphc3NldElkU3RyCQACAQkArAICAiFZb3VyIHN0YWtlZCBORlRzIGFscmVhZHkgY29udGFpbiAFCmFzc2V0SWRTdHIDCQBnAgkAkAMBBQRuZnRzBRdNQVhfTkZUU19TVEFLRURfQllfVVNFUgkAAgEJAKwCAgkArAICAhlZb3VyIGFscmVhZHkgc3Rha2VkIG1heCAoCQCkAwEFF01BWF9ORlRTX1NUQUtFRF9CWV9VU0VSAgYpIE5GVHMECmxpc3RBY3Rpb24JAQtTdHJpbmdFbnRyeQIFB25mdHNLZXkJALoJAgkAzQgCBQRuZnRzBQphc3NldElkU3RyAgFfAwkAAAIIBQVhc3NldAZpc3N1ZXIFBHRoaXMEDSR0MDIyMTMxMjIzMjEJARBzdGFrZU5mdEludGVybmFsBgUEYWRkcgUKYXNzZXRJZFN0cgkAaAIJARJib251c0J5RGVzY3JpcHRpb24BCQEFdmFsdWUBCAUFYXNzZXQLZGVzY3JpcHRpb24AkE4JARJrZXlVc2VyV2xOZnROdW1iZXIBBQRhZGRyBRNrZXlXbE5mdFRvdGFsU3Rha2VkBQtNQVhfV0xfTkZUUwQHYWN0aW9ucwgFDSR0MDIyMTMxMjIzMjECXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAyMjEzMTIyMzIxAl8yCQCUCgIJAM0IAgkAzggCBQ1wcm9sb2dBY3Rpb25zBQdhY3Rpb25zBQpsaXN0QWN0aW9uBRB3bGdDbGFpbWVkQW1vdW50AwkAAAIJAQ9pc0Fya2ltYWxJc3N1ZWQBBQVhc3NldAIACQACAQI0T25seSBXYXZlc0xhbmRzIGFuZCBBcmtpbWFscyBORlQgdG9rZW5zIGFyZSBhY2NlcHRlZAQNJHQwMjI1MDIyMjY1MwkBEHN0YWtlTmZ0SW50ZXJuYWwGBQRhZGRyBQphc3NldElkU3RyBQ1BUktfTkZUX0JPTlVTCQETa2V5VXNlckFya05mdE51bWJlcgEFBGFkZHIFFGtleUFya05mdFRvdGFsU3Rha2VkBQxNQVhfQVJLX05GVFMEB2FjdGlvbnMIBQ0kdDAyMjUwMjIyNjUzAl8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMjI1MDIyMjY1MwJfMgkAlAoCCQDNCAIJAM4IAgUNcHJvbG9nQWN0aW9ucwUHYWN0aW9ucwUKbGlzdEFjdGlvbgUQd2xnQ2xhaW1lZEFtb3VudAFpAQp1bnN0YWtlTkZUAQphc3NldElkU3RyBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBAdhc3NldElkCQDZBAEFCmFzc2V0SWRTdHIEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBAVhc3NldAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBAd0aW1lS2V5CQEea2V5U3Rha2VkVGltZUJ5QXNzZXRJZEFuZE93bmVyAgUKYXNzZXRJZFN0cgUEYWRkcgMJAQEhAQkBCWlzRGVmaW5lZAEJAJ8IAQUHdGltZUtleQkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIVIGlzIG5vdCBzdGFrZWQgYnkgeW91BAduZnRzS2V5CQEUa2V5U3Rha2VkTkZUc0J5T3duZXIBBQRhZGRyBARuZnRzCQC8CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUHbmZ0c0tleQIAAgFfBANpZHgJAM8IAgUEbmZ0cwUKYXNzZXRJZFN0cgMJAQEhAQkBCWlzRGVmaW5lZAEFA2lkeAkAAgEJAKwCAgIfWW91ciBzdGFrZWQgTkZUcyBkb24ndCBjb250YWluIAUKYXNzZXRJZFN0cgQKbGlzdEFjdGlvbgMJAGYCCQCQAwEFBG5mdHMAAQkBC1N0cmluZ0VudHJ5AgUHbmZ0c0tleQkAugkCCQDRCAIFBG5mdHMJAQV2YWx1ZQEFA2lkeAIBXwkBC0RlbGV0ZUVudHJ5AQUHbmZ0c0tleQQEaXNXTAkAAAIIBQVhc3NldAZpc3N1ZXIFBHRoaXMDBQRpc1dMBAt3bE5mdE51bWJlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5VXNlcldsTmZ0TnVtYmVyAQUEYWRkcgAABAhib251c1ZhbAkAaAIJARJib251c0J5RGVzY3JpcHRpb24BCQEFdmFsdWUBCAUFYXNzZXQLZGVzY3JpcHRpb24AkE4EDSR0MDIzODE4MjM4OTcJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAwAABQRhZGRyCQEBLQEFCGJvbnVzVmFsBAdhY3Rpb25zCAUNJHQwMjM4MTgyMzg5NwJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDIzODE4MjM4OTcCXzIJAJQKAgkAzggCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgUHYWN0aW9ucwUKbGlzdEFjdGlvbgkBDEludGVnZXJFbnRyeQIJARJrZXlVc2VyV2xOZnROdW1iZXIBBQRhZGRyCQBlAgULd2xOZnROdW1iZXIAAQkBDEludGVnZXJFbnRyeQIFE2tleVdsTmZ0VG90YWxTdGFrZWQJAJYDAQkAzAgCAAAJAMwIAgkAZQIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUTa2V5V2xOZnRUb3RhbFN0YWtlZAAAAAEFA25pbAkBC0RlbGV0ZUVudHJ5AQkBHmtleVN0YWtlZFRpbWVCeUFzc2V0SWRBbmRPd25lcgIJANgEAQUHYXNzZXRJZAUEYWRkcgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEFB2Fzc2V0SWQFDXByb2xvZ0FjdGlvbnMFEHdsZ0NsYWltZWRBbW91bnQEC2Fya2ltYWxOYW1lCQEPaXNBcmtpbWFsSXNzdWVkAQUFYXNzZXQDCQAAAgULYXJraW1hbE5hbWUCAAkAAgECNE9ubHkgV2F2ZXNMYW5kcyBhbmQgQXJraW1hbHMgTkZUIHRva2VucyBhcmUgYWNjZXB0ZWQEDGFya05mdE51bWJlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETa2V5VXNlckFya05mdE51bWJlcgEFBGFkZHIAAAQNJHQwMjQ1NTcyNDY0MQkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwDAAAFBGFkZHIJAQEtAQUNQVJLX05GVF9CT05VUwQHYWN0aW9ucwgFDSR0MDI0NTU3MjQ2NDECXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAyNDU1NzI0NjQxAl8yCQCUCgIJAM4IAgkAzQgCCQDNCAIJAM0IAgkAzQgCBQdhY3Rpb25zBQpsaXN0QWN0aW9uCQEMSW50ZWdlckVudHJ5AgkBE2tleVVzZXJBcmtOZnROdW1iZXIBBQRhZGRyCQBlAgUMYXJrTmZ0TnVtYmVyAAEJAQtEZWxldGVFbnRyeQEJAR5rZXlTdGFrZWRUaW1lQnlBc3NldElkQW5kT3duZXICCQDYBAEFB2Fzc2V0SWQFBGFkZHIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkBQ1wcm9sb2dBY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50AWkBDGV4Y2hhbmdlTkZUcwADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhRUZW1wb3JhcmlseSBkaXNhYmxlZAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQBmAgADCQCQAwEIBQFpCHBheW1lbnRzCQACAQIpTWluIG9uZSBXTEdPTEQgYW5kIDIgTkZUIHBheW1lbnRzIGFsbG93ZWQDCQBmAgkAkAMBCAUBaQhwYXltZW50cwAGCQACAQIpTWF4IG9uZSBXTEdPTEQgYW5kIDUgTkZUIHBheW1lbnRzIGFsbG93ZWQEBGFkZHIJAKUIAQgFAWkGY2FsbGVyCgEFYWRkVXACA2FjYwNwbXQEB2Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAhpXQVZFUyBwYXltZW50cyBub3QgYWxsb3dlZAMJAAACBQdhc3NldElkBQp3bGdBc3NldElkCQCVCgMJAGQCCAUDYWNjAl8xCAUDcG10BmFtb3VudAgFA2FjYwJfMggFA2FjYwJfMwQFYXNzZXQJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAMJAQIhPQIIBQVhc3NldAZpc3N1ZXIFBHRoaXMJAAIBAhtPbmx5IFdMLWlzc3VlZCBORlRzIGFsbG93ZWQECHJhcml0eUl4CQEWcmFyaXR5SWR4QnlEZXNjcmlwcmlvbgEJAQV2YWx1ZQEIBQVhc3NldAtkZXNjcmlwdGlvbgMDCQBmAggFA2FjYwJfNAAACQECIT0CBQhyYXJpdHlJeAgFA2FjYwJfNAcJAAIBAi1Zb3UgY2FuIGV4Y2hhbmdlIG9ubHkgTkZUcyBvZiB0aGUgc2FtZSByYXJpdHkECWJvbnVzUGVyYwkBEmJvbnVzQnlEZXNjcmlwdGlvbgEJAQV2YWx1ZQEIBQVhc3NldAtkZXNjcmlwdGlvbgkAlgoECAUDYWNjAl8xCQBkAggFA2FjYwJfMgUJYm9udXNQZXJjCQDNCAIIBQNhY2MCXzMJAQRCdXJuAgUHYXNzZXRJZAABBQhyYXJpdHlJeAQNJHQwMjYxNjkyNjM4NAoAAiRsCAUBaQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAAAAAFA25pbAD///////////8BCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRVcAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgQGd2xnRmVlCAUNJHQwMjYxNjkyNjM4NAJfMQQKdG90YWxCb251cwgFDSR0MDI2MTY5MjYzODQCXzIEC2J1cm5BY3Rpb25zCAUNJHQwMjYxNjkyNjM4NAJfMwQJcmFyaXR5SWR4CAUNJHQwMjYxNjkyNjM4NAJfNAQMbmV3UmFyaXR5SWR4AwkAAAIFCXJhcml0eUlkeAUKaWR4UmFyaXR5QwMJAGYCCQCRAwIFEHJhcml0eVRocmVzaG9sZHMFDWlkeFRocmVzaG9sZEMFCnRvdGFsQm9udXMFCmlkeFJhcml0eUMDCQBmAgkAkQMCBRByYXJpdHlUaHJlc2hvbGRzBQ1pZHhUaHJlc2hvbGRVBQp0b3RhbEJvbnVzBQppZHhSYXJpdHlVCQACAQkArAICCQCsAgICOllvdSBjYW4gYWR2YW5jZSBvbmx5IG9uZSBsZXZlbCBvZiByYXJpdHksIG1heCB0b3RhbCBib251cyAJAKQDAQkAkQMCBRByYXJpdHlUaHJlc2hvbGRzBQ1pZHhUaHJlc2hvbGRVAgElAwkAAAIFCXJhcml0eUlkeAUKaWR4UmFyaXR5VQMJAGYCCQCRAwIFEHJhcml0eVRocmVzaG9sZHMFDWlkeFRocmVzaG9sZFUFCnRvdGFsQm9udXMFCmlkeFJhcml0eVUDCQBmAgkAkQMCBRByYXJpdHlUaHJlc2hvbGRzBQ1pZHhUaHJlc2hvbGRMBQp0b3RhbEJvbnVzBQppZHhSYXJpdHlMCQACAQkArAICCQCsAgICOllvdSBjYW4gYWR2YW5jZSBvbmx5IG9uZSBsZXZlbCBvZiByYXJpdHksIG1heCB0b3RhbCBib251cyAJAKQDAQkAkQMCBRByYXJpdHlUaHJlc2hvbGRzBQ1pZHhUaHJlc2hvbGRMAgElAwkAAAIFCXJhcml0eUlkeAUKaWR4UmFyaXR5TAMJAGYCCQCRAwIFEHJhcml0eVRocmVzaG9sZHMFDWlkeFRocmVzaG9sZEwFCnRvdGFsQm9udXMFCmlkeFJhcml0eUwFCmlkeFJhcml0eUUDCQAAAgUJcmFyaXR5SWR4BQppZHhSYXJpdHlFBQppZHhSYXJpdHlFAwkAAAIFCXJhcml0eUlkeAUKaWR4UmFyaXR5UAkAAgECJllvdSBjYW4ndCBleGNoYW5nZSBORlRzIG9mIHRoaXMgcmFyaXR5CQACAQIOVW5rbm93biByYXJpdHkECW1pbldsZ0ZlZQkAawMFCnRvdGFsQm9udXMAZAkBC2dldFdsZ1ByaWNlAQAABAZjaGFuZ2UJAGUCBQZ3bGdGZWUFCW1pbldsZ0ZlZQQHZm9yVGVhbQkAaQIFCW1pbldsZ0ZlZQACBAl3bGdSZW1haW4JAQVhc0ludAEJAPwHBAULd2xnQ29udHJhY3QCCmJ1cm5XbGdvbGQJAMwIAgkAZQIFCW1pbldsZ0ZlZQUHZm9yVGVhbQUDbmlsBQNuaWwDCQBmAgAABQZjaGFuZ2UJAAIBCQCsAgIJAKwCAgITWW91IG5lZWQgdG8gYXR0YWNoIAkBCmZpeGVkUG9pbnQCBQltaW5XbGdGZWUACAIOIFdMR09MRCBhcyBmZWUEDWNoYW5nZUFjdGlvbnMDCQBmAgUGY2hhbmdlAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZjaGFuZ2UFCndsZ0Fzc2V0SWQFA25pbAUDbmlsBA0kdDAyNzkxODI4MDc5CQEOaXNzdWVOZnRDdXN0b20IBQ5pZHhOYW1lUGlja2F4ZQUMbmV3UmFyaXR5SWR4BQppZHhDb2xsRGlnBQxuZXdSYXJpdHlJZHgFCnRvdGFsQm9udXMFD2lkeERlc2NyUGlja2F4ZQUOaWR4Qm9udXNUeXBlRnAIBQFpBmNhbGxlcgQPaXNzdWVOZnRBY3Rpb25zCAUNJHQwMjc5MTgyODA3OQJfMQQKbmZ0QXNzZXRJZAgFDSR0MDI3OTE4MjgwNzkCXzIEBmJ1cm5lZAkAkAMBBQtidXJuQWN0aW9ucwQSYnVybkNvdW50ZXJBY3Rpb25zAwkAAAIFBmJ1cm5lZAAABQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtleU5mdFRvdGFsQnVybmVkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRFrZXlOZnRUb3RhbEJ1cm5lZAAABQZidXJuZWQFA25pbAkAlAoCCQDNCAIJAM4IAgkAzggCCQDOCAIJAM4IAgUPaXNzdWVOZnRBY3Rpb25zBQtidXJuQWN0aW9ucwUSYnVybkNvdW50ZXJBY3Rpb25zBQ1wcm9sb2dBY3Rpb25zBQ1jaGFuZ2VBY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQt3bGdDb250cmFjdAULdGVhbUFkZHJLZXkFB2ZvclRlYW0FCndsZ0Fzc2V0SWQJAJQKAgUKbmZ0QXNzZXRJZAUJd2xnUmVtYWluAWkBDG9wZW5OZnRDaGVzdAADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAlAoCBQNuaWwAAABHCu1C", "height": 3393031, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CMpXSrPGqpkQoKJdzK7MYiNCSt36qmxUuv5ZZ1SRskHE Next: BmBgAqaGJ7Qbyxex4qya2KRicGSDoRUa3snWTH9ht4NK Diff:
OldNewDifferences
103103
104104 func keyCurWeekTxIdByUser (addr) = ("curWeekTxIdByUser_" + addr)
105105
106+
107+let wlgAssetIdKey = "wlg_assetId"
108+
109+let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
106110
107111 let acresIssuedAmountKey = "acresIssuedAmount"
108112
251255 }
252256
253257
258+let teamAddrKey = "teamAddr"
259+
254260 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
255261
256262
257263 let keyLastAcresSellTime = "lastAcresSellTime"
258264
259265 let keyLastLimitLeft = "lastLimitLeft"
260-
261-let nftNames = ["SHOVEL-P3", "PICKAXE-C1", "PICKAXE-C3", "PICKAXE-C5", "PICKAXE-C10"]
262-
263-let contentKeys = ["contentShovelP3", "contentPickaxeC1", "contentPickaxeC3", "contentPickaxeC5", "contentPickaxeC10"]
264266
265267 let names = ["Gold shovel", "Pickaxe"]
266268
270272
271273 let idxDescrPickaxe = 1
272274
273-let rarities = ["Promo", "Common"]
275+let rarityThresholds = [5, 10, 20]
274276
275-let bonuses = [3, 1, 3, 5, 10]
277+let idxThresholdC = 0
278+
279+let idxThresholdU = 1
280+
281+let idxThresholdL = 2
276282
277283 let namez = ["SHOVEL", "PICKAXE"]
278284
289295 let rarityNames = ["Common", "Uncommon", "Legendary", "Epic", "Promo"]
290296
291297 let idxRarityC = 0
298+
299+let idxRarityU = 1
300+
301+let idxRarityL = 2
302+
303+let idxRarityE = 3
292304
293305 let idxRarityP = 4
294306
344356 }
345357
346358
347-func createNftDescription (nftIndex,nftSerial) = ((((((((((((((((((((("{\"url\": \"https://waveslands.com\", " + "\"contentKey\": \"") + contentKeys[nftIndex]) + "\", ") + "\"number\": ") + nftSerial) + ", ") + "\"collection\": \"Digging tools") + "\", ") + "\"name\": \"") + names[nftIndex]) + "\", ") + "\"description\": \"") + descriptions[nftIndex]) + "\", ") + "\"rare\": \"") + rarities[nftIndex]) + "\", ") + "\"bonus\": ") + toString(bonuses[nftIndex])) + ", ") + "\"bonusType\": \"FarmPower\"}")
348-
349-
350-func issueNFTinternal (nftIndex,addr) = if ((nftIndex >= size(contentKeys)))
351- then throw("nftIndex out of bounds")
352- else {
353- let nftSerial = valueOrElse(getInteger(keyNftTotalIssued), 0)
354- let issue = Issue(nftNames[nftIndex], createNftDescription(nftIndex, toString(nftSerial)), 1, 0, false)
355- let nftAssetId = calculateAssetId(issue)
356- $Tuple2([issue, IntegerEntry(keyNftTotalIssued, (nftSerial + 1)), IntegerEntry(keyNftNumberByAssetId(toBase58String(nftAssetId)), nftSerial), ScriptTransfer(addr, 1, nftAssetId)], nftAssetId)
357- }
358-
359-
360359 func stakeUnstakeAcresInternal (amt,address,bonusDelta) = if (if ((amt == 0))
361360 then (bonusDelta == 0)
362361 else false)
385384 else false)
386385 then throw((((("You have only " + fixedPoint(oldBonus, 4)) + "% bonus, and tried to unstake ") + fixedPoint(-(bonusDelta), 4)) + "%"))
387386 else {
388- let $t066976796 = getFarmingPowerByAcresAndBonus(newAcresAmount, (oldBonus + bonusDelta))
389- let newBonusedFp = $t066976796._1
390- let ignored = $t066976796._2
387+ let $t068386937 = getFarmingPowerByAcresAndBonus(newAcresAmount, (oldBonus + bonusDelta))
388+ let newBonusedFp = $t068386937._1
389+ let ignored = $t068386937._2
391390 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
392391 let acresActions = if ((amt == 0))
393392 then nil
480479 }
481480
482481
482+func rarityIdxByDescriprion (descr) = if (!(contains(descr, "\"rare\"")))
483+ then throw(("NFT is not supported: " + descr))
484+ else {
485+ let rarityStr = split_4C(split_4C(split_4C(descr, "\"rare\"")[1], ",")[0], "\"")[1]
486+ value(indexOf(rarityNames, rarityStr))
487+ }
488+
489+
483490 func stakeNftInternal (addr,assetIdStr,bonus6,userNumKey,totalNumKey,limit) = {
484491 let nftNumber = valueOrElse(getInteger(userNumKey), 0)
485492 if ((nftNumber >= limit))
486493 then throw((("You can stake max " + toString(limit)) + " of such NFTs"))
487494 else {
488- let $t01132311399 = stakeUnstakeAcresInternal(0, addr, bonus6)
489- let actions = $t01132311399._1
490- let wlgClaimedAmount = $t01132311399._2
495+ let $t01175711833 = stakeUnstakeAcresInternal(0, addr, bonus6)
496+ let actions = $t01175711833._1
497+ let wlgClaimedAmount = $t01175711833._2
491498 $Tuple2((((actions :+ IntegerEntry(userNumKey, (nftNumber + 1))) :+ IntegerEntry(totalNumKey, (valueOrElse(getInteger(totalNumKey), 0) + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)), wlgClaimedAmount)
492499 }
493500 }
531538 if ((arbReleaseTime > lastBlock.timestamp))
532539 then throw(("You traded some WLGOLD, cannot unstake until " + toString(arbReleaseTime)))
533540 else {
534- let $t01297313053 = stakeUnstakeAcresInternal(-(amount), address, 0)
535- let actions = $t01297313053._1
536- let wlgClaimedAmount = $t01297313053._2
541+ let $t01340713487 = stakeUnstakeAcresInternal(-(amount), address, 0)
542+ let actions = $t01340713487._1
543+ let wlgClaimedAmount = $t01340713487._2
537544 $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
538545 }
539546 }
556563 else (value(pmt.assetId) != acresAssetId))
557564 then throw("ACRES payments only!")
558565 else {
559- let $t01350413580 = stakeUnstakeAcresInternal(amt, address, 0)
560- let actions = $t01350413580._1
561- let wlgClaimedAmount = $t01350413580._2
566+ let $t01393814014 = stakeUnstakeAcresInternal(amt, address, 0)
567+ let actions = $t01393814014._1
568+ let wlgClaimedAmount = $t01393814014._2
562569 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
563570 }
564571 }
622629 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
623630 else {
624631 let addr = toString(i.caller)
625- let $t01543715485 = getSwapLimitAcres()
626- let limitAction = $t01543715485._1
627- let maxUsdt = $t01543715485._2
632+ let $t01587115919 = getSwapLimitAcres()
633+ let limitAction = $t01587115919._1
634+ let maxUsdt = $t01587115919._2
628635 let maxAcres = (maxUsdt * USDT2ACRES_MULTIPLIER)
629636 if ((acresAmount > maxAcres))
630637 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
640647
641648 @Callable(i)
642649 func sellAcresREADONLY (address,acresAmount) = {
643- let $t01598116029 = getSwapLimitAcres()
644- let limitAction = $t01598116029._1
645- let maxUsdt = $t01598116029._2
650+ let $t01641516463 = getSwapLimitAcres()
651+ let limitAction = $t01641516463._1
652+ let maxUsdt = $t01641516463._2
646653 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
647654 $Tuple2(nil, [usdtAmount, MULT7, (maxUsdt * USDT2ACRES_MULTIPLIER), 0])
648655 }
694701 let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
695702 if ((req == req))
696703 then {
697- let $t01789818036 = issueNftCustom(idxNameShovel, idxKeyP, idxCollDig, idxRarityP, 3, idxDescrShovel, idxBonusTypeFp, i.caller)
698- let nftActions = $t01789818036._1
699- let nftAssetId = $t01789818036._2
704+ let $t01833218470 = issueNftCustom(idxNameShovel, idxKeyP, idxCollDig, idxRarityP, 3, idxDescrShovel, idxBonusTypeFp, i.caller)
705+ let nftActions = $t01833218470._1
706+ let nftAssetId = $t01833218470._2
700707 $Tuple5(rr._1, rr._2, rr._3, rr._4, nftActions)
701708 }
702709 else throw("Strict value is not equal to itself.")
763770 let userFpKey = keyFarmingPowerByUser(address)
764771 let oldFp = valueOrElse(getInteger(userFpKey), 0)
765772 let userBonus = valueOrElse(getInteger(acres2Contract, keyUserFullBonus(address)), 0)
766- let $t02020120288 = getFarmingPowerByAcresAndBonus(newAcresAmount, userBonus)
767- let newBonusedFp = $t02020120288._1
768- let ignored = $t02020120288._2
773+ let $t02063520722 = getFarmingPowerByAcresAndBonus(newAcresAmount, userBonus)
774+ let newBonusedFp = $t02063520722._1
775+ let ignored = $t02063520722._2
769776 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
770777 let newTotalFp = ((oldTotalFp + newBonusedFp) - oldFp)
771778 $Tuple2(nil, [oldFp, newBonusedFp, oldTotalFp, newTotalFp])
807814 let listAction = StringEntry(nftsKey, makeString_2C((nfts :+ assetIdStr), "_"))
808815 if ((asset.issuer == this))
809816 then {
810- let $t02169721887 = stakeNftInternal(addr, assetIdStr, (bonusByDescription(value(asset.description)) * 10000), keyUserWlNftNumber(addr), keyWlNftTotalStaked, MAX_WL_NFTS)
811- let actions = $t02169721887._1
812- let wlgClaimedAmount = $t02169721887._2
817+ let $t02213122321 = stakeNftInternal(addr, assetIdStr, (bonusByDescription(value(asset.description)) * 10000), keyUserWlNftNumber(addr), keyWlNftTotalStaked, MAX_WL_NFTS)
818+ let actions = $t02213122321._1
819+ let wlgClaimedAmount = $t02213122321._2
813820 $Tuple2(((prologActions ++ actions) :+ listAction), wlgClaimedAmount)
814821 }
815822 else if ((isArkimalIssued(asset) == ""))
816823 then throw("Only WavesLands and Arkimals NFT tokens are accepted")
817824 else {
818- let $t02206822219 = stakeNftInternal(addr, assetIdStr, ARK_NFT_BONUS, keyUserArkNftNumber(addr), keyArkNftTotalStaked, MAX_ARK_NFTS)
819- let actions = $t02206822219._1
820- let wlgClaimedAmount = $t02206822219._2
825+ let $t02250222653 = stakeNftInternal(addr, assetIdStr, ARK_NFT_BONUS, keyUserArkNftNumber(addr), keyArkNftTotalStaked, MAX_ARK_NFTS)
826+ let actions = $t02250222653._1
827+ let wlgClaimedAmount = $t02250222653._2
821828 $Tuple2(((prologActions ++ actions) :+ listAction), wlgClaimedAmount)
822829 }
823830 }
854861 then {
855862 let wlNftNumber = valueOrElse(getInteger(keyUserWlNftNumber(addr)), 0)
856863 let bonusVal = (bonusByDescription(value(asset.description)) * 10000)
857- let $t02338423463 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
858- let actions = $t02338423463._1
859- let wlgClaimedAmount = $t02338423463._2
864+ let $t02381823897 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
865+ let actions = $t02381823897._1
866+ let wlgClaimedAmount = $t02381823897._2
860867 $Tuple2(((((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber - 1))) :+ IntegerEntry(keyWlNftTotalStaked, max([0, (valueOrElse(getInteger(keyWlNftTotalStaked), 0) - 1)]))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
861868 }
862869 else {
865872 then throw("Only WavesLands and Arkimals NFT tokens are accepted")
866873 else {
867874 let arkNftNumber = valueOrElse(getInteger(keyUserArkNftNumber(addr)), 0)
868- let $t02412324207 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
869- let actions = $t02412324207._1
870- let wlgClaimedAmount = $t02412324207._2
875+ let $t02455724641 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
876+ let actions = $t02455724641._1
877+ let wlgClaimedAmount = $t02455724641._2
871878 $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserArkNftNumber(addr), (arkNftNumber - 1))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
872879 }
873880 }
884891 else {
885892 let prologActions = prolog(i)
886893 if ((3 > size(i.payments)))
887- then throw("Min one USDT and 2 NFT payments allowed")
894+ then throw("Min one WLGOLD and 2 NFT payments allowed")
888895 else if ((size(i.payments) > 6))
889- then throw("Max one USDT and 5 NFT payments allowed")
896+ then throw("Max one WLGOLD and 5 NFT payments allowed")
890897 else {
891898 let addr = toString(i.caller)
892899 func addUp (acc,pmt) = {
893900 let assetId = valueOrErrorMessage(pmt.assetId, "WAVES payments not allowed")
894- if ((assetId == usdtAssetId))
901+ if ((assetId == wlgAssetId))
895902 then $Tuple3((acc._1 + pmt.amount), acc._2, acc._3)
896903 else {
897904 let asset = value(assetInfo(assetId))
898905 if ((asset.issuer != this))
899906 then throw("Only WL-issued NFTs allowed")
900907 else {
901- let bonusPerc = bonusByDescription(value(asset.description))
902- $Tuple3(acc._1, (acc._2 + bonusPerc), (acc._3 :+ Burn(assetId, 1)))
908+ let rarityIx = rarityIdxByDescriprion(value(asset.description))
909+ if (if ((acc._4 > 0))
910+ then (rarityIx != acc._4)
911+ else false)
912+ then throw("You can exchange only NFTs of the same rarity")
913+ else {
914+ let bonusPerc = bonusByDescription(value(asset.description))
915+ $Tuple4(acc._1, (acc._2 + bonusPerc), (acc._3 :+ Burn(assetId, 1)), rarityIx)
916+ }
903917 }
904918 }
905919 }
906920
907- let $t02543625515 = {
921+ let $t02616926384 = {
908922 let $l = i.payments
909923 let $s = size($l)
910- let $acc0 = $Tuple3(0, 0, nil)
924+ let $acc0 = $Tuple4(0, 0, nil, -1)
911925 func $f0_1 ($a,$i) = if (($i >= $s))
912926 then $a
913927 else addUp($a, $l[$i])
918932
919933 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
920934 }
921- let usdtFee = $t02543625515._1
922- let totalBonus = $t02543625515._2
923- let burnActions = $t02543625515._3
924- let nftIndex = if ((totalBonus == 3))
925- then 2
926- else if ((totalBonus == 5))
927- then 3
928- else if ((totalBonus == 10))
929- then 4
930- else throw("Only bonuses of 3%, 5% or 10% are supported")
931- let change = (usdtFee - (totalBonus * MULT6))
935+ let wlgFee = $t02616926384._1
936+ let totalBonus = $t02616926384._2
937+ let burnActions = $t02616926384._3
938+ let rarityIdx = $t02616926384._4
939+ let newRarityIdx = if ((rarityIdx == idxRarityC))
940+ then if ((rarityThresholds[idxThresholdC] > totalBonus))
941+ then idxRarityC
942+ else if ((rarityThresholds[idxThresholdU] > totalBonus))
943+ then idxRarityU
944+ else throw((("You can advance only one level of rarity, max total bonus " + toString(rarityThresholds[idxThresholdU])) + "%"))
945+ else if ((rarityIdx == idxRarityU))
946+ then if ((rarityThresholds[idxThresholdU] > totalBonus))
947+ then idxRarityU
948+ else if ((rarityThresholds[idxThresholdL] > totalBonus))
949+ then idxRarityL
950+ else throw((("You can advance only one level of rarity, max total bonus " + toString(rarityThresholds[idxThresholdL])) + "%"))
951+ else if ((rarityIdx == idxRarityL))
952+ then if ((rarityThresholds[idxThresholdL] > totalBonus))
953+ then idxRarityL
954+ else idxRarityE
955+ else if ((rarityIdx == idxRarityE))
956+ then idxRarityE
957+ else if ((rarityIdx == idxRarityP))
958+ then throw("You can't exchange NFTs of this rarity")
959+ else throw("Unknown rarity")
960+ let minWlgFee = fraction(totalBonus, 100, getWlgPrice(0))
961+ let change = (wlgFee - minWlgFee)
962+ let forTeam = (minWlgFee / 2)
963+ let wlgRemain = asInt(invoke(wlgContract, "burnWlgold", [(minWlgFee - forTeam)], nil))
932964 if ((0 > change))
933- then throw((("You need to attach " + toString(totalBonus)) + " USDT as fee"))
965+ then throw((("You need to attach " + fixedPoint(minWlgFee, 8)) + " WLGOLD as fee"))
934966 else {
935967 let changeActions = if ((change > 0))
936- then [ScriptTransfer(i.caller, change, usdtAssetId)]
968+ then [ScriptTransfer(i.caller, change, wlgAssetId)]
937969 else nil
938- let $t02597226044 = issueNFTinternal(nftIndex, i.caller)
939- let issueNftActions = $t02597226044._1
940- let nftAssetId = $t02597226044._2
970+ let $t02791828079 = issueNftCustom(idxNamePickaxe, newRarityIdx, idxCollDig, newRarityIdx, totalBonus, idxDescrPickaxe, idxBonusTypeFp, i.caller)
971+ let issueNftActions = $t02791828079._1
972+ let nftAssetId = $t02791828079._2
941973 let burned = size(burnActions)
942974 let burnCounterActions = if ((burned == 0))
943975 then nil
944976 else [IntegerEntry(keyNftTotalBurned, (valueOrElse(getInteger(keyNftTotalBurned), 0) + burned))]
945- $Tuple2(((((issueNftActions ++ burnActions) ++ burnCounterActions) ++ prologActions) ++ changeActions), nftAssetId)
977+ $Tuple2((((((issueNftActions ++ burnActions) ++ burnCounterActions) ++ prologActions) ++ changeActions) :+ ScriptTransfer(addressFromStringValue(getStringValue(wlgContract, teamAddrKey)), forTeam, wlgAssetId)), $Tuple2(nftAssetId, wlgRemain))
946978 }
947979 }
948980 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let MULT6 = 1000000
77
88 let MULT7 = 10000000
99
1010 let MULT8 = 100000000
1111
1212 let DAY_MILLIS = 86400000
1313
1414 let USDT2ACRES_MULTIPLIER = 10
1515
1616 let ONE_PERCENT_DIVISOR = 100
1717
1818 let chain = take(drop(this.bytes, 1), 1)
1919
2020 let WEEK_BLOCKS = match chain {
2121 case _ =>
2222 if ((base58'2W' == $match0))
2323 then 10080
2424 else if ((base58'2T' == $match0))
2525 then 180
2626 else throw("Unknown chain")
2727 }
2828
2929 let usdtAssetId = match chain {
3030 case _ =>
3131 if ((base58'2W' == $match0))
3232 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
3333 else if ((base58'2T' == $match0))
3434 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
3535 else throw("Unknown chain")
3636 }
3737
3838 let defaultRest2AddressStr = match chain {
3939 case _ =>
4040 if ((base58'2W' == $match0))
4141 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
4242 else if ((base58'2T' == $match0))
4343 then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
4444 else throw("Unknown chain")
4545 }
4646
4747 let arbitrageDelay = match chain {
4848 case _ =>
4949 if ((base58'2W' == $match0))
5050 then DAY_MILLIS
5151 else if ((base58'2T' == $match0))
5252 then 60000
5353 else throw("Unknown chain")
5454 }
5555
5656 let oldStakingContractStr = match chain {
5757 case _ =>
5858 if ((base58'2W' == $match0))
5959 then "3PLncXtS1U83D6cQbFD3H8rBHPLgzxSFKZ1"
6060 else if ((base58'2T' == $match0))
6161 then "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm"
6262 else throw("Unknown chain")
6363 }
6464
6565 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
6666
6767
6868 let IdxCfgAcres2Dapp = 1
6969
7070 let IdxCfgWlgDapp = 2
7171
7272 let IdxCfgInvestFundDapp = 5
7373
7474 func keyRestCfg () = "%s__restConfig"
7575
7676
7777 func keyRest2Address () = "%s__rest2Addr"
7878
7979
8080 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
8181
8282
8383 func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
8484
8585
8686 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
8787
8888 let rest2Cfg = readRestCfgOrFail(rest2Contract)
8989
9090 let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
9191
9292 let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
9393
9494 let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
9595
9696 let oldAcresContractKey = "oldAcresContract"
9797
9898 func keyBlocked () = "contractsBlocked"
9999
100100
101101 func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
102102
103103
104104 func keyCurWeekTxIdByUser (addr) = ("curWeekTxIdByUser_" + addr)
105105
106+
107+let wlgAssetIdKey = "wlg_assetId"
108+
109+let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
106110
107111 let acresIssuedAmountKey = "acresIssuedAmount"
108112
109113 let acresAssetIdKey = "acresAssetId"
110114
111115 let acresAssetId = valueOrErrorMessage(getBinary(acres2Contract, acresAssetIdKey), "ACRES is not issued yet")
112116
113117 func keyAcresStakedTimeByUser (addr) = ("acresStakedTimeByUser_" + addr)
114118
115119
116120 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
117121
118122
119123 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
120124
121125
122126 func keyStakedTimeByAssetIdAndOwner (assetId,addr) = ((("st_" + assetId) + "_") + addr)
123127
124128
125129 func keyStakedNFTsByOwner (ownerAddr) = ("stakedNFTsByOwner_" + ownerAddr)
126130
127131
128132 func asInt (v) = match v {
129133 case n: Int =>
130134 n
131135 case _ =>
132136 throw("fail to cast into Int")
133137 }
134138
135139
136140 func asTuple5Ints (val) = match val {
137141 case t: (Int, Int, Int, Int, Int) =>
138142 t
139143 case _ =>
140144 throw("fail to cast into (Int, Int, Int, Int, Int)")
141145 }
142146
143147
144148 func asTuple4Ints (val) = match val {
145149 case t: (Int, Int, Int, Int) =>
146150 t
147151 case _ =>
148152 throw("fail to cast into (Int, Int, Int, Int)")
149153 }
150154
151155
152156 func asTuple3Ints (val) = match val {
153157 case t: (Int, Int, Int) =>
154158 t
155159 case _ =>
156160 throw("fail to cast into (Int, Int, Int)")
157161 }
158162
159163
160164 func asTuple2Ints (val) = match val {
161165 case t: (Int, Int) =>
162166 t
163167 case _ =>
164168 throw("fail to cast into (Int, Int)")
165169 }
166170
167171
168172 func fixedPoint (val,decimals) = {
169173 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
170174 let lowPart = toString((val % tenPow))
171175 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
172176 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
173177 }
174178
175179
176180 let M6_ = 1000000
177181
178182 let M8_ = 100000000
179183
180184 let wlgIssuedAmtKey = "wlg_issuedAmount"
181185
182186 let zbIssuedAmtKey = "zbill_issuedAmount"
183187
184188 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
185189
186190
187191 func keyFarmingPowerByUser (addr) = ("farmingPowerByUser_" + addr)
188192
189193
190194 let acresStakdTotalKey = "acresStakedAmountTotal"
191195
192196 let totalFarmingPowerKey = "totalFarmingPower"
193197
194198 let MAX_WL_NFTS = 3
195199
196200 let MAX_ARK_NFTS = 1
197201
198202 let ARK_NFT_BONUS = 5000
199203
200204 let MAX_NFTS_STAKED_BY_USER = 4
201205
202206 let keyNftTotalIssued = "nftTotalIssued"
203207
204208 let keyNftTotalBurned = "nftTotalBurned"
205209
206210 let keyWlNftTotalStaked = "WlNftTotalStaked"
207211
208212 let keyArkNftTotalStaked = "ArkNftTotalStaked"
209213
210214 func keyNftNumberByAssetId (assetId) = ("nftNumberByAssetId_" + assetId)
211215
212216
213217 func keyUserWlNftNumber (addr) = ("userWlNftNumber_" + addr)
214218
215219
216220 func keyUserArkNftNumber (addr) = ("userArkNftNumber_" + addr)
217221
218222
219223 func keyUserFullBonus (addr) = ("userFullBonus_" + addr)
220224
221225
222226 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
223227
224228 func getLevelByAcres (acres) = {
225229 let acr = ((acres + 99999999) / M8_)
226230 func checker (acc,item) = if ((item >= acr))
227231 then acc
228232 else (acc + 1)
229233
230234 let $l = levelAcres
231235 let $s = size($l)
232236 let $acc0 = 0
233237 func $f0_1 ($a,$i) = if (($i >= $s))
234238 then $a
235239 else checker($a, $l[$i])
236240
237241 func $f0_2 ($a,$i) = if (($i >= $s))
238242 then $a
239243 else throw("List size exceeds 10")
240244
241245 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
242246 }
243247
244248
245249 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
246250
247251
248252 func getFarmingPowerByAcresAndBonus (acres,bonus6) = {
249253 let notBonused = getFarmingPowerByAcres(acres)
250254 $Tuple2(fraction(notBonused, (M6_ + bonus6), M6_), notBonused)
251255 }
252256
253257
258+let teamAddrKey = "teamAddr"
259+
254260 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
255261
256262
257263 let keyLastAcresSellTime = "lastAcresSellTime"
258264
259265 let keyLastLimitLeft = "lastLimitLeft"
260-
261-let nftNames = ["SHOVEL-P3", "PICKAXE-C1", "PICKAXE-C3", "PICKAXE-C5", "PICKAXE-C10"]
262-
263-let contentKeys = ["contentShovelP3", "contentPickaxeC1", "contentPickaxeC3", "contentPickaxeC5", "contentPickaxeC10"]
264266
265267 let names = ["Gold shovel", "Pickaxe"]
266268
267269 let descriptions = ["Reward for early birds", "Increases FarmPower"]
268270
269271 let idxDescrShovel = 0
270272
271273 let idxDescrPickaxe = 1
272274
273-let rarities = ["Promo", "Common"]
275+let rarityThresholds = [5, 10, 20]
274276
275-let bonuses = [3, 1, 3, 5, 10]
277+let idxThresholdC = 0
278+
279+let idxThresholdU = 1
280+
281+let idxThresholdL = 2
276282
277283 let namez = ["SHOVEL", "PICKAXE"]
278284
279285 let idxNameShovel = 0
280286
281287 let idxNamePickaxe = 1
282288
283289 let contentKeyz = ["contentPickaxeC", "contentPickaxeU", "contentPickaxeL", "contentPickaxeE", "contentShovelP"]
284290
285291 let idxKeyC = 0
286292
287293 let idxKeyP = 4
288294
289295 let rarityNames = ["Common", "Uncommon", "Legendary", "Epic", "Promo"]
290296
291297 let idxRarityC = 0
298+
299+let idxRarityU = 1
300+
301+let idxRarityL = 2
302+
303+let idxRarityE = 3
292304
293305 let idxRarityP = 4
294306
295307 let collectionz = ["Digging tools"]
296308
297309 let idxCollDig = 0
298310
299311 let bonusTypez = ["FarmPower"]
300312
301313 let idxBonusTypeFp = 0
302314
303315 func prolog (i) = if (if ((i.originCaller != rest2Contract))
304316 then valueOrElse(getBoolean(keyBlocked()), false)
305317 else false)
306318 then throw("Contracts are under maintenance")
307319 else {
308320 let addr = toString(i.originCaller)
309321 let week = (height / WEEK_BLOCKS)
310322 let lastWeekKey = keyLastWeekTxIdByUser(addr)
311323 let lastWeekTxIdByUser = getString(lastWeekKey)
312324 let txId = toBase58String(i.transactionId)
313325 let wtx = ((toString(week) + "_") + txId)
314326 let curWeekKey = keyCurWeekTxIdByUser(addr)
315327 if (isDefined(lastWeekTxIdByUser))
316328 then {
317329 let lastWeekTx = split(value(lastWeekTxIdByUser), "_")
318330 if ((lastWeekTx[0] == toString(week)))
319331 then [StringEntry(lastWeekKey, wtx), StringEntry(curWeekKey, wtx)]
320332 else if ((lastWeekTx[0] == toString((week - 1))))
321333 then [StringEntry(curWeekKey, wtx)]
322334 else {
323335 let curWeekTxIdByUser = getStringValue(curWeekKey)
324336 let curWeekTx = split(curWeekTxIdByUser, "_")
325337 if ((curWeekTx[0] == toString(week)))
326338 then [StringEntry(curWeekKey, wtx)]
327339 else [StringEntry(lastWeekKey, curWeekTxIdByUser), StringEntry(curWeekKey, wtx)]
328340 }
329341 }
330342 else [StringEntry(lastWeekKey, wtx), StringEntry(curWeekKey, wtx)]
331343 }
332344
333345
334346 func createNftDescrCustom (contKey,nftSerial,collection,name,descr,rarity,bonus,bonusType) = (((((((((((((((((((((((("{\"url\": \"https://waveslands.com\", " + "\"contentKey\": \"") + contKey) + "\", ") + "\"number\": ") + toString(nftSerial)) + ", ") + "\"collection\": \"") + collection) + "\", ") + "\"name\": \"") + name) + "\", ") + "\"description\": \"") + descr) + "\", ") + "\"rare\": \"") + rarity) + "\", ") + "\"bonus\": ") + toString(bonus)) + ", ") + "\"bonusType\": \"") + bonusType) + "\"}")
335347
336348
337349 func issueNftCustom (nameIdx,contKeyIdx,collIdx,rarityIdx,bonusPerc,descrIdx,bonusTypeIdx,addr) = {
338350 let nftSerial = valueOrElse(getInteger(keyNftTotalIssued), 0)
339351 let rarity = rarityNames[rarityIdx]
340352 let name = (((namez[nameIdx] + "-") + take(rarity, 1)) + toString(bonusPerc))
341353 let issue = Issue(name, createNftDescrCustom(contentKeyz[contKeyIdx], nftSerial, collectionz[collIdx], names[nameIdx], descriptions[descrIdx], rarityNames[rarityIdx], bonusPerc, bonusTypez[bonusTypeIdx]), 1, 0, false)
342354 let nftAssetId = calculateAssetId(issue)
343355 $Tuple2([issue, IntegerEntry(keyNftTotalIssued, (nftSerial + 1)), IntegerEntry(keyNftNumberByAssetId(toBase58String(nftAssetId)), nftSerial), ScriptTransfer(addr, 1, nftAssetId)], nftAssetId)
344356 }
345357
346358
347-func createNftDescription (nftIndex,nftSerial) = ((((((((((((((((((((("{\"url\": \"https://waveslands.com\", " + "\"contentKey\": \"") + contentKeys[nftIndex]) + "\", ") + "\"number\": ") + nftSerial) + ", ") + "\"collection\": \"Digging tools") + "\", ") + "\"name\": \"") + names[nftIndex]) + "\", ") + "\"description\": \"") + descriptions[nftIndex]) + "\", ") + "\"rare\": \"") + rarities[nftIndex]) + "\", ") + "\"bonus\": ") + toString(bonuses[nftIndex])) + ", ") + "\"bonusType\": \"FarmPower\"}")
348-
349-
350-func issueNFTinternal (nftIndex,addr) = if ((nftIndex >= size(contentKeys)))
351- then throw("nftIndex out of bounds")
352- else {
353- let nftSerial = valueOrElse(getInteger(keyNftTotalIssued), 0)
354- let issue = Issue(nftNames[nftIndex], createNftDescription(nftIndex, toString(nftSerial)), 1, 0, false)
355- let nftAssetId = calculateAssetId(issue)
356- $Tuple2([issue, IntegerEntry(keyNftTotalIssued, (nftSerial + 1)), IntegerEntry(keyNftNumberByAssetId(toBase58String(nftAssetId)), nftSerial), ScriptTransfer(addr, 1, nftAssetId)], nftAssetId)
357- }
358-
359-
360359 func stakeUnstakeAcresInternal (amt,address,bonusDelta) = if (if ((amt == 0))
361360 then (bonusDelta == 0)
362361 else false)
363362 then throw("Nothing to do")
364363 else {
365364 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
366365 if ((wlgResult == wlgResult))
367366 then {
368367 let now = lastBlock.timestamp
369368 let timeKey = keyAcresStakedTimeByUser(address)
370369 let amountKey = keyAcresStakedAmtByUser(address)
371370 let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
372371 if (if ((0 > amt))
373372 then (0 > (oldAcresAmount + amt))
374373 else false)
375374 then throw(((("You have only " + fixedPoint(oldAcresAmount, 8)) + " ACRES staked, tried to unstake ") + fixedPoint(-(amt), 8)))
376375 else {
377376 let newAcresAmount = (oldAcresAmount + amt)
378377 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
379378 let userFpKey = keyFarmingPowerByUser(address)
380379 let oldFp = valueOrElse(getInteger(userFpKey), 0)
381380 let bonusKey = keyUserFullBonus(address)
382381 let oldBonus = valueOrElse(getInteger(acres2Contract, bonusKey), 0)
383382 if (if ((0 > bonusDelta))
384383 then (0 > (oldBonus + bonusDelta))
385384 else false)
386385 then throw((((("You have only " + fixedPoint(oldBonus, 4)) + "% bonus, and tried to unstake ") + fixedPoint(-(bonusDelta), 4)) + "%"))
387386 else {
388- let $t066976796 = getFarmingPowerByAcresAndBonus(newAcresAmount, (oldBonus + bonusDelta))
389- let newBonusedFp = $t066976796._1
390- let ignored = $t066976796._2
387+ let $t068386937 = getFarmingPowerByAcresAndBonus(newAcresAmount, (oldBonus + bonusDelta))
388+ let newBonusedFp = $t068386937._1
389+ let ignored = $t068386937._2
391390 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
392391 let acresActions = if ((amt == 0))
393392 then nil
394393 else [IntegerEntry(amountKey, newAcresAmount), IntegerEntry(acresStakdTotalKey, (oldTotal + amt))]
395394 $Tuple2(((((acresActions :+ IntegerEntry(timeKey, lastBlock.timestamp)) :+ IntegerEntry(userFpKey, newBonusedFp)) :+ IntegerEntry(totalFarmingPowerKey, ((oldTotalFp + newBonusedFp) - oldFp))) :+ IntegerEntry(bonusKey, (oldBonus + bonusDelta))), wlgResult)
396395 }
397396 }
398397 }
399398 else throw("Strict value is not equal to itself.")
400399 }
401400
402401
403402 func getWlgPrice (usdtBalanceCorrection) = {
404403 let issuedAmount = valueOrErrorMessage(getInteger(wlgContract, wlgIssuedAmtKey), "WLGOLD is not issued yet")
405404 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
406405 let acres2Usd = (assetBalance(acres2Contract, usdtAssetId) - usdtBalanceCorrection)
407406 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
408407 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
409408 fraction(totalFundsUsd, MULT8, issuedAmount)
410409 }
411410
412411
413412 func getSwapLimitAcres () = {
414413 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
415414 let acres2Usd = assetBalance(this, usdtAssetId)
416415 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
417416 let defaultLimit = (((acres2Usd + wlgUsd) + investFundTotal) / ONE_PERCENT_DIVISOR)
418417 let lastLimitLeft = valueOrElse(getInteger(keyLastLimitLeft), defaultLimit)
419418 let lastTime = valueOrElse(getInteger(keyLastAcresSellTime), 0)
420419 let now = lastBlock.timestamp
421420 let currentLimit = (lastLimitLeft + fraction(defaultLimit, (now - lastTime), DAY_MILLIS))
422421 let limitLeftUsdt = min([currentLimit, defaultLimit])
423422 $Tuple2(IntegerEntry(keyLastAcresSellTime, now), limitLeftUsdt)
424423 }
425424
426425
427426 let arkOracle = addressFromStringValue("3PJgZ6AK1WVCpdCmEZpesHmaKvrQDdXG5og")
428427
429428 let incubator = valueOrElse(getString(arkOracle, "static_incubatorAddress"), "")
430429
431430 let breeder = valueOrElse(getString(arkOracle, "static_breederAddress"), "")
432431
433432 let turtleIncubator = valueOrElse(getString(arkOracle, "static_turtleIncubatorAddress"), "")
434433
435434 let turtleBreeder = valueOrElse(getString(arkOracle, "static_turtleBreederAddress"), "")
436435
437436 let canineIncubator = valueOrElse(getString(arkOracle, "static_canineIncubatorAddress"), "")
438437
439438 let canineBreeder = valueOrElse(getString(arkOracle, "static_canineBreederAddress"), "")
440439
441440 let felineIncubator = valueOrElse(getString(arkOracle, "static_felineIncubatorAddress"), "")
442441
443442 let felineBreeder = valueOrElse(getString(arkOracle, "static_felineBreederAddress"), "")
444443
445444 let mutantBreeder = valueOrElse(getString(arkOracle, "static_mutantIncubatorAddress"), "")
446445
447446 func isArkimalIssued (nfo) = {
448447 let issuer = toString(nfo.issuer)
449448 if (if (if (if (if (if (if (if (if (if ((chain == base58'2T'))
450449 then (issuer == oldStakingContractStr)
451450 else false)
452451 then true
453452 else (issuer == incubator))
454453 then true
455454 else (issuer == breeder))
456455 then true
457456 else (issuer == turtleIncubator))
458457 then true
459458 else (issuer == turtleBreeder))
460459 then true
461460 else (issuer == canineIncubator))
462461 then true
463462 else (issuer == canineBreeder))
464463 then true
465464 else (issuer == felineIncubator))
466465 then true
467466 else (issuer == felineBreeder))
468467 then nfo.name
469468 else if ((issuer == mutantBreeder))
470469 then nfo.description
471470 else ""
472471 }
473472
474473
475474 func bonusByDescription (descr) = if (!(contains(descr, "\"bonusType\": \"FarmPower\"")))
476475 then throw(("NFT is not supported: " + descr))
477476 else {
478477 let bonusStr = split_4C(split_4C(descr, "\"bonus\":")[1], ",")[0]
479478 parseIntValue(drop(bonusStr, (valueOrElse(lastIndexOf(bonusStr, " "), -1) + 1)))
480479 }
481480
482481
482+func rarityIdxByDescriprion (descr) = if (!(contains(descr, "\"rare\"")))
483+ then throw(("NFT is not supported: " + descr))
484+ else {
485+ let rarityStr = split_4C(split_4C(split_4C(descr, "\"rare\"")[1], ",")[0], "\"")[1]
486+ value(indexOf(rarityNames, rarityStr))
487+ }
488+
489+
483490 func stakeNftInternal (addr,assetIdStr,bonus6,userNumKey,totalNumKey,limit) = {
484491 let nftNumber = valueOrElse(getInteger(userNumKey), 0)
485492 if ((nftNumber >= limit))
486493 then throw((("You can stake max " + toString(limit)) + " of such NFTs"))
487494 else {
488- let $t01132311399 = stakeUnstakeAcresInternal(0, addr, bonus6)
489- let actions = $t01132311399._1
490- let wlgClaimedAmount = $t01132311399._2
495+ let $t01175711833 = stakeUnstakeAcresInternal(0, addr, bonus6)
496+ let actions = $t01175711833._1
497+ let wlgClaimedAmount = $t01175711833._2
491498 $Tuple2((((actions :+ IntegerEntry(userNumKey, (nftNumber + 1))) :+ IntegerEntry(totalNumKey, (valueOrElse(getInteger(totalNumKey), 0) + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)), wlgClaimedAmount)
492499 }
493500 }
494501
495502
496503 @Callable(i)
497504 func saveLastTx () = if (!(containsElement([wlgContract], i.caller)))
498505 then throw("Access denied")
499506 else $Tuple2(prolog(i), 42)
500507
501508
502509
503510 @Callable(i)
504511 func constructorV1 (rest2Addr,oldAcrContract) = if ((i.caller != this))
505512 then throw("Permission denied")
506513 else {
507514 let oldAcrContAddr = addressFromStringValue(oldAcrContract)
508515 [IntegerEntry(acresIssuedAmountKey, getIntegerValue(oldAcrContAddr, acresIssuedAmountKey)), BinaryEntry(acresAssetIdKey, getBinaryValue(oldAcrContAddr, acresAssetIdKey)), StringEntry(keyRest2Address(), rest2Addr), StringEntry(oldAcresContractKey, oldAcrContract)]
509516 }
510517
511518
512519
513520 @Callable(i)
514521 func setBlocked (isBlocked) = if ((i.caller != this))
515522 then throw("permission denied")
516523 else [BooleanEntry(keyBlocked(), isBlocked)]
517524
518525
519526
520527 @Callable(i)
521528 func unstakeAcres (amount) = {
522529 let prologActions = prolog(i)
523530 if ((0 >= amount))
524531 then throw("Amount should be positive")
525532 else {
526533 let address = toString(i.caller)
527534 if ((size(i.payments) != 0))
528535 then throw("No payments required")
529536 else {
530537 let arbReleaseTime = (valueOrElse(getInteger(wlgContract, keyLastWlgTradeTimeByUser(address)), 0) + arbitrageDelay)
531538 if ((arbReleaseTime > lastBlock.timestamp))
532539 then throw(("You traded some WLGOLD, cannot unstake until " + toString(arbReleaseTime)))
533540 else {
534- let $t01297313053 = stakeUnstakeAcresInternal(-(amount), address, 0)
535- let actions = $t01297313053._1
536- let wlgClaimedAmount = $t01297313053._2
541+ let $t01340713487 = stakeUnstakeAcresInternal(-(amount), address, 0)
542+ let actions = $t01340713487._1
543+ let wlgClaimedAmount = $t01340713487._2
537544 $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
538545 }
539546 }
540547 }
541548 }
542549
543550
544551
545552 @Callable(i)
546553 func stakeAcres () = {
547554 let prologActions = prolog(i)
548555 let address = toString(i.caller)
549556 if ((size(i.payments) != 1))
550557 then throw("exactly 1 payment must be attached")
551558 else {
552559 let pmt = i.payments[0]
553560 let amt = pmt.amount
554561 if (if (!(isDefined(pmt.assetId)))
555562 then true
556563 else (value(pmt.assetId) != acresAssetId))
557564 then throw("ACRES payments only!")
558565 else {
559- let $t01350413580 = stakeUnstakeAcresInternal(amt, address, 0)
560- let actions = $t01350413580._1
561- let wlgClaimedAmount = $t01350413580._2
566+ let $t01393814014 = stakeUnstakeAcresInternal(amt, address, 0)
567+ let actions = $t01393814014._1
568+ let wlgClaimedAmount = $t01393814014._2
562569 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
563570 }
564571 }
565572 }
566573
567574
568575
569576 @Callable(i)
570577 func buyAcres () = {
571578 let prologActions = prolog(i)
572579 if ((size(i.payments) != 1))
573580 then throw("exactly 1 payment must be attached")
574581 else {
575582 let pmt = i.payments[0]
576583 let usdtAmount = pmt.amount
577584 if (if (!(isDefined(pmt.assetId)))
578585 then true
579586 else (value(pmt.assetId) != usdtAssetId))
580587 then throw("USDT payments only!")
581588 else if ((MULT6 > usdtAmount))
582589 then throw((("Min payment should be " + fixedPoint(MULT6, 6)) + " USDT"))
583590 else {
584591 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
585592 let wlgAmount = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
586593 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
587594 let req = invoke(oldAcresAddress, "requestAcresCallback", [acresAmount], nil)
588595 if ((req == req))
589596 then {
590597 let wlgRemain = asInt(invoke(wlgContract, "burnWlgold", [wlgAmount], nil))
591598 $Tuple2(([ScriptTransfer(i.caller, acresAmount, acresAssetId)] ++ prologActions), wlgRemain)
592599 }
593600 else throw("Strict value is not equal to itself.")
594601 }
595602 }
596603 }
597604
598605
599606
600607 @Callable(i)
601608 func buyAcresREADONLY (usdtAmount) = {
602609 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
603610 let wlgToBurn = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
604611 $Tuple2(nil, [acresAmount, MULT6, acresAmount, wlgToBurn])
605612 }
606613
607614
608615
609616 @Callable(i)
610617 func sellAcres () = {
611618 let prologActions = prolog(i)
612619 if ((size(i.payments) != 1))
613620 then throw("exactly 1 payment must be attached")
614621 else {
615622 let pmt = i.payments[0]
616623 let acresAmount = pmt.amount
617624 if (if (!(isDefined(pmt.assetId)))
618625 then true
619626 else (value(pmt.assetId) != acresAssetId))
620627 then throw("ACRES payments only!")
621628 else if ((MULT7 > acresAmount))
622629 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
623630 else {
624631 let addr = toString(i.caller)
625- let $t01543715485 = getSwapLimitAcres()
626- let limitAction = $t01543715485._1
627- let maxUsdt = $t01543715485._2
632+ let $t01587115919 = getSwapLimitAcres()
633+ let limitAction = $t01587115919._1
634+ let maxUsdt = $t01587115919._2
628635 let maxAcres = (maxUsdt * USDT2ACRES_MULTIPLIER)
629636 if ((acresAmount > maxAcres))
630637 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
631638 else {
632639 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
633640 $Tuple2(([limitAction, IntegerEntry(keyLastLimitLeft, (maxUsdt - usdtAmount)), ScriptTransfer(i.caller, usdtAmount, usdtAssetId)] ++ prologActions), usdtAmount)
634641 }
635642 }
636643 }
637644 }
638645
639646
640647
641648 @Callable(i)
642649 func sellAcresREADONLY (address,acresAmount) = {
643- let $t01598116029 = getSwapLimitAcres()
644- let limitAction = $t01598116029._1
645- let maxUsdt = $t01598116029._2
650+ let $t01641516463 = getSwapLimitAcres()
651+ let limitAction = $t01641516463._1
652+ let maxUsdt = $t01641516463._2
646653 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
647654 $Tuple2(nil, [usdtAmount, MULT7, (maxUsdt * USDT2ACRES_MULTIPLIER), 0])
648655 }
649656
650657
651658
652659 @Callable(i)
653660 func convertOldStakes () = if ((i.caller != this))
654661 then throw("Temporarily disabled")
655662 else {
656663 let address = toString(i.caller)
657664 if ((size(i.payments) != 0))
658665 then throw("No payments required")
659666 else {
660667 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
661668 let amount = valueOrElse(getInteger(oldAcresAddress, keyAcresStakedAmtByUser(address)), 0)
662669 let gotAcres0 = if ((amount > 0))
663670 then asTuple2Ints(invoke(oldAcresAddress, "unstakeAcresCallback", [amount, address], nil))
664671 else $Tuple2(0, 0)
665672 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
666673 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
667674 let landsResult = if (isDefined(landsStr))
668675 then {
669676 let lands = split_51C(value(landsStr), "_")
670677 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
671678 then throw("landAssetId is required")
672679 else {
673680 let r = asTuple5Ints(invoke(oldStakingAddress, "unstakeLandCallback", [landAssetId, address], nil))
674681 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
675682 }
676683
677684 let rr = {
678685 let $l = lands
679686 let $s = size($l)
680687 let $acc0 = $Tuple4(0, 0, 0, 0)
681688 func $f0_1 ($a,$i) = if (($i >= $s))
682689 then $a
683690 else oneLand($a, $l[$i])
684691
685692 func $f0_2 ($a,$i) = if (($i >= $s))
686693 then $a
687694 else throw("List size exceeds 100")
688695
689696 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
690697 }
691698 let finalize = invoke(oldStakingAddress, "unstakeLandsFinalizeCallback", [address], nil)
692699 if ((finalize == finalize))
693700 then {
694701 let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
695702 if ((req == req))
696703 then {
697- let $t01789818036 = issueNftCustom(idxNameShovel, idxKeyP, idxCollDig, idxRarityP, 3, idxDescrShovel, idxBonusTypeFp, i.caller)
698- let nftActions = $t01789818036._1
699- let nftAssetId = $t01789818036._2
704+ let $t01833218470 = issueNftCustom(idxNameShovel, idxKeyP, idxCollDig, idxRarityP, 3, idxDescrShovel, idxBonusTypeFp, i.caller)
705+ let nftActions = $t01833218470._1
706+ let nftAssetId = $t01833218470._2
700707 $Tuple5(rr._1, rr._2, rr._3, rr._4, nftActions)
701708 }
702709 else throw("Strict value is not equal to itself.")
703710 }
704711 else throw("Strict value is not equal to itself.")
705712 }
706713 else $Tuple5(0, 0, 0, 0, nil)
707714 let duckAssetId = valueOrElse(getString(oldStakingAddress, keyStakedDuckByOwner(address)), "")
708715 let duckResult = if ((duckAssetId != ""))
709716 then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
710717 else $Tuple3(0, 0, 0)
711718 let x = stakeUnstakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address, 0)
712719 $Tuple2((landsResult._5 ++ x._1), x._2)
713720 }
714721 }
715722
716723
717724
718725 @Callable(i)
719726 func unstakeLandsREADONLY (address) = {
720727 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
721728 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
722729 let landsResult = if (isDefined(landsStr))
723730 then {
724731 let lands = split_51C(value(landsStr), "_")
725732 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
726733 then throw("landAssetId is required")
727734 else {
728735 let r = asTuple4Ints(invoke(oldStakingAddress, "unstakeLandREADONLY", [landAssetId, address], nil))
729736 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
730737 }
731738
732739 let $l = lands
733740 let $s = size($l)
734741 let $acc0 = $Tuple4(0, 0, 0, 0)
735742 func $f0_1 ($a,$i) = if (($i >= $s))
736743 then $a
737744 else oneLand($a, $l[$i])
738745
739746 func $f0_2 ($a,$i) = if (($i >= $s))
740747 then $a
741748 else throw("List size exceeds 100")
742749
743750 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
744751 }
745752 else $Tuple4(0, 0, 0, 0)
746753 $Tuple2(nil, landsResult)
747754 }
748755
749756
750757
751758 @Callable(i)
752759 func stakeAcresCallback (addr) = if ((i.caller != addressFromStringValue(oldStakingContractStr)))
753760 then throw("Permission denied")
754761 else stakeUnstakeAcresInternal(i.payments[0].amount, addr, 0)
755762
756763
757764
758765 @Callable(i)
759766 func simulateStakeAcresREADONLY (address,addedAmount) = {
760767 let amountKey = keyAcresStakedAmtByUser(address)
761768 let newAcresAmount = (valueOrElse(getInteger(amountKey), 0) + addedAmount)
762769 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
763770 let userFpKey = keyFarmingPowerByUser(address)
764771 let oldFp = valueOrElse(getInteger(userFpKey), 0)
765772 let userBonus = valueOrElse(getInteger(acres2Contract, keyUserFullBonus(address)), 0)
766- let $t02020120288 = getFarmingPowerByAcresAndBonus(newAcresAmount, userBonus)
767- let newBonusedFp = $t02020120288._1
768- let ignored = $t02020120288._2
773+ let $t02063520722 = getFarmingPowerByAcresAndBonus(newAcresAmount, userBonus)
774+ let newBonusedFp = $t02063520722._1
775+ let ignored = $t02063520722._2
769776 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
770777 let newTotalFp = ((oldTotalFp + newBonusedFp) - oldFp)
771778 $Tuple2(nil, [oldFp, newBonusedFp, oldTotalFp, newTotalFp])
772779 }
773780
774781
775782
776783 @Callable(i)
777784 func issuePickC1 (forAddress) = if ((i.caller != wlgContract))
778785 then throw("Permission denied")
779786 else issueNftCustom(idxNamePickaxe, idxKeyC, idxCollDig, idxRarityC, 1, idxDescrPickaxe, idxBonusTypeFp, addressFromStringValue(forAddress))
780787
781788
782789
783790 @Callable(i)
784791 func stakeNFT () = {
785792 let prologActions = prolog(i)
786793 if ((size(i.payments) != 1))
787794 then throw("Exactly one payment required")
788795 else {
789796 let pmt = value(i.payments[0])
790797 if ((pmt.amount != 1))
791798 then throw("NFT token should be attached as payment")
792799 else {
793800 let assetId = value(pmt.assetId)
794801 let asset = value(assetInfo(assetId))
795802 let assetIdStr = toBase58String(assetId)
796803 let addr = toString(i.caller)
797804 let nftsKey = keyStakedNFTsByOwner(addr)
798805 let nftsStr = getString(nftsKey)
799806 let nfts = if (isDefined(nftsStr))
800807 then split_4C(value(nftsStr), "_")
801808 else nil
802809 if (containsElement(nfts, assetIdStr))
803810 then throw(("Your staked NFTs already contain " + assetIdStr))
804811 else if ((size(nfts) >= MAX_NFTS_STAKED_BY_USER))
805812 then throw((("Your already staked max (" + toString(MAX_NFTS_STAKED_BY_USER)) + ") NFTs"))
806813 else {
807814 let listAction = StringEntry(nftsKey, makeString_2C((nfts :+ assetIdStr), "_"))
808815 if ((asset.issuer == this))
809816 then {
810- let $t02169721887 = stakeNftInternal(addr, assetIdStr, (bonusByDescription(value(asset.description)) * 10000), keyUserWlNftNumber(addr), keyWlNftTotalStaked, MAX_WL_NFTS)
811- let actions = $t02169721887._1
812- let wlgClaimedAmount = $t02169721887._2
817+ let $t02213122321 = stakeNftInternal(addr, assetIdStr, (bonusByDescription(value(asset.description)) * 10000), keyUserWlNftNumber(addr), keyWlNftTotalStaked, MAX_WL_NFTS)
818+ let actions = $t02213122321._1
819+ let wlgClaimedAmount = $t02213122321._2
813820 $Tuple2(((prologActions ++ actions) :+ listAction), wlgClaimedAmount)
814821 }
815822 else if ((isArkimalIssued(asset) == ""))
816823 then throw("Only WavesLands and Arkimals NFT tokens are accepted")
817824 else {
818- let $t02206822219 = stakeNftInternal(addr, assetIdStr, ARK_NFT_BONUS, keyUserArkNftNumber(addr), keyArkNftTotalStaked, MAX_ARK_NFTS)
819- let actions = $t02206822219._1
820- let wlgClaimedAmount = $t02206822219._2
825+ let $t02250222653 = stakeNftInternal(addr, assetIdStr, ARK_NFT_BONUS, keyUserArkNftNumber(addr), keyArkNftTotalStaked, MAX_ARK_NFTS)
826+ let actions = $t02250222653._1
827+ let wlgClaimedAmount = $t02250222653._2
821828 $Tuple2(((prologActions ++ actions) :+ listAction), wlgClaimedAmount)
822829 }
823830 }
824831 }
825832 }
826833 }
827834
828835
829836
830837 @Callable(i)
831838 func unstakeNFT (assetIdStr) = {
832839 let prologActions = prolog(i)
833840 if ((size(i.payments) != 0))
834841 then throw("No payments required")
835842 else {
836843 let assetId = fromBase58String(assetIdStr)
837844 let addr = toString(i.caller)
838845 let asset = value(assetInfo(assetId))
839846 let timeKey = keyStakedTimeByAssetIdAndOwner(assetIdStr, addr)
840847 if (!(isDefined(getInteger(timeKey))))
841848 then throw((("NFT " + asset.name) + " is not staked by you"))
842849 else {
843850 let nftsKey = keyStakedNFTsByOwner(addr)
844851 let nfts = split_4C(valueOrElse(getString(nftsKey), ""), "_")
845852 let idx = indexOf(nfts, assetIdStr)
846853 if (!(isDefined(idx)))
847854 then throw(("Your staked NFTs don't contain " + assetIdStr))
848855 else {
849856 let listAction = if ((size(nfts) > 1))
850857 then StringEntry(nftsKey, makeString_2C(removeByIndex(nfts, value(idx)), "_"))
851858 else DeleteEntry(nftsKey)
852859 let isWL = (asset.issuer == this)
853860 if (isWL)
854861 then {
855862 let wlNftNumber = valueOrElse(getInteger(keyUserWlNftNumber(addr)), 0)
856863 let bonusVal = (bonusByDescription(value(asset.description)) * 10000)
857- let $t02338423463 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
858- let actions = $t02338423463._1
859- let wlgClaimedAmount = $t02338423463._2
864+ let $t02381823897 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
865+ let actions = $t02381823897._1
866+ let wlgClaimedAmount = $t02381823897._2
860867 $Tuple2(((((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber - 1))) :+ IntegerEntry(keyWlNftTotalStaked, max([0, (valueOrElse(getInteger(keyWlNftTotalStaked), 0) - 1)]))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
861868 }
862869 else {
863870 let arkimalName = isArkimalIssued(asset)
864871 if ((arkimalName == ""))
865872 then throw("Only WavesLands and Arkimals NFT tokens are accepted")
866873 else {
867874 let arkNftNumber = valueOrElse(getInteger(keyUserArkNftNumber(addr)), 0)
868- let $t02412324207 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
869- let actions = $t02412324207._1
870- let wlgClaimedAmount = $t02412324207._2
875+ let $t02455724641 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
876+ let actions = $t02455724641._1
877+ let wlgClaimedAmount = $t02455724641._2
871878 $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserArkNftNumber(addr), (arkNftNumber - 1))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
872879 }
873880 }
874881 }
875882 }
876883 }
877884 }
878885
879886
880887
881888 @Callable(i)
882889 func exchangeNFTs () = if ((i.caller != this))
883890 then throw("Temporarily disabled")
884891 else {
885892 let prologActions = prolog(i)
886893 if ((3 > size(i.payments)))
887- then throw("Min one USDT and 2 NFT payments allowed")
894+ then throw("Min one WLGOLD and 2 NFT payments allowed")
888895 else if ((size(i.payments) > 6))
889- then throw("Max one USDT and 5 NFT payments allowed")
896+ then throw("Max one WLGOLD and 5 NFT payments allowed")
890897 else {
891898 let addr = toString(i.caller)
892899 func addUp (acc,pmt) = {
893900 let assetId = valueOrErrorMessage(pmt.assetId, "WAVES payments not allowed")
894- if ((assetId == usdtAssetId))
901+ if ((assetId == wlgAssetId))
895902 then $Tuple3((acc._1 + pmt.amount), acc._2, acc._3)
896903 else {
897904 let asset = value(assetInfo(assetId))
898905 if ((asset.issuer != this))
899906 then throw("Only WL-issued NFTs allowed")
900907 else {
901- let bonusPerc = bonusByDescription(value(asset.description))
902- $Tuple3(acc._1, (acc._2 + bonusPerc), (acc._3 :+ Burn(assetId, 1)))
908+ let rarityIx = rarityIdxByDescriprion(value(asset.description))
909+ if (if ((acc._4 > 0))
910+ then (rarityIx != acc._4)
911+ else false)
912+ then throw("You can exchange only NFTs of the same rarity")
913+ else {
914+ let bonusPerc = bonusByDescription(value(asset.description))
915+ $Tuple4(acc._1, (acc._2 + bonusPerc), (acc._3 :+ Burn(assetId, 1)), rarityIx)
916+ }
903917 }
904918 }
905919 }
906920
907- let $t02543625515 = {
921+ let $t02616926384 = {
908922 let $l = i.payments
909923 let $s = size($l)
910- let $acc0 = $Tuple3(0, 0, nil)
924+ let $acc0 = $Tuple4(0, 0, nil, -1)
911925 func $f0_1 ($a,$i) = if (($i >= $s))
912926 then $a
913927 else addUp($a, $l[$i])
914928
915929 func $f0_2 ($a,$i) = if (($i >= $s))
916930 then $a
917931 else throw("List size exceeds 6")
918932
919933 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
920934 }
921- let usdtFee = $t02543625515._1
922- let totalBonus = $t02543625515._2
923- let burnActions = $t02543625515._3
924- let nftIndex = if ((totalBonus == 3))
925- then 2
926- else if ((totalBonus == 5))
927- then 3
928- else if ((totalBonus == 10))
929- then 4
930- else throw("Only bonuses of 3%, 5% or 10% are supported")
931- let change = (usdtFee - (totalBonus * MULT6))
935+ let wlgFee = $t02616926384._1
936+ let totalBonus = $t02616926384._2
937+ let burnActions = $t02616926384._3
938+ let rarityIdx = $t02616926384._4
939+ let newRarityIdx = if ((rarityIdx == idxRarityC))
940+ then if ((rarityThresholds[idxThresholdC] > totalBonus))
941+ then idxRarityC
942+ else if ((rarityThresholds[idxThresholdU] > totalBonus))
943+ then idxRarityU
944+ else throw((("You can advance only one level of rarity, max total bonus " + toString(rarityThresholds[idxThresholdU])) + "%"))
945+ else if ((rarityIdx == idxRarityU))
946+ then if ((rarityThresholds[idxThresholdU] > totalBonus))
947+ then idxRarityU
948+ else if ((rarityThresholds[idxThresholdL] > totalBonus))
949+ then idxRarityL
950+ else throw((("You can advance only one level of rarity, max total bonus " + toString(rarityThresholds[idxThresholdL])) + "%"))
951+ else if ((rarityIdx == idxRarityL))
952+ then if ((rarityThresholds[idxThresholdL] > totalBonus))
953+ then idxRarityL
954+ else idxRarityE
955+ else if ((rarityIdx == idxRarityE))
956+ then idxRarityE
957+ else if ((rarityIdx == idxRarityP))
958+ then throw("You can't exchange NFTs of this rarity")
959+ else throw("Unknown rarity")
960+ let minWlgFee = fraction(totalBonus, 100, getWlgPrice(0))
961+ let change = (wlgFee - minWlgFee)
962+ let forTeam = (minWlgFee / 2)
963+ let wlgRemain = asInt(invoke(wlgContract, "burnWlgold", [(minWlgFee - forTeam)], nil))
932964 if ((0 > change))
933- then throw((("You need to attach " + toString(totalBonus)) + " USDT as fee"))
965+ then throw((("You need to attach " + fixedPoint(minWlgFee, 8)) + " WLGOLD as fee"))
934966 else {
935967 let changeActions = if ((change > 0))
936- then [ScriptTransfer(i.caller, change, usdtAssetId)]
968+ then [ScriptTransfer(i.caller, change, wlgAssetId)]
937969 else nil
938- let $t02597226044 = issueNFTinternal(nftIndex, i.caller)
939- let issueNftActions = $t02597226044._1
940- let nftAssetId = $t02597226044._2
970+ let $t02791828079 = issueNftCustom(idxNamePickaxe, newRarityIdx, idxCollDig, newRarityIdx, totalBonus, idxDescrPickaxe, idxBonusTypeFp, i.caller)
971+ let issueNftActions = $t02791828079._1
972+ let nftAssetId = $t02791828079._2
941973 let burned = size(burnActions)
942974 let burnCounterActions = if ((burned == 0))
943975 then nil
944976 else [IntegerEntry(keyNftTotalBurned, (valueOrElse(getInteger(keyNftTotalBurned), 0) + burned))]
945- $Tuple2(((((issueNftActions ++ burnActions) ++ burnCounterActions) ++ prologActions) ++ changeActions), nftAssetId)
977+ $Tuple2((((((issueNftActions ++ burnActions) ++ burnCounterActions) ++ prologActions) ++ changeActions) :+ ScriptTransfer(addressFromStringValue(getStringValue(wlgContract, teamAddrKey)), forTeam, wlgAssetId)), $Tuple2(nftAssetId, wlgRemain))
946978 }
947979 }
948980 }
949981
950982
951983
952984 @Callable(i)
953985 func openNftChest () = if ((i.caller != this))
954986 then throw("Permission denied")
955987 else $Tuple2(nil, 0)
956988
957989

github/deemru/w8io/026f985 
116.72 ms