tx · Cggm3Lkf3Y9AgiA4uCGWXcCJVcG76mytEE7VFkBMMqzY

3MwFCBSWkWf9JMqmRyN5WEdoF2MCEPUB1Jx:  -0.02000000 Waves

2025.01.18 01:22 [3463705] smart account 3MwFCBSWkWf9JMqmRyN5WEdoF2MCEPUB1Jx > SELF 0.00000000 Waves

{ "type": 13, "id": "Cggm3Lkf3Y9AgiA4uCGWXcCJVcG76mytEE7VFkBMMqzY", "fee": 2000000, "feeAssetId": null, "timestamp": 1737152527189, "version": 2, "chainId": 84, "sender": "3MwFCBSWkWf9JMqmRyN5WEdoF2MCEPUB1Jx", "senderPublicKey": "BVdzAdt4eF9ScXGp5dwKiwoMQXBwMDeVSxLhL4LT1ceu", "proofs": [ "3222745pbmBAEPu8WNdXqnymQFGePhUA67PjyC3vj6UavJ8M2KqzBgRL1Fwb19go2cn38wgX7hKEKHvFgXaT5WRk" ], "script": "base64:BwJFCAISAwoBCBIECgIIARIDCgEIEgQKAggBEgMKAQgSBAoCCAESAwoBCBIECgIICBIAEgMKAQESAwoBCBIDCgEIEgQKAggBPgEJaXNUZXN0RW52AAQHdGVzdGVudgQHJG1hdGNoMAkAmwgCBQR0aGlzAgdURVNURU5WAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAXgFByRtYXRjaDAFAXgHBQd0ZXN0ZW52ARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJ0IAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQ10cnlHZXRCb29sZWFuAQNrZXkEByRtYXRjaDAJAKAIAQUDa2V5AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAFAWIHAQx0cnlHZXRTdHJpbmcBA2tleQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgUEdGhpcwUDa2V5AQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwECFHN0YXRpY19vcmFjbGVBZGRyZXNzAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAh5XQUk6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQBHnN0YXRpY0tleV90dXJ0bGVTdGFraW5nQWRkcmVzcwACG3N0YXRpY190dXJ0bGVTdGFraW5nQWRkcmVzcwEec3RhdGljS2V5X3R1cnRsZVJlYmlydGhBZGRyZXNzAAIbc3RhdGljX3R1cnRsZVJlYmlydGhBZGRyZXNzARVzdGF0aWNLZXlfcm9wZUFkZHJlc3MAAhJzdGF0aWNfcm9wZUFkZHJlc3MBHHN0YXRpY0tleV9sZXZlbFN5c3RlbUFkZHJlc3MAAhlzdGF0aWNfbGV2ZWxTeXN0ZW1BZGRyZXNzARZzdGF0aWNLZXlfc3BpY2VBc3NldElkAAITc3RhdGljX3NwaWNlQXNzZXRJZAEVc3RhdGljS2V5X21hcmtldHBsYWNlAAIZc3RhdGljX21hcmtldHBsYWNlQWRkcmVzcwEZc3RhdGljS2V5X2NhcGFjaXR5QWRkcmVzcwACFnN0YXRpY19jYXBhY2l0eUFkZHJlc3MBHHN0YXRpY0tleV92ZWdnRmFybWluZ0FkZHJlc3MAAhlzdGF0aWNfdmVnZ0Zhcm1pbmdBZGRyZXNzARZzdGF0aWNLZXlfaXRlbXNBZGRyZXNzAAITc3RhdGljX2l0ZW1zQWRkcmVzcwEec3RhdGljS2V5X211dGFudEZhcm1pbmdBZGRyZXNzAAIbc3RhdGljX211dGFudEZhcm1pbmdBZGRyZXNzAR5zdGF0aWNLZXlfY2FuaW5lQnJlZWRlckFkZHJlc3MAAhtzdGF0aWNfY2FuaW5lQnJlZWRlckFkZHJlc3MBHnN0YXRpY0tleV9mZWxpbmVCcmVlZGVyQWRkcmVzcwACG3N0YXRpY19mZWxpbmVCcmVlZGVyQWRkcmVzcwEec3RhdGljS2V5X3R1cnRsZUJyZWVkZXJBZGRyZXNzAAIbc3RhdGljX3R1cnRsZUJyZWVkZXJBZGRyZXNzAR1zdGF0aWNLZXlfZWFnbGVCcmVlZGVyQWRkcmVzcwACGXN0YXRpY19lYWdsQnJlZWRlckFkZHJlc3MBEWdldFJlYmlydGhBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhVzdGF0aWNfcmViaXJ0aEFkZHJlc3MBE2dldEluY3ViYXRvckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACF3N0YXRpY19pbmN1YmF0b3JBZGRyZXNzARFnZXRGYXJtaW5nQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIYc3RhdGljX2Zhcm1pbmdBZGRyZXNzTmV3ARJnZXRHYW1lRGFwcEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACFnN0YXRpY19nYW1lRGFwcEFkZHJlc3MBEmdldENhcGFjaXR5QWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGXN0YXRpY0tleV9jYXBhY2l0eUFkZHJlc3MAAQ5nZXRCdXJuQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAISc3RhdGljX2J1cm5BZGRyZXNzARJnZXRCYWJ5ZHVja0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACFnN0YXRpY19iYWJ5RHVja0FkZHJlc3MBEmdldEJyZWVkaW5nQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIVc3RhdGljX2JyZWVkZXJBZGRyZXNzARBnZXRNYXN0ZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhZzdGF0aWNfY2ZNYXN0ZXJBZGRyZXNzARdnZXRUdXJ0bGVTdGFraW5nQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHnN0YXRpY0tleV90dXJ0bGVTdGFraW5nQWRkcmVzcwABF2dldFR1cnRsZVJlYmlydGhBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEec3RhdGljS2V5X3R1cnRsZVJlYmlydGhBZGRyZXNzAAEOZ2V0Um9wZUFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARVzdGF0aWNLZXlfcm9wZUFkZHJlc3MAAQ9nZXRTcGljZUFzc2V0SWQACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEWc3RhdGljS2V5X3NwaWNlQXNzZXRJZAABFWdldExldmVsU3lzdGVtQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHHN0YXRpY0tleV9sZXZlbFN5c3RlbUFkZHJlc3MAARVnZXRNYXJrZXRQbGFjZUFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARVzdGF0aWNLZXlfbWFya2V0cGxhY2UAARVnZXRWZWdnRmFybWluZ0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARxzdGF0aWNLZXlfdmVnZ0Zhcm1pbmdBZGRyZXNzAAEPZ2V0SXRlbXNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEWc3RhdGljS2V5X2l0ZW1zQWRkcmVzcwABF2dldE11dGFudEZhcm1pbmdBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEec3RhdGljS2V5X211dGFudEZhcm1pbmdBZGRyZXNzAAEXZ2V0Q2FuaW5lRmFybWluZ0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACG3N0YXRpY19jYW5pbmVTdGFraW5nQWRkcmVzcwEXZ2V0RmVsaW5lRmFybWluZ0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACG3N0YXRpY19mZWxpbmVTdGFraW5nQWRkcmVzcwEWZ2V0RWFnbGVGYXJtaW5nQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIZc3RhdGljX2VhZ2xTdGFraW5nQWRkcmVzcwEXZ2V0Q2FuaW5lQnJlZWRlckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJAR5zdGF0aWNLZXlfY2FuaW5lQnJlZWRlckFkZHJlc3MAARdnZXRGZWxpbmVCcmVlZGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHnN0YXRpY0tleV9mZWxpbmVCcmVlZGVyQWRkcmVzcwABF2dldFR1cnRsZUJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEec3RhdGljS2V5X3R1cnRsZUJyZWVkZXJBZGRyZXNzAAEWZ2V0RWFnbGVCcmVlZGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHXN0YXRpY0tleV9lYWdsZUJyZWVkZXJBZGRyZXNzAAAId0FjY1BLZXkJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQlnZXRPcmFjbGUAAg9zdGF0aWNfd2Fyc1BLZXkCG3N0YXRpY193YXJzUEtleSBub3QgZGVmaW5lZAAPc2NDYW5Vc2VDb3Vwb25zCQDMCAIJARFnZXRSZWJpcnRoQWRkcmVzcwAJAMwIAgkBE2dldEluY3ViYXRvckFkZHJlc3MACQDMCAIJARFnZXRGYXJtaW5nQWRkcmVzcwAJAMwIAgkBEmdldEdhbWVEYXBwQWRkcmVzcwAJAMwIAgkBEmdldEJhYnlkdWNrQWRkcmVzcwAJAMwIAgkBEmdldEJyZWVkaW5nQWRkcmVzcwAJAMwIAgkBF2dldFR1cnRsZVN0YWtpbmdBZGRyZXNzAAkAzAgCCQEXZ2V0VHVydGxlUmViaXJ0aEFkZHJlc3MACQDMCAIJAQ5nZXRSb3BlQWRkcmVzcwAJAMwIAgkBFWdldExldmVsU3lzdGVtQWRkcmVzcwAJAMwIAgkBFWdldE1hcmtldFBsYWNlQWRkcmVzcwAJAMwIAgkBEmdldENhcGFjaXR5QWRkcmVzcwAJAMwIAgkBF2dldE11dGFudEZhcm1pbmdBZGRyZXNzAAkAzAgCCQEXZ2V0Q2FuaW5lRmFybWluZ0FkZHJlc3MACQDMCAIJARdnZXRGZWxpbmVGYXJtaW5nQWRkcmVzcwAJAMwIAgkBFmdldEVhZ2xlQnJlZWRlckFkZHJlc3MACQDMCAIJARdnZXRDYW5pbmVCcmVlZGVyQWRkcmVzcwAJAMwIAgkBF2dldEZlbGluZUJyZWVkZXJBZGRyZXNzAAkAzAgCCQEXZ2V0VHVydGxlQnJlZWRlckFkZHJlc3MACQDMCAIJARZnZXRFYWdsZUZhcm1pbmdBZGRyZXNzAAkAzAgCBQR0aGlzBQNuaWwBEGNvdXBvbnNVc2VyU3BlbmQBBHVzZXIJAKwCAgUEdXNlcgIGX3NwZW5kARFjb3Vwb25zVXNlckFjdGl2ZQEEdXNlcgkArAICBQR1c2VyAgdfYWN0aXZlARRjb3Vwb25zVXNlckFjdGl2ZU9sZAEEdXNlcgkArAICCQERY291cG9uc1VzZXJBY3RpdmUBBQR1c2VyAgRfb2xkARBjb3Vwb25zU3BlbmRPblNjAQJzYwkArAICBQJzYwIPX3NwZW5kX2J5X3VzaW5nAR1hY3Rpb25QZXJBZGRyZXNzUGVyVXNlclBlckRheQQEdXNlcgZhY3Rpb24LZGFwcEFkZHJlc3MDZGF5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFC2RhcHBBZGRyZXNzAgFfBQZhY3Rpb24CAV8FBHVzZXICAV8FA2RheQIIX2FjdGlvbnMBI2FjdGlvblBlckFkZHJlc3NQZXJVc2VyTGFzdENoZWNrRGF5AgR1c2VyBmFjdGlvbgkArAICCQCsAgIJAKwCAgUGYWN0aW9uAgFfBQR1c2VyAhJfYWN0aW9uc19jaGVja19kYXkBI2FjdGlvblBlckFkZHJlc3NQZXJVc2VyQW1vdW50SW5BUm93AgR1c2VyBmFjdGlvbgkArAICCQCsAgIJAKwCAgUGYWN0aW9uAgFfBQR1c2VyAhZfYWN0aW9uc19hbW91bnRfaW5fcm93AQ51c2VyRXhwZXJpZW5jZQEEdXNlcgkArAICBQR1c2VyAgtfZXhwZXJpZW5jZQESYWRkQ291cG9uc0ludGVybmFsAgR1c2VyBmFtb3VudAQGa2V5T2xkCQEUY291cG9uc1VzZXJBY3RpdmVPbGQBBQR1c2VyBANrZXkJARFjb3Vwb25zVXNlckFjdGl2ZQEFBHVzZXIECmNvdXBvbnNPbGQJAQ10cnlHZXRJbnRlZ2VyAQUDa2V5BAdjb3Vwb25zCQBkAgUKY291cG9uc09sZAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQZrZXlPbGQFCmNvdXBvbnNPbGQJAMwIAgkBDEludGVnZXJFbnRyeQIFA2tleQUHY291cG9ucwUDbmlsAAlzdGFydFRzTXMAgIjY+qsxARdjYWxjdWxhdGVEYXlzU2luY2VTdGFydAAEBGRpZmYJAGUCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUJc3RhcnRUc01zBApkYXlzUGFzc2VkCQBpAgUEZGlmZgkAaAIAgKMFAOgHBQpkYXlzUGFzc2VkARBoYXNEb25lVGFzazdEYXlzBQNkYXkHYWRkcmVzcwphY3Rpb25OYW1lDHJld2FyZEFtb3VudBJyZXdhcmRBbW91bnRXZWVrbHkEEXVzZXJFeHBlcmllbmNlS2V5CQEOdXNlckV4cGVyaWVuY2UBBQdhZGRyZXNzBA91c2VyRXhwVGlsbGRhdGUJAQ10cnlHZXRJbnRlZ2VyAQURdXNlckV4cGVyaWVuY2VLZXkEC2NoZWNrRGF5S2V5CQEjYWN0aW9uUGVyQWRkcmVzc1BlclVzZXJMYXN0Q2hlY2tEYXkCBQdhZGRyZXNzBQphY3Rpb25OYW1lBAxkYXlzSW5Sb3dLZXkJASNhY3Rpb25QZXJBZGRyZXNzUGVyVXNlckFtb3VudEluQVJvdwIFB2FkZHJlc3MFCmFjdGlvbk5hbWUEDGxhc3RDaGVja0RheQkBDXRyeUdldEludGVnZXIBBQtjaGVja0RheUtleQQJZGF5c0luUm93CQENdHJ5R2V0SW50ZWdlcgEFDGRheXNJblJvd0tleQQPZGF5c0luUm93VXBkYXRlAwkAAAIFDGxhc3RDaGVja0RheQkAZQIFA2RheQABCQBkAgUJZGF5c0luUm93AAEDCQBmAgkAZQIFA2RheQABBQxsYXN0Q2hlY2tEYXkAAQAABBJsYXN0Q2hlY2tEYXlVcGRhdGUFA2RheQQGcmV3YXJkAwkAAAIFD2RheXNJblJvd1VwZGF0ZQAHCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB2FkZHJlc3MFEnJld2FyZEFtb3VudFdlZWtseQkBD2dldFNwaWNlQXNzZXRJZAAJAMwIAgkBDEludGVnZXJFbnRyeQIFDGRheXNJblJvd0tleQAABQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFDGRheXNJblJvd0tleQUPZGF5c0luUm93VXBkYXRlBQNuaWwJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgULY2hlY2tEYXlLZXkFEmxhc3RDaGVja0RheVVwZGF0ZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQdhZGRyZXNzBQxyZXdhcmRBbW91bnQJAQ9nZXRTcGljZUFzc2V0SWQACQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF1c2VyRXhwZXJpZW5jZUtleQkAZAIFD3VzZXJFeHBUaWxsZGF0ZQABBQNuaWwFBnJld2FyZAEJcGF5QWN0aW9uBAphY3Rpb25OYW1lC3VzZXJBZGRyZXNzBmFtb3VudANkYXkEC2NvbXBvc2VkS2V5AwkBDXRyeUdldEJvb2xlYW4BCQCsAgIJAKwCAgIFVEFTS18FCmFjdGlvbk5hbWUCBl9FVkVSWQUKYWN0aW9uTmFtZQkArAICCQCsAgIFCmFjdGlvbk5hbWUCAV8JAKQDAQUGYW1vdW50AwkBDXRyeUdldEJvb2xlYW4BCQCsAgICBVRBU0tfBQtjb21wb3NlZEtleQkBEGhhc0RvbmVUYXNrN0RheXMFBQNkYXkJAKUIAQULdXNlckFkZHJlc3MFC2NvbXBvc2VkS2V5CQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgVUQVNLXwULY29tcG9zZWRLZXkCDV9SRVdBUkRfREFJTFkJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICBVRBU0tfBQtjb21wb3NlZEtleQIOX1JFV0FSRF9XRUVLTFkFA25pbAEUcmVjb3JkQWN0aW9uSW50ZXJuYWwDCmFjdGlvbk5hbWUNYWRkcmVzc0NhbGxlcgdhZGRyZXNzAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUPc2NDYW5Vc2VDb3Vwb25zBQ1hZGRyZXNzQ2FsbGVyCQACAQI9Q1JBOiBPbmx5IGNlcnRhaW4gc21hcnQgY29udHJhY3RzIGNhbiB1c2UgdGhpcyByZXdhcmQgbW9kdWxlIQQDZGF5CQEXY2FsY3VsYXRlRGF5c1NpbmNlU3RhcnQABAlhY3Rpb25LZXkJAR1hY3Rpb25QZXJBZGRyZXNzUGVyVXNlclBlckRheQQJAKUIAQUHYWRkcmVzcwUKYWN0aW9uTmFtZQkApQgBBQ1hZGRyZXNzQ2FsbGVyCQCkAwEFA2RheQQMdG90YWxBY3Rpb25zCQBkAgkBDXRyeUdldEludGVnZXIBBQlhY3Rpb25LZXkAAQkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlhY3Rpb25LZXkFDHRvdGFsQWN0aW9ucwUDbmlsCQEJcGF5QWN0aW9uBAUKYWN0aW9uTmFtZQUHYWRkcmVzcwUMdG90YWxBY3Rpb25zBQNkYXkNAWkBD2NvbmZpZ3VyZU9yYWNsZQEGb3JhY2xlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIPQ0NPOiBhZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQICFHN0YXRpY19vcmFjbGVBZGRyZXNzBQZvcmFjbGUFA25pbAFpAQphZGRDb3Vwb25zAgR1c2VyBmFtb3VudAMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAQIhPQIIBQFpD2NhbGxlclB1YmxpY0tleQUId0FjY1BLZXkHCQACAQIPQ0FDOiBhZG1pbiBvbmx5AwkAZwIFBmFtb3VudACAreIECQDOCAIJARRyZWNvcmRBY3Rpb25JbnRlcm5hbAMCDFZFR0cxMDAwMDAwMAUEdGhpcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUEdXNlcgkBEmFkZENvdXBvbnNJbnRlcm5hbAIFBHVzZXIFBmFtb3VudAMJAGcCBQZhbW91bnQAoMIeCQDOCAIJARRyZWNvcmRBY3Rpb25JbnRlcm5hbAMCClZFR0c1MDAwMDAFBHRoaXMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHVzZXIJARJhZGRDb3Vwb25zSW50ZXJuYWwCBQR1c2VyBQZhbW91bnQJARJhZGRDb3Vwb25zSW50ZXJuYWwCBQR1c2VyBQZhbW91bnQBaQEMcmVzZXRDaGVhdGVyAQR1c2VyAwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkBAiE9AggFAWkPY2FsbGVyUHVibGljS2V5BQh3QWNjUEtleQcJAAIBAg9DQUM6IGFkbWluIG9ubHkEBmtleU9sZAkBFGNvdXBvbnNVc2VyQWN0aXZlT2xkAQUEdXNlcgQDa2V5CQERY291cG9uc1VzZXJBY3RpdmUBBQR1c2VyBApjb3Vwb25zT2xkCQENdHJ5R2V0SW50ZWdlcgEFA2tleQQHY291cG9ucwCAvqjQ//////8BCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQZrZXlPbGQFCmNvdXBvbnNPbGQJAMwIAgkBDEludGVnZXJFbnRyeQIFA2tleQUHY291cG9ucwUDbmlsAWkBEWFkZENvdXBvbnNGYXJtaW5nAgR1c2VyBmFtb3VudAMDCQECIT0CCAUBaQZjYWxsZXIJARVnZXRWZWdnRmFybWluZ0FkZHJlc3MACQECIT0CCAUBaQZjYWxsZXIJARdnZXRNdXRhbnRGYXJtaW5nQWRkcmVzcwAHCQACAQIbTWV0aG9kIG9ubHkgZm9yIGZhcm1pbmcgc2MhCQESYWRkQ291cG9uc0ludGVybmFsAgUEdXNlcgUGYW1vdW50AWkBD2FkZENvdXBvbnNCYXRjaAEFYmF0Y2gDAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQECIT0CCAUBaQ9jYWxsZXJQdWJsaWNLZXkFCHdBY2NQS2V5BwkAAgECD0NBQzogYWRtaW4gb25seQQLY291cG9uc0xpc3QJALUJAgUFYmF0Y2gCATsKAQxoYW5kbGVDb3Vwb24CA2FjYwZjb3Vwb24ECnNwbGl0QXJyYXkJALUJAgUGY291cG9uAgE6BAR1c2VyCQCRAwIFCnNwbGl0QXJyYXkAAAQGYW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKc3BsaXRBcnJheQABBAhidXJuQ2FsbAkA/AcECQEOZ2V0QnVybkFkZHJlc3MAAgxidXJuQnlJbnZva2UJAMwIAgUGYW1vdW50BQNuaWwFA25pbAMJAAACBQhidXJuQ2FsbAUIYnVybkNhbGwDCQBnAgUGYW1vdW50AICt4gQJAM4IAgkAzggCBQNhY2MJARRyZWNvcmRBY3Rpb25JbnRlcm5hbAMCDFZFR0cxMDAwMDAwMAUEdGhpcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUEdXNlcgkBEmFkZENvdXBvbnNJbnRlcm5hbAIFBHVzZXIFBmFtb3VudAMJAGcCBQZhbW91bnQAoMIeCQDOCAIJAM4IAgUDYWNjCQEUcmVjb3JkQWN0aW9uSW50ZXJuYWwDAgpWRUdHNTAwMDAwBQR0aGlzCQERQGV4dHJOYXRpdmUoMTA2MikBBQR1c2VyCQESYWRkQ291cG9uc0ludGVybmFsAgUEdXNlcgUGYW1vdW50CQDOCAIFA2FjYwkBEmFkZENvdXBvbnNJbnRlcm5hbAIFBHVzZXIFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgoAAiRsBQtjb3Vwb25zTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMaGFuZGxlQ291cG9uAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQBaQEIQ0ZSZWZ1bmQCCXJlY2lwaWVudAZhbW91bnQECWNmQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNTMpAggFAWkGY2FsbGVyAgpDRl9BRERSRVNTBANrZXkJAKwCAgkArAICAgJmXwUJY2ZBZGRyZXNzAg5fc3Rha2VfYWRkcmVzcwQMc3Rha2VBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA1MykCCQEQZ2V0TWFzdGVyQWRkcmVzcwAFA2tleQMJAQIhPQIFDHN0YWtlQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJAAIBAiZDQ1I6IFRoaXMgaXMgc29tZXRoaW5nIGZpc2h5IGdvaW5nIG9uIQkBEmFkZENvdXBvbnNJbnRlcm5hbAIFCXJlY2lwaWVudAUGYW1vdW50AWkBDnF1ZXN0T25lUGV0TmZ0AQdhc3NldElkBAdpbnZva2VyCQClCAEIBQFpBmNhbGxlcgQEdHlwZQMJAAACCAkBBXZhbHVlAQkA7AcBCQDZBAEFB2Fzc2V0SWQGaXNzdWVyCQESZ2V0QnJlZWRpbmdBZGRyZXNzAAIERFVDSwMJAAACCAkBBXZhbHVlAQkA7AcBCQDZBAEFB2Fzc2V0SWQGaXNzdWVyCQEXZ2V0Q2FuaW5lQnJlZWRlckFkZHJlc3MAAgZDQU5JTkUDCQAAAggJAQV2YWx1ZQEJAOwHAQkA2QQBBQdhc3NldElkBmlzc3VlcgkBF2dldEZlbGluZUJyZWVkZXJBZGRyZXNzAAIGRkVMSU5FAwkAAAIICQEFdmFsdWUBCQDsBwEJANkEAQUHYXNzZXRJZAZpc3N1ZXIJARdnZXRUdXJ0bGVCcmVlZGVyQWRkcmVzcwACBlRVUlRMRQkAAgECEFVuc3VwcG9ydGVkIE5GVCEECmludm9rZWRLZXkJAKwCAgkArAICCQCsAgIJAKwCAgIDcTFfBQR0eXBlAgFfBQdpbnZva2VyAghfaW52b2tlZAQTYW1vdW50TmZ0SW52b2tlZEtleQkArAICCQCsAgICA3ExXwUHYXNzZXRJZAIPX2Ftb3VudF9pbnZva2VkBBF0eXBlc0NvbXBsZXRlZEtleQkArAICCQCsAgICA3ExXwUHaW52b2tlcgIKX2NvbXBsZXRlZAQLdG90YWxQZXRLZXkCCHExX3RvdGFsAwkBDXRyeUdldEJvb2xlYW4BBQppbnZva2VkS2V5CQACAQIeWW91IGFscmVhZHkgaW52b2tlZCB0aGlzIHR5cGUhCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCmludm9rZWRLZXkGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNhbW91bnROZnRJbnZva2VkS2V5CQBkAgkBDXRyeUdldEludGVnZXIBBRNhbW91bnROZnRJbnZva2VkS2V5AAEJAMwIAgkBDEludGVnZXJFbnRyeQIFEXR5cGVzQ29tcGxldGVkS2V5CQBkAgkBDXRyeUdldEludGVnZXIBBRF0eXBlc0NvbXBsZXRlZEtleQABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQt0b3RhbFBldEtleQkAZAIJAQ10cnlHZXRJbnRlZ2VyAQULdG90YWxQZXRLZXkAAQUDbmlsCQESYWRkQ291cG9uc0ludGVybmFsAgkApQgBCAUBaQZjYWxsZXIAgI7OHAFpARJxdWVzdFR3b0J1eVBlcmNoZXMCBHR5cGUFY29sb3IEB2ludm9rZXIJAKUIAQgFAWkGY2FsbGVyBBF0eXBlc0NvbXBsZXRlZEtleQkArAICCQCsAgICA3ExXwUHaW52b2tlcgIKX2NvbXBsZXRlZAMJAGYCAAQJAQ10cnlHZXRJbnRlZ2VyAQURdHlwZXNDb21wbGV0ZWRLZXkJAAIBAiVZb3UgbmVlZCB0byBjb21wbGV0ZSB0aGUgZmlyc3QgcXVlc3QhBAZtZXRob2QDCQAAAgUEdHlwZQIGVFVSVExFAgxhZGRGcmVlQmVhY2gCDGFkZEZyZWVQZXJjaAQJaW52b2tlUmVzCQEFYXNJbnQBCQD8BwQFBHRoaXMCCnVzZUNvdXBvbnMJAMwIAgCA4esXBQNuaWwFA25pbAMJAAACBQlpbnZva2VSZXMFCWludm9rZVJlcwMJAQIhPQIFCWludm9rZVJlcwAACQACAQImTm90IGVub3VnaCB2RUdHIHRvIGNvbXBsZXQgdGhpcyBxdWVzdCEEDWludm9rZUFkZHJlc3MDCQAAAgUEdHlwZQIGVFVSVExFCQEXZ2V0VHVydGxlU3Rha2luZ0FkZHJlc3MAAwkAAAIFBHR5cGUCBkNBTklORQkBF2dldENhbmluZUZhcm1pbmdBZGRyZXNzAAMJAAACBQR0eXBlAgZGRUxJTkUJARdnZXRGZWxpbmVGYXJtaW5nQWRkcmVzcwADCQAAAgUEdHlwZQIERFVDSwkBEmdldEJyZWVkaW5nQWRkcmVzcwAJAAIBAhFVbnN1cHBvcnRlZCB0eXBlIQQKaW52b2tlUmVzMgkA/AcEBQ1pbnZva2VBZGRyZXNzBQZtZXRob2QJAMwIAgUHaW52b2tlcgkAzAgCBQVjb2xvcgUDbmlsBQNuaWwECmludm9rZWRLZXkJAKwCAgkArAICCQCsAgIJAKwCAgIDcTJfBQR0eXBlAgFfBQdpbnZva2VyAghfaW52b2tlZAQTYW1vdW50TmZ0SW52b2tlZEtleQkArAICCQCsAgICA3EyXwUEdHlwZQIPX2Ftb3VudF9pbnZva2VkBBN0eXBlc1EyQ29tcGxldGVkS2V5CQCsAgIJAKwCAgIDcTJfBQdpbnZva2VyAgpfY29tcGxldGVkBAp0b3RhbFEyS2V5AghxMl90b3RhbAMJAQ10cnlHZXRCb29sZWFuAQUKaW52b2tlZEtleQkAAgECHllvdSBhbHJlYWR5IGludm9rZWQgdGhpcyB0eXBlIQkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCBQppbnZva2VkS2V5BgkAzAgCCQEMSW50ZWdlckVudHJ5AgUTYW1vdW50TmZ0SW52b2tlZEtleQkAZAIJAQ10cnlHZXRJbnRlZ2VyAQUTYW1vdW50TmZ0SW52b2tlZEtleQABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRN0eXBlc1EyQ29tcGxldGVkS2V5CQBkAgkBDXRyeUdldEludGVnZXIBBRN0eXBlc1EyQ29tcGxldGVkS2V5AAEJAMwIAgkBDEludGVnZXJFbnRyeQIFCnRvdGFsUTJLZXkJAGQCCQENdHJ5R2V0SW50ZWdlcgEFCnRvdGFsUTJLZXkAAQUDbmlsCQESYWRkQ291cG9uc0ludGVybmFsAgkApQgBCAUBaQZjYWxsZXIAgNrECQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpxdWVzdFRocmVlAAQHaW52b2tlcgkApQgBCAUBaQZjYWxsZXIEEXR5cGVzQ29tcGxldGVkS2V5CQCsAgIJAKwCAgIDcTFfBQdpbnZva2VyAgpfY29tcGxldGVkAwkAZgIABAkBDXRyeUdldEludGVnZXIBBRF0eXBlc0NvbXBsZXRlZEtleQkAAgECJVlvdSBuZWVkIHRvIGNvbXBsZXRlIHRoZSBmaXJzdCBxdWVzdCEECmludm9rZVJlczEJAQVhc0ludAEJAPwHBAUEdGhpcwIKdXNlQ291cG9ucwkAzAgCAIDC1y8FA25pbAUDbmlsAwkAAAIFCmludm9rZVJlczEFCmludm9rZVJlczEDCQECIT0CBQppbnZva2VSZXMxAAAJAAIBAiZOb3QgZW5vdWdoIHZFR0cgdG8gY29tcGxldCB0aGlzIHF1ZXN0IQQJaW52b2tlS2V5CQCsAgIJAKwCAgIDcTNfBQdpbnZva2VyAghfaW52b2tlZAQKdG90YWxRM0tleQIIcTNfdG90YWwDCQENdHJ5R2V0Qm9vbGVhbgEFCWludm9rZUtleQkAAgECHllvdSBhbHJlYWR5IGludm9rZWQgdGhpcyB0eXBlIQQKaW52b2tlUmVzMgkA/AcECQESZ2V0QmFieWR1Y2tBZGRyZXNzAAIRaXNzdWVGcmVlRHVja2xpbmcJAMwIAgUHaW52b2tlcgkAzAgCCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJAMwIAgAUBQNuaWwFA25pbAMJAAACBQppbnZva2VSZXMyBQppbnZva2VSZXMyCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCWludm9rZUtleQYJAMwIAgkBDEludGVnZXJFbnRyeQIFCnRvdGFsUTNLZXkJAGQCCQENdHJ5R2V0SW50ZWdlcgEFCnRvdGFsUTNLZXkAAQUDbmlsCQESYWRkQ291cG9uc0ludGVybmFsAgkApQgBCAUBaQZjYWxsZXIAgO+5NAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQp1c2VDb3Vwb25zARFhbW91bnRUcnlpbmdUb1BheQQKaW52b2tpbmdTYwgFAWkGY2FsbGVyAwkAZgIAAAURYW1vdW50VHJ5aW5nVG9QYXkJAAIBAi9DVUM6IE9ubHkgcG9zaXRpdmUgYW1vdW50IG9mIG1vbmV5IGNhbiBiZSBwYWlkIQMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFD3NjQ2FuVXNlQ291cG9ucwUKaW52b2tpbmdTYwkAAgECPUNVQzogT25seSBjZXJ0YWluIHNtYXJ0IGNvbnRyYWN0cyBjYW4gdXNlIHRoaXMgY291cG9uIG1vZHVsZSEEBHVzZXIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAlrZXlBY3RpdmUJARFjb3Vwb25zVXNlckFjdGl2ZQEFBHVzZXIEEGF2YWlsYWJsZUNvdXBvbnMJAQ10cnlHZXRJbnRlZ2VyAQUJa2V5QWN0aXZlAwkAZgIAAAUQYXZhaWxhYmxlQ291cG9ucwkAAgECDkNVQzogR2V0IHJla3QhBAlsZWZ0VG9QYXkDCQBmAgURYW1vdW50VHJ5aW5nVG9QYXkFEGF2YWlsYWJsZUNvdXBvbnMJAGUCBRFhbW91bnRUcnlpbmdUb1BheQUQYXZhaWxhYmxlQ291cG9ucwAABAphbW91bnRQYWlkCQBlAgURYW1vdW50VHJ5aW5nVG9QYXkFCWxlZnRUb1BheQQUYXZhaWxhYmxlQ291cG9uc0xlZnQJAGUCBRBhdmFpbGFibGVDb3Vwb25zBQphbW91bnRQYWlkAwkAZgIAAAUUYXZhaWxhYmxlQ291cG9uc0xlZnQJAAIBAhpDVUM6IFlvdSB0cnkgdG8gb3ZlcnNwZW5kIQQIa2V5U3BlbmQJARBjb3Vwb25zVXNlclNwZW5kAQUEdXNlcgQGa2V5T2xkCQEUY291cG9uc1VzZXJBY3RpdmVPbGQBBQR1c2VyBAprZXlTcGVuZFNjCQEQY291cG9uc1NwZW5kT25TYwEJAKUIAQgFAWkGY2FsbGVyBAV0b3BVcAkA/AcECQEVZ2V0VmVnZ0Zhcm1pbmdBZGRyZXNzAAILdG9wVXBSZXdhcmQJAMwIAgkAaAIJAGkCBQphbW91bnRQYWlkAGQAGQUDbmlsBQNuaWwDCQAAAgUFdG9wVXAFBXRvcFVwBAZ0b3BVcDIDCQAAAgUKaW52b2tpbmdTYwkBF2dldE11dGFudEZhcm1pbmdBZGRyZXNzAAUEdW5pdAkA/AcECQEXZ2V0TXV0YW50RmFybWluZ0FkZHJlc3MAAgt0b3BVcFJld2FyZAkAzAgCAgRWRUdHCQDMCAIJAGgCCQBpAgUKYW1vdW50UGFpZABkAA8FA25pbAUDbmlsAwkAAAIFBnRvcFVwMgUGdG9wVXAyBAp0b3RhbFNwZW5kCQBkAgkBDXRyeUdldEludGVnZXIBBQhrZXlTcGVuZAUKYW1vdW50UGFpZAQMdG90YWxTcGVuZFNjCQBkAgkBDXRyeUdldEludGVnZXIBBQprZXlTcGVuZFNjBQphbW91bnRQYWlkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFCGtleVNwZW5kBQp0b3RhbFNwZW5kCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQZrZXlPbGQFEGF2YWlsYWJsZUNvdXBvbnMJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtleUFjdGl2ZQUUYXZhaWxhYmxlQ291cG9uc0xlZnQJAMwIAgkBDEludGVnZXJFbnRyeQIFCmtleVNwZW5kU2MFDHRvdGFsU3BlbmRTYwUDbmlsBQphbW91bnRQYWlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHJlY29yZEFjdGlvbgEKYWN0aW9uTmFtZQkBFHJlY29yZEFjdGlvbkludGVybmFsAwUKYWN0aW9uTmFtZQgFAWkGY2FsbGVyCAUBaQxvcmlnaW5DYWxsZXIBaQELaW5jcmVhc2VFeHABB2FkZHJlc3MDCQECIT0CCAUBaQZjYWxsZXIJAQ9nZXRJdGVtc0FkZHJlc3MABQNuaWwEEXVzZXJFeHBlcmllbmNlS2V5CQEOdXNlckV4cGVyaWVuY2UBBQdhZGRyZXNzBA91c2VyRXhwVGlsbGRhdGUJAQ10cnlHZXRJbnRlZ2VyAQURdXNlckV4cGVyaWVuY2VLZXkJAMwIAgkBDEludGVnZXJFbnRyeQIFEXVzZXJFeHBlcmllbmNlS2V5CQBkAgUPdXNlckV4cFRpbGxkYXRlAAEFA25pbAFpARJpbmNyZWFzZUV4cERlZmluZWQCB2FkZHJlc3MGYW1vdW50AwkBAiE9AggFAWkGY2FsbGVyCQEPZ2V0SXRlbXNBZGRyZXNzAAUDbmlsBBF1c2VyRXhwZXJpZW5jZUtleQkBDnVzZXJFeHBlcmllbmNlAQUHYWRkcmVzcwQPdXNlckV4cFRpbGxkYXRlCQENdHJ5R2V0SW50ZWdlcgEFEXVzZXJFeHBlcmllbmNlS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF1c2VyRXhwZXJpZW5jZUtleQkAZAIFD3VzZXJFeHBUaWxsZGF0ZQUGYW1vdW50BQNuaWwBAnR4AQZ2ZXJpZnkAAwkBCWlzVGVzdEVudgAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECWZpcnN0VXNlcgEgURzk/Wb/EmnS8VoUnzuy4vQ7f8HLaCeiNF5sONdX3W0ECnNlY29uZFVzZXIBIFxyDkuu8SFPZuYZRfpqorHtsTYpWV8ZzMyw4U1BiGp9BAl0aGlyZFVzZXIBIKCvkeUteUNhYTISrY65+hhZUZ0tU0k2w9Cj96hgGTtOBA9maXJzdFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJZmlyc3RVc2VyAAEAAAQQc2Vjb25kVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCnNlY29uZFVzZXIAAQAABA90aGlyZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJdGhpcmRVc2VyAAEAAAQPc2lnbmF0dXJlc0NvdW50CQBkAgkAZAIFD2ZpcnN0VXNlclNpZ25lZAUQc2Vjb25kVXNlclNpZ25lZAUPdGhpcmRVc2VyU2lnbmVkBAckbWF0Y2gwBQJ0eAkAZwIFD3NpZ25hdHVyZXNDb3VudAAB+CI2wA==", "height": 3463705, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9jacSvFrYPxq4Uw785yMCqwxzAJP6NRCbUzpShJa2amf Next: 3T6MXhcZBsbS1fvshcTmh7B3woWdLfkNFzBz4EykeWsG Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func isTestEnv () = {
4242 func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
4343
4444
45+func asInt (value) = match value {
46+ case int: Int =>
47+ int
48+ case _ =>
49+ throw("WAI: wrong type, expected: Int")
50+}
51+
52+
4553 func staticKey_turtleStakingAddress () = "static_turtleStakingAddress"
4654
4755
7987
8088
8189 func staticKey_turtleBreederAddress () = "static_turtleBreederAddress"
90+
91+
92+func staticKey_eagleBreederAddress () = "static_eaglBreederAddress"
8293
8394
8495 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
141152 func getFelineFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_felineStakingAddress")))
142153
143154
155+func getEagleFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_eaglStakingAddress")))
156+
157+
144158 func getCanineBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_canineBreederAddress())))
145159
146160
150164 func getTurtleBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleBreederAddress())))
151165
152166
167+func getEagleBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_eagleBreederAddress())))
168+
169+
153170 let wAccPKey = fromBase58String(valueOrErrorMessage(getString(getOracle(), "static_warsPKey"), "static_warsPKey not defined"))
154171
155-let scCanUseCoupons = [getRebirthAddress(), getIncubatorAddress(), getFarmingAddress(), getGameDappAddress(), getBabyduckAddress(), getBreedingAddress(), getTurtleStakingAddress(), getTurtleRebirthAddress(), getRopeAddress(), getLevelSystemAddress(), getMarketPlaceAddress(), getCapacityAddress(), getMutantFarmingAddress(), getCanineFarmingAddress(), getFelineFarmingAddress(), getCanineBreederAddress(), getFelineBreederAddress(), getTurtleBreederAddress(), this]
172+let scCanUseCoupons = [getRebirthAddress(), getIncubatorAddress(), getFarmingAddress(), getGameDappAddress(), getBabyduckAddress(), getBreedingAddress(), getTurtleStakingAddress(), getTurtleRebirthAddress(), getRopeAddress(), getLevelSystemAddress(), getMarketPlaceAddress(), getCapacityAddress(), getMutantFarmingAddress(), getCanineFarmingAddress(), getFelineFarmingAddress(), getEagleBreederAddress(), getCanineBreederAddress(), getFelineBreederAddress(), getTurtleBreederAddress(), getEagleFarmingAddress(), this]
156173
157174 func couponsUserSpend (user) = (user + "_spend")
158175
330347
331348
332349 @Callable(i)
350+func questOnePetNft (assetId) = {
351+ let invoker = toString(i.caller)
352+ let type = if ((value(assetInfo(fromBase58String(assetId))).issuer == getBreedingAddress()))
353+ then "DUCK"
354+ else if ((value(assetInfo(fromBase58String(assetId))).issuer == getCanineBreederAddress()))
355+ then "CANINE"
356+ else if ((value(assetInfo(fromBase58String(assetId))).issuer == getFelineBreederAddress()))
357+ then "FELINE"
358+ else if ((value(assetInfo(fromBase58String(assetId))).issuer == getTurtleBreederAddress()))
359+ then "TURTLE"
360+ else throw("Unsupported NFT!")
361+ let invokedKey = (((("q1_" + type) + "_") + invoker) + "_invoked")
362+ let amountNftInvokedKey = (("q1_" + assetId) + "_amount_invoked")
363+ let typesCompletedKey = (("q1_" + invoker) + "_completed")
364+ let totalPetKey = "q1_total"
365+ if (tryGetBoolean(invokedKey))
366+ then throw("You already invoked this type!")
367+ else ([BooleanEntry(invokedKey, true), IntegerEntry(amountNftInvokedKey, (tryGetInteger(amountNftInvokedKey) + 1)), IntegerEntry(typesCompletedKey, (tryGetInteger(typesCompletedKey) + 1)), IntegerEntry(totalPetKey, (tryGetInteger(totalPetKey) + 1))] ++ addCouponsInternal(toString(i.caller), 60000000))
368+ }
369+
370+
371+
372+@Callable(i)
373+func questTwoBuyPerches (type,color) = {
374+ let invoker = toString(i.caller)
375+ let typesCompletedKey = (("q1_" + invoker) + "_completed")
376+ if ((4 > tryGetInteger(typesCompletedKey)))
377+ then throw("You need to complete the first quest!")
378+ else {
379+ let method = if ((type == "TURTLE"))
380+ then "addFreeBeach"
381+ else "addFreePerch"
382+ let invokeRes = asInt(invoke(this, "useCoupons", [50000000], nil))
383+ if ((invokeRes == invokeRes))
384+ then if ((invokeRes != 0))
385+ then throw("Not enough vEGG to complet this quest!")
386+ else {
387+ let invokeAddress = if ((type == "TURTLE"))
388+ then getTurtleStakingAddress()
389+ else if ((type == "CANINE"))
390+ then getCanineFarmingAddress()
391+ else if ((type == "FELINE"))
392+ then getFelineFarmingAddress()
393+ else if ((type == "DUCK"))
394+ then getBreedingAddress()
395+ else throw("Unsupported type!")
396+ let invokeRes2 = invoke(invokeAddress, method, [invoker, color], nil)
397+ let invokedKey = (((("q2_" + type) + "_") + invoker) + "_invoked")
398+ let amountNftInvokedKey = (("q2_" + type) + "_amount_invoked")
399+ let typesQ2CompletedKey = (("q2_" + invoker) + "_completed")
400+ let totalQ2Key = "q2_total"
401+ if (tryGetBoolean(invokedKey))
402+ then throw("You already invoked this type!")
403+ else ([BooleanEntry(invokedKey, true), IntegerEntry(amountNftInvokedKey, (tryGetInteger(amountNftInvokedKey) + 1)), IntegerEntry(typesQ2CompletedKey, (tryGetInteger(typesQ2CompletedKey) + 1)), IntegerEntry(totalQ2Key, (tryGetInteger(totalQ2Key) + 1))] ++ addCouponsInternal(toString(i.caller), 20000000))
404+ }
405+ else throw("Strict value is not equal to itself.")
406+ }
407+ }
408+
409+
410+
411+@Callable(i)
412+func questThree () = {
413+ let invoker = toString(i.caller)
414+ let typesCompletedKey = (("q1_" + invoker) + "_completed")
415+ if ((4 > tryGetInteger(typesCompletedKey)))
416+ then throw("You need to complete the first quest!")
417+ else {
418+ let invokeRes1 = asInt(invoke(this, "useCoupons", [100000000], nil))
419+ if ((invokeRes1 == invokeRes1))
420+ then if ((invokeRes1 != 0))
421+ then throw("Not enough vEGG to complet this quest!")
422+ else {
423+ let invokeKey = (("q3_" + invoker) + "_invoked")
424+ let totalQ3Key = "q3_total"
425+ if (tryGetBoolean(invokeKey))
426+ then throw("You already invoked this type!")
427+ else {
428+ let invokeRes2 = invoke(getBabyduckAddress(), "issueFreeDuckling", [invoker, toBase58String(i.transactionId), 20], nil)
429+ if ((invokeRes2 == invokeRes2))
430+ then ([BooleanEntry(invokeKey, true), IntegerEntry(totalQ3Key, (tryGetInteger(totalQ3Key) + 1))] ++ addCouponsInternal(toString(i.caller), 110000000))
431+ else throw("Strict value is not equal to itself.")
432+ }
433+ }
434+ else throw("Strict value is not equal to itself.")
435+ }
436+ }
437+
438+
439+
440+@Callable(i)
333441 func useCoupons (amountTryingToPay) = {
334442 let invokingSc = i.caller
335443 if ((0 > amountTryingToPay))
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func isTestEnv () = {
55 let testenv = match getBoolean(this, "TESTENV") {
66 case x: Boolean =>
77 x
88 case _ =>
99 false
1010 }
1111 testenv
1212 }
1313
1414
1515 func tryGetStringExternal (address,key) = match getString(address, key) {
1616 case a: String =>
1717 a
1818 case _ =>
1919 ""
2020 }
2121
2222
2323 func tryGetBoolean (key) = match getBoolean(key) {
2424 case b: Boolean =>
2525 b
2626 case _ =>
2727 false
2828 }
2929
3030
3131 func tryGetString (key) = tryGetStringExternal(this, key)
3232
3333
3434 func tryGetInteger (key) = match getInteger(this, key) {
3535 case b: Int =>
3636 b
3737 case _ =>
3838 0
3939 }
4040
4141
4242 func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
4343
4444
45+func asInt (value) = match value {
46+ case int: Int =>
47+ int
48+ case _ =>
49+ throw("WAI: wrong type, expected: Int")
50+}
51+
52+
4553 func staticKey_turtleStakingAddress () = "static_turtleStakingAddress"
4654
4755
4856 func staticKey_turtleRebirthAddress () = "static_turtleRebirthAddress"
4957
5058
5159 func staticKey_ropeAddress () = "static_ropeAddress"
5260
5361
5462 func staticKey_levelSystemAddress () = "static_levelSystemAddress"
5563
5664
5765 func staticKey_spiceAssetId () = "static_spiceAssetId"
5866
5967
6068 func staticKey_marketplace () = "static_marketplaceAddress"
6169
6270
6371 func staticKey_capacityAddress () = "static_capacityAddress"
6472
6573
6674 func staticKey_veggFarmingAddress () = "static_veggFarmingAddress"
6775
6876
6977 func staticKey_itemsAddress () = "static_itemsAddress"
7078
7179
7280 func staticKey_mutantFarmingAddress () = "static_mutantFarmingAddress"
7381
7482
7583 func staticKey_canineBreederAddress () = "static_canineBreederAddress"
7684
7785
7886 func staticKey_felineBreederAddress () = "static_felineBreederAddress"
7987
8088
8189 func staticKey_turtleBreederAddress () = "static_turtleBreederAddress"
90+
91+
92+func staticKey_eagleBreederAddress () = "static_eaglBreederAddress"
8293
8394
8495 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
8596
8697
8798 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
8899
89100
90101 func getFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_farmingAddressNew")))
91102
92103
93104 func getGameDappAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_gameDappAddress")))
94105
95106
96107 func getCapacityAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_capacityAddress())))
97108
98109
99110 func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_burnAddress")))
100111
101112
102113 func getBabyduckAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_babyDuckAddress")))
103114
104115
105116 func getBreedingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress")))
106117
107118
108119 func getMasterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_cfMasterAddress")))
109120
110121
111122 func getTurtleStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleStakingAddress())))
112123
113124
114125 func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
115126
116127
117128 func getRopeAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_ropeAddress())))
118129
119130
120131 func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_spiceAssetId()))
121132
122133
123134 func getLevelSystemAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_levelSystemAddress())))
124135
125136
126137 func getMarketPlaceAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_marketplace())))
127138
128139
129140 func getVeggFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_veggFarmingAddress())))
130141
131142
132143 func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
133144
134145
135146 func getMutantFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_mutantFarmingAddress())))
136147
137148
138149 func getCanineFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_canineStakingAddress")))
139150
140151
141152 func getFelineFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_felineStakingAddress")))
142153
143154
155+func getEagleFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_eaglStakingAddress")))
156+
157+
144158 func getCanineBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_canineBreederAddress())))
145159
146160
147161 func getFelineBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_felineBreederAddress())))
148162
149163
150164 func getTurtleBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleBreederAddress())))
151165
152166
167+func getEagleBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_eagleBreederAddress())))
168+
169+
153170 let wAccPKey = fromBase58String(valueOrErrorMessage(getString(getOracle(), "static_warsPKey"), "static_warsPKey not defined"))
154171
155-let scCanUseCoupons = [getRebirthAddress(), getIncubatorAddress(), getFarmingAddress(), getGameDappAddress(), getBabyduckAddress(), getBreedingAddress(), getTurtleStakingAddress(), getTurtleRebirthAddress(), getRopeAddress(), getLevelSystemAddress(), getMarketPlaceAddress(), getCapacityAddress(), getMutantFarmingAddress(), getCanineFarmingAddress(), getFelineFarmingAddress(), getCanineBreederAddress(), getFelineBreederAddress(), getTurtleBreederAddress(), this]
172+let scCanUseCoupons = [getRebirthAddress(), getIncubatorAddress(), getFarmingAddress(), getGameDappAddress(), getBabyduckAddress(), getBreedingAddress(), getTurtleStakingAddress(), getTurtleRebirthAddress(), getRopeAddress(), getLevelSystemAddress(), getMarketPlaceAddress(), getCapacityAddress(), getMutantFarmingAddress(), getCanineFarmingAddress(), getFelineFarmingAddress(), getEagleBreederAddress(), getCanineBreederAddress(), getFelineBreederAddress(), getTurtleBreederAddress(), getEagleFarmingAddress(), this]
156173
157174 func couponsUserSpend (user) = (user + "_spend")
158175
159176
160177 func couponsUserActive (user) = (user + "_active")
161178
162179
163180 func couponsUserActiveOld (user) = (couponsUserActive(user) + "_old")
164181
165182
166183 func couponsSpendOnSc (sc) = (sc + "_spend_by_using")
167184
168185
169186 func actionPerAddressPerUserPerDay (user,action,dappAddress,day) = (((((((dappAddress + "_") + action) + "_") + user) + "_") + day) + "_actions")
170187
171188
172189 func actionPerAddressPerUserLastCheckDay (user,action) = (((action + "_") + user) + "_actions_check_day")
173190
174191
175192 func actionPerAddressPerUserAmountInARow (user,action) = (((action + "_") + user) + "_actions_amount_in_row")
176193
177194
178195 func userExperience (user) = (user + "_experience")
179196
180197
181198 func addCouponsInternal (user,amount) = {
182199 let keyOld = couponsUserActiveOld(user)
183200 let key = couponsUserActive(user)
184201 let couponsOld = tryGetInteger(key)
185202 let coupons = (couponsOld + amount)
186203 [IntegerEntry(keyOld, couponsOld), IntegerEntry(key, coupons)]
187204 }
188205
189206
190207 let startTsMs = 1695427200000
191208
192209 func calculateDaysSinceStart () = {
193210 let diff = (lastBlock.timestamp - startTsMs)
194211 let daysPassed = (diff / (86400 * 1000))
195212 daysPassed
196213 }
197214
198215
199216 func hasDoneTask7Days (day,address,actionName,rewardAmount,rewardAmountWeekly) = {
200217 let userExperienceKey = userExperience(address)
201218 let userExpTilldate = tryGetInteger(userExperienceKey)
202219 let checkDayKey = actionPerAddressPerUserLastCheckDay(address, actionName)
203220 let daysInRowKey = actionPerAddressPerUserAmountInARow(address, actionName)
204221 let lastCheckDay = tryGetInteger(checkDayKey)
205222 let daysInRow = tryGetInteger(daysInRowKey)
206223 let daysInRowUpdate = if ((lastCheckDay == (day - 1)))
207224 then (daysInRow + 1)
208225 else if (((day - 1) > lastCheckDay))
209226 then 1
210227 else 0
211228 let lastCheckDayUpdate = day
212229 let reward = if ((daysInRowUpdate == 7))
213230 then [ScriptTransfer(addressFromStringValue(address), rewardAmountWeekly, getSpiceAssetId()), IntegerEntry(daysInRowKey, 0)]
214231 else [IntegerEntry(daysInRowKey, daysInRowUpdate)]
215232 ([IntegerEntry(checkDayKey, lastCheckDayUpdate), ScriptTransfer(addressFromStringValue(address), rewardAmount, getSpiceAssetId()), IntegerEntry(userExperienceKey, (userExpTilldate + 1))] ++ reward)
216233 }
217234
218235
219236 func payAction (actionName,userAddress,amount,day) = {
220237 let composedKey = if (tryGetBoolean((("TASK_" + actionName) + "_EVERY")))
221238 then actionName
222239 else ((actionName + "_") + toString(amount))
223240 if (tryGetBoolean(("TASK_" + composedKey)))
224241 then hasDoneTask7Days(day, toString(userAddress), composedKey, tryGetInteger((("TASK_" + composedKey) + "_REWARD_DAILY")), tryGetInteger((("TASK_" + composedKey) + "_REWARD_WEEKLY")))
225242 else nil
226243 }
227244
228245
229246 func recordActionInternal (actionName,addressCaller,address) = if (!(containsElement(scCanUseCoupons, addressCaller)))
230247 then throw("CRA: Only certain smart contracts can use this reward module!")
231248 else {
232249 let day = calculateDaysSinceStart()
233250 let actionKey = actionPerAddressPerUserPerDay(toString(address), actionName, toString(addressCaller), toString(day))
234251 let totalActions = (tryGetInteger(actionKey) + 1)
235252 ([IntegerEntry(actionKey, totalActions)] ++ payAction(actionName, address, totalActions, day))
236253 }
237254
238255
239256 @Callable(i)
240257 func configureOracle (oracle) = if ((i.caller != this))
241258 then throw("CCO: admin only")
242259 else [StringEntry("static_oracleAddress", oracle)]
243260
244261
245262
246263 @Callable(i)
247264 func addCoupons (user,amount) = if (if ((i.caller != this))
248265 then (i.callerPublicKey != wAccPKey)
249266 else false)
250267 then throw("CAC: admin only")
251268 else if ((amount >= 10000000))
252269 then (recordActionInternal("VEGG10000000", this, addressFromStringValue(user)) ++ addCouponsInternal(user, amount))
253270 else if ((amount >= 500000))
254271 then (recordActionInternal("VEGG500000", this, addressFromStringValue(user)) ++ addCouponsInternal(user, amount))
255272 else addCouponsInternal(user, amount)
256273
257274
258275
259276 @Callable(i)
260277 func resetCheater (user) = if (if ((i.caller != this))
261278 then (i.callerPublicKey != wAccPKey)
262279 else false)
263280 then throw("CAC: admin only")
264281 else {
265282 let keyOld = couponsUserActiveOld(user)
266283 let key = couponsUserActive(user)
267284 let couponsOld = tryGetInteger(key)
268285 let coupons = -100000000
269286 [IntegerEntry(keyOld, couponsOld), IntegerEntry(key, coupons)]
270287 }
271288
272289
273290
274291 @Callable(i)
275292 func addCouponsFarming (user,amount) = if (if ((i.caller != getVeggFarmingAddress()))
276293 then (i.caller != getMutantFarmingAddress())
277294 else false)
278295 then throw("Method only for farming sc!")
279296 else addCouponsInternal(user, amount)
280297
281298
282299
283300 @Callable(i)
284301 func addCouponsBatch (batch) = if (if ((i.caller != this))
285302 then (i.callerPublicKey != wAccPKey)
286303 else false)
287304 then throw("CAC: admin only")
288305 else {
289306 let couponsList = split(batch, ";")
290307 func handleCoupon (acc,coupon) = {
291308 let splitArray = split(coupon, ":")
292309 let user = splitArray[0]
293310 let amount = parseIntValue(splitArray[1])
294311 let burnCall = invoke(getBurnAddress(), "burnByInvoke", [amount], nil)
295312 if ((burnCall == burnCall))
296313 then if ((amount >= 10000000))
297314 then ((acc ++ recordActionInternal("VEGG10000000", this, addressFromStringValue(user))) ++ addCouponsInternal(user, amount))
298315 else if ((amount >= 500000))
299316 then ((acc ++ recordActionInternal("VEGG500000", this, addressFromStringValue(user))) ++ addCouponsInternal(user, amount))
300317 else (acc ++ addCouponsInternal(user, amount))
301318 else throw("Strict value is not equal to itself.")
302319 }
303320
304321 let $l = couponsList
305322 let $s = size($l)
306323 let $acc0 = nil
307324 func $f0_1 ($a,$i) = if (($i >= $s))
308325 then $a
309326 else handleCoupon($a, $l[$i])
310327
311328 func $f0_2 ($a,$i) = if (($i >= $s))
312329 then $a
313330 else throw("List size exceeds 20")
314331
315332 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
316333 }
317334
318335
319336
320337 @Callable(i)
321338 func CFRefund (recipient,amount) = {
322339 let cfAddress = getStringValue(i.caller, "CF_ADDRESS")
323340 let key = (("f_" + cfAddress) + "_stake_address")
324341 let stakeAddress = getStringValue(getMasterAddress(), key)
325342 if ((stakeAddress != toString(i.caller)))
326343 then throw("CCR: This is something fishy going on!")
327344 else addCouponsInternal(recipient, amount)
328345 }
329346
330347
331348
332349 @Callable(i)
350+func questOnePetNft (assetId) = {
351+ let invoker = toString(i.caller)
352+ let type = if ((value(assetInfo(fromBase58String(assetId))).issuer == getBreedingAddress()))
353+ then "DUCK"
354+ else if ((value(assetInfo(fromBase58String(assetId))).issuer == getCanineBreederAddress()))
355+ then "CANINE"
356+ else if ((value(assetInfo(fromBase58String(assetId))).issuer == getFelineBreederAddress()))
357+ then "FELINE"
358+ else if ((value(assetInfo(fromBase58String(assetId))).issuer == getTurtleBreederAddress()))
359+ then "TURTLE"
360+ else throw("Unsupported NFT!")
361+ let invokedKey = (((("q1_" + type) + "_") + invoker) + "_invoked")
362+ let amountNftInvokedKey = (("q1_" + assetId) + "_amount_invoked")
363+ let typesCompletedKey = (("q1_" + invoker) + "_completed")
364+ let totalPetKey = "q1_total"
365+ if (tryGetBoolean(invokedKey))
366+ then throw("You already invoked this type!")
367+ else ([BooleanEntry(invokedKey, true), IntegerEntry(amountNftInvokedKey, (tryGetInteger(amountNftInvokedKey) + 1)), IntegerEntry(typesCompletedKey, (tryGetInteger(typesCompletedKey) + 1)), IntegerEntry(totalPetKey, (tryGetInteger(totalPetKey) + 1))] ++ addCouponsInternal(toString(i.caller), 60000000))
368+ }
369+
370+
371+
372+@Callable(i)
373+func questTwoBuyPerches (type,color) = {
374+ let invoker = toString(i.caller)
375+ let typesCompletedKey = (("q1_" + invoker) + "_completed")
376+ if ((4 > tryGetInteger(typesCompletedKey)))
377+ then throw("You need to complete the first quest!")
378+ else {
379+ let method = if ((type == "TURTLE"))
380+ then "addFreeBeach"
381+ else "addFreePerch"
382+ let invokeRes = asInt(invoke(this, "useCoupons", [50000000], nil))
383+ if ((invokeRes == invokeRes))
384+ then if ((invokeRes != 0))
385+ then throw("Not enough vEGG to complet this quest!")
386+ else {
387+ let invokeAddress = if ((type == "TURTLE"))
388+ then getTurtleStakingAddress()
389+ else if ((type == "CANINE"))
390+ then getCanineFarmingAddress()
391+ else if ((type == "FELINE"))
392+ then getFelineFarmingAddress()
393+ else if ((type == "DUCK"))
394+ then getBreedingAddress()
395+ else throw("Unsupported type!")
396+ let invokeRes2 = invoke(invokeAddress, method, [invoker, color], nil)
397+ let invokedKey = (((("q2_" + type) + "_") + invoker) + "_invoked")
398+ let amountNftInvokedKey = (("q2_" + type) + "_amount_invoked")
399+ let typesQ2CompletedKey = (("q2_" + invoker) + "_completed")
400+ let totalQ2Key = "q2_total"
401+ if (tryGetBoolean(invokedKey))
402+ then throw("You already invoked this type!")
403+ else ([BooleanEntry(invokedKey, true), IntegerEntry(amountNftInvokedKey, (tryGetInteger(amountNftInvokedKey) + 1)), IntegerEntry(typesQ2CompletedKey, (tryGetInteger(typesQ2CompletedKey) + 1)), IntegerEntry(totalQ2Key, (tryGetInteger(totalQ2Key) + 1))] ++ addCouponsInternal(toString(i.caller), 20000000))
404+ }
405+ else throw("Strict value is not equal to itself.")
406+ }
407+ }
408+
409+
410+
411+@Callable(i)
412+func questThree () = {
413+ let invoker = toString(i.caller)
414+ let typesCompletedKey = (("q1_" + invoker) + "_completed")
415+ if ((4 > tryGetInteger(typesCompletedKey)))
416+ then throw("You need to complete the first quest!")
417+ else {
418+ let invokeRes1 = asInt(invoke(this, "useCoupons", [100000000], nil))
419+ if ((invokeRes1 == invokeRes1))
420+ then if ((invokeRes1 != 0))
421+ then throw("Not enough vEGG to complet this quest!")
422+ else {
423+ let invokeKey = (("q3_" + invoker) + "_invoked")
424+ let totalQ3Key = "q3_total"
425+ if (tryGetBoolean(invokeKey))
426+ then throw("You already invoked this type!")
427+ else {
428+ let invokeRes2 = invoke(getBabyduckAddress(), "issueFreeDuckling", [invoker, toBase58String(i.transactionId), 20], nil)
429+ if ((invokeRes2 == invokeRes2))
430+ then ([BooleanEntry(invokeKey, true), IntegerEntry(totalQ3Key, (tryGetInteger(totalQ3Key) + 1))] ++ addCouponsInternal(toString(i.caller), 110000000))
431+ else throw("Strict value is not equal to itself.")
432+ }
433+ }
434+ else throw("Strict value is not equal to itself.")
435+ }
436+ }
437+
438+
439+
440+@Callable(i)
333441 func useCoupons (amountTryingToPay) = {
334442 let invokingSc = i.caller
335443 if ((0 > amountTryingToPay))
336444 then throw("CUC: Only positive amount of money can be paid!")
337445 else if (!(containsElement(scCanUseCoupons, invokingSc)))
338446 then throw("CUC: Only certain smart contracts can use this coupon module!")
339447 else {
340448 let user = toString(i.originCaller)
341449 let keyActive = couponsUserActive(user)
342450 let availableCoupons = tryGetInteger(keyActive)
343451 if ((0 > availableCoupons))
344452 then throw("CUC: Get rekt!")
345453 else {
346454 let leftToPay = if ((amountTryingToPay > availableCoupons))
347455 then (amountTryingToPay - availableCoupons)
348456 else 0
349457 let amountPaid = (amountTryingToPay - leftToPay)
350458 let availableCouponsLeft = (availableCoupons - amountPaid)
351459 if ((0 > availableCouponsLeft))
352460 then throw("CUC: You try to overspend!")
353461 else {
354462 let keySpend = couponsUserSpend(user)
355463 let keyOld = couponsUserActiveOld(user)
356464 let keySpendSc = couponsSpendOnSc(toString(i.caller))
357465 let topUp = invoke(getVeggFarmingAddress(), "topUpReward", [((amountPaid / 100) * 25)], nil)
358466 if ((topUp == topUp))
359467 then {
360468 let topUp2 = if ((invokingSc == getMutantFarmingAddress()))
361469 then unit
362470 else invoke(getMutantFarmingAddress(), "topUpReward", ["VEGG", ((amountPaid / 100) * 15)], nil)
363471 if ((topUp2 == topUp2))
364472 then {
365473 let totalSpend = (tryGetInteger(keySpend) + amountPaid)
366474 let totalSpendSc = (tryGetInteger(keySpendSc) + amountPaid)
367475 $Tuple2([IntegerEntry(keySpend, totalSpend), IntegerEntry(keyOld, availableCoupons), IntegerEntry(keyActive, availableCouponsLeft), IntegerEntry(keySpendSc, totalSpendSc)], amountPaid)
368476 }
369477 else throw("Strict value is not equal to itself.")
370478 }
371479 else throw("Strict value is not equal to itself.")
372480 }
373481 }
374482 }
375483 }
376484
377485
378486
379487 @Callable(i)
380488 func recordAction (actionName) = recordActionInternal(actionName, i.caller, i.originCaller)
381489
382490
383491
384492 @Callable(i)
385493 func increaseExp (address) = if ((i.caller != getItemsAddress()))
386494 then nil
387495 else {
388496 let userExperienceKey = userExperience(address)
389497 let userExpTilldate = tryGetInteger(userExperienceKey)
390498 [IntegerEntry(userExperienceKey, (userExpTilldate + 1))]
391499 }
392500
393501
394502
395503 @Callable(i)
396504 func increaseExpDefined (address,amount) = if ((i.caller != getItemsAddress()))
397505 then nil
398506 else {
399507 let userExperienceKey = userExperience(address)
400508 let userExpTilldate = tryGetInteger(userExperienceKey)
401509 [IntegerEntry(userExperienceKey, (userExpTilldate + amount))]
402510 }
403511
404512
405513 @Verifier(tx)
406514 func verify () = if (isTestEnv())
407515 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
408516 else {
409517 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
410518 let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
411519 let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
412520 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
413521 then 1
414522 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
415523 then 1
416524 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
417525 then 1
418526 else 0
419527 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
420528 then 1
421529 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
422530 then 1
423531 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
424532 then 1
425533 else 0
426534 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
427535 then 1
428536 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
429537 then 1
430538 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
431539 then 1
432540 else 0
433541 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
434542 match tx {
435543 case _ =>
436544 (signaturesCount >= 1)
437545 }
438546 }
439547

github/deemru/w8io/169f3d6 
139.32 ms