tx · 2HYLpcktSSTNarcXjyMQ1f5jvvUAa67Wd2iMsDEp9hQJ

3PHUMZkr66B38WxHV1boULaEjjF7giGgVy7:  -0.01000000 Waves

2023.11.28 21:55 [3929494] smart account 3PHUMZkr66B38WxHV1boULaEjjF7giGgVy7 > SELF 0.00000000 Waves

{ "type": 13, "id": "2HYLpcktSSTNarcXjyMQ1f5jvvUAa67Wd2iMsDEp9hQJ", "fee": 1000000, "feeAssetId": null, "timestamp": 1701197735925, "version": 2, "chainId": 87, "sender": "3PHUMZkr66B38WxHV1boULaEjjF7giGgVy7", "senderPublicKey": "8XKsuJqSe6FsspUz3sPvdADeLpP7e1tfiWx5tt6e674g", "proofs": [ "46cc3XjAkuMwS8GfZrQWUekBW2oQUn745rG6HYsCNyduSYxqc7M2RMQ5v2ZWHJ5CaZ78T2ZC5VBuTbBdWH2tRoEH" ], "script": "base64:BgIRCAISAwoBCBIAEgQKAgQIEgAVARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwACFHN0YXRpY19vcmFjbGVBZGRyZXNzARhzdGF0aWNLZXlfYnJlZWRlckFkZHJlc3MAAhVzdGF0aWNfYnJlZWRlckFkZHJlc3MBFnN0YXRpY0tleV9pdGVtc0FkZHJlc3MAAhNzdGF0aWNfaXRlbXNBZGRyZXNzARJzdGF0aWNLZXlfZXh0cmFGZWUAAg9zdGF0aWNfZXh0cmFGZWUBGHN0YXRpY0tleV9leHRyYUZlZVJlbW92ZQACFXN0YXRpY19leHRyYUZlZVJlbW92ZQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAhRzdGF0aWNfZmVlQWdncmVnYXRvcgAJd2VhcmFibGVzCQDMCAICCEFSVC1DQVBFCQDMCAICB0FSVC1IQVQJAMwIAgIKQVJULVhTQ0FSRgkAzAgCAgxBUlQtWFNXRUFURVIFA25pbAEPa2V5QXJ0ZWZhY3REdWNrAgZkdWNrSWQId2VhcmFibGUJAKwCAgkArAICBQZkdWNrSWQCAV8FCHdlYXJhYmxlAQxrZXlUeXBlc0R1Y2sCBmR1Y2tJZAR0eXBlCQCsAgIJAKwCAgUGZHVja0lkAgFfBQR0eXBlARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJ0IAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQx0cnlHZXRTdHJpbmcBA2tleQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgUEdGhpcwUDa2V5AQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQhhc1N0cmluZwEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwBQZzdHJpbmcJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABEWdldEJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAEPZ2V0SXRlbXNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEWc3RhdGljS2V5X2l0ZW1zQWRkcmVzcwABEGdldEZlZUFnZ3JlZ2F0b3IACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgABFmNoZWNrQWRkaXRpb25hbFBheW1lbnQCB3BheW1lbnQOYW1vdW50T3ZlcnJpZGUDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkAAgECGVdDQVA6IFBsZWFzZSBhdHRhY2ggd2F2ZXMECWZlZUFtb3VudAMJAQIhPQIFDmFtb3VudE92ZXJyaWRlAAAFDmFtb3VudE92ZXJyaWRlCQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxXQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsARJ0cnlHZXRDb3NtZXRpY0l0ZW0BBGl0ZW0EA2tleQkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtBAckbWF0Y2gwCQCaCAIJAQ9nZXRJdGVtc0FkZHJlc3MABQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhBQR1bml0AQp0cnlHZXRUeXBlAQh3ZWFyYWJsZQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBD2dldEl0ZW1zQWRkcmVzcwAJAKwCAgIOdHlwZV9jb3NtZXRpY18FCHdlYXJhYmxlAQh3ZWFySXRlbQIPYXNzZXRJZFdlYXJBYmxlBmR1Y2tJZAQMYXJ0ZWZhY3ROYW1lCQEIYXNTdHJpbmcBCQD8BwQJAQ9nZXRJdGVtc0FkZHJlc3MAAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBQ9hc3NldElkV2VhckFibGUFA25pbAUDbmlsAwkAAAIFDGFydGVmYWN0TmFtZQUMYXJ0ZWZhY3ROYW1lAwMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFCXdlYXJhYmxlcwUMYXJ0ZWZhY3ROYW1lCQEBIQEJAQlpc0RlZmluZWQBCQESdHJ5R2V0Q29zbWV0aWNJdGVtAQUMYXJ0ZWZhY3ROYW1lBwkAAgECG1dSSVREOiBVbnN1cHBvcnRlZCB3ZWFyYWJsZQQKYXJ0ZWZhY3RJZAkBDHRyeUdldFN0cmluZwEJAQ9rZXlBcnRlZmFjdER1Y2sCBQZkdWNrSWQFDGFydGVmYWN0TmFtZQQJYm9vc3REdWNrAwkAAAIFDGFydGVmYWN0TmFtZQIKQVJULVhTQ0FSRgkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAIPbWFuaXB1bGF0ZUJvb3N0CQDMCAIARQkAzAgCBQZkdWNrSWQFA25pbAUDbmlsBQNuaWwDCQAAAgUJYm9vc3REdWNrBQlib29zdER1Y2sDCQECIT0CBQphcnRlZmFjdElkAgAJAAIBCQCsAgICGkR1Y2sgaXMgYWxyZWFkeSB3ZWFyaW5nIGEgBQxhcnRlZmFjdE5hbWUEBHR5cGUJAQp0cnlHZXRUeXBlAQUMYXJ0ZWZhY3ROYW1lBAp0eXBlT25EdWNrAwkBAiE9AgUEdHlwZQIACQECIT0CCQEMdHJ5R2V0U3RyaW5nAQkBDGtleVR5cGVzRHVjawIFBmR1Y2tJZAUEdHlwZQIABwMFCnR5cGVPbkR1Y2sJAAIBAjJZb3UgY2FuIG9ubHkgYXR0YWNoIDEgZnJvbSBlYWNoIHR5cGUgdG8geW91ciBkdWNrIQQKdHlwZVJlc3VsdAMJAQIhPQIFBHR5cGUCAAkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5VHlwZXNEdWNrAgUGZHVja0lkBQR0eXBlBQ9hc3NldElkV2VhckFibGUFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleUFydGVmYWN0RHVjawIFBmR1Y2tJZAUMYXJ0ZWZhY3ROYW1lBQ9hc3NldElkV2VhckFibGUFA25pbAUKdHlwZVJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQBaQEPY29uZmlndXJlT3JhY2xlAQZvcmFjbGUDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgphZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwAFBm9yYWNsZQUDbmlsAWkBDndlYXJJdGVtVG9EdWNrAAQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEDXNlY29uZFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAIJAJEDAggFAWkIcGF5bWVudHMAAgAABAZkdWNrSWQJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkBA1zZWNvbmRBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQ1zZWNvbmRQYXltZW50B2Fzc2V0SWQDAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQYJAQIhPQIIBQ1zZWNvbmRQYXltZW50BmFtb3VudAABCQACAQIaV1JJVEQ6IE5GVCBpcyBub3QgYXR0YWNoZWQECGNoaWxkcmVuCQEFYXNJbnQBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACFnZhbGlkYXRlQW5kR2V0Q2hpbGRyZW4JAMwIAgUGZHVja0lkBQNuaWwFA25pbAMJAAACBQhjaGlsZHJlbgUIY2hpbGRyZW4JAM4IAgkAzggCCQEId2Vhckl0ZW0CBQ1zZWNvbmRBc3NldElkBQZkdWNrSWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEScmVtb3ZlSXRlbUZyb21EdWNrAghidXJuSXRlbQxhcnRlZmFjdE5hbWUECHdhdmVzRmVlAwUIYnVybkl0ZW0AAAkBEUBleHRyTmF0aXZlKDEwNTApAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfZXh0cmFGZWVSZW1vdmUABAtkdWNrUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABA9yb2JvRHVja1BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAIJAJEDAggFAWkIcGF5bWVudHMAAgUId2F2ZXNGZWUEBmR1Y2tJZAkA2AQBCQEFdmFsdWUBCAULZHVja1BheW1lbnQHYXNzZXRJZAQKcm9ib0R1Y2tJZAkA2AQBCQEFdmFsdWUBCAUPcm9ib0R1Y2tQYXltZW50B2Fzc2V0SWQDAwkBAiE9AggFC2R1Y2tQYXltZW50BmFtb3VudAABBgkBAiE9AggFD3JvYm9EdWNrUGF5bWVudAZhbW91bnQAAQkAAgECGldSSVREOiBORlQgaXMgbm90IGF0dGFjaGVkBAhjaGlsZHJlbgkBBWFzSW50AQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQDMCAIFBmR1Y2tJZAUDbmlsBQNuaWwDCQAAAgUIY2hpbGRyZW4FCGNoaWxkcmVuBBRhcnRlZmFjdE5hbWVSb2JvZHVjawkBCGFzU3RyaW5nAQkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgUKcm9ib0R1Y2tJZAUDbmlsBQNuaWwDCQAAAgUUYXJ0ZWZhY3ROYW1lUm9ib2R1Y2sFFGFydGVmYWN0TmFtZVJvYm9kdWNrAwkBAiE9AgUUYXJ0ZWZhY3ROYW1lUm9ib2R1Y2sCDEFSVC1ST0JPRFVDSwkAAgECH09ubHkgcm9kb2R1Y2sgY2FuIHJlbW92ZSBpdGVtcyEDAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUJd2VhcmFibGVzBQxhcnRlZmFjdE5hbWUJAQEhAQkBCWlzRGVmaW5lZAEJARJ0cnlHZXRDb3NtZXRpY0l0ZW0BBQxhcnRlZmFjdE5hbWUHCQACAQIbV1JJVEQ6IFVuc3VwcG9ydGVkIHdlYXJhYmxlBAphcnRlZmFjdElkCQEMdHJ5R2V0U3RyaW5nAQkBD2tleUFydGVmYWN0RHVjawIFBmR1Y2tJZAUMYXJ0ZWZhY3ROYW1lBAlib29zdER1Y2sDCQAAAgUMYXJ0ZWZhY3ROYW1lAgpBUlQtWFNDQVJGCQD8BwQJAQ9nZXRJdGVtc0FkZHJlc3MAAg9tYW5pcHVsYXRlQm9vc3QJAMwIAgBFCQDMCAIFBmR1Y2tJZAUDbmlsBQNuaWwFA25pbAMJAAACBQlib29zdER1Y2sFCWJvb3N0RHVjawMJAAACBQphcnRlZmFjdElkAgAJAAIBCQCsAgICE0R1Y2sgbm90IHdlYXJpbmcgYSAFDGFydGVmYWN0TmFtZQQEdHlwZQkBCnRyeUdldFR5cGUBBQxhcnRlZmFjdE5hbWUECnR5cGVSZXN1bHQDCQECIT0CBQR0eXBlAgAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleVR5cGVzRHVjawIFBmR1Y2tJZAUEdHlwZQUDbmlsBQNuaWwEBGJ1cm4DBQhidXJuSXRlbQkAzAgCCQEEQnVybgIJANkEAQUKYXJ0ZWZhY3RJZAABBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEJANkEAQUKYXJ0ZWZhY3RJZAUDbmlsCQDOCAIJAM4IAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ9rZXlBcnRlZmFjdER1Y2sCBQZkdWNrSWQFDGFydGVmYWN0TmFtZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQgFC2R1Y2tQYXltZW50B2Fzc2V0SWQJAMwIAgkBBEJ1cm4CCQDZBAEFCnJvYm9EdWNrSWQAAQUDbmlsBQRidXJuBQx2YWxpZFBheW1lbnQFCnR5cGVSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQd2VhclhJdGVtc1RvRHVjawAEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQCCQCRAwIIBQFpCHBheW1lbnRzAAEAAAMJAGYCAAMJAJADAQgFAWkIcGF5bWVudHMJAAIBAjFXV1hJVEQ6IFBsZWFzZSBhdHRhY2ggYXQgbGVhc3QgMSBpdGVtIGFuZCAxIGR1Y2shAwkAZgIJAJADAQgFAWkIcGF5bWVudHMABwkAAgECMVdXWElURDogWW91IGNhbiBvbmx5IGF0dGFjaCA1IGl0ZW1zIGFuZCBvbmUgZHVjayEKAQpoYW5kbGVJdGVtAgNhY2MHcGF5bWVudAQFaW5kZXgJAM8IAggFAWkIcGF5bWVudHMFB3BheW1lbnQDCQAAAgUFaW5kZXgAAAQGZHVja0lkCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQDCQECIT0CCAUHcGF5bWVudAZhbW91bnQAAQkAAgECG1dSSVREOiBEdWNrIGlzIG5vdCBhdHRhY2hlZAQIY2hpbGRyZW4JAQVhc0ludAEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWdmFsaWRhdGVBbmRHZXRDaGlsZHJlbgkAzAgCBQZkdWNrSWQFA25pbAUDbmlsAwkAAAIFCGNoaWxkcmVuBQhjaGlsZHJlbgkAzggCBQNhY2MJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEIBQdwYXltZW50B2Fzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzggCBQNhY2MJAQh3ZWFySXRlbQIJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAkA2AQBCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwABB2Fzc2V0SWQJAM4IAgoAAiRsCAUBaQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKaGFuZGxlSXRlbQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgUMdmFsaWRQYXltZW50AGWzEvU=", "height": 3929494, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9x2YtvA7GH6RXteGd5AKxAqsHmrm4bZYWqyKcoZVBnRd Next: CnjNBiTYioJbDoSk1HKmfNQNe9pEuZjTqJgPMdQTWrK5 Diff:
OldNewDifferences
2222 let wearables = ["ART-CAPE", "ART-HAT", "ART-XSCARF", "ART-XSWEATER"]
2323
2424 func keyArtefactDuck (duckId,wearable) = ((duckId + "_") + wearable)
25+
26+
27+func keyTypesDuck (duckId,type) = ((duckId + "_") + type)
2528
2629
2730 func tryGetStringExternal (address,key) = match getString(address, key) {
8689 }
8790
8891
92+func tryGetType (wearable) = tryGetStringExternal(getItemsAddress(), ("type_cosmetic_" + wearable))
93+
94+
8995 func wearItem (assetIdWearAble,duckId) = {
9096 let artefactName = asString(invoke(getItemsAddress(), "checkArtefactDetails", [assetIdWearAble], nil))
9197 if ((artefactName == artefactName))
101107 if ((boostDuck == boostDuck))
102108 then if ((artefactId != ""))
103109 then throw(("Duck is already wearing a " + artefactName))
104- else [StringEntry(keyArtefactDuck(duckId, artefactName), assetIdWearAble)]
110+ else {
111+ let type = tryGetType(artefactName)
112+ let typeOnDuck = if ((type != ""))
113+ then (tryGetString(keyTypesDuck(duckId, type)) != "")
114+ else false
115+ if (typeOnDuck)
116+ then throw("You can only attach 1 from each type to your duck!")
117+ else {
118+ let typeResult = if ((type != ""))
119+ then [StringEntry(keyTypesDuck(duckId, type), assetIdWearAble)]
120+ else nil
121+ ([StringEntry(keyArtefactDuck(duckId, artefactName), assetIdWearAble)] ++ typeResult)
122+ }
123+ }
105124 else throw("Strict value is not equal to itself.")
106125 }
107126 else throw("Strict value is not equal to itself.")
171190 then if ((artefactId == ""))
172191 then throw(("Duck not wearing a " + artefactName))
173192 else {
193+ let type = tryGetType(artefactName)
194+ let typeResult = if ((type != ""))
195+ then [DeleteEntry(keyTypesDuck(duckId, type))]
196+ else nil
174197 let burn = if (burnItem)
175198 then [Burn(fromBase58String(artefactId), 1)]
176199 else [ScriptTransfer(i.caller, 1, fromBase58String(artefactId))]
177- (([DeleteEntry(keyArtefactDuck(duckId, artefactName)), ScriptTransfer(i.caller, 1, duckPayment.assetId), Burn(fromBase58String(roboDuckId), 1)] ++ burn) ++ validPayment)
200+ ((([DeleteEntry(keyArtefactDuck(duckId, artefactName)), ScriptTransfer(i.caller, 1, duckPayment.assetId), Burn(fromBase58String(roboDuckId), 1)] ++ burn) ++ validPayment) ++ typeResult)
178201 }
179202 else throw("Strict value is not equal to itself.")
180203 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func staticKey_oracleAddress () = "static_oracleAddress"
55
66
77 func staticKey_breederAddress () = "static_breederAddress"
88
99
1010 func staticKey_itemsAddress () = "static_itemsAddress"
1111
1212
1313 func staticKey_extraFee () = "static_extraFee"
1414
1515
1616 func staticKey_extraFeeRemove () = "static_extraFeeRemove"
1717
1818
1919 func staticKey_feeAggregator () = "static_feeAggregator"
2020
2121
2222 let wearables = ["ART-CAPE", "ART-HAT", "ART-XSCARF", "ART-XSWEATER"]
2323
2424 func keyArtefactDuck (duckId,wearable) = ((duckId + "_") + wearable)
25+
26+
27+func keyTypesDuck (duckId,type) = ((duckId + "_") + type)
2528
2629
2730 func tryGetStringExternal (address,key) = match getString(address, key) {
2831 case a: String =>
2932 a
3033 case _ =>
3134 ""
3235 }
3336
3437
3538 func tryGetString (key) = tryGetStringExternal(this, key)
3639
3740
3841 func asInt (value) = match value {
3942 case int: Int =>
4043 int
4144 case _ =>
4245 throw("wrong type, expected: Int")
4346 }
4447
4548
4649 func asString (value) = match value {
4750 case string: String =>
4851 string
4952 case _ =>
5053 throw("wrong type, expected: String")
5154 }
5255
5356
5457 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
5558
5659
5760 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
5861
5962
6063 func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
6164
6265
6366 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
6467
6568
6669 func checkAdditionalPayment (payment,amountOverride) = if (isDefined(payment.assetId))
6770 then throw("WCAP: Please attach waves")
6871 else {
6972 let feeAmount = if ((amountOverride != 0))
7073 then amountOverride
7174 else getIntegerValue(getOracle(), staticKey_extraFee())
7275 if ((payment.amount != feeAmount))
7376 then throw((("WCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
7477 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
7578 }
7679
7780
7881 func tryGetCosmeticItem (item) = {
7982 let key = ("direct_cosmetic_" + item)
8083 match getInteger(getItemsAddress(), key) {
8184 case a: Int =>
8285 a
8386 case _ =>
8487 unit
8588 }
8689 }
8790
8891
92+func tryGetType (wearable) = tryGetStringExternal(getItemsAddress(), ("type_cosmetic_" + wearable))
93+
94+
8995 func wearItem (assetIdWearAble,duckId) = {
9096 let artefactName = asString(invoke(getItemsAddress(), "checkArtefactDetails", [assetIdWearAble], nil))
9197 if ((artefactName == artefactName))
9298 then if (if (!(containsElement(wearables, artefactName)))
9399 then !(isDefined(tryGetCosmeticItem(artefactName)))
94100 else false)
95101 then throw("WRITD: Unsupported wearable")
96102 else {
97103 let artefactId = tryGetString(keyArtefactDuck(duckId, artefactName))
98104 let boostDuck = if ((artefactName == "ART-XSCARF"))
99105 then invoke(getItemsAddress(), "manipulateBoost", [69, duckId], nil)
100106 else nil
101107 if ((boostDuck == boostDuck))
102108 then if ((artefactId != ""))
103109 then throw(("Duck is already wearing a " + artefactName))
104- else [StringEntry(keyArtefactDuck(duckId, artefactName), assetIdWearAble)]
110+ else {
111+ let type = tryGetType(artefactName)
112+ let typeOnDuck = if ((type != ""))
113+ then (tryGetString(keyTypesDuck(duckId, type)) != "")
114+ else false
115+ if (typeOnDuck)
116+ then throw("You can only attach 1 from each type to your duck!")
117+ else {
118+ let typeResult = if ((type != ""))
119+ then [StringEntry(keyTypesDuck(duckId, type), assetIdWearAble)]
120+ else nil
121+ ([StringEntry(keyArtefactDuck(duckId, artefactName), assetIdWearAble)] ++ typeResult)
122+ }
123+ }
105124 else throw("Strict value is not equal to itself.")
106125 }
107126 else throw("Strict value is not equal to itself.")
108127 }
109128
110129
111130 @Callable(i)
112131 func configureOracle (oracle) = if ((i.caller != this))
113132 then throw("admin only")
114133 else [StringEntry(staticKey_oracleAddress(), oracle)]
115134
116135
117136
118137 @Callable(i)
119138 func wearItemToDuck () = {
120139 let firstPayment = value(i.payments[0])
121140 let secondPayment = value(i.payments[1])
122141 let validPayment = checkAdditionalPayment(i.payments[2], 0)
123142 let duckId = toBase58String(value(firstPayment.assetId))
124143 let secondAssetId = toBase58String(value(secondPayment.assetId))
125144 if (if ((firstPayment.amount != 1))
126145 then true
127146 else (secondPayment.amount != 1))
128147 then throw("WRITD: NFT is not attached")
129148 else {
130149 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil))
131150 if ((children == children))
132151 then ((wearItem(secondAssetId, duckId) ++ [ScriptTransfer(i.caller, 1, firstPayment.assetId)]) ++ validPayment)
133152 else throw("Strict value is not equal to itself.")
134153 }
135154 }
136155
137156
138157
139158 @Callable(i)
140159 func removeItemFromDuck (burnItem,artefactName) = {
141160 let wavesFee = if (burnItem)
142161 then 0
143162 else getIntegerValue(getOracle(), staticKey_extraFeeRemove())
144163 let duckPayment = value(i.payments[0])
145164 let roboDuckPayment = value(i.payments[1])
146165 let validPayment = checkAdditionalPayment(i.payments[2], wavesFee)
147166 let duckId = toBase58String(value(duckPayment.assetId))
148167 let roboDuckId = toBase58String(value(roboDuckPayment.assetId))
149168 if (if ((duckPayment.amount != 1))
150169 then true
151170 else (roboDuckPayment.amount != 1))
152171 then throw("WRITD: NFT is not attached")
153172 else {
154173 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil))
155174 if ((children == children))
156175 then {
157176 let artefactNameRoboduck = asString(invoke(getItemsAddress(), "checkArtefactDetails", [roboDuckId], nil))
158177 if ((artefactNameRoboduck == artefactNameRoboduck))
159178 then if ((artefactNameRoboduck != "ART-ROBODUCK"))
160179 then throw("Only rododuck can remove items!")
161180 else if (if (!(containsElement(wearables, artefactName)))
162181 then !(isDefined(tryGetCosmeticItem(artefactName)))
163182 else false)
164183 then throw("WRITD: Unsupported wearable")
165184 else {
166185 let artefactId = tryGetString(keyArtefactDuck(duckId, artefactName))
167186 let boostDuck = if ((artefactName == "ART-XSCARF"))
168187 then invoke(getItemsAddress(), "manipulateBoost", [69, duckId], nil)
169188 else nil
170189 if ((boostDuck == boostDuck))
171190 then if ((artefactId == ""))
172191 then throw(("Duck not wearing a " + artefactName))
173192 else {
193+ let type = tryGetType(artefactName)
194+ let typeResult = if ((type != ""))
195+ then [DeleteEntry(keyTypesDuck(duckId, type))]
196+ else nil
174197 let burn = if (burnItem)
175198 then [Burn(fromBase58String(artefactId), 1)]
176199 else [ScriptTransfer(i.caller, 1, fromBase58String(artefactId))]
177- (([DeleteEntry(keyArtefactDuck(duckId, artefactName)), ScriptTransfer(i.caller, 1, duckPayment.assetId), Burn(fromBase58String(roboDuckId), 1)] ++ burn) ++ validPayment)
200+ ((([DeleteEntry(keyArtefactDuck(duckId, artefactName)), ScriptTransfer(i.caller, 1, duckPayment.assetId), Burn(fromBase58String(roboDuckId), 1)] ++ burn) ++ validPayment) ++ typeResult)
178201 }
179202 else throw("Strict value is not equal to itself.")
180203 }
181204 else throw("Strict value is not equal to itself.")
182205 }
183206 else throw("Strict value is not equal to itself.")
184207 }
185208 }
186209
187210
188211
189212 @Callable(i)
190213 func wearXItemsToDuck () = {
191214 let validPayment = checkAdditionalPayment(i.payments[1], 0)
192215 if ((3 > size(i.payments)))
193216 then throw("WWXITD: Please attach at least 1 item and 1 duck!")
194217 else if ((size(i.payments) > 7))
195218 then throw("WWXITD: You can only attach 5 items and one duck!")
196219 else {
197220 func handleItem (acc,payment) = {
198221 let index = indexOf(i.payments, payment)
199222 if ((index == 0))
200223 then {
201224 let duckId = toBase58String(value(payment.assetId))
202225 if ((payment.amount != 1))
203226 then throw("WRITD: Duck is not attached")
204227 else {
205228 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil))
206229 if ((children == children))
207230 then (acc ++ [ScriptTransfer(i.caller, 1, payment.assetId)])
208231 else throw("Strict value is not equal to itself.")
209232 }
210233 }
211234 else (acc ++ wearItem(toBase58String(value(payment.assetId)), toBase58String(value(i.payments[1].assetId))))
212235 }
213236
214237 ({
215238 let $l = i.payments
216239 let $s = size($l)
217240 let $acc0 = nil
218241 func $f0_1 ($a,$i) = if (($i >= $s))
219242 then $a
220243 else handleItem($a, $l[$i])
221244
222245 func $f0_2 ($a,$i) = if (($i >= $s))
223246 then $a
224247 else throw("List size exceeds 6")
225248
226249 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
227250 } ++ validPayment)
228251 }
229252 }
230253
231254

github/deemru/w8io/3ef1775 
37.40 ms