2022.06.30 16:41 [3184824] smart account 3PCoF5ZnsQJKAJJCoSqUcVVqJ2Dm4fvn9ar > SELF 0.00000000 Waves

{ "type": 13, "id": "4euNe4h4McpnUMcrhPF5YKpoAS9JjJS7yk8vPAR3ox3o", "fee": 1200000, "feeAssetId": null, "timestamp": 1656596489751, "version": 2, "chainId": 87, "sender": "3PCoF5ZnsQJKAJJCoSqUcVVqJ2Dm4fvn9ar", "senderPublicKey": "2RFPMtHxVSEG1LnET2FGshyhRepA7zJmx6tPwdHeNpJi", "proofs": [ "4AZvJKCs1PPWvYfWJR6RRoSPtk1Fg4E5yVdxpsC8tdR5wtsZ7EU89jhtUtmxX2ZUNKCU5BC4MQajcqvMDdNoS99v" ], "script": "base64:BgIUCAISAwoBCBIAEgQKAggIEgMKAQgdAQx0cnlHZXRTdHJpbmcBA2tleQQHJG1hdGNoMAkAnQgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABFHRyeUdldFN0cmluZ0V4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABCWdldE9yYWNsZQAJAQdBZGRyZXNzAQkA2QQBCQEMdHJ5R2V0U3RyaW5nAQIUc3RhdGljX29yYWNsZUFkZHJlc3MBEWdldEJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhVzdGF0aWNfYnJlZWRlckFkZHJlc3MBE2dldEluY3ViYXRvckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACF3N0YXRpY19pbmN1YmF0b3JBZGRyZXNzARNnZXRTd29wUHJvbW9BZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhdzdGF0aWNfc3dvcFByb21vQWRkcmVzcwENZ2V0RWdnQXNzZXRJZAAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACEXN0YXRpY19lZ2dBc3NldElkARNnZXRXZWFyYWJsZXNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhdzdGF0aWNfd2VhcmFibGVzQWRkcmVzcwERZ2V0RmFybWluZ0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACFXN0YXRpY19mYXJtaW5nQWRkcmVzcwERZ2V0Q291cG9uc0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACFXN0YXRpY19jb3Vwb25zQWRkcmVzcwERZ2V0UmViaXJ0aEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACFXN0YXRpY19yZWJpcnRoQWRkcmVzcwAKTUFOVExFTkFNRQIGbWFudGxlAAxzYWxlc0VuYWJsZWQHAApTVEFUVVNGUkVFAgRGUkVFAA5TVEFUVVNPQ0NVUElFRAIIT0NDVVBJRUQBC2tleUR1Y2tMb2NrAg1jYWxsZXJBZGRyZXNzBmR1Y2tJZAkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUNY2FsbGVyQWRkcmVzcwIGX2R1Y2tfBQZkdWNrSWQCB19zdGF0dXMBC2tleUludmVzdG9yAQ1jYWxsZXJBZGRyZXNzCQCsAgIJAKwCAgIIYWRkcmVzc18FDWNhbGxlckFkZHJlc3MCB19hbW91bnQBE2tleUFydGVmYWN0SW52ZXN0ZWQCBHR5cGUKYXJ0ZWZhY3RJZAkArAICCQCsAgIJAKwCAgkArAICAglhcnRlZmFjdF8FBHR5cGUCDF9hcnRlZmFjdElkXwUKYXJ0ZWZhY3RJZAIJX2ludmVzdGVkARRrZXlPbmx5QXJ0ZWZhY3RMZXZlbAEKYXJ0ZWZhY3RJZAkArAICCQCsAgICC2FydGVmYWN0SWRfCQDYBAEFCmFydGVmYWN0SWQCBl9sZXZlbAEaa2V5QXJ0ZWZhY3RJZEJ5RHVja0FuZFR5cGUCBHR5cGUGZHVja0lkCQCsAgIJAKwCAgkArAICCQCsAgICCmFydGVmYWN0XyAFBHR5cGUCBl9kdWNrXwkA2AQBBQZkdWNrSWQCC19hcnRlZmFjdElkARBrZXlBcnRlZmFjdE93bmVyAgR0eXBlCmFydGVmYWN0SWQJAKwCAgkArAICCQCsAgIJAKwCAgIKYXJ0ZWZhY3RfIAUEdHlwZQIMX2FydGVmYWN0SWRfCQDYBAEFCmFydGVmYWN0SWQCBl9vd25lcgEZa2V5QXJ0ZWZhY3RPd25lckFuZFN0YXR1cwMEdHlwZQVvd25lcgphcnRlZmFjdElkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUFb3duZXICCl9hcnRlZmFjdF8FBHR5cGUCDF9hcnRlZmFjdElkXwkA2AQBBQphcnRlZmFjdElkAgdfc3RhdHVzARFrZXlBcnRlZmFjdFN0YXR1cwIEdHlwZQphcnRlZmFjdElkCQCsAgIJAKwCAgkArAICCQCsAgICCmFydGVmYWN0XyAFBHR5cGUCDF9hcnRlZmFjdElkXwkA2AQBBQphcnRlZmFjdElkAgdfc3RhdHVzAQ9rZXlBcnRlZmFjdFR5cGUBCmFydGVmYWN0SWQJAKwCAgkArAICAgthcnRlZmFjdElkXwkA2AQBBQphcnRlZmFjdElkAgVfdHlwZQEQa2V5QXJ0ZWZhY3RMZXZlbAMEdHlwZQVvd25lcgphcnRlZmFjdElkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUFb3duZXICCl9hcnRlZmFjdF8FBHR5cGUCDF9hcnRlZmFjdElkXwkA2AQBBQphcnRlZmFjdElkAgZfbGV2ZWwBEGtleVB1dE9uQXJ0ZWZhY3QEBHR5cGUFb3duZXIGZHVja0lkCmFydGVmYWN0SWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUFb3duZXICBl9kdWNrXwUGZHVja0lkAgpfYXJ0ZWZhY3RfBQR0eXBlAgxfYXJ0ZWZhY3RJZF8JANgEAQUKYXJ0ZWZhY3RJZAIHX3N0YXR1cwERa2V5QXJ0ZWZhY3RFeGlzdHMCBHR5cGUKYXJ0ZWZhY3RJZAkArAICCQCsAgIJAKwCAgIJYXJ0ZWZhY3RfBQR0eXBlAgxfYXJ0ZWZhY3RJZF8JANgEAQUKYXJ0ZWZhY3RJZAEJaXNKYWNrcG90AQdhc3NldElkCQAAAgkAsgICCQEFdmFsdWUBCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBG5hbWUAAQIBVQEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIeV0FJOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50BAFpAQ9jb25maWd1cmVPcmFjbGUBBm9yYWNsZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECD1dDTzogYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCAhRzdGF0aWNfb3JhY2xlQWRkcmVzcwUGb3JhY2xlBQNuaWwBaQENcHV0T25BcnRlZmFjdAAEDGZpcnN0UGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABA1zZWNvbmRQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEEWF0dGFjaGVkQXNzZXRJbmZvCQEFdmFsdWUBCQDsBwEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAQXc2Vjb25kQXR0YWNoZWRBc3NldEluZm8JAQV2YWx1ZQEJAOwHAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQkAAgECHldQT0E6IERVQ0sgTkZUIGlzIG5vdCBhdHRhY2hlZAMJAQIhPQIIBQ1zZWNvbmRQYXltZW50BmFtb3VudAABCQACAQIgV1BPQTogTUFOVExFIE5GVCBpcyBub3QgYXR0YWNoZWQDAwkBAiE9AggFEWF0dGFjaGVkQXNzZXRJbmZvBmlzc3VlcgkBE2dldEluY3ViYXRvckFkZHJlc3MACQECIT0CCAURYXR0YWNoZWRBc3NldEluZm8GaXNzdWVyCQERZ2V0QnJlZWRlckFkZHJlc3MABwkAAgECP1dQT0E6IFlvdSBjYW4gYXR0YWNoIG9ubHkgRFVDS3MgaXNzdWVkIGJ5IGluY3ViYXRvciBvciBicmVlZGVyIAMJAQIhPQIIBRdzZWNvbmRBdHRhY2hlZEFzc2V0SW5mbwZpc3N1ZXIFBHRoaXMJAAIBAjRXUE9BOiBZb3UgY2FuIGF0dGFjaCBvbmx5IG1hbnRsZXMgaXNzdWVzIGJ5IHRoaXMgc2MuBAphcnRlZmFjdElkCQEFdmFsdWUBCAUNc2Vjb25kUGF5bWVudAdhc3NldElkBApoYXNTd2VhdGVyCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQETZ2V0V2VhcmFibGVzQWRkcmVzcwAJAKwCAgkA2AQBCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQCDV9BUlQtWFNXRUFURVIEDWtNYW50bGVFeGlzdHMJARFrZXlBcnRlZmFjdEV4aXN0cwIFCk1BTlRMRU5BTUUFCmFydGVmYWN0SWQEDWtNYW50bGVTdGF0dXMJARFrZXlBcnRlZmFjdFN0YXR1cwIFCk1BTlRMRU5BTUUFCmFydGVmYWN0SWQEF2tBcnRlZmFjdE93bmVyQW5kU3RhdHVzCQEZa2V5QXJ0ZWZhY3RPd25lckFuZFN0YXR1cwMFCk1BTlRMRU5BTUUJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBQphcnRlZmFjdElkBAlrRHVja0xvY2sJAQtrZXlEdWNrTG9jawIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQDYBAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAQMbWFudGxlRXhpc3RzCQERQGV4dHJOYXRpdmUoMTA1NikBBQ1rTWFudGxlRXhpc3RzBAxtYW50bGVTdGF0dXMJARFAZXh0ck5hdGl2ZSgxMDU4KQEFDWtNYW50bGVTdGF0dXMEEWtBcnRlZmFjdElkQnlUeXBlCQEaa2V5QXJ0ZWZhY3RJZEJ5RHVja0FuZFR5cGUCBQpNQU5UTEVOQU1FCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQDCQEBIQEFDG1hbnRsZUV4aXN0cwkAAgECK1dQT0E6IE1hbnRsZSB3aXRoIHN1Y2ggYW4gSUQgZG9lcyBub3QgZXhpc3QDCQECIT0CBQxtYW50bGVTdGF0dXMFClNUQVRVU0ZSRUUJAAIBAh1XUE9BOiBNYW50bGUgaXMgYWxyZWFkeSB1c2VkIQQJc3Rha2VEdWNrAwkBAiE9AgUKaGFzU3dlYXRlcgIAAwkBCWlzSmFja3BvdAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAkA/AcECQERZ2V0RmFybWluZ0FkZHJlc3MAAgxzdGFrZUphY2twb3QFA25pbAgFAWkIcGF5bWVudHMJAPwHBAkBEWdldEZhcm1pbmdBZGRyZXNzAAIIc3Rha2VORlQFA25pbAgFAWkIcGF5bWVudHMFA25pbAMJAAACBQlzdGFrZUR1Y2sFCXN0YWtlRHVjawQOa1B1dE9uQXJ0ZWZhY3QJARBrZXlQdXRPbkFydGVmYWN0BAUKTUFOVExFTkFNRQkApQgBCAUBaQxvcmlnaW5DYWxsZXIJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkBQphcnRlZmFjdElkBAxrTWFudGxlT3duZXIJARBrZXlBcnRlZmFjdE93bmVyAgUKTUFOVExFTkFNRQUKYXJ0ZWZhY3RJZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUOa1B1dE9uQXJ0ZWZhY3QGCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtNYW50bGVTdGF0dXMFDlNUQVRVU09DQ1VQSUVECQDMCAIJAQtTdHJpbmdFbnRyeQIFF2tBcnRlZmFjdE93bmVyQW5kU3RhdHVzBQ5TVEFUVVNPQ0NVUElFRAkAzAgCCQELU3RyaW5nRW50cnkCBQxrTWFudGxlT3duZXIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQDMCAIJAQxCb29sZWFuRW50cnkCBQlrRHVja0xvY2sGCQDMCAIJAQtTdHJpbmdFbnRyeQIFEWtBcnRlZmFjdElkQnlUeXBlCQDYBAEFCmFydGVmYWN0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ90YWtlT2ZmQXJ0ZWZhY3QCBmR1Y2tJZAxhcnRlZmFjdFR5cGUEGGtBcnRlZmFjdElkQnlUeXBlQW5kRHVjawkBGmtleUFydGVmYWN0SWRCeUR1Y2tBbmRUeXBlAgUMYXJ0ZWZhY3RUeXBlCQDZBAEFBmR1Y2tJZAQKYXJ0ZWZhY3RJZAkBEUBleHRyTmF0aXZlKDEwNTgpAQUYa0FydGVmYWN0SWRCeVR5cGVBbmREdWNrBA1rQXJ0ZWZhY3RUeXBlCQEPa2V5QXJ0ZWZhY3RUeXBlAQkA2QQBBQphcnRlZmFjdElkBA5rUHV0T25BcnRlZmFjdAkBEGtleVB1dE9uQXJ0ZWZhY3QEBQxhcnRlZmFjdFR5cGUJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBQZkdWNrSWQJANkEAQUKYXJ0ZWZhY3RJZAQUa1B1dE9uQXJ0ZWZhY3RTdGF0dXMJARFAZXh0ck5hdGl2ZSgxMDU2KQEFDmtQdXRPbkFydGVmYWN0BBdrQXJ0ZWZhY3RPd25lckFuZFN0YXR1cwkBGWtleUFydGVmYWN0T3duZXJBbmRTdGF0dXMDBQxhcnRlZmFjdFR5cGUJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQDZBAEFCmFydGVmYWN0SWQECWtEdWNrTG9jawkBC2tleUR1Y2tMb2NrAgkApQgBCAUBaQxvcmlnaW5DYWxsZXIFBmR1Y2tJZAQNa01hbnRsZVN0YXR1cwkBEWtleUFydGVmYWN0U3RhdHVzAgUMYXJ0ZWZhY3RUeXBlCQDZBAEFCmFydGVmYWN0SWQDCQECIT0CBRRrUHV0T25BcnRlZmFjdFN0YXR1cwYJAAIBAixXVE9BOiBUaGVyZSBpcyBubyBkdWNrIHdpdGggc3VjaCBwYXJhbWV0ZXJlcwQKaGFzU3dlYXRlcgkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBE2dldFdlYXJhYmxlc0FkZHJlc3MACQCsAgIFBmR1Y2tJZAINX0FSVC1YU1dFQVRFUgQMa01hbnRsZU93bmVyCQEQa2V5QXJ0ZWZhY3RPd25lcgIFDGFydGVmYWN0VHlwZQkA2QQBBQphcnRlZmFjdElkBAt1bnN0YWtlRHVjawMJAQIhPQIFCmhhc1N3ZWF0ZXICAAMJAQlpc0phY2twb3QBCQDZBAEFBmR1Y2tJZAkA/AcECQERZ2V0RmFybWluZ0FkZHJlc3MAAg51bnN0YWtlSmFja3BvdAkAzAgCBQZkdWNrSWQFA25pbAUDbmlsCQD8BwQJARFnZXRGYXJtaW5nQWRkcmVzcwACCnVuc3Rha2VORlQJAMwIAgUGZHVja0lkBQNuaWwFA25pbAUDbmlsAwkAAAIFC3Vuc3Rha2VEdWNrBQt1bnN0YWtlRHVjawkAzAgCCQELRGVsZXRlRW50cnkBBQ5rUHV0T25BcnRlZmFjdAkAzAgCCQELRGVsZXRlRW50cnkBBRhrQXJ0ZWZhY3RJZEJ5VHlwZUFuZER1Y2sJAMwIAgkBC0RlbGV0ZUVudHJ5AQUJa0R1Y2tMb2NrCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtNYW50bGVTdGF0dXMFClNUQVRVU0ZSRUUJAMwIAgkBC0RlbGV0ZUVudHJ5AQUXa0FydGVmYWN0T3duZXJBbmRTdGF0dXMJAMwIAgkBC0RlbGV0ZUVudHJ5AQUMa01hbnRsZU93bmVyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpDG9yaWdpbkNhbGxlcgABCQDZBAEFBmR1Y2tJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQxvcmlnaW5DYWxsZXIAAQkA2QQBBQphcnRlZmFjdElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENZXhwb3J0TWFudGxlcwEDaWRzBAZuZnRJZHMJALUJAgUDaWRzAgE7CgEIaGFuZGxlSWQCA2FjYwJpZAQMa01hbnRsZU93bmVyCQEQa2V5QXJ0ZWZhY3RPd25lcgIFCk1BTlRMRU5BTUUJANkEAQUCaWQEC21hbnRsZU93bmVyCQERQGV4dHJOYXRpdmUoMTA1OCkBBQxrTWFudGxlT3duZXIEF2tBcnRlZmFjdE93bmVyQW5kU3RhdHVzCQEZa2V5QXJ0ZWZhY3RPd25lckFuZFN0YXR1cwMFCk1BTlRMRU5BTUUFC21hbnRsZU93bmVyCQDZBAEFAmlkBA1rTWFudGxlU3RhdHVzCQERa2V5QXJ0ZWZhY3RTdGF0dXMCBQpNQU5UTEVOQU1FCQDZBAEFAmlkBAxtYW50bGVTdGF0dXMJARFAZXh0ck5hdGl2ZSgxMDU4KQEFDWtNYW50bGVTdGF0dXMDCQAAAgUMbWFudGxlU3RhdHVzBQpTVEFUVVNGUkVFCQDOCAIFA2FjYwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULbWFudGxlT3duZXIAAQkA2QQBBQJpZAkAzAgCCQELRGVsZXRlRW50cnkBBQxrTWFudGxlT3duZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQUXa0FydGVmYWN0T3duZXJBbmRTdGF0dXMFA25pbAUDYWNjCgACJGwFBm5mdElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIaGFuZGxlSWQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFABfMXaO", "height": 3184824, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 41XrDs93y6L5U7yYcmFjcVkzcUSBH14wzJPGHErNMt69 Next: CiJw3C6dVqWTpUSM9yUb6Tixt8RJ2ksgeTFVTKhJKJ2G Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetString (key) = match getString(this, key) {
4545
4646
4747 let MANTLENAME = "mantle"
48+
49+let salesEnabled = false
4850
4951 let STATUSFREE = "FREE"
5052
9799 }
98100
99101
100-func upgradeMantleFunc (i,artefactId,amount) = {
101- let kMantleExists = keyArtefactExists(MANTLENAME, fromBase58String(artefactId))
102- let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(artefactId))
103- let mantleExists = getBooleanValue(kMantleExists)
104- let mantleOwner = getStringValue(kMantleOwner)
105- if (!(mantleExists))
106- then throw("WUPM: Mantle with such an ID does not exist")
107- else if ((mantleOwner != toString(i.originCaller)))
108- then throw("WUPM: You're not an owner of the mantle")
109- else {
110- let kMantleInvested = keyArtefactInvested(MANTLENAME, artefactId)
111- let mantleAlreadyInvested = getIntegerValue(kMantleInvested)
112- let kMantleLevel = keyArtefactLevel(MANTLENAME, toString(i.originCaller), fromBase58String(artefactId))
113- let kOnlyArtefactLevel = keyOnlyArtefactLevel(fromBase58String(artefactId))
114- let totalInvested = (mantleAlreadyInvested + amount)
115- let newLevel = (((10 * pow(totalInvested, 8, 6, 1, 8, HALFUP)) + 100000000) / 100000000)
116-[IntegerEntry(kMantleLevel, newLevel), IntegerEntry(kMantleInvested, totalInvested), IntegerEntry(kOnlyArtefactLevel, newLevel)]
117- }
118- }
119-
120-
121102 @Callable(i)
122103 func configureOracle (oracle) = if ((i.caller != this))
123104 then throw("WCO: admin only")
126107
127108
128109 @Callable(i)
129-func issueFreeMantle (address,type,level) = if (if ((i.caller != this))
130- then (i.caller != getSwopPromoAddress())
131- else false)
132- then throw("WIFM: Can be called only by admin")
133- else if ((type != MANTLENAME))
134- then throw("WIFM: You can buy only mantles now")
135- else {
136- let issueMantleNFT = Issue("DUCK-MANTLE-0", "[Artefact] Mantle NFT for Jeduck", 1, 0, false)
137- let mantleNftId = calculateAssetId(issueMantleNFT)
138- let kMantleLevel = keyArtefactLevel(MANTLENAME, address, mantleNftId)
139- let kMantleExists = keyArtefactExists(MANTLENAME, mantleNftId)
140- let kMantleOwner = keyArtefactOwner(MANTLENAME, mantleNftId)
141- let kMantleStatus = keyArtefactStatus(MANTLENAME, mantleNftId)
142- let kArtefactType = keyArtefactType(mantleNftId)
143- let kMantleInvested = keyArtefactInvested(MANTLENAME, toBase58String(mantleNftId))
144- let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, address, mantleNftId)
145- let kOnlyArtefactLevel = keyOnlyArtefactLevel(mantleNftId)
146- let invested = pow((level - 1), 1, (1000000000 / 6), 8, 8, HALFUP)
147- $Tuple2([IntegerEntry(kMantleLevel, level), IntegerEntry(kMantleInvested, invested), BooleanEntry(kMantleExists, true), StringEntry(kMantleOwner, address), StringEntry(kMantleStatus, STATUSFREE), StringEntry(kArtefactType, MANTLENAME), StringEntry(kArtefactOwnerAndStatus, STATUSFREE), IntegerEntry(kOnlyArtefactLevel, level)], toBase58String(mantleNftId))
148- }
149-
150-
151-
152-@Callable(i)
153-func buyArtefact (type) = if ((type != MANTLENAME))
154- then throw("WBA: You can buy only mantles now")
155- else {
156- let MANTLEPRICE = 1000000
157- let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [MANTLEPRICE], nil))
158- if ((amountPaidByCoupons == amountPaidByCoupons))
159- then {
160- let leftToPay = (MANTLEPRICE - amountPaidByCoupons)
161- let payment = if ((leftToPay != 0))
162- then {
163- let firstPayment = value(i.payments[0])
164- if ((firstPayment.assetId != getEggAssetId()))
165- then throw(("WBA: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
166- else if ((firstPayment.amount != leftToPay))
167- then throw(("WBA: To buy a mantle you currently need the following amount of EGGlets: " + toString(leftToPay)))
168- else leftToPay
110+func putOnArtefact () = {
111+ let firstPayment = value(i.payments[0])
112+ let secondPayment = value(i.payments[1])
113+ let attachedAssetInfo = value(assetInfo(value(firstPayment.assetId)))
114+ let secondAttachedAssetInfo = value(assetInfo(value(firstPayment.assetId)))
115+ if ((firstPayment.amount != 1))
116+ then throw("WPOA: DUCK NFT is not attached")
117+ else if ((secondPayment.amount != 1))
118+ then throw("WPOA: MANTLE NFT is not attached")
119+ else if (if ((attachedAssetInfo.issuer != getIncubatorAddress()))
120+ then (attachedAssetInfo.issuer != getBreederAddress())
121+ else false)
122+ then throw("WPOA: You can attach only DUCKs issued by incubator or breeder ")
123+ else if ((secondAttachedAssetInfo.issuer != this))
124+ then throw("WPOA: You can attach only mantles issues by this sc.")
125+ else {
126+ let artefactId = value(secondPayment.assetId)
127+ let hasSweater = tryGetStringExternal(getWearablesAddress(), (toBase58String(value(firstPayment.assetId)) + "_ART-XSWEATER"))
128+ let kMantleExists = keyArtefactExists(MANTLENAME, artefactId)
129+ let kMantleStatus = keyArtefactStatus(MANTLENAME, artefactId)
130+ let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.originCaller), artefactId)
131+ let kDuckLock = keyDuckLock(toString(i.originCaller), toBase58String(value(firstPayment.assetId)))
132+ let mantleExists = getBooleanValue(kMantleExists)
133+ let mantleStatus = getStringValue(kMantleStatus)
134+ let kArtefactIdByType = keyArtefactIdByDuckAndType(MANTLENAME, value(firstPayment.assetId))
135+ if (!(mantleExists))
136+ then throw("WPOA: Mantle with such an ID does not exist")
137+ else if ((mantleStatus != STATUSFREE))
138+ then throw("WPOA: Mantle is already used!")
139+ else {
140+ let stakeDuck = if ((hasSweater != ""))
141+ then if (isJackpot(value(firstPayment.assetId)))
142+ then invoke(getFarmingAddress(), "stakeJackpot", nil, i.payments)
143+ else invoke(getFarmingAddress(), "stakeNFT", nil, i.payments)
144+ else nil
145+ if ((stakeDuck == stakeDuck))
146+ then {
147+ let kPutOnArtefact = keyPutOnArtefact(MANTLENAME, toString(i.originCaller), toBase58String(value(firstPayment.assetId)), artefactId)
148+ let kMantleOwner = keyArtefactOwner(MANTLENAME, artefactId)
149+[BooleanEntry(kPutOnArtefact, true), StringEntry(kMantleStatus, STATUSOCCUPIED), StringEntry(kArtefactOwnerAndStatus, STATUSOCCUPIED), StringEntry(kMantleOwner, toString(i.originCaller)), BooleanEntry(kDuckLock, true), StringEntry(kArtefactIdByType, toBase58String(artefactId))]
150+ }
151+ else throw("Strict value is not equal to itself.")
152+ }
169153 }
170- else 0
171- if ((payment == payment))
172- then {
173- let issueMantleNFT = Issue("DUCK-MANTLE-0", "[Artefact] Mantle NFT for Jeduck", 1, 0, false)
174- let mantleNftId = calculateAssetId(issueMantleNFT)
175- let kMantleLevel = keyArtefactLevel(MANTLENAME, toString(i.caller), mantleNftId)
176- let kMantleExists = keyArtefactExists(MANTLENAME, mantleNftId)
177- let kMantleOwner = keyArtefactOwner(MANTLENAME, mantleNftId)
178- let kMantleStatus = keyArtefactStatus(MANTLENAME, mantleNftId)
179- let kArtefactType = keyArtefactType(mantleNftId)
180- let kMantleInvested = keyArtefactInvested(MANTLENAME, toBase58String(mantleNftId))
181- let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.caller), mantleNftId)
182- let kOnlyArtefactLevel = keyOnlyArtefactLevel(mantleNftId)
183-[IntegerEntry(kMantleLevel, 1), IntegerEntry(kMantleInvested, MANTLEPRICE), BooleanEntry(kMantleExists, true), StringEntry(kMantleOwner, toString(i.caller)), StringEntry(kMantleStatus, STATUSFREE), StringEntry(kArtefactType, MANTLENAME), StringEntry(kArtefactOwnerAndStatus, STATUSFREE), IntegerEntry(kOnlyArtefactLevel, 1)]
184- }
185- else throw("Strict value is not equal to itself.")
186- }
187- else throw("Strict value is not equal to itself.")
188- }
189-
190-
191-
192-@Callable(i)
193-func upgradeMantle (artefactId) = {
194- let upgradePointPrice = 1000000
195- let firstPayment = value(i.payments[0])
196- let amount = firstPayment.amount
197- if ((firstPayment.assetId != getEggAssetId()))
198- then throw(("WUM: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
199- else if ((upgradePointPrice > firstPayment.amount))
200- then throw(("WUM: Minimal payment for upgrading mantle is: " + toString(upgradePointPrice)))
201- else upgradeMantleFunc(i, artefactId, amount)
202- }
203-
204-
205-
206-@Callable(i)
207-func upgradeMantleByCoupons (artefactId,couponsAmount) = {
208- let upgradePointPrice = 1000000
209- let firstPayment = value(i.payments[0])
210- if ((upgradePointPrice > couponsAmount))
211- then throw(("WUMBC: Minimal payment for upgrading mantle is: " + toString(upgradePointPrice)))
212- else {
213- let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [couponsAmount], nil))
214- if ((amountPaidByCoupons == amountPaidByCoupons))
215- then if ((couponsAmount != amountPaidByCoupons))
216- then throw("WUMBC: Not enough coupons! Please make sure to pick lower coupon amount!")
217- else upgradeMantleFunc(i, artefactId, couponsAmount)
218- else throw("Strict value is not equal to itself.")
219- }
220- }
221-
222-
223-
224-@Callable(i)
225-func putOnArtefact (artefactId) = {
226- let firstPayment = value(i.payments[0])
227- let attachedAssetInfo = value(assetInfo(value(firstPayment.assetId)))
228- if ((firstPayment.amount != 1))
229- then throw("WPOA: NFT is not attached")
230- else if (if ((attachedAssetInfo.issuer != getIncubatorAddress()))
231- then (attachedAssetInfo.issuer != getBreederAddress())
232- else false)
233- then throw("WPOA: You can attach only DUCKs issued by incubator or breeder ")
234- else {
235- let hasSweater = tryGetStringExternal(getWearablesAddress(), (toBase58String(value(firstPayment.assetId)) + "_ART-XSWEATER"))
236- let kMantleExists = keyArtefactExists(MANTLENAME, fromBase58String(artefactId))
237- let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(artefactId))
238- let kMantleStatus = keyArtefactStatus(MANTLENAME, fromBase58String(artefactId))
239- let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.originCaller), fromBase58String(artefactId))
240- let kDuckLock = keyDuckLock(toString(i.originCaller), toBase58String(value(firstPayment.assetId)))
241- let mantleExists = getBooleanValue(kMantleExists)
242- let mantleOwner = getStringValue(kMantleOwner)
243- let mantleStatus = getStringValue(kMantleStatus)
244- let kArtefactIdByType = keyArtefactIdByDuckAndType(MANTLENAME, value(firstPayment.assetId))
245- if (!(mantleExists))
246- then throw("WPOA: Mantle with such an ID does not exist")
247- else if ((mantleOwner != toString(i.originCaller)))
248- then throw("WPOA: You're not an owner of the mantle")
249- else if ((mantleStatus != STATUSFREE))
250- then throw("WPOA: Mantle is already used!")
251- else {
252- let stakeDuck = if ((hasSweater != ""))
253- then if (isJackpot(value(firstPayment.assetId)))
254- then invoke(getFarmingAddress(), "stakeNFT", nil, i.payments)
255- else invoke(getFarmingAddress(), "stakeJackpot", nil, i.payments)
256- else nil
257- if ((stakeDuck == stakeDuck))
258- then {
259- let kPutOnArtefact = keyPutOnArtefact(MANTLENAME, toString(i.originCaller), toBase58String(value(firstPayment.assetId)), fromBase58String(artefactId))
260-[BooleanEntry(kPutOnArtefact, true), StringEntry(kMantleStatus, STATUSOCCUPIED), StringEntry(kArtefactOwnerAndStatus, STATUSOCCUPIED), BooleanEntry(kDuckLock, true), StringEntry(kArtefactIdByType, artefactId)]
261- }
262- else throw("Strict value is not equal to itself.")
263- }
264- }
265154 }
266155
267156
280169 then throw("WTOA: There is no duck with such parameteres")
281170 else {
282171 let hasSweater = tryGetStringExternal(getWearablesAddress(), (duckId + "_ART-XSWEATER"))
172+ let kMantleOwner = keyArtefactOwner(artefactType, fromBase58String(artefactId))
283173 let unstakeDuck = if ((hasSweater != ""))
284174 then if (isJackpot(fromBase58String(duckId)))
285- then invoke(getFarmingAddress(), "unstakeNFT", [duckId], nil)
286- else invoke(getFarmingAddress(), "unstakeJackpot", [duckId], nil)
175+ then invoke(getFarmingAddress(), "unstakeJackpot", [duckId], nil)
176+ else invoke(getFarmingAddress(), "unstakeNFT", [duckId], nil)
287177 else nil
288178 if ((unstakeDuck == unstakeDuck))
289- then [DeleteEntry(kPutOnArtefact), DeleteEntry(kArtefactIdByTypeAndDuck), DeleteEntry(kDuckLock), StringEntry(kMantleStatus, STATUSFREE), StringEntry(kArtefactOwnerAndStatus, STATUSFREE), ScriptTransfer(i.originCaller, 1, fromBase58String(duckId))]
179+ then [DeleteEntry(kPutOnArtefact), DeleteEntry(kArtefactIdByTypeAndDuck), DeleteEntry(kDuckLock), StringEntry(kMantleStatus, STATUSFREE), DeleteEntry(kArtefactOwnerAndStatus), DeleteEntry(kMantleOwner), ScriptTransfer(i.originCaller, 1, fromBase58String(duckId)), ScriptTransfer(i.originCaller, 1, fromBase58String(artefactId))]
290180 else throw("Strict value is not equal to itself.")
291181 }
292182 }
293183
294184
295-@Verifier(tx)
296-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
185+
186+@Callable(i)
187+func exportMantles (ids) = {
188+ let nftIds = split(ids, ";")
189+ func handleId (acc,id) = {
190+ let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(id))
191+ let mantleOwner = getStringValue(kMantleOwner)
192+ let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, mantleOwner, fromBase58String(id))
193+ let kMantleStatus = keyArtefactStatus(MANTLENAME, fromBase58String(id))
194+ let mantleStatus = getStringValue(kMantleStatus)
195+ if ((mantleStatus == STATUSFREE))
196+ then (acc ++ [ScriptTransfer(Address(fromBase58String(mantleOwner)), 1, fromBase58String(id)), DeleteEntry(kMantleOwner), DeleteEntry(kArtefactOwnerAndStatus)])
197+ else acc
198+ }
199+
200+ let $l = nftIds
201+ let $s = size($l)
202+ let $acc0 = nil
203+ func $f0_1 ($a,$i) = if (($i >= $s))
204+ then $a
205+ else handleId($a, $l[$i])
206+
207+ func $f0_2 ($a,$i) = if (($i >= $s))
208+ then $a
209+ else throw("List size exceeds 20")
210+
211+ $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)
212+ }
213+
297214
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetString (key) = match getString(this, key) {
55 case a: String =>
66 a
77 case _ =>
88 ""
99 }
1010
1111
1212 func tryGetStringExternal (address,key) = match getString(address, key) {
1313 case a: String =>
1414 a
1515 case _ =>
1616 ""
1717 }
1818
1919
2020 func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
2121
2222
2323 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress")))
2424
2525
2626 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
2727
2828
2929 func getSwopPromoAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_swopPromoAddress")))
3030
3131
3232 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId"))
3333
3434
3535 func getWearablesAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_wearablesAddress")))
3636
3737
3838 func getFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_farmingAddress")))
3939
4040
4141 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_couponsAddress")))
4242
4343
4444 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
4545
4646
4747 let MANTLENAME = "mantle"
48+
49+let salesEnabled = false
4850
4951 let STATUSFREE = "FREE"
5052
5153 let STATUSOCCUPIED = "OCCUPIED"
5254
5355 func keyDuckLock (callerAddress,duckId) = (((("address_" + callerAddress) + "_duck_") + duckId) + "_status")
5456
5557
5658 func keyInvestor (callerAddress) = (("address_" + callerAddress) + "_amount")
5759
5860
5961 func keyArtefactInvested (type,artefactId) = (((("artefact_" + type) + "_artefactId_") + artefactId) + "_invested")
6062
6163
6264 func keyOnlyArtefactLevel (artefactId) = (("artefactId_" + toBase58String(artefactId)) + "_level")
6365
6466
6567 func keyArtefactIdByDuckAndType (type,duckId) = (((("artefact_ " + type) + "_duck_") + toBase58String(duckId)) + "_artefactId")
6668
6769
6870 func keyArtefactOwner (type,artefactId) = (((("artefact_ " + type) + "_artefactId_") + toBase58String(artefactId)) + "_owner")
6971
7072
7173 func keyArtefactOwnerAndStatus (type,owner,artefactId) = (((((("address_" + owner) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_status")
7274
7375
7476 func keyArtefactStatus (type,artefactId) = (((("artefact_ " + type) + "_artefactId_") + toBase58String(artefactId)) + "_status")
7577
7678
7779 func keyArtefactType (artefactId) = (("artefactId_" + toBase58String(artefactId)) + "_type")
7880
7981
8082 func keyArtefactLevel (type,owner,artefactId) = (((((("address_" + owner) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_level")
8183
8284
8385 func keyPutOnArtefact (type,owner,duckId,artefactId) = (((((((("address_" + owner) + "_duck_") + duckId) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_status")
8486
8587
8688 func keyArtefactExists (type,artefactId) = ((("artefact_" + type) + "_artefactId_") + toBase58String(artefactId))
8789
8890
8991 func isJackpot (assetId) = (takeRight(value(value(assetInfo(assetId)).name), 1) == "U")
9092
9193
9294 func asInt (value) = match value {
9395 case int: Int =>
9496 int
9597 case _ =>
9698 throw("WAI: wrong type, expected: Int")
9799 }
98100
99101
100-func upgradeMantleFunc (i,artefactId,amount) = {
101- let kMantleExists = keyArtefactExists(MANTLENAME, fromBase58String(artefactId))
102- let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(artefactId))
103- let mantleExists = getBooleanValue(kMantleExists)
104- let mantleOwner = getStringValue(kMantleOwner)
105- if (!(mantleExists))
106- then throw("WUPM: Mantle with such an ID does not exist")
107- else if ((mantleOwner != toString(i.originCaller)))
108- then throw("WUPM: You're not an owner of the mantle")
109- else {
110- let kMantleInvested = keyArtefactInvested(MANTLENAME, artefactId)
111- let mantleAlreadyInvested = getIntegerValue(kMantleInvested)
112- let kMantleLevel = keyArtefactLevel(MANTLENAME, toString(i.originCaller), fromBase58String(artefactId))
113- let kOnlyArtefactLevel = keyOnlyArtefactLevel(fromBase58String(artefactId))
114- let totalInvested = (mantleAlreadyInvested + amount)
115- let newLevel = (((10 * pow(totalInvested, 8, 6, 1, 8, HALFUP)) + 100000000) / 100000000)
116-[IntegerEntry(kMantleLevel, newLevel), IntegerEntry(kMantleInvested, totalInvested), IntegerEntry(kOnlyArtefactLevel, newLevel)]
117- }
118- }
119-
120-
121102 @Callable(i)
122103 func configureOracle (oracle) = if ((i.caller != this))
123104 then throw("WCO: admin only")
124105 else [StringEntry("static_oracleAddress", oracle)]
125106
126107
127108
128109 @Callable(i)
129-func issueFreeMantle (address,type,level) = if (if ((i.caller != this))
130- then (i.caller != getSwopPromoAddress())
131- else false)
132- then throw("WIFM: Can be called only by admin")
133- else if ((type != MANTLENAME))
134- then throw("WIFM: You can buy only mantles now")
135- else {
136- let issueMantleNFT = Issue("DUCK-MANTLE-0", "[Artefact] Mantle NFT for Jeduck", 1, 0, false)
137- let mantleNftId = calculateAssetId(issueMantleNFT)
138- let kMantleLevel = keyArtefactLevel(MANTLENAME, address, mantleNftId)
139- let kMantleExists = keyArtefactExists(MANTLENAME, mantleNftId)
140- let kMantleOwner = keyArtefactOwner(MANTLENAME, mantleNftId)
141- let kMantleStatus = keyArtefactStatus(MANTLENAME, mantleNftId)
142- let kArtefactType = keyArtefactType(mantleNftId)
143- let kMantleInvested = keyArtefactInvested(MANTLENAME, toBase58String(mantleNftId))
144- let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, address, mantleNftId)
145- let kOnlyArtefactLevel = keyOnlyArtefactLevel(mantleNftId)
146- let invested = pow((level - 1), 1, (1000000000 / 6), 8, 8, HALFUP)
147- $Tuple2([IntegerEntry(kMantleLevel, level), IntegerEntry(kMantleInvested, invested), BooleanEntry(kMantleExists, true), StringEntry(kMantleOwner, address), StringEntry(kMantleStatus, STATUSFREE), StringEntry(kArtefactType, MANTLENAME), StringEntry(kArtefactOwnerAndStatus, STATUSFREE), IntegerEntry(kOnlyArtefactLevel, level)], toBase58String(mantleNftId))
148- }
149-
150-
151-
152-@Callable(i)
153-func buyArtefact (type) = if ((type != MANTLENAME))
154- then throw("WBA: You can buy only mantles now")
155- else {
156- let MANTLEPRICE = 1000000
157- let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [MANTLEPRICE], nil))
158- if ((amountPaidByCoupons == amountPaidByCoupons))
159- then {
160- let leftToPay = (MANTLEPRICE - amountPaidByCoupons)
161- let payment = if ((leftToPay != 0))
162- then {
163- let firstPayment = value(i.payments[0])
164- if ((firstPayment.assetId != getEggAssetId()))
165- then throw(("WBA: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
166- else if ((firstPayment.amount != leftToPay))
167- then throw(("WBA: To buy a mantle you currently need the following amount of EGGlets: " + toString(leftToPay)))
168- else leftToPay
110+func putOnArtefact () = {
111+ let firstPayment = value(i.payments[0])
112+ let secondPayment = value(i.payments[1])
113+ let attachedAssetInfo = value(assetInfo(value(firstPayment.assetId)))
114+ let secondAttachedAssetInfo = value(assetInfo(value(firstPayment.assetId)))
115+ if ((firstPayment.amount != 1))
116+ then throw("WPOA: DUCK NFT is not attached")
117+ else if ((secondPayment.amount != 1))
118+ then throw("WPOA: MANTLE NFT is not attached")
119+ else if (if ((attachedAssetInfo.issuer != getIncubatorAddress()))
120+ then (attachedAssetInfo.issuer != getBreederAddress())
121+ else false)
122+ then throw("WPOA: You can attach only DUCKs issued by incubator or breeder ")
123+ else if ((secondAttachedAssetInfo.issuer != this))
124+ then throw("WPOA: You can attach only mantles issues by this sc.")
125+ else {
126+ let artefactId = value(secondPayment.assetId)
127+ let hasSweater = tryGetStringExternal(getWearablesAddress(), (toBase58String(value(firstPayment.assetId)) + "_ART-XSWEATER"))
128+ let kMantleExists = keyArtefactExists(MANTLENAME, artefactId)
129+ let kMantleStatus = keyArtefactStatus(MANTLENAME, artefactId)
130+ let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.originCaller), artefactId)
131+ let kDuckLock = keyDuckLock(toString(i.originCaller), toBase58String(value(firstPayment.assetId)))
132+ let mantleExists = getBooleanValue(kMantleExists)
133+ let mantleStatus = getStringValue(kMantleStatus)
134+ let kArtefactIdByType = keyArtefactIdByDuckAndType(MANTLENAME, value(firstPayment.assetId))
135+ if (!(mantleExists))
136+ then throw("WPOA: Mantle with such an ID does not exist")
137+ else if ((mantleStatus != STATUSFREE))
138+ then throw("WPOA: Mantle is already used!")
139+ else {
140+ let stakeDuck = if ((hasSweater != ""))
141+ then if (isJackpot(value(firstPayment.assetId)))
142+ then invoke(getFarmingAddress(), "stakeJackpot", nil, i.payments)
143+ else invoke(getFarmingAddress(), "stakeNFT", nil, i.payments)
144+ else nil
145+ if ((stakeDuck == stakeDuck))
146+ then {
147+ let kPutOnArtefact = keyPutOnArtefact(MANTLENAME, toString(i.originCaller), toBase58String(value(firstPayment.assetId)), artefactId)
148+ let kMantleOwner = keyArtefactOwner(MANTLENAME, artefactId)
149+[BooleanEntry(kPutOnArtefact, true), StringEntry(kMantleStatus, STATUSOCCUPIED), StringEntry(kArtefactOwnerAndStatus, STATUSOCCUPIED), StringEntry(kMantleOwner, toString(i.originCaller)), BooleanEntry(kDuckLock, true), StringEntry(kArtefactIdByType, toBase58String(artefactId))]
150+ }
151+ else throw("Strict value is not equal to itself.")
152+ }
169153 }
170- else 0
171- if ((payment == payment))
172- then {
173- let issueMantleNFT = Issue("DUCK-MANTLE-0", "[Artefact] Mantle NFT for Jeduck", 1, 0, false)
174- let mantleNftId = calculateAssetId(issueMantleNFT)
175- let kMantleLevel = keyArtefactLevel(MANTLENAME, toString(i.caller), mantleNftId)
176- let kMantleExists = keyArtefactExists(MANTLENAME, mantleNftId)
177- let kMantleOwner = keyArtefactOwner(MANTLENAME, mantleNftId)
178- let kMantleStatus = keyArtefactStatus(MANTLENAME, mantleNftId)
179- let kArtefactType = keyArtefactType(mantleNftId)
180- let kMantleInvested = keyArtefactInvested(MANTLENAME, toBase58String(mantleNftId))
181- let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.caller), mantleNftId)
182- let kOnlyArtefactLevel = keyOnlyArtefactLevel(mantleNftId)
183-[IntegerEntry(kMantleLevel, 1), IntegerEntry(kMantleInvested, MANTLEPRICE), BooleanEntry(kMantleExists, true), StringEntry(kMantleOwner, toString(i.caller)), StringEntry(kMantleStatus, STATUSFREE), StringEntry(kArtefactType, MANTLENAME), StringEntry(kArtefactOwnerAndStatus, STATUSFREE), IntegerEntry(kOnlyArtefactLevel, 1)]
184- }
185- else throw("Strict value is not equal to itself.")
186- }
187- else throw("Strict value is not equal to itself.")
188- }
189-
190-
191-
192-@Callable(i)
193-func upgradeMantle (artefactId) = {
194- let upgradePointPrice = 1000000
195- let firstPayment = value(i.payments[0])
196- let amount = firstPayment.amount
197- if ((firstPayment.assetId != getEggAssetId()))
198- then throw(("WUM: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
199- else if ((upgradePointPrice > firstPayment.amount))
200- then throw(("WUM: Minimal payment for upgrading mantle is: " + toString(upgradePointPrice)))
201- else upgradeMantleFunc(i, artefactId, amount)
202- }
203-
204-
205-
206-@Callable(i)
207-func upgradeMantleByCoupons (artefactId,couponsAmount) = {
208- let upgradePointPrice = 1000000
209- let firstPayment = value(i.payments[0])
210- if ((upgradePointPrice > couponsAmount))
211- then throw(("WUMBC: Minimal payment for upgrading mantle is: " + toString(upgradePointPrice)))
212- else {
213- let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [couponsAmount], nil))
214- if ((amountPaidByCoupons == amountPaidByCoupons))
215- then if ((couponsAmount != amountPaidByCoupons))
216- then throw("WUMBC: Not enough coupons! Please make sure to pick lower coupon amount!")
217- else upgradeMantleFunc(i, artefactId, couponsAmount)
218- else throw("Strict value is not equal to itself.")
219- }
220- }
221-
222-
223-
224-@Callable(i)
225-func putOnArtefact (artefactId) = {
226- let firstPayment = value(i.payments[0])
227- let attachedAssetInfo = value(assetInfo(value(firstPayment.assetId)))
228- if ((firstPayment.amount != 1))
229- then throw("WPOA: NFT is not attached")
230- else if (if ((attachedAssetInfo.issuer != getIncubatorAddress()))
231- then (attachedAssetInfo.issuer != getBreederAddress())
232- else false)
233- then throw("WPOA: You can attach only DUCKs issued by incubator or breeder ")
234- else {
235- let hasSweater = tryGetStringExternal(getWearablesAddress(), (toBase58String(value(firstPayment.assetId)) + "_ART-XSWEATER"))
236- let kMantleExists = keyArtefactExists(MANTLENAME, fromBase58String(artefactId))
237- let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(artefactId))
238- let kMantleStatus = keyArtefactStatus(MANTLENAME, fromBase58String(artefactId))
239- let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.originCaller), fromBase58String(artefactId))
240- let kDuckLock = keyDuckLock(toString(i.originCaller), toBase58String(value(firstPayment.assetId)))
241- let mantleExists = getBooleanValue(kMantleExists)
242- let mantleOwner = getStringValue(kMantleOwner)
243- let mantleStatus = getStringValue(kMantleStatus)
244- let kArtefactIdByType = keyArtefactIdByDuckAndType(MANTLENAME, value(firstPayment.assetId))
245- if (!(mantleExists))
246- then throw("WPOA: Mantle with such an ID does not exist")
247- else if ((mantleOwner != toString(i.originCaller)))
248- then throw("WPOA: You're not an owner of the mantle")
249- else if ((mantleStatus != STATUSFREE))
250- then throw("WPOA: Mantle is already used!")
251- else {
252- let stakeDuck = if ((hasSweater != ""))
253- then if (isJackpot(value(firstPayment.assetId)))
254- then invoke(getFarmingAddress(), "stakeNFT", nil, i.payments)
255- else invoke(getFarmingAddress(), "stakeJackpot", nil, i.payments)
256- else nil
257- if ((stakeDuck == stakeDuck))
258- then {
259- let kPutOnArtefact = keyPutOnArtefact(MANTLENAME, toString(i.originCaller), toBase58String(value(firstPayment.assetId)), fromBase58String(artefactId))
260-[BooleanEntry(kPutOnArtefact, true), StringEntry(kMantleStatus, STATUSOCCUPIED), StringEntry(kArtefactOwnerAndStatus, STATUSOCCUPIED), BooleanEntry(kDuckLock, true), StringEntry(kArtefactIdByType, artefactId)]
261- }
262- else throw("Strict value is not equal to itself.")
263- }
264- }
265154 }
266155
267156
268157
269158 @Callable(i)
270159 func takeOffArtefact (duckId,artefactType) = {
271160 let kArtefactIdByTypeAndDuck = keyArtefactIdByDuckAndType(artefactType, fromBase58String(duckId))
272161 let artefactId = getStringValue(kArtefactIdByTypeAndDuck)
273162 let kArtefactType = keyArtefactType(fromBase58String(artefactId))
274163 let kPutOnArtefact = keyPutOnArtefact(artefactType, toString(i.originCaller), duckId, fromBase58String(artefactId))
275164 let kPutOnArtefactStatus = getBooleanValue(kPutOnArtefact)
276165 let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(artefactType, toString(i.originCaller), fromBase58String(artefactId))
277166 let kDuckLock = keyDuckLock(toString(i.originCaller), duckId)
278167 let kMantleStatus = keyArtefactStatus(artefactType, fromBase58String(artefactId))
279168 if ((kPutOnArtefactStatus != true))
280169 then throw("WTOA: There is no duck with such parameteres")
281170 else {
282171 let hasSweater = tryGetStringExternal(getWearablesAddress(), (duckId + "_ART-XSWEATER"))
172+ let kMantleOwner = keyArtefactOwner(artefactType, fromBase58String(artefactId))
283173 let unstakeDuck = if ((hasSweater != ""))
284174 then if (isJackpot(fromBase58String(duckId)))
285- then invoke(getFarmingAddress(), "unstakeNFT", [duckId], nil)
286- else invoke(getFarmingAddress(), "unstakeJackpot", [duckId], nil)
175+ then invoke(getFarmingAddress(), "unstakeJackpot", [duckId], nil)
176+ else invoke(getFarmingAddress(), "unstakeNFT", [duckId], nil)
287177 else nil
288178 if ((unstakeDuck == unstakeDuck))
289- then [DeleteEntry(kPutOnArtefact), DeleteEntry(kArtefactIdByTypeAndDuck), DeleteEntry(kDuckLock), StringEntry(kMantleStatus, STATUSFREE), StringEntry(kArtefactOwnerAndStatus, STATUSFREE), ScriptTransfer(i.originCaller, 1, fromBase58String(duckId))]
179+ then [DeleteEntry(kPutOnArtefact), DeleteEntry(kArtefactIdByTypeAndDuck), DeleteEntry(kDuckLock), StringEntry(kMantleStatus, STATUSFREE), DeleteEntry(kArtefactOwnerAndStatus), DeleteEntry(kMantleOwner), ScriptTransfer(i.originCaller, 1, fromBase58String(duckId)), ScriptTransfer(i.originCaller, 1, fromBase58String(artefactId))]
290180 else throw("Strict value is not equal to itself.")
291181 }
292182 }
293183
294184
295-@Verifier(tx)
296-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
185+
186+@Callable(i)
187+func exportMantles (ids) = {
188+ let nftIds = split(ids, ";")
189+ func handleId (acc,id) = {
190+ let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(id))
191+ let mantleOwner = getStringValue(kMantleOwner)
192+ let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, mantleOwner, fromBase58String(id))
193+ let kMantleStatus = keyArtefactStatus(MANTLENAME, fromBase58String(id))
194+ let mantleStatus = getStringValue(kMantleStatus)
195+ if ((mantleStatus == STATUSFREE))
196+ then (acc ++ [ScriptTransfer(Address(fromBase58String(mantleOwner)), 1, fromBase58String(id)), DeleteEntry(kMantleOwner), DeleteEntry(kArtefactOwnerAndStatus)])
197+ else acc
198+ }
199+
200+ let $l = nftIds
201+ let $s = size($l)
202+ let $acc0 = nil
203+ func $f0_1 ($a,$i) = if (($i >= $s))
204+ then $a
205+ else handleId($a, $l[$i])
206+
207+ func $f0_2 ($a,$i) = if (($i >= $s))
208+ then $a
209+ else throw("List size exceeds 20")
210+
211+ $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)
212+ }
213+
297214

github/deemru/w8io/786bc32 
54.65 ms