tx · FWvrcnQr966wcUvd7mFgieYb8t4XZSeuj8aMUcaxV2eA 3PR87TwfWio6HVUScSaHGMnFYkGyaVdFeqT: -0.01400000 Waves 2021.10.18 14:51 [2816647] smart account 3PR87TwfWio6HVUScSaHGMnFYkGyaVdFeqT > SELF 0.00000000 Waves
{ "type": 13, "id": "FWvrcnQr966wcUvd7mFgieYb8t4XZSeuj8aMUcaxV2eA", "fee": 1400000, "feeAssetId": null, "timestamp": 1634557891504, "version": 2, "chainId": 87, "sender": "3PR87TwfWio6HVUScSaHGMnFYkGyaVdFeqT", "senderPublicKey": "DvzM1HgWkv7KTs8nozoqi2VnCgL56k1kFNgpTCYNqt9S", "proofs": [ "3ykohVmc3GFBDGSojwgWnZnxRj66gQW3jbkx4ePvcmZHuCDPYFSPYL83MmKnmwCVoFL2w9UczhxitLJPoHaW14ta" ], "script": "base64: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bnRsZU5GVAkABEIAAAAFAgAAAA1EVUNLLU1BTlRMRS0wAgAAACBbQXJ0ZWZhY3RdIE1hbnRsZSBORlQgZm9yIEplZHVjawAAAAAAAAAAAQAAAAAAAAAAAAcEAAAAC21hbnRsZU5mdElkCQAEOAAAAAEFAAAADmlzc3VlTWFudGxlTkZUBAAAAAxrTWFudGxlTGV2ZWwJAQAAABBrZXlBcnRlZmFjdExldmVsAAAAAwUAAAAKTUFOVExFTkFNRQkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAC21hbnRsZU5mdElkBAAAAA1rTWFudGxlRXhpc3RzCQEAAAARa2V5QXJ0ZWZhY3RFeGlzdHMAAAACBQAAAApNQU5UTEVOQU1FBQAAAAttYW50bGVOZnRJZAQAAAAMa01hbnRsZU93bmVyCQEAAAAQa2V5QXJ0ZWZhY3RPd25lcgAAAAIFAAAACk1BTlRMRU5BTUUFAAAAC21hbnRsZU5mdElkBAAAAA1rTWFudGxlU3RhdHVzCQEAAAARa2V5QXJ0ZWZhY3RTdGF0dXMAAAACBQAAAApNQU5UTEVOQU1FBQAAAAttYW50bGVOZnRJZAQAAAANa0FydGVmYWN0VHlwZQkBAAAAD2tleUFydGVmYWN0VHlwZQAAAAEFAAAAC21hbnRsZU5mdElkBAAAAA9rTWFudGxlSW52ZXN0ZWQJAQAAABNrZXlBcnRlZmFjdEludmVzdGVkAAAAAgUAAAAKTUFOVExFTkFNRQkAAlgAAAABBQAAAAttYW50bGVOZnRJZAQAAAAXa0FydGVmYWN0T3duZXJBbmRTdGF0dXMJAQAAABlrZXlBcnRlZmFjdE93bmVyQW5kU3RhdHVzAAAAAwUAAAAKTUFOVExFTkFNRQkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAC21hbnRsZU5mdElkBAAAABJrT25seUFydGVmYWN0TGV2ZWwJAQAAABRrZXlPbmx5QXJ0ZWZhY3RMZXZlbAAAAAEFAAAAC21hbnRsZU5mdElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAxrTWFudGxlTGV2ZWwAAAAAAAAAAAEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAD2tNYW50bGVJbnZlc3RlZAUAAAALTUFOVExFUFJJQ0UJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAADWtNYW50bGVFeGlzdHMGCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADGtNYW50bGVPd25lcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAANa01hbnRsZVN0YXR1cwUAAAAKU1RBVFVTRlJFRQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA1rQXJ0ZWZhY3RUeXBlBQAAAApNQU5UTEVOQU1FCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAF2tBcnRlZmFjdE93bmVyQW5kU3RhdHVzBQAAAApTVEFUVVNGUkVFCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJrT25seUFydGVmYWN0TGV2ZWwAAAAAAAAAAAEFAAAAA25pbAAAAAFpAQAAAA11cGdyYWRlTWFudGxlAAAAAQAAAAphcnRlZmFjdElkBAAAABF1cGdyYWRlUG9pbnRQcmljZQAAAAAAAA9CQAQAAAAMZmlyc3RQYXltZW50CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAwkBAAAAAiE9AAAAAggFAAAADGZpcnN0UGF5bWVudAAAAAdhc3NldElkBQAAAAplZ2dBc3NldElkCQAAAgAAAAEJAAEsAAAAAgIAAAA8WW91IGNhbiBhdHRhY2ggb25seSBFR0cgdG9rZW5zIHdpdGggdGhlIGZvbGxvd2luZyBhc3NldCBpZDogCQACWAAAAAEFAAAACmVnZ0Fzc2V0SWQDCQAAZgAAAAIFAAAAEXVwZ3JhZGVQb2ludFByaWNlCAUAAAAMZmlyc3RQYXltZW50AAAABmFtb3VudAkAAAIAAAABCQABLAAAAAICAAAAKU1pbmltYWwgcGF5bWVudCBmb3IgdXBncmFkaW5nIG1hbnRsZSBpczogCQABpAAAAAEFAAAAEXVwZ3JhZGVQb2ludFByaWNlBAAAAA1rTWFudGxlRXhpc3RzCQEAAAARa2V5QXJ0ZWZhY3RFeGlzdHMAAAACBQAAAApNQU5UTEVOQU1FCQACWQAAAAEFAAAACmFydGVmYWN0SWQEAAAADGtNYW50bGVPd25lcgkBAAAAEGtleUFydGVmYWN0T3duZXIAAAACBQAAAApNQU5UTEVOQU1FCQACWQAAAAEFAAAACmFydGVmYWN0SWQEAAAADG1hbnRsZUV4aXN0cwkBAAAAEUBleHRyTmF0aXZlKDEwNTYpAAAAAQUAAAANa01hbnRsZUV4aXN0cwQAAAALbWFudGxlT3duZXIJAQAAABFAZXh0ck5hdGl2ZSgxMDU4KQAAAAEFAAAADGtNYW50bGVPd25lcgMJAQAAAAEhAAAAAQUAAAAMbWFudGxlRXhpc3RzCQAAAgAAAAECAAAAJU1hbnRsZSB3aXRoIHN1Y2ggYW4gSUQgZG9lcyBub3QgZXhpc3QDCQEAAAACIT0AAAACBQAAAAttYW50bGVPd25lcgkABCUAAAABCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIJAAACAAAAAQIAAAAhWW91J3JlIG5vdCBhbiBvd25lciBvZiB0aGUgbWFudGxlBAAAAA9rTWFudGxlSW52ZXN0ZWQJAQAAABNrZXlBcnRlZmFjdEludmVzdGVkAAAAAgUAAAAKTUFOVExFTkFNRQUAAAAKYXJ0ZWZhY3RJZAQAAAAVbWFudGxlQWxyZWFkeUludmVzdGVkCQEAAAARQGV4dHJOYXRpdmUoMTA1NSkAAAABBQAAAA9rTWFudGxlSW52ZXN0ZWQEAAAADGtNYW50bGVMZXZlbAkBAAAAEGtleUFydGVmYWN0TGV2ZWwAAAADBQAAAApNQU5UTEVOQU1FCQAEJQAAAAEIBQAAAAFpAAAADG9yaWdpbkNhbGxlcgkAAlkAAAABBQAAAAphcnRlZmFjdElkBAAAABJrT25seUFydGVmYWN0TGV2ZWwJAQAAABRrZXlPbmx5QXJ0ZWZhY3RMZXZlbAAAAAEJAAJZAAAAAQUAAAAKYXJ0ZWZhY3RJZAQAAAANdG90YWxJbnZlc3RlZAkAAGQAAAACBQAAABVtYW50bGVBbHJlYWR5SW52ZXN0ZWQIBQAAAAxmaXJzdFBheW1lbnQAAAAGYW1vdW50BAAAAAhuZXdMZXZlbAkAAGkAAAACCQAAZAAAAAIJAABoAAAAAgAAAAAAAAAACgkAAGwAAAAGBQAAAA10b3RhbEludmVzdGVkAAAAAAAAAAAIAAAAAAAAAAAGAAAAAAAAAAABAAAAAAAAAAAIBQAAAAZIQUxGVVAAAAAAAAX14QAAAAAAAAX14QAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADGtNYW50bGVMZXZlbAUAAAAIbmV3TGV2ZWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAD2tNYW50bGVJbnZlc3RlZAUAAAANdG90YWxJbnZlc3RlZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAASa09ubHlBcnRlZmFjdExldmVsBQAAAAhuZXdMZXZlbAUAAAADbmlsAAAAAWkBAAAADXB1dE9uQXJ0ZWZhY3QAAAABAAAACmFydGVmYWN0SWQEAAAADGZpcnN0UGF5bWVudAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAARYXR0YWNoZWRBc3NldEluZm8JAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQkBAAAABXZhbHVlAAAAAQgFAAAADGZpcnN0UGF5bWVudAAAAAdhc3NldElkAwMJAQAAAAIhPQAAAAIICAUAAAARYXR0YWNoZWRBc3NldEluZm8AAAAGaXNzdWVyAAAABWJ5dGVzBQAAABFpbmN1YmF0b3JDb250cmFjdAkBAAAAAiE9AAAAAggIBQAAABFhdHRhY2hlZEFzc2V0SW5mbwAAAAZpc3N1ZXIAAAAFYnl0ZXMFAAAAD2JyZWVkZXJDb250cmFjdAcJAAACAAAAAQIAAAA5WW91IGNhbiBhdHRhY2ggb25seSBEVUNLcyBpc3N1ZWQgYnkgaW5jdWJhdG9yIG9yIGJyZWVkZXIgBAAAAA1rTWFudGxlRXhpc3RzCQEAAAARa2V5QXJ0ZWZhY3RFeGlzdHMAAAACBQAAAApNQU5UTEVOQU1FCQACWQAAAAEFAAAACmFydGVmYWN0SWQEAAAADGtNYW50bGVPd25lcgkBAAAAEGtleUFydGVmYWN0T3duZXIAAAACBQAAAApNQU5UTEVOQU1FCQACWQAAAAEFAAAACmFydGVmYWN0SWQEAAAADWtNYW50bGVTdGF0dXMJAQAAABFrZXlBcnRlZmFjdFN0YXR1cwAAAAIFAAAACk1BTlRMRU5BTUUJAAJZAAAAAQUAAAAKYXJ0ZWZhY3RJZAQAAAAXa0FydGVmYWN0T3duZXJBbmRTdGF0dXMJAQAAABlrZXlBcnRlZmFjdE93bmVyQW5kU3RhdHVzAAAAAwUAAAAKTUFOVExFTkFNRQkABCUAAAABCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIJAAJZAAAAAQUAAAAKYXJ0ZWZhY3RJZAQAAAAJa0R1Y2tMb2NrCQEAAAALa2V5RHVja0xvY2sAAAACCQAEJQAAAAEIBQAAAAFpAAAADG9yaWdpbkNhbGxlcgkAAlgAAAABCQEAAAAFdmFsdWUAAAABCAUAAAAMZmlyc3RQYXltZW50AAAAB2Fzc2V0SWQEAAAADG1hbnRsZUV4aXN0cwkBAAAAEUBleHRyTmF0aXZlKDEwNTYpAAAAAQUAAAANa01hbnRsZUV4aXN0cwQAAAALbWFudGxlT3duZXIJAQAAABFAZXh0ck5hdGl2ZSgxMDU4KQAAAAEFAAAADGtNYW50bGVPd25lcgQAAAAMbWFudGxlU3RhdHVzCQEAAAARQGV4dHJOYXRpdmUoMTA1OCkAAAABBQAAAA1rTWFudGxlU3RhdHVzBAAAABFrQXJ0ZWZhY3RJZEJ5VHlwZQkBAAAAGmtleUFydGVmYWN0SWRCeUR1Y2tBbmRUeXBlAAAAAgUAAAAKTUFOVExFTkFNRQkBAAAABXZhbHVlAAAAAQgFAAAADGZpcnN0UGF5bWVudAAAAAdhc3NldElkAwkBAAAAASEAAAABBQAAAAxtYW50bGVFeGlzdHMJAAACAAAAAQIAAAAlTWFudGxlIHdpdGggc3VjaCBhbiBJRCBkb2VzIG5vdCBleGlzdAMJAQAAAAIhPQAAAAIFAAAAC21hbnRsZU93bmVyCQAEJQAAAAEIBQAAAAFpAAAADG9yaWdpbkNhbGxlcgkAAAIAAAABAgAAACFZb3UncmUgbm90IGFuIG93bmVyIG9mIHRoZSBtYW50bGUDCQEAAAACIT0AAAACBQAAAAxtYW50bGVTdGF0dXMFAAAAClNUQVRVU0ZSRUUJAAACAAAAAQIAAAAXTWFudGxlIGlzIGFscmVhZHkgdXNlZCEEAAAADmtQdXRPbkFydGVmYWN0CQEAAAAQa2V5UHV0T25BcnRlZmFjdAAAAAQFAAAACk1BTlRMRU5BTUUJAAQlAAAAAQgFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyCQACWAAAAAEJAQAAAAV2YWx1ZQAAAAEIBQAAAAxmaXJzdFBheW1lbnQAAAAHYXNzZXRJZAkAAlkAAAABBQAAAAphcnRlZmFjdElkCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAA5rUHV0T25BcnRlZmFjdAYJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAANa01hbnRsZVN0YXR1cwUAAAAOU1RBVFVTT0NDVVBJRUQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAXa0FydGVmYWN0T3duZXJBbmRTdGF0dXMFAAAADlNUQVRVU09DQ1VQSUVECQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAlrRHVja0xvY2sGCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAEWtBcnRlZmFjdElkQnlUeXBlBQAAAAphcnRlZmFjdElkBQAAAANuaWwAAAABaQEAAAAPdGFrZU9mZkFydGVmYWN0AAAAAgAAAAZkdWNrSWQAAAAMYXJ0ZWZhY3RUeXBlBAAAABhrQXJ0ZWZhY3RJZEJ5VHlwZUFuZER1Y2sJAQAAABprZXlBcnRlZmFjdElkQnlEdWNrQW5kVHlwZQAAAAIFAAAADGFydGVmYWN0VHlwZQkAAlkAAAABBQAAAAZkdWNrSWQEAAAACmFydGVmYWN0SWQJAQAAABFAZXh0ck5hdGl2ZSgxMDU4KQAAAAEFAAAAGGtBcnRlZmFjdElkQnlUeXBlQW5kRHVjawQAAAANa0FydGVmYWN0VHlwZQkBAAAAD2tleUFydGVmYWN0VHlwZQAAAAEJAAJZAAAAAQUAAAAKYXJ0ZWZhY3RJZAQAAAAOa1B1dE9uQXJ0ZWZhY3QJAQAAABBrZXlQdXRPbkFydGVmYWN0AAAABAUAAAAMYXJ0ZWZhY3RUeXBlCQAEJQAAAAEIBQAAAAFpAAAADG9yaWdpbkNhbGxlcgUAAAAGZHVja0lkCQACWQAAAAEFAAAACmFydGVmYWN0SWQEAAAAFGtQdXRPbkFydGVmYWN0U3RhdHVzCQEAAAARQGV4dHJOYXRpdmUoMTA1NikAAAABBQAAAA5rUHV0T25BcnRlZmFjdAQAAAAXa0FydGVmYWN0T3duZXJBbmRTdGF0dXMJAQAAABlrZXlBcnRlZmFjdE93bmVyQW5kU3RhdHVzAAAAAwUAAAAMYXJ0ZWZhY3RUeXBlCQAEJQAAAAEIBQAAAAFpAAAADG9yaWdpbkNhbGxlcgkAAlkAAAABBQAAAAphcnRlZmFjdElkBAAAAAlrRHVja0xvY2sJAQAAAAtrZXlEdWNrTG9jawAAAAIJAAQlAAAAAQgFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyBQAAAAZkdWNrSWQEAAAADWtNYW50bGVTdGF0dXMJAQAAABFrZXlBcnRlZmFjdFN0YXR1cwAAAAIFAAAADGFydGVmYWN0VHlwZQkAAlkAAAABBQAAAAphcnRlZmFjdElkAwkBAAAAAiE9AAAAAgUAAAAUa1B1dE9uQXJ0ZWZhY3RTdGF0dXMGCQAAAgAAAAECAAAAJlRoZXJlIGlzIG5vIGR1Y2sgd2l0aCBzdWNoIHBhcmFtZXRlcmVzCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAADmtQdXRPbkFydGVmYWN0CQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAAGGtBcnRlZmFjdElkQnlUeXBlQW5kRHVjawkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAAlrRHVja0xvY2sJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAANa01hbnRsZVN0YXR1cwUAAAAKU1RBVFVTRlJFRQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABdrQXJ0ZWZhY3RPd25lckFuZFN0YXR1cwUAAAAKU1RBVFVTRlJFRQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIAAAAAAAAAAAEJAAJZAAAAAQUAAAAGZHVja0lkBQAAAANuaWwAAAABaQEAAAAQdW5sb2NrTmZ0Rm9yV2FycwAAAAEAAAAEa2V5cwMJAQAAAAIhPQAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQEAAAAgD3csaoTE7s0q+LUFTqhxhL0WVCTh231y++NV3LUuGBIJAAACAAAAAQIAAAAXQ2Fubm90IGNhbGwgdGhpcyBtZXRob2QEAAAACGtleXNMaXN0CQAEtQAAAAIFAAAABGtleXMCAAAAATsDCQAAZgAAAAIJAAGQAAAAAQUAAAAIa2V5c0xpc3QAAAAAAAAAAAoJAAACAAAAAQIAAAA3WW91IGNhbm5vdCB1bmxvY2sgbW9yZSB0aGFuIDEwIGR1Y2tzIGluIG9uZSB0cmFuc2FjdGlvbgoBAAAAE2hhbmRsZVVubG9ja09uZUR1Y2sAAAACAAAABWFjY3VtAAAAA2tleQQAAAAJa0R1Y2tMb2NrCQAEtQAAAAIFAAAAA2tleQIAAAABXwkABE4AAAACBQAAAAVhY2N1bQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAANrZXkJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAABXZhbHVlAAAAAQkAAZEAAAACBQAAAAlrRHVja0xvY2sAAAAAAAAAAAEAAAAAAAAAAAEJAAJZAAAAAQkBAAAABXZhbHVlAAAAAQkAAZEAAAACBQAAAAlrRHVja0xvY2sAAAAAAAAAAAMFAAAAA25pbAoAAAAAAiRsBQAAAAhrZXlzTGlzdAoAAAAAAiRzCQABkAAAAAEFAAAAAiRsCgAAAAAFJGFjYzAFAAAAA25pbAoBAAAAATEAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQEAAAATaGFuZGxlVW5sb2NrT25lRHVjawAAAAIFAAAAAiRhCQABkQAAAAIFAAAAAiRsBQAAAAIkaQoBAAAAATIAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQAAAgAAAAECAAAAFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEAAAABMgAAAAIJAQAAAAExAAAAAgkBAAAAATEAAAACCQEAAAABMQAAAAIJAQAAAAExAAAAAgkBAAAAATEAAAACCQEAAAABMQAAAAIJAQAAAAExAAAAAgkBAAAAATEAAAACCQEAAAABMQAAAAIJAQAAAAExAAAAAgUAAAAFJGFjYzAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAIAAAAAAAAAAAMAAAAAAAAAAAQAAAAAAAAAAAUAAAAAAAAAAAYAAAAAAAAAAAcAAAAAAAAAAAgAAAAAAAAAAAkAAAAAAAAAAAoAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAACQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleQvAQGA=", "height": 2816647, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: B8TZKnnnYgzvq3mu8LbBC3MBLLnuez6nbZxsDXbcXAW7 Next: 4upyY3bhk9de1fu6BSGkbYphdfb4gDBHVkmHiebuyH9T Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let breederContract = base58' | |
4 | + | let breederContract = base58'3P9REuLBnYBafDqtEu6hfzs2Rv2haSU158y' | |
5 | 5 | ||
6 | - | let incubatorContract = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv' | |
6 | + | let incubatorContract = base58'3P6TwNU39Ykkbeqhn5TE4a2736xsA1vXemM' | |
7 | + | ||
8 | + | let eggAssetId = base58'3v7zGkeHS6KrsvmTRzEzvCxm5cdzkCtM7z5cM6efcjCB' | |
9 | + | ||
10 | + | let MANTLENAME = "mantle" | |
11 | + | ||
12 | + | let STATUSFREE = "FREE" | |
13 | + | ||
14 | + | let STATUSOCCUPIED = "OCCUPIED" | |
7 | 15 | ||
8 | 16 | func keyDuckLock (callerAddress,duckId) = (((("address_" + callerAddress) + "_duck_") + duckId) + "_status") | |
9 | 17 | ||
10 | 18 | ||
19 | + | func keyInvestor (callerAddress) = (("address_" + callerAddress) + "_amount") | |
20 | + | ||
21 | + | ||
22 | + | func keyArtefactInvested (type,artefactId) = (((("artefact_" + type) + "_artefactId_") + artefactId) + "_invested") | |
23 | + | ||
24 | + | ||
25 | + | func keyOnlyArtefactLevel (artefactId) = (("artefactId_" + toBase58String(artefactId)) + "_level") | |
26 | + | ||
27 | + | ||
28 | + | func keyArtefactIdByDuckAndType (type,duckId) = (((("artefact_ " + type) + "_duck_") + toBase58String(duckId)) + "_artefactId") | |
29 | + | ||
30 | + | ||
31 | + | func keyArtefactOwner (type,artefactId) = (((("artefact_ " + type) + "_artefactId_") + toBase58String(artefactId)) + "_owner") | |
32 | + | ||
33 | + | ||
34 | + | func keyArtefactOwnerAndStatus (type,owner,artefactId) = (((((("address_" + owner) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_status") | |
35 | + | ||
36 | + | ||
37 | + | func keyArtefactStatus (type,artefactId) = (((("artefact_ " + type) + "_artefactId_") + toBase58String(artefactId)) + "_status") | |
38 | + | ||
39 | + | ||
40 | + | func keyArtefactType (artefactId) = (("artefactId_" + toBase58String(artefactId)) + "_type") | |
41 | + | ||
42 | + | ||
43 | + | func keyArtefactLevel (type,owner,artefactId) = (((((("address_" + owner) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_level") | |
44 | + | ||
45 | + | ||
46 | + | func keyPutOnArtefact (type,owner,duckId,artefactId) = (((((((("address_" + owner) + "_duck_") + duckId) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_status") | |
47 | + | ||
48 | + | ||
49 | + | func keyArtefactExists (type,artefactId) = ((("artefact_" + type) + "_artefactId_") + toBase58String(artefactId)) | |
50 | + | ||
51 | + | ||
11 | 52 | @Callable(i) | |
12 | - | func lockNftForWars () = { | |
13 | - | func handlePayment (accum,payment) = { | |
14 | - | let assetId = value(payment.assetId) | |
15 | - | let nft = valueOrErrorMessage(assetInfo(assetId), ("There is not asset with such an id " + toBase58String(assetId))) | |
16 | - | if (if ((nft.issuer != Address(breederContract))) | |
17 | - | then (nft.issuer != Address(incubatorContract)) | |
18 | - | else false) | |
19 | - | then throw("NFT was NOT issued by WavesDucks contracts") | |
20 | - | else { | |
21 | - | let kDuckLock = keyDuckLock(toString(i.originCaller), toBase58String(assetId)) | |
22 | - | (accum ++ [BooleanEntry(kDuckLock, true)]) | |
23 | - | } | |
53 | + | func buyArtefact (type) = if ((type != MANTLENAME)) | |
54 | + | then throw("You can buy only mantles now") | |
55 | + | else { | |
56 | + | let MANTLEPRICE = 1000000 | |
57 | + | let firstPayment = value(i.payments[0]) | |
58 | + | if ((firstPayment.assetId != eggAssetId)) | |
59 | + | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggAssetId))) | |
60 | + | else if ((firstPayment.amount != MANTLEPRICE)) | |
61 | + | then throw(("To buy a mantle you currently need the following amount of EGGlets: " + toString(MANTLEPRICE))) | |
62 | + | else { | |
63 | + | let issueMantleNFT = Issue("DUCK-MANTLE-0", "[Artefact] Mantle NFT for Jeduck", 1, 0, false) | |
64 | + | let mantleNftId = calculateAssetId(issueMantleNFT) | |
65 | + | let kMantleLevel = keyArtefactLevel(MANTLENAME, toString(i.caller), mantleNftId) | |
66 | + | let kMantleExists = keyArtefactExists(MANTLENAME, mantleNftId) | |
67 | + | let kMantleOwner = keyArtefactOwner(MANTLENAME, mantleNftId) | |
68 | + | let kMantleStatus = keyArtefactStatus(MANTLENAME, mantleNftId) | |
69 | + | let kArtefactType = keyArtefactType(mantleNftId) | |
70 | + | let kMantleInvested = keyArtefactInvested(MANTLENAME, toBase58String(mantleNftId)) | |
71 | + | let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.caller), mantleNftId) | |
72 | + | let kOnlyArtefactLevel = keyOnlyArtefactLevel(mantleNftId) | |
73 | + | [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)] | |
74 | + | } | |
24 | 75 | } | |
25 | 76 | ||
26 | - | let $l = i.payments | |
27 | - | let $s = size($l) | |
28 | - | let $acc0 = nil | |
29 | - | func 1 ($a,$i) = if (($i >= $s)) | |
30 | - | then $a | |
31 | - | else handlePayment($a, $l[$i]) | |
32 | 77 | ||
33 | - | func 2 ($a,$i) = if (($i >= $s)) | |
34 | - | then $a | |
35 | - | else throw("List size exceeds 10") | |
36 | 78 | ||
37 | - | 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
79 | + | @Callable(i) | |
80 | + | func upgradeMantle (artefactId) = { | |
81 | + | let upgradePointPrice = 1000000 | |
82 | + | let firstPayment = value(i.payments[0]) | |
83 | + | if ((firstPayment.assetId != eggAssetId)) | |
84 | + | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggAssetId))) | |
85 | + | else if ((upgradePointPrice > firstPayment.amount)) | |
86 | + | then throw(("Minimal payment for upgrading mantle is: " + toString(upgradePointPrice))) | |
87 | + | else { | |
88 | + | let kMantleExists = keyArtefactExists(MANTLENAME, fromBase58String(artefactId)) | |
89 | + | let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(artefactId)) | |
90 | + | let mantleExists = getBooleanValue(kMantleExists) | |
91 | + | let mantleOwner = getStringValue(kMantleOwner) | |
92 | + | if (!(mantleExists)) | |
93 | + | then throw("Mantle with such an ID does not exist") | |
94 | + | else if ((mantleOwner != toString(i.originCaller))) | |
95 | + | then throw("You're not an owner of the mantle") | |
96 | + | else { | |
97 | + | let kMantleInvested = keyArtefactInvested(MANTLENAME, artefactId) | |
98 | + | let mantleAlreadyInvested = getIntegerValue(kMantleInvested) | |
99 | + | let kMantleLevel = keyArtefactLevel(MANTLENAME, toString(i.originCaller), fromBase58String(artefactId)) | |
100 | + | let kOnlyArtefactLevel = keyOnlyArtefactLevel(fromBase58String(artefactId)) | |
101 | + | let totalInvested = (mantleAlreadyInvested + firstPayment.amount) | |
102 | + | let newLevel = (((10 * pow(totalInvested, 8, 6, 1, 8, HALFUP)) + 100000000) / 100000000) | |
103 | + | [IntegerEntry(kMantleLevel, newLevel), IntegerEntry(kMantleInvested, totalInvested), IntegerEntry(kOnlyArtefactLevel, newLevel)] | |
104 | + | } | |
105 | + | } | |
38 | 106 | } | |
39 | 107 | ||
40 | 108 | ||
41 | 109 | ||
42 | 110 | @Callable(i) | |
43 | - | func unlockNftForWars (duckIds) = { | |
44 | - | let duckIdsList = split(duckIds, ";") | |
45 | - | if ((size(duckIdsList) > 10)) | |
46 | - | then throw("You cannot unlock more than 10 ducks in one transaction") | |
111 | + | func putOnArtefact (artefactId) = { | |
112 | + | let firstPayment = value(i.payments[0]) | |
113 | + | let attachedAssetInfo = value(assetInfo(value(firstPayment.assetId))) | |
114 | + | if (if ((attachedAssetInfo.issuer.bytes != incubatorContract)) | |
115 | + | then (attachedAssetInfo.issuer.bytes != breederContract) | |
116 | + | else false) | |
117 | + | then throw("You can attach only DUCKs issued by incubator or breeder ") | |
47 | 118 | else { | |
48 | - | func handleUnlockOneDuck (accum,duckId) = { | |
49 | - | let kDuckLock = keyDuckLock(toString(i.originCaller), duckId) | |
50 | - | let duckLockedValue = getBoolean(this, kDuckLock) | |
51 | - | let duckIsLocked = match duckLockedValue { | |
52 | - | case t: Boolean => | |
53 | - | t | |
54 | - | case _ => | |
55 | - | false | |
56 | - | } | |
57 | - | if ((duckIsLocked == false)) | |
58 | - | then throw(("Whhhhat, the duck is not locked by you: " + duckId)) | |
59 | - | else (accum ++ [DeleteEntry(kDuckLock), ScriptTransfer(i.originCaller, 1, fromBase58String(duckId))]) | |
60 | - | } | |
61 | - | ||
62 | - | let $l = duckIdsList | |
63 | - | let $s = size($l) | |
64 | - | let $acc0 = nil | |
65 | - | func 1 ($a,$i) = if (($i >= $s)) | |
66 | - | then $a | |
67 | - | else handleUnlockOneDuck($a, $l[$i]) | |
68 | - | ||
69 | - | func 2 ($a,$i) = if (($i >= $s)) | |
70 | - | then $a | |
71 | - | else throw("List size exceeds 10") | |
72 | - | ||
73 | - | 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
119 | + | let kMantleExists = keyArtefactExists(MANTLENAME, fromBase58String(artefactId)) | |
120 | + | let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(artefactId)) | |
121 | + | let kMantleStatus = keyArtefactStatus(MANTLENAME, fromBase58String(artefactId)) | |
122 | + | let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.originCaller), fromBase58String(artefactId)) | |
123 | + | let kDuckLock = keyDuckLock(toString(i.originCaller), toBase58String(value(firstPayment.assetId))) | |
124 | + | let mantleExists = getBooleanValue(kMantleExists) | |
125 | + | let mantleOwner = getStringValue(kMantleOwner) | |
126 | + | let mantleStatus = getStringValue(kMantleStatus) | |
127 | + | let kArtefactIdByType = keyArtefactIdByDuckAndType(MANTLENAME, value(firstPayment.assetId)) | |
128 | + | if (!(mantleExists)) | |
129 | + | then throw("Mantle with such an ID does not exist") | |
130 | + | else if ((mantleOwner != toString(i.originCaller))) | |
131 | + | then throw("You're not an owner of the mantle") | |
132 | + | else if ((mantleStatus != STATUSFREE)) | |
133 | + | then throw("Mantle is already used!") | |
134 | + | else { | |
135 | + | let kPutOnArtefact = keyPutOnArtefact(MANTLENAME, toString(i.originCaller), toBase58String(value(firstPayment.assetId)), fromBase58String(artefactId)) | |
136 | + | [BooleanEntry(kPutOnArtefact, true), StringEntry(kMantleStatus, STATUSOCCUPIED), StringEntry(kArtefactOwnerAndStatus, STATUSOCCUPIED), BooleanEntry(kDuckLock, true), StringEntry(kArtefactIdByType, artefactId)] | |
137 | + | } | |
74 | 138 | } | |
75 | 139 | } | |
140 | + | ||
141 | + | ||
142 | + | ||
143 | + | @Callable(i) | |
144 | + | func takeOffArtefact (duckId,artefactType) = { | |
145 | + | let kArtefactIdByTypeAndDuck = keyArtefactIdByDuckAndType(artefactType, fromBase58String(duckId)) | |
146 | + | let artefactId = getStringValue(kArtefactIdByTypeAndDuck) | |
147 | + | let kArtefactType = keyArtefactType(fromBase58String(artefactId)) | |
148 | + | let kPutOnArtefact = keyPutOnArtefact(artefactType, toString(i.originCaller), duckId, fromBase58String(artefactId)) | |
149 | + | let kPutOnArtefactStatus = getBooleanValue(kPutOnArtefact) | |
150 | + | let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(artefactType, toString(i.originCaller), fromBase58String(artefactId)) | |
151 | + | let kDuckLock = keyDuckLock(toString(i.originCaller), duckId) | |
152 | + | let kMantleStatus = keyArtefactStatus(artefactType, fromBase58String(artefactId)) | |
153 | + | if ((kPutOnArtefactStatus != true)) | |
154 | + | then throw("There is no duck with such parameteres") | |
155 | + | else [DeleteEntry(kPutOnArtefact), DeleteEntry(kArtefactIdByTypeAndDuck), DeleteEntry(kDuckLock), StringEntry(kMantleStatus, STATUSFREE), StringEntry(kArtefactOwnerAndStatus, STATUSFREE), ScriptTransfer(i.originCaller, 1, fromBase58String(duckId))] | |
156 | + | } | |
157 | + | ||
158 | + | ||
159 | + | ||
160 | + | @Callable(i) | |
161 | + | func unlockNftForWars (keys) = if ((i.callerPublicKey != base58'23NWm7kUDQqbTVkirjd5JXWRZaWVoS4ZesmRNHicBa3T')) | |
162 | + | then throw("Cannot call this method") | |
163 | + | else { | |
164 | + | let keysList = split(keys, ";") | |
165 | + | if ((size(keysList) > 10)) | |
166 | + | then throw("You cannot unlock more than 10 ducks in one transaction") | |
167 | + | else { | |
168 | + | func handleUnlockOneDuck (accum,key) = { | |
169 | + | let kDuckLock = split(key, "_") | |
170 | + | (accum ++ [DeleteEntry(key), ScriptTransfer(addressFromStringValue(value(kDuckLock[1])), 1, fromBase58String(value(kDuckLock[3])))]) | |
171 | + | } | |
172 | + | ||
173 | + | let $l = keysList | |
174 | + | let $s = size($l) | |
175 | + | let $acc0 = nil | |
176 | + | func 1 ($a,$i) = if (($i >= $s)) | |
177 | + | then $a | |
178 | + | else handleUnlockOneDuck($a, $l[$i]) | |
179 | + | ||
180 | + | func 2 ($a,$i) = if (($i >= $s)) | |
181 | + | then $a | |
182 | + | else throw("List size exceeds 10") | |
183 | + | ||
184 | + | 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
185 | + | } | |
186 | + | } | |
76 | 187 | ||
77 | 188 | ||
78 | 189 | @Verifier(tx) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let breederContract = base58' | |
4 | + | let breederContract = base58'3P9REuLBnYBafDqtEu6hfzs2Rv2haSU158y' | |
5 | 5 | ||
6 | - | let incubatorContract = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv' | |
6 | + | let incubatorContract = base58'3P6TwNU39Ykkbeqhn5TE4a2736xsA1vXemM' | |
7 | + | ||
8 | + | let eggAssetId = base58'3v7zGkeHS6KrsvmTRzEzvCxm5cdzkCtM7z5cM6efcjCB' | |
9 | + | ||
10 | + | let MANTLENAME = "mantle" | |
11 | + | ||
12 | + | let STATUSFREE = "FREE" | |
13 | + | ||
14 | + | let STATUSOCCUPIED = "OCCUPIED" | |
7 | 15 | ||
8 | 16 | func keyDuckLock (callerAddress,duckId) = (((("address_" + callerAddress) + "_duck_") + duckId) + "_status") | |
9 | 17 | ||
10 | 18 | ||
19 | + | func keyInvestor (callerAddress) = (("address_" + callerAddress) + "_amount") | |
20 | + | ||
21 | + | ||
22 | + | func keyArtefactInvested (type,artefactId) = (((("artefact_" + type) + "_artefactId_") + artefactId) + "_invested") | |
23 | + | ||
24 | + | ||
25 | + | func keyOnlyArtefactLevel (artefactId) = (("artefactId_" + toBase58String(artefactId)) + "_level") | |
26 | + | ||
27 | + | ||
28 | + | func keyArtefactIdByDuckAndType (type,duckId) = (((("artefact_ " + type) + "_duck_") + toBase58String(duckId)) + "_artefactId") | |
29 | + | ||
30 | + | ||
31 | + | func keyArtefactOwner (type,artefactId) = (((("artefact_ " + type) + "_artefactId_") + toBase58String(artefactId)) + "_owner") | |
32 | + | ||
33 | + | ||
34 | + | func keyArtefactOwnerAndStatus (type,owner,artefactId) = (((((("address_" + owner) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_status") | |
35 | + | ||
36 | + | ||
37 | + | func keyArtefactStatus (type,artefactId) = (((("artefact_ " + type) + "_artefactId_") + toBase58String(artefactId)) + "_status") | |
38 | + | ||
39 | + | ||
40 | + | func keyArtefactType (artefactId) = (("artefactId_" + toBase58String(artefactId)) + "_type") | |
41 | + | ||
42 | + | ||
43 | + | func keyArtefactLevel (type,owner,artefactId) = (((((("address_" + owner) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_level") | |
44 | + | ||
45 | + | ||
46 | + | func keyPutOnArtefact (type,owner,duckId,artefactId) = (((((((("address_" + owner) + "_duck_") + duckId) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_status") | |
47 | + | ||
48 | + | ||
49 | + | func keyArtefactExists (type,artefactId) = ((("artefact_" + type) + "_artefactId_") + toBase58String(artefactId)) | |
50 | + | ||
51 | + | ||
11 | 52 | @Callable(i) | |
12 | - | func lockNftForWars () = { | |
13 | - | func handlePayment (accum,payment) = { | |
14 | - | let assetId = value(payment.assetId) | |
15 | - | let nft = valueOrErrorMessage(assetInfo(assetId), ("There is not asset with such an id " + toBase58String(assetId))) | |
16 | - | if (if ((nft.issuer != Address(breederContract))) | |
17 | - | then (nft.issuer != Address(incubatorContract)) | |
18 | - | else false) | |
19 | - | then throw("NFT was NOT issued by WavesDucks contracts") | |
20 | - | else { | |
21 | - | let kDuckLock = keyDuckLock(toString(i.originCaller), toBase58String(assetId)) | |
22 | - | (accum ++ [BooleanEntry(kDuckLock, true)]) | |
23 | - | } | |
53 | + | func buyArtefact (type) = if ((type != MANTLENAME)) | |
54 | + | then throw("You can buy only mantles now") | |
55 | + | else { | |
56 | + | let MANTLEPRICE = 1000000 | |
57 | + | let firstPayment = value(i.payments[0]) | |
58 | + | if ((firstPayment.assetId != eggAssetId)) | |
59 | + | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggAssetId))) | |
60 | + | else if ((firstPayment.amount != MANTLEPRICE)) | |
61 | + | then throw(("To buy a mantle you currently need the following amount of EGGlets: " + toString(MANTLEPRICE))) | |
62 | + | else { | |
63 | + | let issueMantleNFT = Issue("DUCK-MANTLE-0", "[Artefact] Mantle NFT for Jeduck", 1, 0, false) | |
64 | + | let mantleNftId = calculateAssetId(issueMantleNFT) | |
65 | + | let kMantleLevel = keyArtefactLevel(MANTLENAME, toString(i.caller), mantleNftId) | |
66 | + | let kMantleExists = keyArtefactExists(MANTLENAME, mantleNftId) | |
67 | + | let kMantleOwner = keyArtefactOwner(MANTLENAME, mantleNftId) | |
68 | + | let kMantleStatus = keyArtefactStatus(MANTLENAME, mantleNftId) | |
69 | + | let kArtefactType = keyArtefactType(mantleNftId) | |
70 | + | let kMantleInvested = keyArtefactInvested(MANTLENAME, toBase58String(mantleNftId)) | |
71 | + | let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.caller), mantleNftId) | |
72 | + | let kOnlyArtefactLevel = keyOnlyArtefactLevel(mantleNftId) | |
73 | + | [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)] | |
74 | + | } | |
24 | 75 | } | |
25 | 76 | ||
26 | - | let $l = i.payments | |
27 | - | let $s = size($l) | |
28 | - | let $acc0 = nil | |
29 | - | func 1 ($a,$i) = if (($i >= $s)) | |
30 | - | then $a | |
31 | - | else handlePayment($a, $l[$i]) | |
32 | 77 | ||
33 | - | func 2 ($a,$i) = if (($i >= $s)) | |
34 | - | then $a | |
35 | - | else throw("List size exceeds 10") | |
36 | 78 | ||
37 | - | 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
79 | + | @Callable(i) | |
80 | + | func upgradeMantle (artefactId) = { | |
81 | + | let upgradePointPrice = 1000000 | |
82 | + | let firstPayment = value(i.payments[0]) | |
83 | + | if ((firstPayment.assetId != eggAssetId)) | |
84 | + | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggAssetId))) | |
85 | + | else if ((upgradePointPrice > firstPayment.amount)) | |
86 | + | then throw(("Minimal payment for upgrading mantle is: " + toString(upgradePointPrice))) | |
87 | + | else { | |
88 | + | let kMantleExists = keyArtefactExists(MANTLENAME, fromBase58String(artefactId)) | |
89 | + | let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(artefactId)) | |
90 | + | let mantleExists = getBooleanValue(kMantleExists) | |
91 | + | let mantleOwner = getStringValue(kMantleOwner) | |
92 | + | if (!(mantleExists)) | |
93 | + | then throw("Mantle with such an ID does not exist") | |
94 | + | else if ((mantleOwner != toString(i.originCaller))) | |
95 | + | then throw("You're not an owner of the mantle") | |
96 | + | else { | |
97 | + | let kMantleInvested = keyArtefactInvested(MANTLENAME, artefactId) | |
98 | + | let mantleAlreadyInvested = getIntegerValue(kMantleInvested) | |
99 | + | let kMantleLevel = keyArtefactLevel(MANTLENAME, toString(i.originCaller), fromBase58String(artefactId)) | |
100 | + | let kOnlyArtefactLevel = keyOnlyArtefactLevel(fromBase58String(artefactId)) | |
101 | + | let totalInvested = (mantleAlreadyInvested + firstPayment.amount) | |
102 | + | let newLevel = (((10 * pow(totalInvested, 8, 6, 1, 8, HALFUP)) + 100000000) / 100000000) | |
103 | + | [IntegerEntry(kMantleLevel, newLevel), IntegerEntry(kMantleInvested, totalInvested), IntegerEntry(kOnlyArtefactLevel, newLevel)] | |
104 | + | } | |
105 | + | } | |
38 | 106 | } | |
39 | 107 | ||
40 | 108 | ||
41 | 109 | ||
42 | 110 | @Callable(i) | |
43 | - | func unlockNftForWars (duckIds) = { | |
44 | - | let duckIdsList = split(duckIds, ";") | |
45 | - | if ((size(duckIdsList) > 10)) | |
46 | - | then throw("You cannot unlock more than 10 ducks in one transaction") | |
111 | + | func putOnArtefact (artefactId) = { | |
112 | + | let firstPayment = value(i.payments[0]) | |
113 | + | let attachedAssetInfo = value(assetInfo(value(firstPayment.assetId))) | |
114 | + | if (if ((attachedAssetInfo.issuer.bytes != incubatorContract)) | |
115 | + | then (attachedAssetInfo.issuer.bytes != breederContract) | |
116 | + | else false) | |
117 | + | then throw("You can attach only DUCKs issued by incubator or breeder ") | |
47 | 118 | else { | |
48 | - | func handleUnlockOneDuck (accum,duckId) = { | |
49 | - | let kDuckLock = keyDuckLock(toString(i.originCaller), duckId) | |
50 | - | let duckLockedValue = getBoolean(this, kDuckLock) | |
51 | - | let duckIsLocked = match duckLockedValue { | |
52 | - | case t: Boolean => | |
53 | - | t | |
54 | - | case _ => | |
55 | - | false | |
56 | - | } | |
57 | - | if ((duckIsLocked == false)) | |
58 | - | then throw(("Whhhhat, the duck is not locked by you: " + duckId)) | |
59 | - | else (accum ++ [DeleteEntry(kDuckLock), ScriptTransfer(i.originCaller, 1, fromBase58String(duckId))]) | |
60 | - | } | |
61 | - | ||
62 | - | let $l = duckIdsList | |
63 | - | let $s = size($l) | |
64 | - | let $acc0 = nil | |
65 | - | func 1 ($a,$i) = if (($i >= $s)) | |
66 | - | then $a | |
67 | - | else handleUnlockOneDuck($a, $l[$i]) | |
68 | - | ||
69 | - | func 2 ($a,$i) = if (($i >= $s)) | |
70 | - | then $a | |
71 | - | else throw("List size exceeds 10") | |
72 | - | ||
73 | - | 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
119 | + | let kMantleExists = keyArtefactExists(MANTLENAME, fromBase58String(artefactId)) | |
120 | + | let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(artefactId)) | |
121 | + | let kMantleStatus = keyArtefactStatus(MANTLENAME, fromBase58String(artefactId)) | |
122 | + | let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.originCaller), fromBase58String(artefactId)) | |
123 | + | let kDuckLock = keyDuckLock(toString(i.originCaller), toBase58String(value(firstPayment.assetId))) | |
124 | + | let mantleExists = getBooleanValue(kMantleExists) | |
125 | + | let mantleOwner = getStringValue(kMantleOwner) | |
126 | + | let mantleStatus = getStringValue(kMantleStatus) | |
127 | + | let kArtefactIdByType = keyArtefactIdByDuckAndType(MANTLENAME, value(firstPayment.assetId)) | |
128 | + | if (!(mantleExists)) | |
129 | + | then throw("Mantle with such an ID does not exist") | |
130 | + | else if ((mantleOwner != toString(i.originCaller))) | |
131 | + | then throw("You're not an owner of the mantle") | |
132 | + | else if ((mantleStatus != STATUSFREE)) | |
133 | + | then throw("Mantle is already used!") | |
134 | + | else { | |
135 | + | let kPutOnArtefact = keyPutOnArtefact(MANTLENAME, toString(i.originCaller), toBase58String(value(firstPayment.assetId)), fromBase58String(artefactId)) | |
136 | + | [BooleanEntry(kPutOnArtefact, true), StringEntry(kMantleStatus, STATUSOCCUPIED), StringEntry(kArtefactOwnerAndStatus, STATUSOCCUPIED), BooleanEntry(kDuckLock, true), StringEntry(kArtefactIdByType, artefactId)] | |
137 | + | } | |
74 | 138 | } | |
75 | 139 | } | |
140 | + | ||
141 | + | ||
142 | + | ||
143 | + | @Callable(i) | |
144 | + | func takeOffArtefact (duckId,artefactType) = { | |
145 | + | let kArtefactIdByTypeAndDuck = keyArtefactIdByDuckAndType(artefactType, fromBase58String(duckId)) | |
146 | + | let artefactId = getStringValue(kArtefactIdByTypeAndDuck) | |
147 | + | let kArtefactType = keyArtefactType(fromBase58String(artefactId)) | |
148 | + | let kPutOnArtefact = keyPutOnArtefact(artefactType, toString(i.originCaller), duckId, fromBase58String(artefactId)) | |
149 | + | let kPutOnArtefactStatus = getBooleanValue(kPutOnArtefact) | |
150 | + | let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(artefactType, toString(i.originCaller), fromBase58String(artefactId)) | |
151 | + | let kDuckLock = keyDuckLock(toString(i.originCaller), duckId) | |
152 | + | let kMantleStatus = keyArtefactStatus(artefactType, fromBase58String(artefactId)) | |
153 | + | if ((kPutOnArtefactStatus != true)) | |
154 | + | then throw("There is no duck with such parameteres") | |
155 | + | else [DeleteEntry(kPutOnArtefact), DeleteEntry(kArtefactIdByTypeAndDuck), DeleteEntry(kDuckLock), StringEntry(kMantleStatus, STATUSFREE), StringEntry(kArtefactOwnerAndStatus, STATUSFREE), ScriptTransfer(i.originCaller, 1, fromBase58String(duckId))] | |
156 | + | } | |
157 | + | ||
158 | + | ||
159 | + | ||
160 | + | @Callable(i) | |
161 | + | func unlockNftForWars (keys) = if ((i.callerPublicKey != base58'23NWm7kUDQqbTVkirjd5JXWRZaWVoS4ZesmRNHicBa3T')) | |
162 | + | then throw("Cannot call this method") | |
163 | + | else { | |
164 | + | let keysList = split(keys, ";") | |
165 | + | if ((size(keysList) > 10)) | |
166 | + | then throw("You cannot unlock more than 10 ducks in one transaction") | |
167 | + | else { | |
168 | + | func handleUnlockOneDuck (accum,key) = { | |
169 | + | let kDuckLock = split(key, "_") | |
170 | + | (accum ++ [DeleteEntry(key), ScriptTransfer(addressFromStringValue(value(kDuckLock[1])), 1, fromBase58String(value(kDuckLock[3])))]) | |
171 | + | } | |
172 | + | ||
173 | + | let $l = keysList | |
174 | + | let $s = size($l) | |
175 | + | let $acc0 = nil | |
176 | + | func 1 ($a,$i) = if (($i >= $s)) | |
177 | + | then $a | |
178 | + | else handleUnlockOneDuck($a, $l[$i]) | |
179 | + | ||
180 | + | func 2 ($a,$i) = if (($i >= $s)) | |
181 | + | then $a | |
182 | + | else throw("List size exceeds 10") | |
183 | + | ||
184 | + | 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
185 | + | } | |
186 | + | } | |
76 | 187 | ||
77 | 188 | ||
78 | 189 | @Verifier(tx) | |
79 | 190 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
80 | 191 |
github/deemru/w8io/3ef1775 52.45 ms ◑