tx · 9tRLDusYHVy8gqcXkRErXYrHp5gxLgpJitsMjaciFoQw

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.01000000 Waves

2022.12.06 01:50 [2347680] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "9tRLDusYHVy8gqcXkRErXYrHp5gxLgpJitsMjaciFoQw", "fee": 1000000, "feeAssetId": null, "timestamp": 1670280677083, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "2fgjG1uzJHa9M8VJHMoY3z9ZZfD24T3KH8Qjub2SBURL5DNtjzKMn2hKuNxVpBfxiKE1zaHn6mrtVgoDbHxsnsgh" ], "script": "base64:BgIICAISBAoCAQEbAAVNVUxUNgDAhD0ABU1VTFQ4AIDC1y8AC3VzZG5Bc3NldElkASD3dur394PKZdtuE+4CO89YKZWpwdGN8kvabNgdYoDI3gALYmFja0VuZEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQECIzNONVNwWDIxUjNSNzVRbzRlYjNNd0ZGdlc3VFV6eWh2YXZ2AA9zdGFraW5nQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQECIzNOREN5Qkc1cTg1SnVhUmlpZ1VlRXRhaW55akNRVDNYcFptAA9ERUZBVUxUTE9DQVRJT04CD0FmcmljYV9GX0FmcmljYQAGTlVNUkVTAAYAE0ZBQ1RPUllNQVhXQVJFSE9VU0UAgMivoCUACHJlc1R5cGVzCQDMCAICA09pbAkAzAgCAgNPcmUJAMwIAgIEV29vZAkAzAgCAgRTYW5kCQDMCAICBENsYXkJAMwIAgIHT3JnYW5pYwUDbmlsAApjb250aW5lbnRzCQDMCAICCEFtZXJpY2FzCQDMCAICBkV1cm9wZQkAzAgCAgRBc2lhCQDMCAICBkFmcmljYQkAzAgCAgdPY2VhbmlhBQNuaWwBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIJZmFjdG9yeUlkB3Jlc1R5cGUJAKwCAgkArAICCQCsAgICG2ZhY3RvcnlXaEJ5Q29udGluZW50QW5kUmVzXwUJZmFjdG9yeUlkAgFfCQCkAwEFB3Jlc1R5cGUBEWtleUFzc2V0SWRUb093bmVyAQdhc3NldElkCQCsAgICCW5mdE93bmVyXwUHYXNzZXRJZAEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAgtzdGFrZWRUaW1lXwUHYXNzZXRJZAEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgERa2V5QmFja3BhY2tCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICCWJhY2tQYWNrXwULZHVja0Fzc2V0SWQBD2tleUR1Y2tMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgINZHVja0xvY2F0aW9uXwULZHVja0Fzc2V0SWQAB2lkeFR5cGUAAAALaWR4UXVhbnRpdHkAAQAIaWR4UHJpY2UAAgAPbG9jSWR4Q29udGluZW50AAAACmxvY0lkeFR5cGUAAQAIbG9jSWR4SWQAAgAKYnBJZHhMZXZlbAAAAAhicElkeFJlcwABAAhicElkeE1hdAACAAlicElkeFByb2QAAwEGc3ViUmVzAwdyZXNMaXN0B3Jlc1R5cGUGYW1vdW50CgEGc3ViYmVyAgNhY2MBaQkAzQgCBQNhY2MDCQAAAgUBaQUHcmVzVHlwZQkApAMBCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWkFBmFtb3VudAkAkQMCBQdyZXNMaXN0BQFpBAFyCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEGc3ViYmVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGCQC5CQIFAXICAV8BAWkBDHNlbGxSZXNvdXJjZQIHcmVzVHlwZQZhbW91bnQDAwkAZgIAAAUHcmVzVHlwZQYJAGcCBQdyZXNUeXBlBQZOVU1SRVMJAAIBCQCsAgICElVua25vd24gcmVzb3VyY2U6IAkApAMBBQdyZXNUeXBlAwkAZwIAAAUGYW1vdW50CQACAQkArAICAhtBbW91bnQgc2hvdWxkIGJlIHBvc2l0aXZlISAJAKQDAQUGYW1vdW50BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAipzZWxsUmVzb3VyY2VzIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudHMEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAtjdXJyZW50UGFjawkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAUFYnBLZXkCDzA6MF8wXzBfMF8wXzA6OgIBOgQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQKY3VycmVudFJlcwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFB3Jlc1R5cGUDCQBmAgUGYW1vdW50BQpjdXJyZW50UmVzCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkApAMBBQpjdXJyZW50UmVzAgQgb2YgCQCRAwIFCHJlc1R5cGVzBQdyZXNUeXBlAiAgaW4gYmFja3BhY2ssIGJ1dCB0cmllZCB0byBzZWxsIAkApAMBBQZhbW91bnQEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQFB3Jlc1R5cGUEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEAnIwAwkAZgIFAncwBRNGQUNUT1JZTUFYV0FSRUhPVVNFAAADCQBmAgkAZAIFAncwBQZhbW91bnQFE0ZBQ1RPUllNQVhXQVJFSE9VU0UJAGUCBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQJ3MAUGYW1vdW50BAx1c2RuUmVjZWl2ZWQJAGQCCQBrAwUCcjAJAGUCCQBoAgACBQVNVUxUNgkAawMJAGQCBQJ3MAkAaQIFAnIwAAIFBU1VTFQ2BRNGQUNUT1JZTUFYV0FSRUhPVVNFBQVNVUxUOAkAaQIJAGUCBQZhbW91bnQFAnIwAGQEBWJwUmVzCQEGc3ViUmVzAwUHcmVzTGlzdAUHcmVzVHlwZQUGYW1vdW50BAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCBQVicFJlcwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgkAzAgCCQELU3RyaW5nRW50cnkCBQVicEtleQUHbmV3UGFjawkAzAgCCQEMSW50ZWdlckVudHJ5AgUFd2hLZXkJAGQCBQJ3MAUGYW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUMdXNkblJlY2VpdmVkBQt1c2RuQXNzZXRJZAUDbmlsAEmTTvk=", "height": 2347680, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: G5tydDzpJrheYW2U2QYtCiXqSqEYPxGrdqatWTLMkeZL Next: 7N2EXuiBVFiZofNKHDCSv4C4rwMCm9toECHF4eYEZgiZ Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let MULT6 = 1000000
5+
46 let MULT8 = 100000000
57
68 let usdnAssetId = base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
911
1012 let stakingContract = addressFromStringValue("3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm")
1113
12-let allowedResources = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
14+let DEFAULTLOCATION = "Africa_F_Africa"
15+
16+let NUMRES = 6
17+
18+let FACTORYMAXWAREHOUSE = 10000000000
19+
20+let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
1321
1422 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
1523
16-func keyStoreResByContinentAndType (continent,resType) = ((("storeResourceByContinentAndType_" + continent) + "_") + resType)
24+func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
1725
1826
1927 func keyAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
2533 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
2634
2735
36+func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
37+
38+
39+func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
40+
41+
2842 let idxType = 0
2943
3044 let idxQuantity = 1
3145
3246 let idxPrice = 2
3347
34-let recLandNum = 0
48+let locIdxContinent = 0
3549
36-let recLandSize = 1
50+let locIdxType = 1
3751
38-let recTerrains = 2
52+let locIdxId = 2
3953
40-let recContinent = 3
54+let bpIdxLevel = 0
4155
42-@Callable(i)
43-func sellResource (userAddressStr,continent,resource) = if ((i.caller != backEndAddr))
44- then throw("permission denied")
45- else if ((size(i.payments) != 0))
46- then throw("sellResources doesn't require any payments")
47- else if (!(containsElement(continents, continent)))
48- then throw(("Unknown continent: " + continent))
49- else {
50- let userAddress = addressFromStringValue(userAddressStr)
51- let parts = split(resource, "_")
52- let resType = parts[idxType]
53- if (!(containsElement(allowedResources, resType)))
54- then throw(("Unknown resource: " + resType))
55- else {
56- let resKey = keyStoreResByContinentAndType(continent, resType)
57- let q = parseIntValue(parts[idxQuantity])
58-[IntegerEntry(resKey, (valueOrElse(getInteger(resKey), 0) + q)), ScriptTransfer(userAddress, fraction(q, parseIntValue(parts[idxPrice]), MULT8), usdnAssetId)]
59- }
60- }
56+let bpIdxRes = 1
6157
58+let bpIdxMat = 2
59+
60+let bpIdxProd = 3
61+
62+func subRes (resList,resType,amount) = {
63+ func subber (acc,i) = (acc :+ (if ((i == resType))
64+ then toString((parseIntValue(resList[i]) - amount))
65+ else resList[i]))
66+
67+ let r = {
68+ let $l = [0, 1, 2, 3, 4, 5]
69+ let $s = size($l)
70+ let $acc0 = nil
71+ func $f0_1 ($a,$i) = if (($i >= $s))
72+ then $a
73+ else subber($a, $l[$i])
74+
75+ func $f0_2 ($a,$i) = if (($i >= $s))
76+ then $a
77+ else throw("List size exceeds 6")
78+
79+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
80+ }
81+ makeString(r, "_")
82+ }
6283
6384
6485 @Callable(i)
65-func sellResources (userAddressStr,continent,resources) = if ((i.caller != backEndAddr))
66- then throw("permission denied")
67- else if ((size(i.payments) != 0))
68- then throw("sellResources doesn't require any payments")
69- else if (!(containsElement(continents, continent)))
70- then throw(("Unknown continent: " + continent))
71- else {
72- let userAddress = addressFromStringValue(userAddressStr)
73- func adder (acc,elem) = {
74- let parts = split(elem, "_")
75- let resType = parts[idxType]
76- if (!(containsElement(allowedResources, resType)))
77- then throw(("Unknown resource: " + resType))
86+func sellResource (resType,amount) = if (if ((0 > resType))
87+ then true
88+ else (resType >= NUMRES))
89+ then throw(("Unknown resource: " + toString(resType)))
90+ else if ((0 >= amount))
91+ then throw(("Amount should be positive! " + toString(amount)))
92+ else {
93+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
94+ if ((size(i.payments) != 0))
95+ then throw("sellResources doesn't require any payments")
96+ else {
97+ let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
98+ if ((curLocation[locIdxType] != "F"))
99+ then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
78100 else {
79- let resKey = keyStoreResByContinentAndType(continent, resType)
80- let q = parseIntValue(parts[idxQuantity])
81- $Tuple2((acc._1 :+ IntegerEntry(resKey, (valueOrElse(getInteger(resKey), 0) + q))), (acc._2 + fraction(q, parseIntValue(parts[idxPrice]), MULT8)))
101+ let bpKey = keyBackpackByDuck(duckAssetId)
102+ let currentPack = split(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0::"), ":")
103+ let resList = split(currentPack[bpIdxRes], "_")
104+ let currentRes = parseIntValue(resList[resType])
105+ if ((amount > currentRes))
106+ then throw(((((("You have " + toString(currentRes)) + " of ") + resTypes[resType]) + " in backpack, but tried to sell ") + toString(amount)))
107+ else {
108+ let whKey = keyFactoryWarehouseByIdAndType(curLocation[locIdxId], resType)
109+ let w0 = valueOrElse(getInteger(whKey), 0)
110+ let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
111+ then 0
112+ else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
113+ then (FACTORYMAXWAREHOUSE - w0)
114+ else amount
115+ let usdnReceived = (fraction(r0, ((2 * MULT6) - fraction((w0 + (r0 / 2)), MULT6, FACTORYMAXWAREHOUSE)), MULT8) + ((amount - r0) / 100))
116+ let bpRes = subRes(resList, resType, amount)
117+ let newPack = makeString([currentPack[bpIdxLevel], bpRes, currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
118+[StringEntry(bpKey, newPack), IntegerEntry(whKey, (w0 + amount)), ScriptTransfer(i.caller, usdnReceived, usdnAssetId)]
119+ }
82120 }
83121 }
84-
85- let result = {
86- let $l = resources
87- let $s = size($l)
88- let $acc0 = $Tuple2(nil, 0)
89- func $f0_1 ($a,$i) = if (($i >= $s))
90- then $a
91- else adder($a, $l[$i])
92-
93- func $f0_2 ($a,$i) = if (($i >= $s))
94- then $a
95- else throw("List size exceeds 10")
96-
97- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
98- }
99- (result._1 :+ ScriptTransfer(userAddress, result._2, usdnAssetId))
100- }
122+ }
101123
102124
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let MULT6 = 1000000
5+
46 let MULT8 = 100000000
57
68 let usdnAssetId = base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
79
810 let backEndAddr = addressFromStringValue("3N5SpX21R3R75Qo4eb3MwFFvW7TUzyhvavv")
911
1012 let stakingContract = addressFromStringValue("3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm")
1113
12-let allowedResources = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
14+let DEFAULTLOCATION = "Africa_F_Africa"
15+
16+let NUMRES = 6
17+
18+let FACTORYMAXWAREHOUSE = 10000000000
19+
20+let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
1321
1422 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
1523
16-func keyStoreResByContinentAndType (continent,resType) = ((("storeResourceByContinentAndType_" + continent) + "_") + resType)
24+func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
1725
1826
1927 func keyAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
2028
2129
2230 func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
2331
2432
2533 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
2634
2735
36+func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
37+
38+
39+func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
40+
41+
2842 let idxType = 0
2943
3044 let idxQuantity = 1
3145
3246 let idxPrice = 2
3347
34-let recLandNum = 0
48+let locIdxContinent = 0
3549
36-let recLandSize = 1
50+let locIdxType = 1
3751
38-let recTerrains = 2
52+let locIdxId = 2
3953
40-let recContinent = 3
54+let bpIdxLevel = 0
4155
42-@Callable(i)
43-func sellResource (userAddressStr,continent,resource) = if ((i.caller != backEndAddr))
44- then throw("permission denied")
45- else if ((size(i.payments) != 0))
46- then throw("sellResources doesn't require any payments")
47- else if (!(containsElement(continents, continent)))
48- then throw(("Unknown continent: " + continent))
49- else {
50- let userAddress = addressFromStringValue(userAddressStr)
51- let parts = split(resource, "_")
52- let resType = parts[idxType]
53- if (!(containsElement(allowedResources, resType)))
54- then throw(("Unknown resource: " + resType))
55- else {
56- let resKey = keyStoreResByContinentAndType(continent, resType)
57- let q = parseIntValue(parts[idxQuantity])
58-[IntegerEntry(resKey, (valueOrElse(getInteger(resKey), 0) + q)), ScriptTransfer(userAddress, fraction(q, parseIntValue(parts[idxPrice]), MULT8), usdnAssetId)]
59- }
60- }
56+let bpIdxRes = 1
6157
58+let bpIdxMat = 2
59+
60+let bpIdxProd = 3
61+
62+func subRes (resList,resType,amount) = {
63+ func subber (acc,i) = (acc :+ (if ((i == resType))
64+ then toString((parseIntValue(resList[i]) - amount))
65+ else resList[i]))
66+
67+ let r = {
68+ let $l = [0, 1, 2, 3, 4, 5]
69+ let $s = size($l)
70+ let $acc0 = nil
71+ func $f0_1 ($a,$i) = if (($i >= $s))
72+ then $a
73+ else subber($a, $l[$i])
74+
75+ func $f0_2 ($a,$i) = if (($i >= $s))
76+ then $a
77+ else throw("List size exceeds 6")
78+
79+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
80+ }
81+ makeString(r, "_")
82+ }
6283
6384
6485 @Callable(i)
65-func sellResources (userAddressStr,continent,resources) = if ((i.caller != backEndAddr))
66- then throw("permission denied")
67- else if ((size(i.payments) != 0))
68- then throw("sellResources doesn't require any payments")
69- else if (!(containsElement(continents, continent)))
70- then throw(("Unknown continent: " + continent))
71- else {
72- let userAddress = addressFromStringValue(userAddressStr)
73- func adder (acc,elem) = {
74- let parts = split(elem, "_")
75- let resType = parts[idxType]
76- if (!(containsElement(allowedResources, resType)))
77- then throw(("Unknown resource: " + resType))
86+func sellResource (resType,amount) = if (if ((0 > resType))
87+ then true
88+ else (resType >= NUMRES))
89+ then throw(("Unknown resource: " + toString(resType)))
90+ else if ((0 >= amount))
91+ then throw(("Amount should be positive! " + toString(amount)))
92+ else {
93+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
94+ if ((size(i.payments) != 0))
95+ then throw("sellResources doesn't require any payments")
96+ else {
97+ let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
98+ if ((curLocation[locIdxType] != "F"))
99+ then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
78100 else {
79- let resKey = keyStoreResByContinentAndType(continent, resType)
80- let q = parseIntValue(parts[idxQuantity])
81- $Tuple2((acc._1 :+ IntegerEntry(resKey, (valueOrElse(getInteger(resKey), 0) + q))), (acc._2 + fraction(q, parseIntValue(parts[idxPrice]), MULT8)))
101+ let bpKey = keyBackpackByDuck(duckAssetId)
102+ let currentPack = split(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0::"), ":")
103+ let resList = split(currentPack[bpIdxRes], "_")
104+ let currentRes = parseIntValue(resList[resType])
105+ if ((amount > currentRes))
106+ then throw(((((("You have " + toString(currentRes)) + " of ") + resTypes[resType]) + " in backpack, but tried to sell ") + toString(amount)))
107+ else {
108+ let whKey = keyFactoryWarehouseByIdAndType(curLocation[locIdxId], resType)
109+ let w0 = valueOrElse(getInteger(whKey), 0)
110+ let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
111+ then 0
112+ else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
113+ then (FACTORYMAXWAREHOUSE - w0)
114+ else amount
115+ let usdnReceived = (fraction(r0, ((2 * MULT6) - fraction((w0 + (r0 / 2)), MULT6, FACTORYMAXWAREHOUSE)), MULT8) + ((amount - r0) / 100))
116+ let bpRes = subRes(resList, resType, amount)
117+ let newPack = makeString([currentPack[bpIdxLevel], bpRes, currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
118+[StringEntry(bpKey, newPack), IntegerEntry(whKey, (w0 + amount)), ScriptTransfer(i.caller, usdnReceived, usdnAssetId)]
119+ }
82120 }
83121 }
84-
85- let result = {
86- let $l = resources
87- let $s = size($l)
88- let $acc0 = $Tuple2(nil, 0)
89- func $f0_1 ($a,$i) = if (($i >= $s))
90- then $a
91- else adder($a, $l[$i])
92-
93- func $f0_2 ($a,$i) = if (($i >= $s))
94- then $a
95- else throw("List size exceeds 10")
96-
97- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
98- }
99- (result._1 :+ ScriptTransfer(userAddress, result._2, usdnAssetId))
100- }
122+ }
101123
102124

github/deemru/w8io/873ac7e 
30.02 ms