tx · BMVuH2iwUjCwnTsWFcnchNp6aTychUBx4vVaYZu3ZcDN

3P7aVqHv6fXkYuS4sRW2K17ENZMsbXi3sPV:  -0.01400000 Waves

2023.11.26 21:53 [3926624] smart account 3P7aVqHv6fXkYuS4sRW2K17ENZMsbXi3sPV > SELF 0.00000000 Waves

{ "type": 13, "id": "BMVuH2iwUjCwnTsWFcnchNp6aTychUBx4vVaYZu3ZcDN", "fee": 1400000, "feeAssetId": null, "timestamp": 1701024882281, "version": 2, "chainId": 87, "sender": "3P7aVqHv6fXkYuS4sRW2K17ENZMsbXi3sPV", "senderPublicKey": "5SevHzYFiymbFWe1GPt6nNYccPnfTbMft1DqZWfRH8GN", "proofs": [ "2pXEF6ScNP5fyqEC2ojdUdnug2piMqiYyV9XuiYPhbGPVUMhFqrwBmWsN7gY4Gjmq9c2kpGgGS42K1yKm1vpufVa" ], "script": "base64:AAIFAAAAAAAAACMIAhIDCgEIEgMKAQgSAwoBCBIECgIICBIDCgEIEgMKAQESAAAAACcAAAAABVNjYWxlAAAAAAAF9eEAAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWIFAAAAByRtYXRjaDAFAAAAAWIAAAAAAAAAAAABAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAAAQAAAAx0cnlHZXRTdHJpbmcAAAABAAAAA2tleQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgUAAAAEdGhpcwUAAAADa2V5AQAAABdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwAAAAACAAAAFHN0YXRpY19vcmFjbGVBZGRyZXNzAQAAABRzdGF0aWNLZXlfZWdnQXNzZXRJZAAAAAACAAAAEXN0YXRpY19lZ2dBc3NldElkAQAAABVzdGF0aWNLZXlfYnVybkFkZHJlc3MAAAAAAgAAABJzdGF0aWNfYnVybkFkZHJlc3MBAAAAEnN0YXRpY0tleV9leHRyYUZlZQAAAAACAAAAD3N0YXRpY19leHRyYUZlZQEAAAAXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAAAAAgAAABRzdGF0aWNfZmVlQWdncmVnYXRvcgEAAAAac3RhdGljS2V5X2luY3ViYXRvckFkZHJlc3MAAAAAAgAAABdzdGF0aWNfaW5jdWJhdG9yQWRkcmVzcwEAAAAYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAAAAAIAAAAVc3RhdGljX2JyZWVkZXJBZGRyZXNzAQAAABxzdGF0aWNLZXlfcmVmQ29udHJhY3RBZGRyZXNzAAAAAAIAAAAZc3RhdGljX3JlZkNvbnRyYWN0QWRkcmVzcwEAAAAYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAAAAAIAAAAVc3RhdGljX2NvdXBvbnNBZGRyZXNzAQAAABtzdGF0aWNLZXlfYWNjQm9vc3RlckFkZHJlc3MAAAAAAgAAABhzdGF0aWNfYWNjQm9vc3RlckFkZHJlc3MBAAAAFnN0YXRpY0tleV92ZWdnUGVyY2hGZWUAAAAAAgAAABNzdGF0aWNfdmVnZ1BlcmNoRmVlAQAAABByZXdhcmRDbGFpbWVkS2V5AAAAAQAAAAdhZGRyZXNzCQABLAAAAAIJAAQlAAAAAQUAAAAHYWRkcmVzcwIAAAAIX2NsYWltZWQBAAAADnRvdGFsU3Rha2VkS2V5AAAAAAIAAAAMdG90YWxfc3Rha2VkAQAAABJ0b3RhbFN0YWtlZFVzZXJLZXkAAAABAAAAB2FkZHJlc3MJAAEsAAAAAgIAAAANdG90YWxfc3Rha2VkXwUAAAAHYWRkcmVzcwAAAAAVa2V5R2xvYmFsTGFzdEludGVyZXN0AgAAABlnbG9iYWxfbGFzdENoZWNrX2ludGVyZXN0AQAAABRrZXlMYXN0Q2hlY2tJbnRlcmVzdAAAAAEAAAAHYWRkcmVzcwkAASwAAAACCQAEJQAAAAEFAAAAB2FkZHJlc3MCAAAAE19sYXN0Q2hlY2tfaW50ZXJlc3QAAAAAD2tleUdsb2JhbEVhcm5lZAIAAAAPZ2xvYmFsX2Vhcm5pbmdzAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAADHRyeUdldFN0cmluZwAAAAEJAQAAABdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwAAAAABAAAADWdldEVnZ0Fzc2V0SWQAAAAACQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAAAAAAQAAAA5nZXRCdXJuQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAFXN0YXRpY0tleV9idXJuQWRkcmVzcwAAAAABAAAAEGdldEZlZUFnZ3JlZ2F0b3IAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgAAAAABAAAAEWdldEJyZWVkZXJBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAAAAAEAAAATZ2V0SW5jdWJhdG9yQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAGnN0YXRpY0tleV9pbmN1YmF0b3JBZGRyZXNzAAAAAAEAAAAVZ2V0UmVmQ29udHJhY3RBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAcc3RhdGljS2V5X3JlZkNvbnRyYWN0QWRkcmVzcwAAAAABAAAAEWdldENvdXBvbnNBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAAAAAEAAAAUZ2V0QWNjQm9vc3RlckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABtzdGF0aWNLZXlfYWNjQm9vc3RlckFkZHJlc3MAAAAAAQAAABZjaGVja0FkZGl0aW9uYWxQYXltZW50AAAAAQAAAAdwYXltZW50AwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQJAAACAAAAAQIAAAAZRkNBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQAAAAJZmVlQW1vdW50CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAEnN0YXRpY0tleV9leHRyYUZlZQAAAAADCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAACWZlZUFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAcRkNBUDogUGxlYXNlIGF0dGFjaCBleGFjdGx5IAkAAaQAAAABBQAAAAlmZWVBbW91bnQCAAAAEyBhbW91bnQgb2Ygd2F2ZWxldHMJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEGdldEZlZUFnZ3JlZ2F0b3IAAAAABQAAAAlmZWVBbW91bnQFAAAABHVuaXQFAAAAA25pbAEAAAAFYXNJbnQAAAABAAAABXZhbHVlBAAAAAckbWF0Y2gwBQAAAAV2YWx1ZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAANpbnQFAAAAByRtYXRjaDAFAAAAA2ludAkAAAIAAAABAgAAAB5GQUk6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQBAAAAEmNsYWltU3Rha2luZ1Jlc3VsdAAAAAEAAAAHYWRkcmVzcwQAAAAPY3VycmVudEludGVyZXN0CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEFAAAAFWtleUdsb2JhbExhc3RJbnRlcmVzdAQAAAARbGFzdENoZWNrSW50ZXJlc3QJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAFGtleUxhc3RDaGVja0ludGVyZXN0AAAAAQUAAAAHYWRkcmVzcwQAAAAMc3Rha2VkQW1vdW50CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABJ0b3RhbFN0YWtlZFVzZXJLZXkAAAABCQAEJQAAAAEFAAAAB2FkZHJlc3MEAAAABnJld2FyZAMJAABmAAAAAgUAAAARbGFzdENoZWNrSW50ZXJlc3QAAAAAAAAAAAAJAABrAAAAAwkAAGUAAAACBQAAAA9jdXJyZW50SW50ZXJlc3QFAAAAEWxhc3RDaGVja0ludGVyZXN0BQAAAAxzdGFrZWRBbW91bnQFAAAABVNjYWxlAAAAAAAAAAAABAAAAAxpbnZva2VSZXN1bHQDCQAAZgAAAAIFAAAABnJld2FyZAAAAAAAAAAAAAkAA/wAAAAECQEAAAARZ2V0Q291cG9uc0FkZHJlc3MAAAAAAgAAABFhZGRDb3Vwb25zRmFybWluZwkABEwAAAACCQAEJQAAAAEFAAAAB2FkZHJlc3MJAARMAAAAAgUAAAAGcmV3YXJkBQAAAANuaWwFAAAAA25pbAUAAAAEdW5pdAMJAAAAAAAAAgUAAAAMaW52b2tlUmVzdWx0BQAAAAxpbnZva2VSZXN1bHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABRrZXlMYXN0Q2hlY2tJbnRlcmVzdAAAAAEFAAAAB2FkZHJlc3MFAAAAD2N1cnJlbnRJbnRlcmVzdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEHJld2FyZENsYWltZWRLZXkAAAABBQAAAAdhZGRyZXNzCQAAZAAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAEHJld2FyZENsYWltZWRLZXkAAAABBQAAAAdhZGRyZXNzBQAAAAZyZXdhcmQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAAAAEmhhbmRsZVN0YWtpbmdUb3BVcAAAAAEAAAAGYW1vdW50BAAAAA9jdXJyZW50SW50ZXJlc3QJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAAVa2V5R2xvYmFsTGFzdEludGVyZXN0BAAAABF0b3RhbFN0YWtlZEFtb3VudAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAOdG90YWxTdGFrZWRLZXkAAAAABAAAAA1pbnRlcmVzdERlbHRhAwkAAGYAAAACBQAAABF0b3RhbFN0YWtlZEFtb3VudAAAAAAAAAAAAAkAAGsAAAADBQAAAAZhbW91bnQFAAAABVNjYWxlBQAAABF0b3RhbFN0YWtlZEFtb3VudAAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPa2V5R2xvYmFsRWFybmVkCQAAZAAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAAPa2V5R2xvYmFsRWFybmVkBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFWtleUdsb2JhbExhc3RJbnRlcmVzdAkAAGQAAAACBQAAAA9jdXJyZW50SW50ZXJlc3QFAAAADWludGVyZXN0RGVsdGEFAAAAA25pbAEAAAAJYXNCb29sZWFuAAAAAQAAAAV2YWx1ZQQAAAAHJG1hdGNoMAUAAAAFdmFsdWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAB0Jvb2xlYW4EAAAAB2Jvb2xlYW4FAAAAByRtYXRjaDAFAAAAB2Jvb2xlYW4JAAACAAAAAQIAAAAiRkFCOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogQm9vbGVhbgEAAAATY2FsY3VsYXRlUGVyY2hQcmljZQAAAAEAAAAHYWRkcmVzcwQAAAARaGFzQXJ0ZWZhY3RTdGFrZWQJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAABRnZXRBY2NCb29zdGVyQWRkcmVzcwAAAAAJAAEsAAAAAgkAASwAAAACAgAAAAtBUlQtWE1JU1RMXwUAAAAHYWRkcmVzcwIAAAAGX293bmVyBAAAAApwZXJjaFByaWNlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAFnN0YXRpY0tleV92ZWdnUGVyY2hGZWUAAAAAAwkAAAAAAAACBQAAABFoYXNBcnRlZmFjdFN0YWtlZAIAAAAABQAAAApwZXJjaFByaWNlBQAAAApwZXJjaFByaWNlAQAAAA5nZXRBc3NldE9yaWdpbgAAAAEAAAAKZ2VuZXJhdGlvbgMJAAAAAAAAAgUAAAAKZ2VuZXJhdGlvbgIAAAABRwkBAAAAE2dldEluY3ViYXRvckFkZHJlc3MAAAAACQEAAAARZ2V0QnJlZWRlckFkZHJlc3MAAAAAAQAAAA5nZXRBc3NldFJhcml0eQAAAAIAAAAIZ2Vub3R5cGUAAAAKZ2VuZXJhdGlvbgQAAAAIcXVhbnRpdHkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACCQEAAAAOZ2V0QXNzZXRPcmlnaW4AAAABBQAAAApnZW5l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", "height": 3926624, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6FSF8Y5eHiYcKMNj6tBvDUkW3Yt4RriyQk2Agrv8A9ne Next: EnCdeidiuechoJqQeomZWrcsUp6DE9d14ymzbsUwr7vP Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func tryGetStringExternal (address,key) = match getString(address, key) {
5- case a: String =>
6- a
7- case _ =>
8- ""
9-}
10-
11-
12-func tryGetBoolean (key) = match getBoolean(key) {
13- case b: Boolean =>
14- b
15- case _ =>
16- false
17-}
18-
19-
20-func tryGetString (key) = tryGetStringExternal(this, key)
21-
4+let Scale = 100000000
225
236 func tryGetInteger (key) = match getInteger(this, key) {
247 case b: Int =>
2811 }
2912
3013
31-func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
14+func tryGetStringExternal (address,key) = match getString(address, key) {
15+ case a: String =>
16+ a
17+ case _ =>
18+ ""
19+}
3220
3321
34-func staticKey_turtleStakingAddress () = "static_turtleStakingAddress"
22+func tryGetString (key) = tryGetStringExternal(this, key)
3523
3624
37-func staticKey_turtleRebirthAddress () = "static_turtleRebirthAddress"
25+func staticKey_oracleAddress () = "static_oracleAddress"
3826
3927
40-func staticKey_ropeAddress () = "static_ropeAddress"
28+func staticKey_eggAssetId () = "static_eggAssetId"
4129
4230
43-func staticKey_levelSystemAddress () = "static_levelSystemAddress"
31+func staticKey_burnAddress () = "static_burnAddress"
4432
4533
46-func staticKey_spiceAssetId () = "static_spiceAssetId"
34+func staticKey_extraFee () = "static_extraFee"
4735
4836
49-func staticKey_marketplace () = "static_marketplaceAddress"
37+func staticKey_feeAggregator () = "static_feeAggregator"
5038
5139
52-func staticKey_capacityAddress () = "static_capacityAddress"
40+func staticKey_incubatorAddress () = "static_incubatorAddress"
5341
5442
55-func staticKey_veggFarmingAddress () = "static_veggFarmingAddress"
43+func staticKey_breederAddress () = "static_breederAddress"
5644
5745
58-func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
46+func staticKey_refContractAddress () = "static_refContractAddress"
5947
6048
61-func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
49+func staticKey_couponsAddress () = "static_couponsAddress"
6250
6351
64-func getFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_farmingAddress")))
52+func staticKey_accBoosterAddress () = "static_accBoosterAddress"
6553
6654
67-func getGameDappAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_gameDappAddress")))
55+func staticKey_veggPerchFee () = "static_veggPerchFee"
6856
6957
70-func getCapacityAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_capacityAddress())))
58+func rewardClaimedKey (address) = (toString(address) + "_claimed")
7159
7260
73-func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_burnAddress")))
61+func totalStakedKey () = "total_staked"
7462
7563
76-func getBabyduckAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_babyDuckAddress")))
64+func totalStakedUserKey (address) = ("total_staked_" + address)
7765
7866
79-func getBreedingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress")))
67+let keyGlobalLastInterest = "global_lastCheck_interest"
68+
69+func keyLastCheckInterest (address) = (toString(address) + "_lastCheck_interest")
8070
8171
82-func getMasterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_cfMasterAddress")))
72+let keyGlobalEarned = "global_earnings"
73+
74+func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
8375
8476
85-func getTurtleStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleStakingAddress())))
77+func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
8678
8779
88-func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
80+func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
8981
9082
91-func getRopeAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_ropeAddress())))
83+func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
9284
9385
94-func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_spiceAssetId()))
86+func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
9587
9688
97-func getLevelSystemAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_levelSystemAddress())))
89+func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_incubatorAddress())))
9890
9991
100-func getMarketPlaceAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_marketplace())))
92+func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
10193
10294
103-func getVeggFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_veggFarmingAddress())))
95+func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
10496
10597
106-let wAccPKey = fromBase58String(valueOrErrorMessage(getString(getOracle(), "static_warsPKey"), "static_warsPKey not defined"))
107-
108-let scCanUseCoupons = [getRebirthAddress(), getIncubatorAddress(), getFarmingAddress(), getGameDappAddress(), getBabyduckAddress(), getBreedingAddress(), getTurtleStakingAddress(), getTurtleRebirthAddress(), getRopeAddress(), getLevelSystemAddress(), getMarketPlaceAddress(), getCapacityAddress(), this]
109-
110-func couponsUserSpend (user) = (user + "_spend")
98+func getAccBoosterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_accBoosterAddress())))
11199
112100
113-func couponsUserActive (user) = (user + "_active")
101+func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
102+ then throw("FCAP: Please attach waves")
103+ else {
104+ let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
105+ if ((payment.amount != feeAmount))
106+ then throw((("FCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
107+ else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
108+ }
114109
115110
116-func couponsUserActiveOld (user) = (couponsUserActive(user) + "_old")
111+func asInt (value) = match value {
112+ case int: Int =>
113+ int
114+ case _ =>
115+ throw("FAI: wrong type, expected: Int")
116+}
117117
118118
119-func couponsSpendOnSc (sc) = (sc + "_spend_by_using")
120-
121-
122-func actionPerAddressPerUserPerDay (user,action,dappAddress,day) = (((((((dappAddress + "_") + action) + "_") + user) + "_") + day) + "_actions")
123-
124-
125-func actionPerAddressPerUserLastCheckDay (user,action) = (((action + "_") + user) + "_actions_check_day")
126-
127-
128-func actionPerAddressPerUserAmountInARow (user,action) = (((action + "_") + user) + "_actions_amount_in_row")
129-
130-
131-func userExperience (user) = (user + "_experience")
132-
133-
134-func addCouponsInternal (user,amount) = {
135- let keyOld = couponsUserActiveOld(user)
136- let key = couponsUserActive(user)
137- let couponsOld = tryGetInteger(key)
138- let coupons = (couponsOld + amount)
139-[IntegerEntry(keyOld, couponsOld), IntegerEntry(key, coupons)]
119+func claimStakingResult (address) = {
120+ let currentInterest = tryGetInteger(keyGlobalLastInterest)
121+ let lastCheckInterest = tryGetInteger(keyLastCheckInterest(address))
122+ let stakedAmount = tryGetInteger(totalStakedUserKey(toString(address)))
123+ let reward = if ((lastCheckInterest > 0))
124+ then fraction((currentInterest - lastCheckInterest), stakedAmount, Scale)
125+ else 0
126+ let invokeResult = if ((reward > 0))
127+ then invoke(getCouponsAddress(), "addCouponsFarming", [toString(address), reward], nil)
128+ else unit
129+ if ((invokeResult == invokeResult))
130+ then [IntegerEntry(keyLastCheckInterest(address), currentInterest), IntegerEntry(rewardClaimedKey(address), (tryGetInteger(rewardClaimedKey(address)) + reward))]
131+ else throw("Strict value is not equal to itself.")
140132 }
141133
142134
143-let startTsMs = 1695427200000
144-
145-func calculateDaysSinceStart () = {
146- let diff = (lastBlock.timestamp - startTsMs)
147- let daysPassed = (diff / (86400 * 1000))
148- daysPassed
135+func handleStakingTopUp (amount) = {
136+ let currentInterest = tryGetInteger(keyGlobalLastInterest)
137+ let totalStakedAmount = tryGetInteger(totalStakedKey())
138+ let interestDelta = if ((totalStakedAmount > 0))
139+ then fraction(amount, Scale, totalStakedAmount)
140+ else 0
141+[IntegerEntry(keyGlobalEarned, (tryGetInteger(keyGlobalEarned) + amount)), IntegerEntry(keyGlobalLastInterest, (currentInterest + interestDelta))]
149142 }
150143
151144
152-func hasDoneTask7Days (day,address,actionName,rewardAmount,rewardAmountWeekly) = {
153- let userExperienceKey = userExperience(address)
154- let userExpTilldate = tryGetInteger(userExperienceKey)
155- let checkDayKey = actionPerAddressPerUserLastCheckDay(address, actionName)
156- let daysInRowKey = actionPerAddressPerUserAmountInARow(address, actionName)
157- let lastCheckDay = tryGetInteger(checkDayKey)
158- let daysInRow = tryGetInteger(daysInRowKey)
159- let daysInRowUpdate = if ((lastCheckDay == (day - 1)))
160- then (daysInRow + 1)
161- else if (((day - 1) > lastCheckDay))
162- then 1
163- else 0
164- let lastCheckDayUpdate = day
165- let reward = if ((daysInRowUpdate == 7))
166- then [ScriptTransfer(addressFromStringValue(address), rewardAmountWeekly, getSpiceAssetId()), IntegerEntry(daysInRowKey, 0)]
167- else [IntegerEntry(daysInRowKey, daysInRowUpdate)]
168- ([IntegerEntry(checkDayKey, lastCheckDayUpdate), ScriptTransfer(addressFromStringValue(address), rewardAmount, getSpiceAssetId()), IntegerEntry(userExperienceKey, (userExpTilldate + 1))] ++ reward)
145+func asBoolean (value) = match value {
146+ case boolean: Boolean =>
147+ boolean
148+ case _ =>
149+ throw("FAB: wrong type, expected: Boolean")
150+}
151+
152+
153+func calculatePerchPrice (address) = {
154+ let hasArtefactStaked = tryGetStringExternal(getAccBoosterAddress(), (("ART-XMISTL_" + address) + "_owner"))
155+ let perchPrice = getIntegerValue(getOracle(), staticKey_veggPerchFee())
156+ if ((hasArtefactStaked == ""))
157+ then perchPrice
158+ else perchPrice
169159 }
170160
171161
172-func payAction (actionName,userAddress,amount,day) = {
173- let composedKey = if (tryGetBoolean((("TASK_" + actionName) + "_EVERY")))
174- then actionName
175- else ((actionName + "_") + toString(amount))
176- if (tryGetBoolean(("TASK_" + composedKey)))
177- then hasDoneTask7Days(day, toString(userAddress), composedKey, tryGetInteger((("TASK_" + composedKey) + "_REWARD_DAILY")), tryGetInteger((("TASK_" + composedKey) + "_REWARD_WEEKLY")))
178- else nil
162+func getAssetOrigin (generation) = if ((generation == "G"))
163+ then getIncubatorAddress()
164+ else getBreederAddress()
165+
166+
167+func getAssetRarity (genotype,generation) = {
168+ let quantity = valueOrErrorMessage(getInteger(getAssetOrigin(generation), (("stats_" + genotype) + "_quantity")), (("stats_" + genotype) + "_quantity not found"))
169+ let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR)
170+ if ((power > 0))
171+ then power
172+ else 2
179173 }
180174
181175
182-func recordActionInternal (actionName,addressCaller,address) = if (!(containsElement(scCanUseCoupons, addressCaller)))
183- then throw("CRA: Only certain smart contracts can use this reward module!")
184- else {
185- let day = calculateDaysSinceStart()
186- let actionKey = actionPerAddressPerUserPerDay(toString(address), actionName, toString(addressCaller), toString(day))
187- let totalActions = (tryGetInteger(actionKey) + 1)
188- ([IntegerEntry(actionKey, totalActions)] ++ payAction(actionName, address, totalActions, day))
189- }
176+func asString (value) = match value {
177+ case string: String =>
178+ string
179+ case _ =>
180+ throw("FAS: wrong type, expected: String")
181+}
190182
191183
192184 @Callable(i)
193185 func configureOracle (oracle) = if ((i.caller != this))
194- then throw("CCO: admin only")
186+ then throw("ICU: admin only")
195187 else [StringEntry("static_oracleAddress", oracle)]
196188
197189
198190
199191 @Callable(i)
200-func addCoupons (user,amount) = if (if ((i.caller != this))
201- then (i.callerPublicKey != wAccPKey)
202- else false)
203- then throw("CAC: admin only")
204- else if ((amount >= 10000000))
205- then (recordActionInternal("VEGG10000000", this, addressFromStringValue(user)) ++ addCouponsInternal(user, amount))
206- else if ((amount >= 500000))
207- then (recordActionInternal("VEGG500000", this, addressFromStringValue(user)) ++ addCouponsInternal(user, amount))
208- else addCouponsInternal(user, amount)
192+func calculateFarmPower (assetId) = if (!(if ((value(assetInfo(fromBase58String(assetId))).issuer == getBreederAddress()))
193+ then true
194+ else (value(assetInfo(fromBase58String(assetId))).issuer == getIncubatorAddress())))
195+ then throw("This does not seem like a valid Duck!")
196+ else {
197+ let assetName = value(assetInfo(fromBase58String(assetId))).name
198+ let gen = takeRight(assetName, 1)
199+ let genotype = split(dropRight(drop(assetName, 5), 3), "")
200+ func uniqueArrayFilter (accum,nextGen) = if (!(containsElement(accum, nextGen)))
201+ then (accum :+ nextGen)
202+ else accum
209203
204+ let uniqueList = {
205+ let $l = genotype
206+ let $s = size($l)
207+ let $acc0 = nil
208+ func $f0_1 ($a,$i) = if (($i >= $s))
209+ then $a
210+ else uniqueArrayFilter($a, $l[$i])
210211
212+ func $f0_2 ($a,$i) = if (($i >= $s))
213+ then $a
214+ else throw("List size exceeds 8")
211215
212-@Callable(i)
213-func addCouponsFarming (user,amount) = if ((i.caller != getVeggFarmingAddress()))
214- then throw("Method only for farming sc!")
215- else addCouponsInternal(user, amount)
216-
217-
218-
219-@Callable(i)
220-func addCouponsBatch (batch) = if (if ((i.caller != this))
221- then (i.callerPublicKey != wAccPKey)
222- else false)
223- then throw("CAC: admin only")
224- else {
225- let couponsList = split(batch, ";")
226- func handleCoupon (acc,coupon) = {
227- let splitArray = split(coupon, ":")
228- let user = splitArray[0]
229- let amount = parseIntValue(splitArray[1])
230- let burnCall = invoke(getBurnAddress(), "burnByInvoke", [amount], nil)
231- if ((burnCall == burnCall))
232- then if ((amount >= 10000000))
233- then ((acc ++ recordActionInternal("VEGG10000000", this, addressFromStringValue(user))) ++ addCouponsInternal(user, amount))
234- else if ((amount >= 500000))
235- then ((acc ++ recordActionInternal("VEGG500000", this, addressFromStringValue(user))) ++ addCouponsInternal(user, amount))
236- else (acc ++ addCouponsInternal(user, amount))
237- else throw("Strict value is not equal to itself.")
216+ $f0_2($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)
238217 }
239-
240- let $l = couponsList
241- let $s = size($l)
242- let $acc0 = nil
243- func $f0_1 ($a,$i) = if (($i >= $s))
244- then $a
245- else handleCoupon($a, $l[$i])
246-
247- func $f0_2 ($a,$i) = if (($i >= $s))
248- then $a
249- else throw("List size exceeds 20")
250-
251- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
218+ let totalGenes = if ((gen == "U"))
219+ then 8
220+ else size(uniqueList)
221+ let power = pow(15, 1, totalGenes, 0, 2, DOWN)
222+ let multiplier = (((height - 3750000) * 100) / (((60 * 24) * 30) * 3))
223+ let finalPower = ((power * multiplier) / 100)
224+ $Tuple2([IntegerEntry(("DEBUG_" + assetName), finalPower), IntegerEntry(("DEBUG_COEFFICIENT_" + assetName), multiplier)], finalPower)
252225 }
253226
254227
255228
256229 @Callable(i)
257-func CFRefund (recipient,amount) = {
258- let cfAddress = getStringValue(i.caller, "CF_ADDRESS")
259- let key = (("f_" + cfAddress) + "_stake_address")
260- let stakeAddress = getStringValue(getMasterAddress(), key)
261- if ((stakeAddress != toString(i.caller)))
262- then throw("CCR: This is something fishy going on!")
263- else addCouponsInternal(recipient, amount)
230+func calculateFarmPowerAssetName (assetName) = {
231+ let gen = takeRight(assetName, 1)
232+ let genotype = split(dropRight(drop(assetName, 5), 3), "")
233+ func uniqueArrayFilter (accum,nextGen) = if (!(containsElement(accum, nextGen)))
234+ then (accum :+ nextGen)
235+ else accum
236+
237+ let uniqueList = {
238+ let $l = genotype
239+ let $s = size($l)
240+ let $acc0 = nil
241+ func $f0_1 ($a,$i) = if (($i >= $s))
242+ then $a
243+ else uniqueArrayFilter($a, $l[$i])
244+
245+ func $f0_2 ($a,$i) = if (($i >= $s))
246+ then $a
247+ else throw("List size exceeds 8")
248+
249+ $f0_2($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)
250+ }
251+ let totalGenes = if ((gen == "U"))
252+ then 8
253+ else size(uniqueList)
254+ let power = pow(15, 1, totalGenes, 0, 1, DOWN)
255+ let multiplier = (((height - 3750000) * 100) / (((60 * 24) * 30) * 3))
256+ let finalPower = ((power * multiplier) / 100)
257+ $Tuple2([IntegerEntry(("DEBUG_" + assetName), finalPower), IntegerEntry(("DEBUG_COEFFICIENT_" + assetName), multiplier)], finalPower)
264258 }
265259
266260
267261
268262 @Callable(i)
269-func useCoupons (amountTryingToPay) = {
270- let invokingSc = i.caller
271- if ((0 > amountTryingToPay))
272- then throw("CUC: Only positive amount of money can be paid!")
273- else if (!(containsElement(scCanUseCoupons, invokingSc)))
274- then throw("CUC: Only certain smart contracts can use this coupon module!")
275- else {
276- let user = toString(i.originCaller)
277- let keyActive = couponsUserActive(user)
278- let availableCoupons = tryGetInteger(keyActive)
279- if ((0 > availableCoupons))
280- then throw("CUC: Get rekt!")
281- else {
282- let leftToPay = if ((amountTryingToPay > availableCoupons))
283- then (amountTryingToPay - availableCoupons)
284- else 0
285- let amountPaid = (amountTryingToPay - leftToPay)
286- let availableCouponsLeft = (availableCoupons - amountPaid)
287- if ((0 > availableCouponsLeft))
288- then throw("CUC: You try to overspend!")
263+func buyPerch (colorI,refererAddress) = {
264+ let validPayment = checkAdditionalPayment(i.payments[0])
265+ if ((validPayment == validPayment))
266+ then {
267+ let color = if ((colorI == "U"))
268+ then "B"
269+ else colorI
270+ if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
271+ then throw("you need to set color properly")
272+ else {
273+ let exactPrice = calculatePerchPrice(toString(i.caller))
274+ let firstPayment = if ((size(i.payments) == 2))
275+ then value(i.payments[1])
276+ else value(i.payments[0])
277+ if ((firstPayment.assetId != getEggAssetId()))
278+ then throw(("FBP: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
279+ else if ((firstPayment.amount != exactPrice))
280+ then throw(((("FBP: To buy a perch you currently need the following amount of EGGlets: " + toString(exactPrice)) + " ") + toString(i.caller)))
289281 else {
290- let keySpend = couponsUserSpend(user)
291- let keyOld = couponsUserActiveOld(user)
292- let keySpendSc = couponsSpendOnSc(toString(i.caller))
293- let topUp = invoke(getVeggFarmingAddress(), "topUpReward", [amountPaid], nil)
294- if ((topUp == topUp))
282+ let toBurn = exactPrice
283+ let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), toBurn)])
284+ if ((burnCall == burnCall))
295285 then {
296- let totalSpend = (tryGetInteger(keySpend) + amountPaid)
297- let totalSpendSc = (tryGetInteger(keySpendSc) + amountPaid)
298- $Tuple2([IntegerEntry(keySpend, totalSpend), IntegerEntry(keyOld, availableCoupons), IntegerEntry(keyActive, availableCouponsLeft), IntegerEntry(keySpendSc, totalSpendSc)], amountPaid)
286+ let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)
287+ let perchAmount = tryGetInteger(perchAmountKey)
288+ ([IntegerEntry(perchAmountKey, (perchAmount + 1))] ++ validPayment)
299289 }
300290 else throw("Strict value is not equal to itself.")
301291 }
302- }
303- }
292+ }
293+ }
294+ else throw("Strict value is not equal to itself.")
304295 }
305296
306297
307298
308299 @Callable(i)
309-func recordAction (actionName) = recordActionInternal(actionName, i.caller, i.originCaller)
300+func stakeNFT (jColor) = {
301+ let validPayment = checkAdditionalPayment(i.payments[0])
302+ if ((validPayment == validPayment))
303+ then {
304+ let pmt = value(i.payments[1])
305+ let assetId = value(pmt.assetId)
306+ let assetName = value(value(assetInfo(assetId)).name)
307+ let isJackpot = (takeRight(assetName, 1) == "U")
308+ let rarity = if (isJackpot)
309+ then 100
310+ else {
311+ let generation = take(takeRight(assetName, 2), 1)
312+ let farmGen = asString(invoke(getBreederAddress(), "getGenFromName", [assetName], nil))
313+ if ((farmGen == farmGen))
314+ then getAssetRarity(farmGen, generation)
315+ else throw("Strict value is not equal to itself.")
316+ }
317+ if ((70 > rarity))
318+ then throw("Only ducks with a rarity above 70 can be locked!")
319+ else {
320+ let address = toString(i.caller)
321+ let color = if (isJackpot)
322+ then jColor
323+ else takeRight(assetName, 1)
324+ let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color))
325+ if ((pmt.amount != 1))
326+ then throw("NFT is not attached")
327+ else if ((0 >= availablePerches))
328+ then throw(("no perch available for the type " + color))
329+ else {
330+ let farmingPower = asInt(invoke(this, "calculateFarmPower", [toBase58String(assetId)], nil))
331+ if ((farmingPower == farmingPower))
332+ then (([IntegerEntry(totalStakedKey(), (tryGetInteger(totalStakedKey()) + farmingPower)), IntegerEntry(totalStakedUserKey(address), (tryGetInteger(totalStakedUserKey(address)) + farmingPower)), IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((toBase58String(assetId) + "_owner"), address), IntegerEntry((toBase58String(assetId) + "_power"), farmingPower), IntegerEntry((((("assetId_" + toBase58String(assetId)) + "_owner_") + address) + "_power"), farmingPower)] ++ claimStakingResult(i.caller)) ++ validPayment)
333+ else throw("Strict value is not equal to itself.")
334+ }
335+ }
336+ }
337+ else throw("Strict value is not equal to itself.")
338+ }
339+
340+
341+
342+@Callable(i)
343+func topUpReward (amount) = if ((i.caller != getCouponsAddress()))
344+ then throw("VFTUP: Only couponsdapp can do topup!")
345+ else {
346+ let resHandleStaking = handleStakingTopUp(amount)
347+ $Tuple2(resHandleStaking, true)
348+ }
349+
350+
351+
352+@Callable(i)
353+func claimReward () = {
354+ let validPayment = checkAdditionalPayment(i.payments[0])
355+ if ((validPayment == validPayment))
356+ then if ((size(i.payments) > 1))
357+ then throw("Please don't add extra payments")
358+ else (claimStakingResult(i.caller) ++ validPayment)
359+ else throw("Strict value is not equal to itself.")
360+ }
310361
311362
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func tryGetStringExternal (address,key) = match getString(address, key) {
5- case a: String =>
6- a
7- case _ =>
8- ""
9-}
10-
11-
12-func tryGetBoolean (key) = match getBoolean(key) {
13- case b: Boolean =>
14- b
15- case _ =>
16- false
17-}
18-
19-
20-func tryGetString (key) = tryGetStringExternal(this, key)
21-
4+let Scale = 100000000
225
236 func tryGetInteger (key) = match getInteger(this, key) {
247 case b: Int =>
258 b
269 case _ =>
2710 0
2811 }
2912
3013
31-func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
14+func tryGetStringExternal (address,key) = match getString(address, key) {
15+ case a: String =>
16+ a
17+ case _ =>
18+ ""
19+}
3220
3321
34-func staticKey_turtleStakingAddress () = "static_turtleStakingAddress"
22+func tryGetString (key) = tryGetStringExternal(this, key)
3523
3624
37-func staticKey_turtleRebirthAddress () = "static_turtleRebirthAddress"
25+func staticKey_oracleAddress () = "static_oracleAddress"
3826
3927
40-func staticKey_ropeAddress () = "static_ropeAddress"
28+func staticKey_eggAssetId () = "static_eggAssetId"
4129
4230
43-func staticKey_levelSystemAddress () = "static_levelSystemAddress"
31+func staticKey_burnAddress () = "static_burnAddress"
4432
4533
46-func staticKey_spiceAssetId () = "static_spiceAssetId"
34+func staticKey_extraFee () = "static_extraFee"
4735
4836
49-func staticKey_marketplace () = "static_marketplaceAddress"
37+func staticKey_feeAggregator () = "static_feeAggregator"
5038
5139
52-func staticKey_capacityAddress () = "static_capacityAddress"
40+func staticKey_incubatorAddress () = "static_incubatorAddress"
5341
5442
55-func staticKey_veggFarmingAddress () = "static_veggFarmingAddress"
43+func staticKey_breederAddress () = "static_breederAddress"
5644
5745
58-func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
46+func staticKey_refContractAddress () = "static_refContractAddress"
5947
6048
61-func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
49+func staticKey_couponsAddress () = "static_couponsAddress"
6250
6351
64-func getFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_farmingAddress")))
52+func staticKey_accBoosterAddress () = "static_accBoosterAddress"
6553
6654
67-func getGameDappAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_gameDappAddress")))
55+func staticKey_veggPerchFee () = "static_veggPerchFee"
6856
6957
70-func getCapacityAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_capacityAddress())))
58+func rewardClaimedKey (address) = (toString(address) + "_claimed")
7159
7260
73-func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_burnAddress")))
61+func totalStakedKey () = "total_staked"
7462
7563
76-func getBabyduckAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_babyDuckAddress")))
64+func totalStakedUserKey (address) = ("total_staked_" + address)
7765
7866
79-func getBreedingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress")))
67+let keyGlobalLastInterest = "global_lastCheck_interest"
68+
69+func keyLastCheckInterest (address) = (toString(address) + "_lastCheck_interest")
8070
8171
82-func getMasterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_cfMasterAddress")))
72+let keyGlobalEarned = "global_earnings"
73+
74+func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
8375
8476
85-func getTurtleStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleStakingAddress())))
77+func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
8678
8779
88-func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
80+func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
8981
9082
91-func getRopeAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_ropeAddress())))
83+func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
9284
9385
94-func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_spiceAssetId()))
86+func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
9587
9688
97-func getLevelSystemAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_levelSystemAddress())))
89+func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_incubatorAddress())))
9890
9991
100-func getMarketPlaceAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_marketplace())))
92+func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
10193
10294
103-func getVeggFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_veggFarmingAddress())))
95+func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
10496
10597
106-let wAccPKey = fromBase58String(valueOrErrorMessage(getString(getOracle(), "static_warsPKey"), "static_warsPKey not defined"))
107-
108-let scCanUseCoupons = [getRebirthAddress(), getIncubatorAddress(), getFarmingAddress(), getGameDappAddress(), getBabyduckAddress(), getBreedingAddress(), getTurtleStakingAddress(), getTurtleRebirthAddress(), getRopeAddress(), getLevelSystemAddress(), getMarketPlaceAddress(), getCapacityAddress(), this]
109-
110-func couponsUserSpend (user) = (user + "_spend")
98+func getAccBoosterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_accBoosterAddress())))
11199
112100
113-func couponsUserActive (user) = (user + "_active")
101+func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
102+ then throw("FCAP: Please attach waves")
103+ else {
104+ let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
105+ if ((payment.amount != feeAmount))
106+ then throw((("FCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
107+ else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
108+ }
114109
115110
116-func couponsUserActiveOld (user) = (couponsUserActive(user) + "_old")
111+func asInt (value) = match value {
112+ case int: Int =>
113+ int
114+ case _ =>
115+ throw("FAI: wrong type, expected: Int")
116+}
117117
118118
119-func couponsSpendOnSc (sc) = (sc + "_spend_by_using")
120-
121-
122-func actionPerAddressPerUserPerDay (user,action,dappAddress,day) = (((((((dappAddress + "_") + action) + "_") + user) + "_") + day) + "_actions")
123-
124-
125-func actionPerAddressPerUserLastCheckDay (user,action) = (((action + "_") + user) + "_actions_check_day")
126-
127-
128-func actionPerAddressPerUserAmountInARow (user,action) = (((action + "_") + user) + "_actions_amount_in_row")
129-
130-
131-func userExperience (user) = (user + "_experience")
132-
133-
134-func addCouponsInternal (user,amount) = {
135- let keyOld = couponsUserActiveOld(user)
136- let key = couponsUserActive(user)
137- let couponsOld = tryGetInteger(key)
138- let coupons = (couponsOld + amount)
139-[IntegerEntry(keyOld, couponsOld), IntegerEntry(key, coupons)]
119+func claimStakingResult (address) = {
120+ let currentInterest = tryGetInteger(keyGlobalLastInterest)
121+ let lastCheckInterest = tryGetInteger(keyLastCheckInterest(address))
122+ let stakedAmount = tryGetInteger(totalStakedUserKey(toString(address)))
123+ let reward = if ((lastCheckInterest > 0))
124+ then fraction((currentInterest - lastCheckInterest), stakedAmount, Scale)
125+ else 0
126+ let invokeResult = if ((reward > 0))
127+ then invoke(getCouponsAddress(), "addCouponsFarming", [toString(address), reward], nil)
128+ else unit
129+ if ((invokeResult == invokeResult))
130+ then [IntegerEntry(keyLastCheckInterest(address), currentInterest), IntegerEntry(rewardClaimedKey(address), (tryGetInteger(rewardClaimedKey(address)) + reward))]
131+ else throw("Strict value is not equal to itself.")
140132 }
141133
142134
143-let startTsMs = 1695427200000
144-
145-func calculateDaysSinceStart () = {
146- let diff = (lastBlock.timestamp - startTsMs)
147- let daysPassed = (diff / (86400 * 1000))
148- daysPassed
135+func handleStakingTopUp (amount) = {
136+ let currentInterest = tryGetInteger(keyGlobalLastInterest)
137+ let totalStakedAmount = tryGetInteger(totalStakedKey())
138+ let interestDelta = if ((totalStakedAmount > 0))
139+ then fraction(amount, Scale, totalStakedAmount)
140+ else 0
141+[IntegerEntry(keyGlobalEarned, (tryGetInteger(keyGlobalEarned) + amount)), IntegerEntry(keyGlobalLastInterest, (currentInterest + interestDelta))]
149142 }
150143
151144
152-func hasDoneTask7Days (day,address,actionName,rewardAmount,rewardAmountWeekly) = {
153- let userExperienceKey = userExperience(address)
154- let userExpTilldate = tryGetInteger(userExperienceKey)
155- let checkDayKey = actionPerAddressPerUserLastCheckDay(address, actionName)
156- let daysInRowKey = actionPerAddressPerUserAmountInARow(address, actionName)
157- let lastCheckDay = tryGetInteger(checkDayKey)
158- let daysInRow = tryGetInteger(daysInRowKey)
159- let daysInRowUpdate = if ((lastCheckDay == (day - 1)))
160- then (daysInRow + 1)
161- else if (((day - 1) > lastCheckDay))
162- then 1
163- else 0
164- let lastCheckDayUpdate = day
165- let reward = if ((daysInRowUpdate == 7))
166- then [ScriptTransfer(addressFromStringValue(address), rewardAmountWeekly, getSpiceAssetId()), IntegerEntry(daysInRowKey, 0)]
167- else [IntegerEntry(daysInRowKey, daysInRowUpdate)]
168- ([IntegerEntry(checkDayKey, lastCheckDayUpdate), ScriptTransfer(addressFromStringValue(address), rewardAmount, getSpiceAssetId()), IntegerEntry(userExperienceKey, (userExpTilldate + 1))] ++ reward)
145+func asBoolean (value) = match value {
146+ case boolean: Boolean =>
147+ boolean
148+ case _ =>
149+ throw("FAB: wrong type, expected: Boolean")
150+}
151+
152+
153+func calculatePerchPrice (address) = {
154+ let hasArtefactStaked = tryGetStringExternal(getAccBoosterAddress(), (("ART-XMISTL_" + address) + "_owner"))
155+ let perchPrice = getIntegerValue(getOracle(), staticKey_veggPerchFee())
156+ if ((hasArtefactStaked == ""))
157+ then perchPrice
158+ else perchPrice
169159 }
170160
171161
172-func payAction (actionName,userAddress,amount,day) = {
173- let composedKey = if (tryGetBoolean((("TASK_" + actionName) + "_EVERY")))
174- then actionName
175- else ((actionName + "_") + toString(amount))
176- if (tryGetBoolean(("TASK_" + composedKey)))
177- then hasDoneTask7Days(day, toString(userAddress), composedKey, tryGetInteger((("TASK_" + composedKey) + "_REWARD_DAILY")), tryGetInteger((("TASK_" + composedKey) + "_REWARD_WEEKLY")))
178- else nil
162+func getAssetOrigin (generation) = if ((generation == "G"))
163+ then getIncubatorAddress()
164+ else getBreederAddress()
165+
166+
167+func getAssetRarity (genotype,generation) = {
168+ let quantity = valueOrErrorMessage(getInteger(getAssetOrigin(generation), (("stats_" + genotype) + "_quantity")), (("stats_" + genotype) + "_quantity not found"))
169+ let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR)
170+ if ((power > 0))
171+ then power
172+ else 2
179173 }
180174
181175
182-func recordActionInternal (actionName,addressCaller,address) = if (!(containsElement(scCanUseCoupons, addressCaller)))
183- then throw("CRA: Only certain smart contracts can use this reward module!")
184- else {
185- let day = calculateDaysSinceStart()
186- let actionKey = actionPerAddressPerUserPerDay(toString(address), actionName, toString(addressCaller), toString(day))
187- let totalActions = (tryGetInteger(actionKey) + 1)
188- ([IntegerEntry(actionKey, totalActions)] ++ payAction(actionName, address, totalActions, day))
189- }
176+func asString (value) = match value {
177+ case string: String =>
178+ string
179+ case _ =>
180+ throw("FAS: wrong type, expected: String")
181+}
190182
191183
192184 @Callable(i)
193185 func configureOracle (oracle) = if ((i.caller != this))
194- then throw("CCO: admin only")
186+ then throw("ICU: admin only")
195187 else [StringEntry("static_oracleAddress", oracle)]
196188
197189
198190
199191 @Callable(i)
200-func addCoupons (user,amount) = if (if ((i.caller != this))
201- then (i.callerPublicKey != wAccPKey)
202- else false)
203- then throw("CAC: admin only")
204- else if ((amount >= 10000000))
205- then (recordActionInternal("VEGG10000000", this, addressFromStringValue(user)) ++ addCouponsInternal(user, amount))
206- else if ((amount >= 500000))
207- then (recordActionInternal("VEGG500000", this, addressFromStringValue(user)) ++ addCouponsInternal(user, amount))
208- else addCouponsInternal(user, amount)
192+func calculateFarmPower (assetId) = if (!(if ((value(assetInfo(fromBase58String(assetId))).issuer == getBreederAddress()))
193+ then true
194+ else (value(assetInfo(fromBase58String(assetId))).issuer == getIncubatorAddress())))
195+ then throw("This does not seem like a valid Duck!")
196+ else {
197+ let assetName = value(assetInfo(fromBase58String(assetId))).name
198+ let gen = takeRight(assetName, 1)
199+ let genotype = split(dropRight(drop(assetName, 5), 3), "")
200+ func uniqueArrayFilter (accum,nextGen) = if (!(containsElement(accum, nextGen)))
201+ then (accum :+ nextGen)
202+ else accum
209203
204+ let uniqueList = {
205+ let $l = genotype
206+ let $s = size($l)
207+ let $acc0 = nil
208+ func $f0_1 ($a,$i) = if (($i >= $s))
209+ then $a
210+ else uniqueArrayFilter($a, $l[$i])
210211
212+ func $f0_2 ($a,$i) = if (($i >= $s))
213+ then $a
214+ else throw("List size exceeds 8")
211215
212-@Callable(i)
213-func addCouponsFarming (user,amount) = if ((i.caller != getVeggFarmingAddress()))
214- then throw("Method only for farming sc!")
215- else addCouponsInternal(user, amount)
216-
217-
218-
219-@Callable(i)
220-func addCouponsBatch (batch) = if (if ((i.caller != this))
221- then (i.callerPublicKey != wAccPKey)
222- else false)
223- then throw("CAC: admin only")
224- else {
225- let couponsList = split(batch, ";")
226- func handleCoupon (acc,coupon) = {
227- let splitArray = split(coupon, ":")
228- let user = splitArray[0]
229- let amount = parseIntValue(splitArray[1])
230- let burnCall = invoke(getBurnAddress(), "burnByInvoke", [amount], nil)
231- if ((burnCall == burnCall))
232- then if ((amount >= 10000000))
233- then ((acc ++ recordActionInternal("VEGG10000000", this, addressFromStringValue(user))) ++ addCouponsInternal(user, amount))
234- else if ((amount >= 500000))
235- then ((acc ++ recordActionInternal("VEGG500000", this, addressFromStringValue(user))) ++ addCouponsInternal(user, amount))
236- else (acc ++ addCouponsInternal(user, amount))
237- else throw("Strict value is not equal to itself.")
216+ $f0_2($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)
238217 }
239-
240- let $l = couponsList
241- let $s = size($l)
242- let $acc0 = nil
243- func $f0_1 ($a,$i) = if (($i >= $s))
244- then $a
245- else handleCoupon($a, $l[$i])
246-
247- func $f0_2 ($a,$i) = if (($i >= $s))
248- then $a
249- else throw("List size exceeds 20")
250-
251- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
218+ let totalGenes = if ((gen == "U"))
219+ then 8
220+ else size(uniqueList)
221+ let power = pow(15, 1, totalGenes, 0, 2, DOWN)
222+ let multiplier = (((height - 3750000) * 100) / (((60 * 24) * 30) * 3))
223+ let finalPower = ((power * multiplier) / 100)
224+ $Tuple2([IntegerEntry(("DEBUG_" + assetName), finalPower), IntegerEntry(("DEBUG_COEFFICIENT_" + assetName), multiplier)], finalPower)
252225 }
253226
254227
255228
256229 @Callable(i)
257-func CFRefund (recipient,amount) = {
258- let cfAddress = getStringValue(i.caller, "CF_ADDRESS")
259- let key = (("f_" + cfAddress) + "_stake_address")
260- let stakeAddress = getStringValue(getMasterAddress(), key)
261- if ((stakeAddress != toString(i.caller)))
262- then throw("CCR: This is something fishy going on!")
263- else addCouponsInternal(recipient, amount)
230+func calculateFarmPowerAssetName (assetName) = {
231+ let gen = takeRight(assetName, 1)
232+ let genotype = split(dropRight(drop(assetName, 5), 3), "")
233+ func uniqueArrayFilter (accum,nextGen) = if (!(containsElement(accum, nextGen)))
234+ then (accum :+ nextGen)
235+ else accum
236+
237+ let uniqueList = {
238+ let $l = genotype
239+ let $s = size($l)
240+ let $acc0 = nil
241+ func $f0_1 ($a,$i) = if (($i >= $s))
242+ then $a
243+ else uniqueArrayFilter($a, $l[$i])
244+
245+ func $f0_2 ($a,$i) = if (($i >= $s))
246+ then $a
247+ else throw("List size exceeds 8")
248+
249+ $f0_2($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)
250+ }
251+ let totalGenes = if ((gen == "U"))
252+ then 8
253+ else size(uniqueList)
254+ let power = pow(15, 1, totalGenes, 0, 1, DOWN)
255+ let multiplier = (((height - 3750000) * 100) / (((60 * 24) * 30) * 3))
256+ let finalPower = ((power * multiplier) / 100)
257+ $Tuple2([IntegerEntry(("DEBUG_" + assetName), finalPower), IntegerEntry(("DEBUG_COEFFICIENT_" + assetName), multiplier)], finalPower)
264258 }
265259
266260
267261
268262 @Callable(i)
269-func useCoupons (amountTryingToPay) = {
270- let invokingSc = i.caller
271- if ((0 > amountTryingToPay))
272- then throw("CUC: Only positive amount of money can be paid!")
273- else if (!(containsElement(scCanUseCoupons, invokingSc)))
274- then throw("CUC: Only certain smart contracts can use this coupon module!")
275- else {
276- let user = toString(i.originCaller)
277- let keyActive = couponsUserActive(user)
278- let availableCoupons = tryGetInteger(keyActive)
279- if ((0 > availableCoupons))
280- then throw("CUC: Get rekt!")
281- else {
282- let leftToPay = if ((amountTryingToPay > availableCoupons))
283- then (amountTryingToPay - availableCoupons)
284- else 0
285- let amountPaid = (amountTryingToPay - leftToPay)
286- let availableCouponsLeft = (availableCoupons - amountPaid)
287- if ((0 > availableCouponsLeft))
288- then throw("CUC: You try to overspend!")
263+func buyPerch (colorI,refererAddress) = {
264+ let validPayment = checkAdditionalPayment(i.payments[0])
265+ if ((validPayment == validPayment))
266+ then {
267+ let color = if ((colorI == "U"))
268+ then "B"
269+ else colorI
270+ if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
271+ then throw("you need to set color properly")
272+ else {
273+ let exactPrice = calculatePerchPrice(toString(i.caller))
274+ let firstPayment = if ((size(i.payments) == 2))
275+ then value(i.payments[1])
276+ else value(i.payments[0])
277+ if ((firstPayment.assetId != getEggAssetId()))
278+ then throw(("FBP: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
279+ else if ((firstPayment.amount != exactPrice))
280+ then throw(((("FBP: To buy a perch you currently need the following amount of EGGlets: " + toString(exactPrice)) + " ") + toString(i.caller)))
289281 else {
290- let keySpend = couponsUserSpend(user)
291- let keyOld = couponsUserActiveOld(user)
292- let keySpendSc = couponsSpendOnSc(toString(i.caller))
293- let topUp = invoke(getVeggFarmingAddress(), "topUpReward", [amountPaid], nil)
294- if ((topUp == topUp))
282+ let toBurn = exactPrice
283+ let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), toBurn)])
284+ if ((burnCall == burnCall))
295285 then {
296- let totalSpend = (tryGetInteger(keySpend) + amountPaid)
297- let totalSpendSc = (tryGetInteger(keySpendSc) + amountPaid)
298- $Tuple2([IntegerEntry(keySpend, totalSpend), IntegerEntry(keyOld, availableCoupons), IntegerEntry(keyActive, availableCouponsLeft), IntegerEntry(keySpendSc, totalSpendSc)], amountPaid)
286+ let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)
287+ let perchAmount = tryGetInteger(perchAmountKey)
288+ ([IntegerEntry(perchAmountKey, (perchAmount + 1))] ++ validPayment)
299289 }
300290 else throw("Strict value is not equal to itself.")
301291 }
302- }
303- }
292+ }
293+ }
294+ else throw("Strict value is not equal to itself.")
304295 }
305296
306297
307298
308299 @Callable(i)
309-func recordAction (actionName) = recordActionInternal(actionName, i.caller, i.originCaller)
300+func stakeNFT (jColor) = {
301+ let validPayment = checkAdditionalPayment(i.payments[0])
302+ if ((validPayment == validPayment))
303+ then {
304+ let pmt = value(i.payments[1])
305+ let assetId = value(pmt.assetId)
306+ let assetName = value(value(assetInfo(assetId)).name)
307+ let isJackpot = (takeRight(assetName, 1) == "U")
308+ let rarity = if (isJackpot)
309+ then 100
310+ else {
311+ let generation = take(takeRight(assetName, 2), 1)
312+ let farmGen = asString(invoke(getBreederAddress(), "getGenFromName", [assetName], nil))
313+ if ((farmGen == farmGen))
314+ then getAssetRarity(farmGen, generation)
315+ else throw("Strict value is not equal to itself.")
316+ }
317+ if ((70 > rarity))
318+ then throw("Only ducks with a rarity above 70 can be locked!")
319+ else {
320+ let address = toString(i.caller)
321+ let color = if (isJackpot)
322+ then jColor
323+ else takeRight(assetName, 1)
324+ let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color))
325+ if ((pmt.amount != 1))
326+ then throw("NFT is not attached")
327+ else if ((0 >= availablePerches))
328+ then throw(("no perch available for the type " + color))
329+ else {
330+ let farmingPower = asInt(invoke(this, "calculateFarmPower", [toBase58String(assetId)], nil))
331+ if ((farmingPower == farmingPower))
332+ then (([IntegerEntry(totalStakedKey(), (tryGetInteger(totalStakedKey()) + farmingPower)), IntegerEntry(totalStakedUserKey(address), (tryGetInteger(totalStakedUserKey(address)) + farmingPower)), IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((toBase58String(assetId) + "_owner"), address), IntegerEntry((toBase58String(assetId) + "_power"), farmingPower), IntegerEntry((((("assetId_" + toBase58String(assetId)) + "_owner_") + address) + "_power"), farmingPower)] ++ claimStakingResult(i.caller)) ++ validPayment)
333+ else throw("Strict value is not equal to itself.")
334+ }
335+ }
336+ }
337+ else throw("Strict value is not equal to itself.")
338+ }
339+
340+
341+
342+@Callable(i)
343+func topUpReward (amount) = if ((i.caller != getCouponsAddress()))
344+ then throw("VFTUP: Only couponsdapp can do topup!")
345+ else {
346+ let resHandleStaking = handleStakingTopUp(amount)
347+ $Tuple2(resHandleStaking, true)
348+ }
349+
350+
351+
352+@Callable(i)
353+func claimReward () = {
354+ let validPayment = checkAdditionalPayment(i.payments[0])
355+ if ((validPayment == validPayment))
356+ then if ((size(i.payments) > 1))
357+ then throw("Please don't add extra payments")
358+ else (claimStakingResult(i.caller) ++ validPayment)
359+ else throw("Strict value is not equal to itself.")
360+ }
310361
311362

github/deemru/w8io/3ef1775 
76.27 ms