tx · DFf5UtP5FxE6BKATqTYMzcbRLRvv8HUmJppNQLZrecX8

3Mrj66WrZRC5TYVqoGS8WXGNN9ib23GMUEh:  -0.02100000 Waves

2024.10.03 13:16 [3310539] smart account 3Mrj66WrZRC5TYVqoGS8WXGNN9ib23GMUEh > SELF 0.00000000 Waves

{ "type": 13, "id": "DFf5UtP5FxE6BKATqTYMzcbRLRvv8HUmJppNQLZrecX8", "fee": 2100000, "feeAssetId": null, "timestamp": 1727950572954, "version": 2, "chainId": 84, "sender": "3Mrj66WrZRC5TYVqoGS8WXGNN9ib23GMUEh", "senderPublicKey": "HtAuuH8fNTR1JCCJQQz1CsvFkGChAXrRT48xCPAYBfRY", "proofs": [ "54xZtCi9KzQTjBpf7LaakKeqKdisDwiTrszkChsNpsm5RBWCFj5pH6mAxLFEfTTRBM8HvT7E5Gxhd9agrjBZBp1X" ], "script": "base64:AAIFAAAAAAAAACEIAhIDCgEIEgMKAQgSBAoCCAgSAwoBCBIDCgEBEgMKAQgAAAAyAQAAAAdnZXRCb29sAAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQbAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdCb29sZWFuBAAAAAFiBQAAAAckbWF0Y2gwBQAAAAFiBwEAAAAJaXNUZXN0RW52AAAAAAkBAAAAB2dldEJvb2wAAAABAgAAAAdURVNURU5WAAAAAAVTY2FsZQAAAAAABfXhAAEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAADHRyeUdldFN0cmluZwAAAAEAAAADa2V5CQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACBQAAAAR0aGlzBQAAAANrZXkBAAAAHHN0YXRpY0tleV9yZWZDb250cmFjdEFkZHJlc3MAAAAAAgAAABlzdGF0aWNfcmVmQ29udHJhY3RBZGRyZXNzAAAAABVrZXlHbG9iYWxMYXN0SW50ZXJlc3QCAAAAGWdsb2JhbF9sYXN0Q2hlY2tfaW50ZXJlc3QBAAAAF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAAAAAIAAAAUc3RhdGljX29yYWNsZUFkZHJlc3MBAAAAFHN0YXRpY0tleV9lZ2dBc3NldElkAAAAAAIAAAARc3RhdGljX2VnZ0Fzc2V0SWQBAAAAGnN0YXRpY0tleV9pbmN1YmF0b3JBZGRyZXNzAAAAAAIAAAAXc3RhdGljX2luY3ViYXRvckFkZHJlc3MBAAAAGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwAAAAACAAAAFXN0YXRpY19icmVlZGVyQWRkcmVzcwEAAAAbc3RhdGljS2V5X2FjY0Jvb3N0ZXJBZGRyZXNzAAAAAAIAAAAYc3RhdGljX2FjY0Jvb3N0ZXJBZGRyZXNzAQAAABVzdGF0aWNLZXlfZHVja1dyYXBwZXIAAAAAAgAAABJzdGF0aWNfZHVja1dyYXBwZXIBAAAAGHN0YXRpY0tleV9jb3Vwb25zQWRkcmVzcwAAAAACAAAAFXN0YXRpY19jb3Vwb25zQWRkcmVzcwEAAAAVc3RhdGljS2V5X2J1cm5BZGRyZXNzAAAAAAIAAAASc3RhdGljX2J1cm5BZGRyZXNzAQAAABJzdGF0aWNLZXlfZXh0cmFGZWUAAAAAAgAAAA9zdGF0aWNfZXh0cmFGZWUBAAAAF3N0YXRpY0tleV9mZWVBZ2dyZWdhdG9yAAAAAAIAAAAUc3RhdGljX2ZlZUFnZ3JlZ2F0b3IAAAAAD2tleUdsb2JhbEVhcm5lZAIAAAAPZ2xvYmFsX2Vhcm5pbmdzAQAAABZzdGF0aWNLZXlfdmVnZ1BlcmNoRmVlAAAAAAIAAAATc3RhdGljX3ZlZ2dQZXJjaEZlZQEAAAAOdG90YWxTdGFrZWRLZXkAAAAAAgAAAAx0b3RhbF9zdGFrZWQBAAAACWdldE9yYWNsZQAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkBAAAAF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAAAAAEAAAANZ2V0RWdnQXNzZXRJZAAAAAAJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABRzdGF0aWNLZXlfZWdnQXNzZXRJZAAAAAABAAAAE2dldEluY3ViYXRvckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABpzdGF0aWNLZXlfaW5jdWJhdG9yQWRkcmVzcwAAAAABAAAAEWdldEJyZWVkZXJBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAAAAAEAAAAUZ2V0QWNjQm9vc3RlckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABtzdGF0aWNLZXlfYWNjQm9vc3RlckFkZHJlc3MAAAAAAQAAABBnZXREdWNrV3JhcHBlclNjAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAVc3RhdGljS2V5X2R1Y2tXcmFwcGVyAAAAAAEAAAARZ2V0Q291cG9uc0FkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABhzdGF0aWNLZXlfY291cG9uc0FkZHJlc3MAAAAAAQAAAA5nZXRCdXJuQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAFXN0YXRpY0tleV9idXJuQWRkcmVzcwAAAAABAAAAEGdldEZlZUFnZ3JlZ2F0b3IAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgAAAAABAAAAFWdldFJlZkNvbnRyYWN0QWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAHHN0YXRpY0tleV9yZWZDb250cmFjdEFkZHJlc3MAAAAAAQAAABRrZXlMYXN0Q2hlY2tJbnRlcmVzdAAAAAIAAAAHYWRkcmVzcwAAAAVhc3NldAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAEl9sYXN0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ZXIAAAAAAAAAAAAFAAAABXBvd2VyAAAAAAAAAAACAQAAABZnZXRBc3NldFJhcml0eUNvbXBsZXRlAAAAAgAAAAlpc0phY2twb3QAAAAJYXNzZXROYW1lBAAAAAZyYXJpdHkDBQAAAAlpc0phY2twb3QAAAAAAAAAAGQEAAAACmdlbmVyYXRpb24JAAEvAAAAAgkBAAAACXRha2VSaWdodAAAAAIFAAAACWFzc2V0TmFtZQAAAAAAAAAAAgAAAAAAAAAAAQQAAAAHZmFybUdlbgkBAAAACGFzU3RyaW5nAAAAAQkAA/wAAAAECQEAAAARZ2V0QnJlZWRlckFkZHJlc3MAAAAAAgAAAA5nZXRHZW5Gcm9tTmFtZQkABEwAAAACBQAAAAlhc3NldE5hbWUFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAdmYXJtR2VuBQAAAAdmYXJtR2VuCQEAAAAOZ2V0QXNzZXRSYXJpdHkAAAACBQAAAAdmYXJtR2VuBQAAAApnZW5lcmF0aW9uCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUAAAAGcmFyaXR5AQAAABJ1cGRhdGVGYXJtaW5nUG93ZXIAAAACAAAAB2FkZHJlc3MAAAAFYXNzZXQEAAAAC3RvdGFsU3Rha2VkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAAA50b3RhbFN0YWtlZEtleQAAAAAEAAAAD3RvdGFsU3Rha2VkVXNlcgkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAASdG90YWxTdGFrZWRVc2VyS2V5AAAAAQUAAAAHYWRkcmVzcwQAAAAJY3VycmVudEZQCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABFhc3NldEZhcm1pbmdQb3dlcgAAAAIFAAAAB2FkZHJlc3MFAAAABWFzc2V0BAAAAAVuZXdGUAkBAAAACmFzSW50VHVwbGUAAAABCQAD/AAAAAQFAAAABHRoaXMCAAAAEmNhbGN1bGF0ZUZhcm1Qb3dlcgkABEwAAAACBQAAAAVhc3NldAUAAAADbmlsBQAAAANuaWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA50b3RhbFN0YWtlZEtleQAAAAAJAABkAAAAAgkAAGUAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAAA50b3RhbFN0YWtlZEtleQAAAAAFAAAACWN1cnJlbnRGUAgFAAAABW5ld0ZQAAAAAl8xCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAASdG90YWxTdGFrZWRVc2VyS2V5AAAAAQUAAAAHYWRkcmVzcwkAAGQAAAACCQAAZQAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAEnRvdGFsU3Rha2VkVXNlcktleQAAAAEFAAAAB2FkZHJlc3MFAAAACWN1cnJlbnRGUAgFAAAABW5ld0ZQAAAAAl8xCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAARYXNzZXRGYXJtaW5nUG93ZXIAAAACBQAAAAdhZGRyZXNzBQAAAAVhc3NldAgFAAAABW5ld0ZQAAAAAl8xCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAA9ERUJVR19jdXJyZW50RlAFAAAACWN1cnJlbnRGUAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAALREVCVUdfbmV3RlAIBQAAAAVuZXdGUAAAAAJfMQUAAAADbmlsAQAAABJjbGFpbVN0YWtpbmdSZXN1bHQAAAACAAAAB2FkZHJlc3MAAAAFYXNzZXQEAAAAD2N1cnJlbnRJbnRlcmVzdAkBAAAADXRyeUdldEludGVnZXIAAAABBQAAABVrZXlHbG9iYWxMYXN0SW50ZXJlc3QEAAAAEWxhc3RDaGVja0ludGVyZXN0CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABRrZXlMYXN0Q2hlY2tJbnRlcmVzdAAAAAIFAAAAB2FkZHJlc3MFAAAABWFzc2V0BAAAAAxzdGFrZWRBbW91bnQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAEWFzc2V0RmFybWluZ1Bvd2VyAAAAAgUAAAAHYWRkcmVzcwUAAAAFYXNzZXQEAAAACGZwVXBkYXRlCQEAAAASdXBkYXRlRmFybWluZ1Bvd2VyAAAAAgUAAAAHYWRkcmVzcwUAAAAFYXNzZXQEAAAABnJld2FyZAMJAABmAAAAAgUAAAARbGFzdENoZWNrSW50ZXJlc3QAAAAAAAAAAAAJAABrAAAAAwkAAGUAAAACBQAAAA9jdXJyZW50SW50ZXJlc3QFAAAAEWxhc3RDaGVja0ludGVyZXN0BQAAAAxzdGFrZWRBbW91bnQFAAAABVNjYWxlAAAAAAAAAAAABAAAAAxpbnZva2VSZXN1bHQDCQAAZgAAAAIFAAAABnJld2FyZAAAAAAAAAAAAAkAA/wAAAAECQEAAAARZ2V0Q291cG9uc0FkZHJlc3MAAAAAAgAAABFhZGRDb3Vwb25zRmFybWluZwkABEwAAAACBQAAAAdhZGRyZXNzCQAETAAAAAIFAAAABnJld2FyZAUAAAADbmlsBQAAAANuaWwFAAAABHVuaXQDCQAAAAAAAAIFAAAADGludm9rZVJlc3VsdAUAAAAMaW52b2tlUmVzdWx0CQAETgAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABRrZXlMYXN0Q2hlY2tJbnRlcmVzdAAAAAIFAAAAB2FkZHJlc3MFAAAABWFzc2V0BQAAAA9jdXJyZW50SW50ZXJlc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABByZXdhcmRDbGFpbWVkS2V5AAAAAgUAAAAHYWRkcmVzcwUAAAAFYXNzZXQJAABkAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAQcmV3YXJkQ2xhaW1lZEtleQAAAAIFAAAAB2FkZHJlc3MFAAAABWFzc2V0BQAAAAZyZXdhcmQFAAAAA25pbAUAAAAIZnBVcGRhdGUJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQAAAAlhc0Jvb2xlYW4AAAABAAAABXZhbHVlBAAAAAckbWF0Y2gwBQAAAAV2YWx1ZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAAHYm9vbGVhbgUAAAAHJG1hdGNoMAUAAAAHYm9vbGVhbgkAAAIAAAABAgAAACJGQUI6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiBCb29sZWFuAQAAABNjYWxjdWxhdGVQZXJjaFByaWNlAAAAAQAAAAdhZGRyZXNzBAAAABFoYXNBcnRlZmFjdFN0YWtlZAkB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", "height": 3310539, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 67E5KPYtASEP43CpRCYpG3rXtT8m1bMzm3YVk6oBpqxQ Next: GymeRQtwEjwQR7oRC7trmsfvZXxoXxeMupuTDKCFcbuW Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+func getBool (key) = match getBoolean(this, key) {
5+ case b: Boolean =>
6+ b
7+ case _ =>
8+ false
9+}
10+
11+
12+func isTestEnv () = getBool("TESTENV")
13+
14+
415 let Scale = 100000000
516
617 func tryGetStringExternal (address,key) = match getString(address, key) {
394405 }
395406
396407
408+@Verifier(tx)
409+func verify () = if (isTestEnv())
410+ then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
411+ else {
412+ let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
413+ let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
414+ let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
415+ let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
416+ then 1
417+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
418+ then 1
419+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
420+ then 1
421+ else 0
422+ let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
423+ then 1
424+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
425+ then 1
426+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
427+ then 1
428+ else 0
429+ let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
430+ then 1
431+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
432+ then 1
433+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
434+ then 1
435+ else 0
436+ let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
437+ match tx {
438+ case _ =>
439+ (signaturesCount >= 2)
440+ }
441+ }
442+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+func getBool (key) = match getBoolean(this, key) {
5+ case b: Boolean =>
6+ b
7+ case _ =>
8+ false
9+}
10+
11+
12+func isTestEnv () = getBool("TESTENV")
13+
14+
415 let Scale = 100000000
516
617 func tryGetStringExternal (address,key) = match getString(address, key) {
718 case a: String =>
819 a
920 case _ =>
1021 ""
1122 }
1223
1324
1425 func tryGetString (key) = tryGetStringExternal(this, key)
1526
1627
1728 func staticKey_refContractAddress () = "static_refContractAddress"
1829
1930
2031 let keyGlobalLastInterest = "global_lastCheck_interest"
2132
2233 func staticKey_oracleAddress () = "static_oracleAddress"
2334
2435
2536 func staticKey_eggAssetId () = "static_eggAssetId"
2637
2738
2839 func staticKey_incubatorAddress () = "static_incubatorAddress"
2940
3041
3142 func staticKey_breederAddress () = "static_breederAddress"
3243
3344
3445 func staticKey_accBoosterAddress () = "static_accBoosterAddress"
3546
3647
3748 func staticKey_duckWrapper () = "static_duckWrapper"
3849
3950
4051 func staticKey_couponsAddress () = "static_couponsAddress"
4152
4253
4354 func staticKey_burnAddress () = "static_burnAddress"
4455
4556
4657 func staticKey_extraFee () = "static_extraFee"
4758
4859
4960 func staticKey_feeAggregator () = "static_feeAggregator"
5061
5162
5263 let keyGlobalEarned = "global_earnings"
5364
5465 func staticKey_veggPerchFee () = "static_veggPerchFee"
5566
5667
5768 func totalStakedKey () = "total_staked"
5869
5970
6071 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
6172
6273
6374 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
6475
6576
6677 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_incubatorAddress())))
6778
6879
6980 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
7081
7182
7283 func getAccBoosterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_accBoosterAddress())))
7384
7485
7586 func getDuckWrapperSc () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckWrapper())))
7687
7788
7889 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
7990
8091
8192 func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
8293
8394
8495 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
8596
8697
8798 func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
8899
89100
90101 func keyLastCheckInterest (address,asset) = (((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest")
91102
92103
93104 func assetFarmingPower (address,asset) = (((("address_" + address) + "_asset_") + asset) + "_farmingPower")
94105
95106
96107 func rewardClaimedKey (address,asset) = (((address + "_asset_") + asset) + "_claimed")
97108
98109
99110 func totalStakedUserKey (address) = ("total_staked_" + address)
100111
101112
102113 let RefererReward = 5
103114
104115 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
105116 then throw("FCAP: Please attach waves")
106117 else {
107118 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
108119 if ((payment.amount != feeAmount))
109120 then throw((("FCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
110121 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
111122 }
112123
113124
114125 func tryGetInteger (key) = match getInteger(this, key) {
115126 case b: Int =>
116127 b
117128 case _ =>
118129 0
119130 }
120131
121132
122133 func asInt (value) = match value {
123134 case int: Int =>
124135 int
125136 case _ =>
126137 throw("FAI: wrong type, expected: Int")
127138 }
128139
129140
130141 func asIntTuple (value) = match value {
131142 case int: (Int, Int) =>
132143 int
133144 case _ =>
134145 throw("FAI: wrong type, expected: (Int,Int)")
135146 }
136147
137148
138149 func handleStakingTopUp (amount) = {
139150 let currentInterest = tryGetInteger(keyGlobalLastInterest)
140151 let totalStakedAmount = tryGetInteger(totalStakedKey())
141152 let interestDelta = if ((totalStakedAmount > 0))
142153 then fraction(amount, Scale, totalStakedAmount)
143154 else 0
144155 [IntegerEntry(keyGlobalEarned, (tryGetInteger(keyGlobalEarned) + amount)), IntegerEntry(keyGlobalLastInterest, (currentInterest + interestDelta))]
145156 }
146157
147158
148159 func asString (value) = match value {
149160 case string: String =>
150161 string
151162 case _ =>
152163 throw("FAS: wrong type, expected: String")
153164 }
154165
155166
156167 func tryGetBoolean (key) = match getBoolean(this, key) {
157168 case b: Boolean =>
158169 b
159170 case _ =>
160171 false
161172 }
162173
163174
164175 func tryGetBooleanExternal (address,key) = match getBoolean(address, key) {
165176 case b: Boolean =>
166177 b
167178 case _ =>
168179 false
169180 }
170181
171182
172183 func getAssetOrigin (generation) = if ((generation == "G"))
173184 then getIncubatorAddress()
174185 else getBreederAddress()
175186
176187
177188 func getAssetRarity (genotype,generation) = {
178189 let quantity = valueOrErrorMessage(getInteger(getAssetOrigin(generation), (("stats_" + genotype) + "_quantity")), (("stats_" + genotype) + "_quantity not found"))
179190 let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR)
180191 if ((power > 0))
181192 then power
182193 else 2
183194 }
184195
185196
186197 func getAssetRarityComplete (isJackpot,assetName) = {
187198 let rarity = if (isJackpot)
188199 then 100
189200 else {
190201 let generation = take(takeRight(assetName, 2), 1)
191202 let farmGen = asString(invoke(getBreederAddress(), "getGenFromName", [assetName], nil))
192203 if ((farmGen == farmGen))
193204 then getAssetRarity(farmGen, generation)
194205 else throw("Strict value is not equal to itself.")
195206 }
196207 rarity
197208 }
198209
199210
200211 func updateFarmingPower (address,asset) = {
201212 let totalStaked = tryGetInteger(totalStakedKey())
202213 let totalStakedUser = tryGetInteger(totalStakedUserKey(address))
203214 let currentFP = tryGetInteger(assetFarmingPower(address, asset))
204215 let newFP = asIntTuple(invoke(this, "calculateFarmPower", [asset], nil))
205216 [IntegerEntry(totalStakedKey(), ((tryGetInteger(totalStakedKey()) - currentFP) + newFP._1)), IntegerEntry(totalStakedUserKey(address), ((tryGetInteger(totalStakedUserKey(address)) - currentFP) + newFP._1)), IntegerEntry(assetFarmingPower(address, asset), newFP._1), IntegerEntry("DEBUG_currentFP", currentFP), IntegerEntry("DEBUG_newFP", newFP._1)]
206217 }
207218
208219
209220 func claimStakingResult (address,asset) = {
210221 let currentInterest = tryGetInteger(keyGlobalLastInterest)
211222 let lastCheckInterest = tryGetInteger(keyLastCheckInterest(address, asset))
212223 let stakedAmount = tryGetInteger(assetFarmingPower(address, asset))
213224 let fpUpdate = updateFarmingPower(address, asset)
214225 let reward = if ((lastCheckInterest > 0))
215226 then fraction((currentInterest - lastCheckInterest), stakedAmount, Scale)
216227 else 0
217228 let invokeResult = if ((reward > 0))
218229 then invoke(getCouponsAddress(), "addCouponsFarming", [address, reward], nil)
219230 else unit
220231 if ((invokeResult == invokeResult))
221232 then ([IntegerEntry(keyLastCheckInterest(address, asset), currentInterest), IntegerEntry(rewardClaimedKey(address, asset), (tryGetInteger(rewardClaimedKey(address, asset)) + reward))] ++ fpUpdate)
222233 else throw("Strict value is not equal to itself.")
223234 }
224235
225236
226237 func asBoolean (value) = match value {
227238 case boolean: Boolean =>
228239 boolean
229240 case _ =>
230241 throw("FAB: wrong type, expected: Boolean")
231242 }
232243
233244
234245 func calculatePerchPrice (address) = {
235246 let hasArtefactStaked = tryGetStringExternal(getAccBoosterAddress(), (("ART-XMISTL_" + address) + "_owner"))
236247 let perchPrice = getIntegerValue(getOracle(), staticKey_veggPerchFee())
237248 if ((hasArtefactStaked == ""))
238249 then perchPrice
239250 else perchPrice
240251 }
241252
242253
243254 @Callable(i)
244255 func calculateFarmPower (assetId) = if (!(if ((value(assetInfo(fromBase58String(assetId))).issuer == getBreederAddress()))
245256 then true
246257 else (value(assetInfo(fromBase58String(assetId))).issuer == getIncubatorAddress())))
247258 then throw("This does not seem like a valid Duck!")
248259 else {
249260 let assetName = value(assetInfo(fromBase58String(assetId))).name
250261 let gen = takeRight(assetName, 1)
251262 let isJackpot = (takeRight(assetName, 1) == "U")
252263 let rarity = getAssetRarityComplete(isJackpot, assetName)
253264 let genotype = split(dropRight(drop(assetName, 5), 3), "")
254265 func uniqueArrayFilter (accum,nextGen) = if (!(containsElement(accum, nextGen)))
255266 then (accum :+ nextGen)
256267 else accum
257268
258269 let uniqueList = {
259270 let $l = genotype
260271 let $s = size($l)
261272 let $acc0 = nil
262273 func $f0_1 ($a,$i) = if (($i >= $s))
263274 then $a
264275 else uniqueArrayFilter($a, $l[$i])
265276
266277 func $f0_2 ($a,$i) = if (($i >= $s))
267278 then $a
268279 else throw("List size exceeds 8")
269280
270281 $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)
271282 }
272283 let totalGenes = if ((gen == "U"))
273284 then 8
274285 else size(uniqueList)
275286 let power = pow(15, 1, totalGenes, 0, 2, DOWN)
276287 let multiplier = (((height - 3750000) * 100) / (((60 * 24) * 30) * 3))
277288 let basePower = tryGetInteger((assetId + "_basePower"))
278289 let finalPower = if ((basePower > 0))
279290 then basePower
280291 else ((power * multiplier) / 100)
281292 let finalPowerRarity = ((finalPower * rarity) / 100)
282293 $Tuple2([IntegerEntry(("DEBUG_" + assetName), finalPower), IntegerEntry(("DEBUG_RARITY" + assetName), rarity), IntegerEntry(("DEBUG_FPRARITY_" + assetName), finalPowerRarity), IntegerEntry(("DEBUG_BASEPOWER_" + assetName), basePower), IntegerEntry(("DEBUG_COEFFICIENT_" + assetName), multiplier)], $Tuple2(finalPowerRarity, finalPower))
283294 }
284295
285296
286297
287298 @Callable(i)
288299 func configureOracle (oracle) = if ((i.caller != this))
289300 then throw("FCO: admin only")
290301 else [StringEntry(staticKey_oracleAddress(), oracle)]
291302
292303
293304
294305 @Callable(i)
295306 func buyPerch (colorI,refererAddress) = {
296307 let validPayment = checkAdditionalPayment(i.payments[0])
297308 if ((validPayment == validPayment))
298309 then {
299310 let color = if ((colorI == "U"))
300311 then "B"
301312 else colorI
302313 if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
303314 then throw("you need to set color properly")
304315 else {
305316 let exactPrice = calculatePerchPrice(toString(i.caller))
306317 let firstPayment = if ((size(i.payments) == 2))
307318 then value(i.payments[1])
308319 else value(i.payments[0])
309320 if ((firstPayment.assetId != getEggAssetId()))
310321 then throw(("FBP: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
311322 else if ((firstPayment.amount != exactPrice))
312323 then throw(((("FBP: To buy a perch you currently need the following amount of EGGlets: " + toString(exactPrice)) + " ") + toString(i.caller)))
313324 else {
314325 let refererRewardForPerch = fraction(exactPrice, 5, 100)
315326 let refCall = asBoolean(invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]))
316327 if ((refCall == refCall))
317328 then {
318329 let toBurn = if (refCall)
319330 then (exactPrice - refererRewardForPerch)
320331 else exactPrice
321332 let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), toBurn)])
322333 if ((burnCall == burnCall))
323334 then {
324335 let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)
325336 let perchAmount = tryGetInteger(perchAmountKey)
326337 ([IntegerEntry(perchAmountKey, (perchAmount + 1))] ++ validPayment)
327338 }
328339 else throw("Strict value is not equal to itself.")
329340 }
330341 else throw("Strict value is not equal to itself.")
331342 }
332343 }
333344 }
334345 else throw("Strict value is not equal to itself.")
335346 }
336347
337348
338349
339350 @Callable(i)
340351 func stakeNFT (jColor) = {
341352 let validPayment = checkAdditionalPayment(i.payments[0])
342353 if ((validPayment == validPayment))
343354 then {
344355 let pmt = value(i.payments[1])
345356 let assetId = value(pmt.assetId)
346357 let assetName = value(value(assetInfo(assetId)).name)
347358 let isJackpot = (takeRight(assetName, 1) == "U")
348359 let address = toString(i.caller)
349360 let rarity = getAssetRarityComplete(isJackpot, assetName)
350361 if ((70 > rarity))
351362 then throw("Only ducks with a rarity above 70 can be locked!")
352363 else {
353364 let color = if (isJackpot)
354365 then jColor
355366 else takeRight(assetName, 1)
356367 let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color))
357368 if ((pmt.amount != 1))
358369 then throw("NFT is not attached")
359370 else if ((0 >= availablePerches))
360371 then throw(("no perches available for the color " + color))
361372 else {
362373 let farmingPower = asIntTuple(invoke(this, "calculateFarmPower", [toBase58String(assetId)], nil))
363374 if ((farmingPower == farmingPower))
364375 then (([IntegerEntry(totalStakedKey(), (tryGetInteger(totalStakedKey()) + farmingPower._1)), IntegerEntry(totalStakedUserKey(address), (tryGetInteger(totalStakedUserKey(address)) + farmingPower._1)), IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((toBase58String(assetId) + "_owner"), address), IntegerEntry(assetFarmingPower(address, toBase58String(assetId)), farmingPower._1), IntegerEntry((toBase58String(assetId) + "_basePower"), farmingPower._2), StringEntry((((("address_" + address) + "_asset_") + toBase58String(assetId)) + "_perchColor"), color)] ++ claimStakingResult(address, toBase58String(assetId))) ++ validPayment)
365376 else throw("Strict value is not equal to itself.")
366377 }
367378 }
368379 }
369380 else throw("Strict value is not equal to itself.")
370381 }
371382
372383
373384
374385 @Callable(i)
375386 func topUpReward (amount) = if ((i.caller != getCouponsAddress()))
376387 then throw("VFTUP: Only couponsdapp can do topup!")
377388 else {
378389 let resHandleStaking = handleStakingTopUp(amount)
379390 $Tuple2(resHandleStaking, true)
380391 }
381392
382393
383394
384395 @Callable(i)
385396 func claimReward (assetId) = {
386397 let validPayment = checkAdditionalPayment(i.payments[0])
387398 if ((validPayment == validPayment))
388399 then if ((tryGetString((assetId + "_owner")) != toString(i.caller)))
389400 then throw("You don't own this duck!!")
390401 else if ((size(i.payments) > 1))
391402 then throw("Please don't add extra payments")
392403 else (claimStakingResult(toString(i.caller), assetId) ++ validPayment)
393404 else throw("Strict value is not equal to itself.")
394405 }
395406
396407
408+@Verifier(tx)
409+func verify () = if (isTestEnv())
410+ then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
411+ else {
412+ let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
413+ let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
414+ let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
415+ let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
416+ then 1
417+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
418+ then 1
419+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
420+ then 1
421+ else 0
422+ let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
423+ then 1
424+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
425+ then 1
426+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
427+ then 1
428+ else 0
429+ let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
430+ then 1
431+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
432+ then 1
433+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
434+ then 1
435+ else 0
436+ let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
437+ match tx {
438+ case _ =>
439+ (signaturesCount >= 2)
440+ }
441+ }
442+

github/deemru/w8io/026f985 
38.20 ms