tx · 2XRRdr7ryt1VoNomTUPZ4KvZxXjXSxQTVmGpJ1fqKxDq

3PHUMZkr66B38WxHV1boULaEjjF7giGgVy7:  -0.01000000 Waves

2023.11.03 22:27 [3893418] smart account 3PHUMZkr66B38WxHV1boULaEjjF7giGgVy7 > SELF 0.00000000 Waves

{ "type": 13, "id": "2XRRdr7ryt1VoNomTUPZ4KvZxXjXSxQTVmGpJ1fqKxDq", "fee": 1000000, "feeAssetId": null, "timestamp": 1699039668255, "version": 2, "chainId": 87, "sender": "3PHUMZkr66B38WxHV1boULaEjjF7giGgVy7", "senderPublicKey": "8XKsuJqSe6FsspUz3sPvdADeLpP7e1tfiWx5tt6e674g", "proofs": [ "rveNSP7XFp6pUCR8TEzu9z2RxPdrgzoFymacf164ruyLXTTMtA2js4Kw3MDUWy6gGDdcuyY3cvnJ3M6pkXFqzAZ" ], "script": "base64:BgIRCAISAwoBCBIAEgQKAgQIEgATARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwACFHN0YXRpY19vcmFjbGVBZGRyZXNzARhzdGF0aWNLZXlfYnJlZWRlckFkZHJlc3MAAhVzdGF0aWNfYnJlZWRlckFkZHJlc3MBFnN0YXRpY0tleV9pdGVtc0FkZHJlc3MAAhNzdGF0aWNfaXRlbXNBZGRyZXNzARJzdGF0aWNLZXlfZXh0cmFGZWUAAg9zdGF0aWNfZXh0cmFGZWUBGHN0YXRpY0tleV9leHRyYUZlZVJlbW92ZQACFXN0YXRpY19leHRyYUZlZVJlbW92ZQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAhRzdGF0aWNfZmVlQWdncmVnYXRvcgAJd2VhcmFibGVzCQDMCAICCEFSVC1DQVBFCQDMCAICB0FSVC1IQVQJAMwIAgIKQVJULVhTQ0FSRgkAzAgCAgxBUlQtWFNXRUFURVIFA25pbAEPa2V5QXJ0ZWZhY3REdWNrAgZkdWNrSWQId2VhcmFibGUJAKwCAgkArAICBQZkdWNrSWQCAV8FCHdlYXJhYmxlARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJ0IAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQx0cnlHZXRTdHJpbmcBA2tleQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgUEdGhpcwUDa2V5AQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQhhc1N0cmluZwEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwBQZzdHJpbmcJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABEWdldEJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAEPZ2V0SXRlbXNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEWc3RhdGljS2V5X2l0ZW1zQWRkcmVzcwABEGdldEZlZUFnZ3JlZ2F0b3IACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgABFmNoZWNrQWRkaXRpb25hbFBheW1lbnQCB3BheW1lbnQOYW1vdW50T3ZlcnJpZGUDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkAAgECGVdDQVA6IFBsZWFzZSBhdHRhY2ggd2F2ZXMECWZlZUFtb3VudAMJAQIhPQIFDmFtb3VudE92ZXJyaWRlAAAFDmFtb3VudE92ZXJyaWRlCQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxXQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsARJ0cnlHZXRDb3NtZXRpY0l0ZW0BBGl0ZW0EA2tleQkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtBAckbWF0Y2gwCQCaCAIJAQ9nZXRJdGVtc0FkZHJlc3MABQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhBQR1bml0AQh3ZWFySXRlbQIPYXNzZXRJZFdlYXJBYmxlBmR1Y2tJZAQMYXJ0ZWZhY3ROYW1lCQEIYXNTdHJpbmcBCQD8BwQJAQ9nZXRJdGVtc0FkZHJlc3MAAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBQ9hc3NldElkV2VhckFibGUFA25pbAUDbmlsAwkAAAIFDGFydGVmYWN0TmFtZQUMYXJ0ZWZhY3ROYW1lAwMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFCXdlYXJhYmxlcwUMYXJ0ZWZhY3ROYW1lCQEBIQEJAQlpc0RlZmluZWQBCQESdHJ5R2V0Q29zbWV0aWNJdGVtAQUMYXJ0ZWZhY3ROYW1lBwkAAgECG1dSSVREOiBVbnN1cHBvcnRlZCB3ZWFyYWJsZQQKYXJ0ZWZhY3RJZAkBDHRyeUdldFN0cmluZwEJAQ9rZXlBcnRlZmFjdER1Y2sCBQZkdWNrSWQFDGFydGVmYWN0TmFtZQQJYm9vc3REdWNrAwkAAAIFDGFydGVmYWN0TmFtZQIKQVJULVhTQ0FSRgkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAIPbWFuaXB1bGF0ZUJvb3N0CQDMCAIARQkAzAgCBQZkdWNrSWQFA25pbAUDbmlsBQNuaWwDCQAAAgUJYm9vc3REdWNrBQlib29zdER1Y2sDCQECIT0CBQphcnRlZmFjdElkAgAJAAIBCQCsAgICGkR1Y2sgaXMgYWxyZWFkeSB3ZWFyaW5nIGEgBQxhcnRlZmFjdE5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleUFydGVmYWN0RHVjawIFBmR1Y2tJZAUMYXJ0ZWZhY3ROYW1lBQ9hc3NldElkV2VhckFibGUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQBaQEPY29uZmlndXJlT3JhY2xlAQZvcmFjbGUDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgphZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwAFBm9yYWNsZQUDbmlsAWkBDndlYXJJdGVtVG9EdWNrAAQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEDXNlY29uZFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAIJAJEDAggFAWkIcGF5bWVudHMAAgAABAZkdWNrSWQJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkBA1zZWNvbmRBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQ1zZWNvbmRQYXltZW50B2Fzc2V0SWQDAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQYJAQIhPQIIBQ1zZWNvbmRQYXltZW50BmFtb3VudAABCQACAQIaV1JJVEQ6IE5GVCBpcyBub3QgYXR0YWNoZWQECGNoaWxkcmVuCQEFYXNJbnQBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACFnZhbGlkYXRlQW5kR2V0Q2hpbGRyZW4JAMwIAgUGZHVja0lkBQNuaWwFA25pbAMJAAACBQhjaGlsZHJlbgUIY2hpbGRyZW4JAM4IAgkAzggCCQEId2Vhckl0ZW0CBQ1zZWNvbmRBc3NldElkBQZkdWNrSWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEScmVtb3ZlSXRlbUZyb21EdWNrAghidXJuSXRlbQxhcnRlZmFjdE5hbWUECHdhdmVzRmVlAwUIYnVybkl0ZW0AAAkBEUBleHRyTmF0aXZlKDEwNTApAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfZXh0cmFGZWVSZW1vdmUABAtkdWNrUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABA9yb2JvRHVja1BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAIJAJEDAggFAWkIcGF5bWVudHMAAgUId2F2ZXNGZWUEBmR1Y2tJZAkA2AQBCQEFdmFsdWUBCAULZHVja1BheW1lbnQHYXNzZXRJZAQKcm9ib0R1Y2tJZAkA2AQBCQEFdmFsdWUBCAUPcm9ib0R1Y2tQYXltZW50B2Fzc2V0SWQDAwkBAiE9AggFC2R1Y2tQYXltZW50BmFtb3VudAABBgkBAiE9AggFD3JvYm9EdWNrUGF5bWVudAZhbW91bnQAAQkAAgECGldSSVREOiBORlQgaXMgbm90IGF0dGFjaGVkBAhjaGlsZHJlbgkBBWFzSW50AQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQDMCAIFBmR1Y2tJZAUDbmlsBQNuaWwDCQAAAgUIY2hpbGRyZW4FCGNoaWxkcmVuAwMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFCXdlYXJhYmxlcwUMYXJ0ZWZhY3ROYW1lCQEBIQEJAQlpc0RlZmluZWQBCQESdHJ5R2V0Q29zbWV0aWNJdGVtAQUMYXJ0ZWZhY3ROYW1lBwkAAgECG1dSSVREOiBVbnN1cHBvcnRlZCB3ZWFyYWJsZQQKYXJ0ZWZhY3RJZAkBDHRyeUdldFN0cmluZwEJAQ9rZXlBcnRlZmFjdER1Y2sCBQZkdWNrSWQFDGFydGVmYWN0TmFtZQQJYm9vc3REdWNrAwkAAAIFDGFydGVmYWN0TmFtZQIKQVJULVhTQ0FSRgkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAIPbWFuaXB1bGF0ZUJvb3N0CQDMCAIARQkAzAgCBQZkdWNrSWQFA25pbAUDbmlsBQNuaWwDCQAAAgUJYm9vc3REdWNrBQlib29zdER1Y2sDCQAAAgUKYXJ0ZWZhY3RJZAIACQACAQkArAICAhNEdWNrIG5vdCB3ZWFyaW5nIGEgBQxhcnRlZmFjdE5hbWUEBGJ1cm4DBQhidXJuSXRlbQkAzAgCCQEEQnVybgIJANkEAQUKYXJ0ZWZhY3RJZAABBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEJANkEAQUKYXJ0ZWZhY3RJZAUDbmlsCQDOCAIJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQEPa2V5QXJ0ZWZhY3REdWNrAgUGZHVja0lkBQxhcnRlZmFjdE5hbWUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEIBQtkdWNrUGF5bWVudAdhc3NldElkCQDMCAIJAQRCdXJuAgkA2QQBBQpyb2JvRHVja0lkAAEFA25pbAUEYnVybgUMdmFsaWRQYXltZW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEHdlYXJYSXRlbXNUb0R1Y2sABAx2YWxpZFBheW1lbnQJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AgkAkQMCCAUBaQhwYXltZW50cwABAAADCQBmAgADCQCQAwEIBQFpCHBheW1lbnRzCQACAQIxV1dYSVREOiBQbGVhc2UgYXR0YWNoIGF0IGxlYXN0IDEgaXRlbSBhbmQgMSBkdWNrIQMJAGYCCQCQAwEIBQFpCHBheW1lbnRzAAcJAAIBAjFXV1hJVEQ6IFlvdSBjYW4gb25seSBhdHRhY2ggNSBpdGVtcyBhbmQgb25lIGR1Y2shCgEKaGFuZGxlSXRlbQIDYWNjB3BheW1lbnQEBWluZGV4CQDPCAIIBQFpCHBheW1lbnRzBQdwYXltZW50AwkAAAIFBWluZGV4AAAEBmR1Y2tJZAkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkAwkBAiE9AggFB3BheW1lbnQGYW1vdW50AAEJAAIBAhtXUklURDogRHVjayBpcyBub3QgYXR0YWNoZWQECGNoaWxkcmVuCQEFYXNJbnQBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACFnZhbGlkYXRlQW5kR2V0Q2hpbGRyZW4JAMwIAgUGZHVja0lkBQNuaWwFA25pbAMJAAACBQhjaGlsZHJlbgUIY2hpbGRyZW4JAM4IAgUDYWNjCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABCAUHcGF5bWVudAdhc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAM4IAgUDYWNjCQEId2Vhckl0ZW0CCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQJANgEAQkBBXZhbHVlAQgJAJEDAggFAWkIcGF5bWVudHMAAQdhc3NldElkCQDOCAIKAAIkbAgFAWkIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCmhhbmRsZUl0ZW0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYFDHZhbGlkUGF5bWVudAB+h24O", "height": 3893418, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Hg9Nbhp9Pd9q7aJ6FYeHNm6YU846JobcHifHGmnBSirZ Next: 9x2YtvA7GH6RXteGd5AKxAqsHmrm4bZYWqyKcoZVBnRd 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 if (if (!(containsElement(wearables, artefactName)))
157+ then !(isDefined(tryGetCosmeticItem(artefactName)))
158+ else false)
159+ then throw("WRITD: Unsupported wearable")
160+ else {
161+ let artefactId = tryGetString(keyArtefactDuck(duckId, artefactName))
162+ let boostDuck = if ((artefactName == "ART-XSCARF"))
163+ then invoke(getItemsAddress(), "manipulateBoost", [69, duckId], nil)
164+ else nil
165+ if ((boostDuck == boostDuck))
166+ then if ((artefactId == ""))
167+ then throw(("Duck not wearing a " + artefactName))
168+ else {
169+ let burn = if (burnItem)
170+ then [Burn(fromBase58String(artefactId), 1)]
171+ else [ScriptTransfer(i.caller, 1, fromBase58String(artefactId))]
172+ (([DeleteEntry(keyArtefactDuck(duckId, artefactName)), ScriptTransfer(i.caller, 1, duckPayment.assetId), Burn(fromBase58String(roboDuckId), 1)] ++ burn) ++ validPayment)
173+ }
174+ else throw("Strict value is not equal to itself.")
175+ }
176+ else throw("Strict value is not equal to itself.")
177+ }
178+ }
179+
180+
181+
182+@Callable(i)
135183 func wearXItemsToDuck () = {
136- let validPayment = checkAdditionalPayment(i.payments[1])
184+ let validPayment = checkAdditionalPayment(i.payments[1], 0)
137185 if ((3 > size(i.payments)))
138186 then throw("WWXITD: Please attach at least 1 item and 1 duck!")
139187 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 if (if (!(containsElement(wearables, artefactName)))
157+ then !(isDefined(tryGetCosmeticItem(artefactName)))
158+ else false)
159+ then throw("WRITD: Unsupported wearable")
160+ else {
161+ let artefactId = tryGetString(keyArtefactDuck(duckId, artefactName))
162+ let boostDuck = if ((artefactName == "ART-XSCARF"))
163+ then invoke(getItemsAddress(), "manipulateBoost", [69, duckId], nil)
164+ else nil
165+ if ((boostDuck == boostDuck))
166+ then if ((artefactId == ""))
167+ then throw(("Duck not wearing a " + artefactName))
168+ else {
169+ let burn = if (burnItem)
170+ then [Burn(fromBase58String(artefactId), 1)]
171+ else [ScriptTransfer(i.caller, 1, fromBase58String(artefactId))]
172+ (([DeleteEntry(keyArtefactDuck(duckId, artefactName)), ScriptTransfer(i.caller, 1, duckPayment.assetId), Burn(fromBase58String(roboDuckId), 1)] ++ burn) ++ validPayment)
173+ }
174+ else throw("Strict value is not equal to itself.")
175+ }
176+ else throw("Strict value is not equal to itself.")
177+ }
178+ }
179+
180+
181+
182+@Callable(i)
135183 func wearXItemsToDuck () = {
136- let validPayment = checkAdditionalPayment(i.payments[1])
184+ let validPayment = checkAdditionalPayment(i.payments[1], 0)
137185 if ((3 > size(i.payments)))
138186 then throw("WWXITD: Please attach at least 1 item and 1 duck!")
139187 else if ((size(i.payments) > 7))
140188 then throw("WWXITD: You can only attach 5 items and one duck!")
141189 else {
142190 func handleItem (acc,payment) = {
143191 let index = indexOf(i.payments, payment)
144192 if ((index == 0))
145193 then {
146194 let duckId = toBase58String(value(payment.assetId))
147195 if ((payment.amount != 1))
148196 then throw("WRITD: Duck is not attached")
149197 else {
150198 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil))
151199 if ((children == children))
152200 then (acc ++ [ScriptTransfer(i.caller, 1, payment.assetId)])
153201 else throw("Strict value is not equal to itself.")
154202 }
155203 }
156204 else (acc ++ wearItem(toBase58String(value(payment.assetId)), toBase58String(value(i.payments[1].assetId))))
157205 }
158206
159207 ({
160208 let $l = i.payments
161209 let $s = size($l)
162210 let $acc0 = nil
163211 func $f0_1 ($a,$i) = if (($i >= $s))
164212 then $a
165213 else handleItem($a, $l[$i])
166214
167215 func $f0_2 ($a,$i) = if (($i >= $s))
168216 then $a
169217 else throw("List size exceeds 6")
170218
171219 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
172220 } ++ validPayment)
173221 }
174222 }
175223
176224

github/deemru/w8io/3ef1775 
43.69 ms