tx · 2Avaau5fL31P6GuMkKeDY9mzmS76SsaK6328ZaPvqAsv

3PCxXZk5r9nL8ppcqRjDAqeYWzRQSDapxWw:  -0.01000000 Waves

2023.11.07 19:00 [3898970] smart account 3PCxXZk5r9nL8ppcqRjDAqeYWzRQSDapxWw > SELF 0.00000000 Waves

{ "type": 13, "id": "2Avaau5fL31P6GuMkKeDY9mzmS76SsaK6328ZaPvqAsv", "fee": 1000000, "feeAssetId": null, "timestamp": 1699372832782, "version": 2, "chainId": 87, "sender": "3PCxXZk5r9nL8ppcqRjDAqeYWzRQSDapxWw", "senderPublicKey": "7HScgnyFhXBghV1HNiksyihGxZhYeyoGPr5Lp4jBiabf", "proofs": [ "3Qhp3HEHCw5veXusyHNno8qu3XMQzxqxhtSF8ZvMjJ2b3QxRt8inWukZED4onHsUMzm2B1xdsPeRNBot7uKbzd3w" ], "script": "base64:BgIRCAISAwoBCBIAEgQKAgQIEgATARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwACFHN0YXRpY19vcmFjbGVBZGRyZXNzARhzdGF0aWNLZXlfYnJlZWRlckFkZHJlc3MAAhVzdGF0aWNfYnJlZWRlckFkZHJlc3MBFnN0YXRpY0tleV9pdGVtc0FkZHJlc3MAAhNzdGF0aWNfaXRlbXNBZGRyZXNzARJzdGF0aWNLZXlfZXh0cmFGZWUAAg9zdGF0aWNfZXh0cmFGZWUBGHN0YXRpY0tleV9leHRyYUZlZVJlbW92ZQACFXN0YXRpY19leHRyYUZlZVJlbW92ZQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAhRzdGF0aWNfZmVlQWdncmVnYXRvcgAJd2VhcmFibGVzCQDMCAICCEFSVC1DQVBFCQDMCAICB0FSVC1IQVQJAMwIAgIKQVJULVhTQ0FSRgkAzAgCAgxBUlQtWFNXRUFURVIFA25pbAEPa2V5QXJ0ZWZhY3REdWNrAgZkdWNrSWQId2VhcmFibGUJAKwCAgkArAICBQZkdWNrSWQCAV8FCHdlYXJhYmxlARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJ0IAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQx0cnlHZXRTdHJpbmcBA2tleQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgUEdGhpcwUDa2V5AQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQhhc1N0cmluZwEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwBQZzdHJpbmcJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABEWdldEJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAEPZ2V0SXRlbXNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEWc3RhdGljS2V5X2l0ZW1zQWRkcmVzcwABEGdldEZlZUFnZ3JlZ2F0b3IACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgABFmNoZWNrQWRkaXRpb25hbFBheW1lbnQCB3BheW1lbnQOYW1vdW50T3ZlcnJpZGUDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkAAgECGVdDQVA6IFBsZWFzZSBhdHRhY2ggd2F2ZXMECWZlZUFtb3VudAMJAQIhPQIFDmFtb3VudE92ZXJyaWRlAAAFDmFtb3VudE92ZXJyaWRlCQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxXQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsARJ0cnlHZXRDb3NtZXRpY0l0ZW0BBGl0ZW0EA2tleQkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtBAckbWF0Y2gwCQCaCAIJAQ9nZXRJdGVtc0FkZHJlc3MABQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhBQR1bml0AQh3ZWFySXRlbQIPYXNzZXRJZFdlYXJBYmxlBmR1Y2tJZAQMYXJ0ZWZhY3ROYW1lCQEIYXNTdHJpbmcBCQD8BwQJAQ9nZXRJdGVtc0FkZHJlc3MAAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBQ9hc3NldElkV2VhckFibGUFA25pbAUDbmlsAwkAAAIFDGFydGVmYWN0TmFtZQUMYXJ0ZWZhY3ROYW1lAwMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFCXdlYXJhYmxlcwUMYXJ0ZWZhY3ROYW1lCQEBIQEJAQlpc0RlZmluZWQBCQESdHJ5R2V0Q29zbWV0aWNJdGVtAQUMYXJ0ZWZhY3ROYW1lBwkAAgECG1dSSVREOiBVbnN1cHBvcnRlZCB3ZWFyYWJsZQQKYXJ0ZWZhY3RJZAkBDHRyeUdldFN0cmluZwEJAQ9rZXlBcnRlZmFjdER1Y2sCBQZkdWNrSWQFDGFydGVmYWN0TmFtZQQJYm9vc3REdWNrAwkAAAIFDGFydGVmYWN0TmFtZQIKQVJULVhTQ0FSRgkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAIPbWFuaXB1bGF0ZUJvb3N0CQDMCAIARQkAzAgCBQZkdWNrSWQFA25pbAUDbmlsBQNuaWwDCQAAAgUJYm9vc3REdWNrBQlib29zdER1Y2sDCQECIT0CBQphcnRlZmFjdElkAgAJAAIBCQCsAgICGkR1Y2sgaXMgYWxyZWFkeSB3ZWFyaW5nIGEgBQxhcnRlZmFjdE5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleUFydGVmYWN0RHVjawIFBmR1Y2tJZAUMYXJ0ZWZhY3ROYW1lBQ9hc3NldElkV2VhckFibGUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQBaQEPY29uZmlndXJlT3JhY2xlAQZvcmFjbGUDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgphZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwAFBm9yYWNsZQUDbmlsAWkBDndlYXJJdGVtVG9EdWNrAAQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEDXNlY29uZFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAIJAJEDAggFAWkIcGF5bWVudHMAAgAABAZkdWNrSWQJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkBA1zZWNvbmRBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQ1zZWNvbmRQYXltZW50B2Fzc2V0SWQDAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQYJAQIhPQIIBQ1zZWNvbmRQYXltZW50BmFtb3VudAABCQACAQIaV1JJVEQ6IE5GVCBpcyBub3QgYXR0YWNoZWQECGNoaWxkcmVuCQEFYXNJbnQBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACFnZhbGlkYXRlQW5kR2V0Q2hpbGRyZW4JAMwIAgUGZHVja0lkBQNuaWwFA25pbAMJAAACBQhjaGlsZHJlbgUIY2hpbGRyZW4JAM4IAgkAzggCCQEId2Vhckl0ZW0CBQ1zZWNvbmRBc3NldElkBQZkdWNrSWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEScmVtb3ZlSXRlbUZyb21EdWNrAghidXJuSXRlbQxhcnRlZmFjdE5hbWUECHdhdmVzRmVlAwUIYnVybkl0ZW0AAAkBEUBleHRyTmF0aXZlKDEwNTApAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfZXh0cmFGZWVSZW1vdmUABAtkdWNrUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABA9yb2JvRHVja1BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAIJAJEDAggFAWkIcGF5bWVudHMAAgUId2F2ZXNGZWUEBmR1Y2tJZAkA2AQBCQEFdmFsdWUBCAULZHVja1BheW1lbnQHYXNzZXRJZAQKcm9ib0R1Y2tJZAkA2AQBCQEFdmFsdWUBCAUPcm9ib0R1Y2tQYXltZW50B2Fzc2V0SWQDAwkBAiE9AggFC2R1Y2tQYXltZW50BmFtb3VudAABBgkBAiE9AggFD3JvYm9EdWNrUGF5bWVudAZhbW91bnQAAQkAAgECGldSSVREOiBORlQgaXMgbm90IGF0dGFjaGVkBAhjaGlsZHJlbgkBBWFzSW50AQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQDMCAIFBmR1Y2tJZAUDbmlsBQNuaWwDCQAAAgUIY2hpbGRyZW4FCGNoaWxkcmVuBBRhcnRlZmFjdE5hbWVSb2JvZHVjawkBCGFzU3RyaW5nAQkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgUKcm9ib0R1Y2tJZAUDbmlsBQNuaWwDCQAAAgUUYXJ0ZWZhY3ROYW1lUm9ib2R1Y2sFFGFydGVmYWN0TmFtZVJvYm9kdWNrAwkBAiE9AgUUYXJ0ZWZhY3ROYW1lUm9ib2R1Y2sCDEFSVC1ST0JPRFVDSwkAAgECH09ubHkgcm9kb2R1Y2sgY2FuIHJlbW92ZSBpdGVtcyEDAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUJd2VhcmFibGVzBQxhcnRlZmFjdE5hbWUJAQEhAQkBCWlzRGVmaW5lZAEJARJ0cnlHZXRDb3NtZXRpY0l0ZW0BBQxhcnRlZmFjdE5hbWUHCQACAQIbV1JJVEQ6IFVuc3VwcG9ydGVkIHdlYXJhYmxlBAphcnRlZmFjdElkCQEMdHJ5R2V0U3RyaW5nAQkBD2tleUFydGVmYWN0RHVjawIFBmR1Y2tJZAUMYXJ0ZWZhY3ROYW1lBAlib29zdER1Y2sDCQAAAgUMYXJ0ZWZhY3ROYW1lAgpBUlQtWFNDQVJGCQD8BwQJAQ9nZXRJdGVtc0FkZHJlc3MAAg9tYW5pcHVsYXRlQm9vc3QJAMwIAgBFCQDMCAIFBmR1Y2tJZAUDbmlsBQNuaWwFA25pbAMJAAACBQlib29zdER1Y2sFCWJvb3N0RHVjawMJAAACBQphcnRlZmFjdElkAgAJAAIBCQCsAgICE0R1Y2sgbm90IHdlYXJpbmcgYSAFDGFydGVmYWN0TmFtZQQEYnVybgMFCGJ1cm5JdGVtCQDMCAIJAQRCdXJuAgkA2QQBBQphcnRlZmFjdElkAAEFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQkA2QQBBQphcnRlZmFjdElkBQNuaWwJAM4IAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ9rZXlBcnRlZmFjdER1Y2sCBQZkdWNrSWQFDGFydGVmYWN0TmFtZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQgFC2R1Y2tQYXltZW50B2Fzc2V0SWQJAMwIAgkBBEJ1cm4CCQDZBAEFCnJvYm9EdWNrSWQAAQUDbmlsBQRidXJuBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQd2VhclhJdGVtc1RvRHVjawAEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQCCQCRAwIIBQFpCHBheW1lbnRzAAEAAAMJAGYCAAMJAJADAQgFAWkIcGF5bWVudHMJAAIBAjFXV1hJVEQ6IFBsZWFzZSBhdHRhY2ggYXQgbGVhc3QgMSBpdGVtIGFuZCAxIGR1Y2shAwkAZgIJAJADAQgFAWkIcGF5bWVudHMABwkAAgECMVdXWElURDogWW91IGNhbiBvbmx5IGF0dGFjaCA1IGl0ZW1zIGFuZCBvbmUgZHVjayEKAQpoYW5kbGVJdGVtAgNhY2MHcGF5bWVudAQFaW5kZXgJAM8IAggFAWkIcGF5bWVudHMFB3BheW1lbnQDCQAAAgUFaW5kZXgAAAQGZHVja0lkCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQDCQECIT0CCAUHcGF5bWVudAZhbW91bnQAAQkAAgECG1dSSVREOiBEdWNrIGlzIG5vdCBhdHRhY2hlZAQIY2hpbGRyZW4JAQVhc0ludAEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWdmFsaWRhdGVBbmRHZXRDaGlsZHJlbgkAzAgCBQZkdWNrSWQFA25pbAUDbmlsAwkAAAIFCGNoaWxkcmVuBQhjaGlsZHJlbgkAzggCBQNhY2MJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEIBQdwYXltZW50B2Fzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzggCBQNhY2MJAQh3ZWFySXRlbQIJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAkA2AQBCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwABB2Fzc2V0SWQJAM4IAgoAAiRsCAUBaQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKaGFuZGxlSXRlbQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgUMdmFsaWRQYXltZW50AAWHGBk=", "height": 3898970, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EEzPwx5VcDrC956R8euGyKFyovTLqjN9zoQz8zL5w1fw Next: 3cJXtNADwN5rrKqKuas4Q7hczHSaeyYQpz4TzpezAXVK Diff:
OldNewDifferences
1111
1212
1313 func staticKey_extraFee () = "static_extraFee"
14+
15+
16+func staticKey_extraFeeRemove () = "static_extraFeeRemove"
1417
1518
1619 func staticKey_feeAggregator () = "static_feeAggregator"
6063 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
6164
6265
63-func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
66+func checkAdditionalPayment (payment,amountOverride) = if (isDefined(payment.assetId))
6467 then throw("WCAP: Please attach waves")
6568 else {
66- let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
69+ let feeAmount = if ((amountOverride != 0))
70+ then amountOverride
71+ else getIntegerValue(getOracle(), staticKey_extraFee())
6772 if ((payment.amount != feeAmount))
6873 then throw((("WCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
6974 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
114119 func wearItemToDuck () = {
115120 let firstPayment = value(i.payments[0])
116121 let secondPayment = value(i.payments[1])
117- let validPayment = checkAdditionalPayment(i.payments[2])
122+ let validPayment = checkAdditionalPayment(i.payments[2], 0)
118123 let duckId = toBase58String(value(firstPayment.assetId))
119124 let secondAssetId = toBase58String(value(secondPayment.assetId))
120125 if (if ((firstPayment.amount != 1))
132137
133138
134139 @Callable(i)
140+func removeItemFromDuck (burnItem,artefactName) = {
141+ let wavesFee = if (burnItem)
142+ then 0
143+ else getIntegerValue(getOracle(), staticKey_extraFeeRemove())
144+ let duckPayment = value(i.payments[0])
145+ let roboDuckPayment = value(i.payments[1])
146+ let validPayment = checkAdditionalPayment(i.payments[2], wavesFee)
147+ let duckId = toBase58String(value(duckPayment.assetId))
148+ let roboDuckId = toBase58String(value(roboDuckPayment.assetId))
149+ if (if ((duckPayment.amount != 1))
150+ then true
151+ else (roboDuckPayment.amount != 1))
152+ then throw("WRITD: NFT is not attached")
153+ else {
154+ let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil))
155+ if ((children == children))
156+ then {
157+ let artefactNameRoboduck = asString(invoke(getItemsAddress(), "checkArtefactDetails", [roboDuckId], nil))
158+ if ((artefactNameRoboduck == artefactNameRoboduck))
159+ then if ((artefactNameRoboduck != "ART-ROBODUCK"))
160+ then throw("Only rododuck can remove items!")
161+ else if (if (!(containsElement(wearables, artefactName)))
162+ then !(isDefined(tryGetCosmeticItem(artefactName)))
163+ else false)
164+ then throw("WRITD: Unsupported wearable")
165+ else {
166+ let artefactId = tryGetString(keyArtefactDuck(duckId, artefactName))
167+ let boostDuck = if ((artefactName == "ART-XSCARF"))
168+ then invoke(getItemsAddress(), "manipulateBoost", [69, duckId], nil)
169+ else nil
170+ if ((boostDuck == boostDuck))
171+ then if ((artefactId == ""))
172+ then throw(("Duck not wearing a " + artefactName))
173+ else {
174+ let burn = if (burnItem)
175+ then [Burn(fromBase58String(artefactId), 1)]
176+ else [ScriptTransfer(i.caller, 1, fromBase58String(artefactId))]
177+ (([DeleteEntry(keyArtefactDuck(duckId, artefactName)), ScriptTransfer(i.caller, 1, duckPayment.assetId), Burn(fromBase58String(roboDuckId), 1)] ++ burn) ++ validPayment)
178+ }
179+ else throw("Strict value is not equal to itself.")
180+ }
181+ else throw("Strict value is not equal to itself.")
182+ }
183+ else throw("Strict value is not equal to itself.")
184+ }
185+ }
186+
187+
188+
189+@Callable(i)
135190 func wearXItemsToDuck () = {
136- let validPayment = checkAdditionalPayment(i.payments[1])
191+ let validPayment = checkAdditionalPayment(i.payments[1], 0)
137192 if ((3 > size(i.payments)))
138193 then throw("WWXITD: Please attach at least 1 item and 1 duck!")
139194 else if ((size(i.payments) > 7))
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"
14+
15+
16+func staticKey_extraFeeRemove () = "static_extraFeeRemove"
1417
1518
1619 func staticKey_feeAggregator () = "static_feeAggregator"
1720
1821
1922 let wearables = ["ART-CAPE", "ART-HAT", "ART-XSCARF", "ART-XSWEATER"]
2023
2124 func keyArtefactDuck (duckId,wearable) = ((duckId + "_") + wearable)
2225
2326
2427 func tryGetStringExternal (address,key) = match getString(address, key) {
2528 case a: String =>
2629 a
2730 case _ =>
2831 ""
2932 }
3033
3134
3235 func tryGetString (key) = tryGetStringExternal(this, key)
3336
3437
3538 func asInt (value) = match value {
3639 case int: Int =>
3740 int
3841 case _ =>
3942 throw("wrong type, expected: Int")
4043 }
4144
4245
4346 func asString (value) = match value {
4447 case string: String =>
4548 string
4649 case _ =>
4750 throw("wrong type, expected: String")
4851 }
4952
5053
5154 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
5255
5356
5457 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
5558
5659
5760 func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
5861
5962
6063 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
6164
6265
63-func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
66+func checkAdditionalPayment (payment,amountOverride) = if (isDefined(payment.assetId))
6467 then throw("WCAP: Please attach waves")
6568 else {
66- let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
69+ let feeAmount = if ((amountOverride != 0))
70+ then amountOverride
71+ else getIntegerValue(getOracle(), staticKey_extraFee())
6772 if ((payment.amount != feeAmount))
6873 then throw((("WCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
6974 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
7075 }
7176
7277
7378 func tryGetCosmeticItem (item) = {
7479 let key = ("direct_cosmetic_" + item)
7580 match getInteger(getItemsAddress(), key) {
7681 case a: Int =>
7782 a
7883 case _ =>
7984 unit
8085 }
8186 }
8287
8388
8489 func wearItem (assetIdWearAble,duckId) = {
8590 let artefactName = asString(invoke(getItemsAddress(), "checkArtefactDetails", [assetIdWearAble], nil))
8691 if ((artefactName == artefactName))
8792 then if (if (!(containsElement(wearables, artefactName)))
8893 then !(isDefined(tryGetCosmeticItem(artefactName)))
8994 else false)
9095 then throw("WRITD: Unsupported wearable")
9196 else {
9297 let artefactId = tryGetString(keyArtefactDuck(duckId, artefactName))
9398 let boostDuck = if ((artefactName == "ART-XSCARF"))
9499 then invoke(getItemsAddress(), "manipulateBoost", [69, duckId], nil)
95100 else nil
96101 if ((boostDuck == boostDuck))
97102 then if ((artefactId != ""))
98103 then throw(("Duck is already wearing a " + artefactName))
99104 else [StringEntry(keyArtefactDuck(duckId, artefactName), assetIdWearAble)]
100105 else throw("Strict value is not equal to itself.")
101106 }
102107 else throw("Strict value is not equal to itself.")
103108 }
104109
105110
106111 @Callable(i)
107112 func configureOracle (oracle) = if ((i.caller != this))
108113 then throw("admin only")
109114 else [StringEntry(staticKey_oracleAddress(), oracle)]
110115
111116
112117
113118 @Callable(i)
114119 func wearItemToDuck () = {
115120 let firstPayment = value(i.payments[0])
116121 let secondPayment = value(i.payments[1])
117- let validPayment = checkAdditionalPayment(i.payments[2])
122+ let validPayment = checkAdditionalPayment(i.payments[2], 0)
118123 let duckId = toBase58String(value(firstPayment.assetId))
119124 let secondAssetId = toBase58String(value(secondPayment.assetId))
120125 if (if ((firstPayment.amount != 1))
121126 then true
122127 else (secondPayment.amount != 1))
123128 then throw("WRITD: NFT is not attached")
124129 else {
125130 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil))
126131 if ((children == children))
127132 then ((wearItem(secondAssetId, duckId) ++ [ScriptTransfer(i.caller, 1, firstPayment.assetId)]) ++ validPayment)
128133 else throw("Strict value is not equal to itself.")
129134 }
130135 }
131136
132137
133138
134139 @Callable(i)
140+func removeItemFromDuck (burnItem,artefactName) = {
141+ let wavesFee = if (burnItem)
142+ then 0
143+ else getIntegerValue(getOracle(), staticKey_extraFeeRemove())
144+ let duckPayment = value(i.payments[0])
145+ let roboDuckPayment = value(i.payments[1])
146+ let validPayment = checkAdditionalPayment(i.payments[2], wavesFee)
147+ let duckId = toBase58String(value(duckPayment.assetId))
148+ let roboDuckId = toBase58String(value(roboDuckPayment.assetId))
149+ if (if ((duckPayment.amount != 1))
150+ then true
151+ else (roboDuckPayment.amount != 1))
152+ then throw("WRITD: NFT is not attached")
153+ else {
154+ let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil))
155+ if ((children == children))
156+ then {
157+ let artefactNameRoboduck = asString(invoke(getItemsAddress(), "checkArtefactDetails", [roboDuckId], nil))
158+ if ((artefactNameRoboduck == artefactNameRoboduck))
159+ then if ((artefactNameRoboduck != "ART-ROBODUCK"))
160+ then throw("Only rododuck can remove items!")
161+ else if (if (!(containsElement(wearables, artefactName)))
162+ then !(isDefined(tryGetCosmeticItem(artefactName)))
163+ else false)
164+ then throw("WRITD: Unsupported wearable")
165+ else {
166+ let artefactId = tryGetString(keyArtefactDuck(duckId, artefactName))
167+ let boostDuck = if ((artefactName == "ART-XSCARF"))
168+ then invoke(getItemsAddress(), "manipulateBoost", [69, duckId], nil)
169+ else nil
170+ if ((boostDuck == boostDuck))
171+ then if ((artefactId == ""))
172+ then throw(("Duck not wearing a " + artefactName))
173+ else {
174+ let burn = if (burnItem)
175+ then [Burn(fromBase58String(artefactId), 1)]
176+ else [ScriptTransfer(i.caller, 1, fromBase58String(artefactId))]
177+ (([DeleteEntry(keyArtefactDuck(duckId, artefactName)), ScriptTransfer(i.caller, 1, duckPayment.assetId), Burn(fromBase58String(roboDuckId), 1)] ++ burn) ++ validPayment)
178+ }
179+ else throw("Strict value is not equal to itself.")
180+ }
181+ else throw("Strict value is not equal to itself.")
182+ }
183+ else throw("Strict value is not equal to itself.")
184+ }
185+ }
186+
187+
188+
189+@Callable(i)
135190 func wearXItemsToDuck () = {
136- let validPayment = checkAdditionalPayment(i.payments[1])
191+ let validPayment = checkAdditionalPayment(i.payments[1], 0)
137192 if ((3 > size(i.payments)))
138193 then throw("WWXITD: Please attach at least 1 item and 1 duck!")
139194 else if ((size(i.payments) > 7))
140195 then throw("WWXITD: You can only attach 5 items and one duck!")
141196 else {
142197 func handleItem (acc,payment) = {
143198 let index = indexOf(i.payments, payment)
144199 if ((index == 0))
145200 then {
146201 let duckId = toBase58String(value(payment.assetId))
147202 if ((payment.amount != 1))
148203 then throw("WRITD: Duck is not attached")
149204 else {
150205 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil))
151206 if ((children == children))
152207 then (acc ++ [ScriptTransfer(i.caller, 1, payment.assetId)])
153208 else throw("Strict value is not equal to itself.")
154209 }
155210 }
156211 else (acc ++ wearItem(toBase58String(value(payment.assetId)), toBase58String(value(i.payments[1].assetId))))
157212 }
158213
159214 ({
160215 let $l = i.payments
161216 let $s = size($l)
162217 let $acc0 = nil
163218 func $f0_1 ($a,$i) = if (($i >= $s))
164219 then $a
165220 else handleItem($a, $l[$i])
166221
167222 func $f0_2 ($a,$i) = if (($i >= $s))
168223 then $a
169224 else throw("List size exceeds 6")
170225
171226 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
172227 } ++ validPayment)
173228 }
174229 }
175230
176231

github/deemru/w8io/3ef1775 
67.28 ms