tx · Dn3SHDyrDumRV6GN8n6HZw1J5Bd2NWrxTpMwXiTj9yJX

3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA:  -0.02200000 Waves

2024.04.15 21:35 [4130226] smart account 3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA > SELF 0.00000000 Waves

{ "type": 13, "id": "Dn3SHDyrDumRV6GN8n6HZw1J5Bd2NWrxTpMwXiTj9yJX", "fee": 2200000, "feeAssetId": null, "timestamp": 1713206147263, "version": 2, "chainId": 87, "sender": "3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA", "senderPublicKey": "3GtkwhnMmG1yeozW51o4dJ1x3BDToPaLBXyBWKGdAc2e", "proofs": [ "5X6KuqnE7287b1p1KLoeuEeRq3UTFzwokGGJ2s9eNmuMXighUD5fq72Gpyr9YbXYuMVfdpEHCTvXfWgAwTM82c7i" ], "script": "base64:AAIFAAAAAAAAADcIAhIDCgEIEgASBAoCCAgSBAoCCAgSABIAEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBCBIDCgEIAAAANgAAAAAKcGVyY2hQcmljZQkAAGgAAAACAAAAAAAAAABkAAAAAAAAD0JAAAAAAAVzY2FsZQAAAAAAAAAnEAAAAAAGc2NhbGUyAAAAAAAAD0JAAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAAAAEAAAAMdHJ5R2V0U3RyaW5nAAAAAQAAAANrZXkJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIFAAAABHRoaXMFAAAAA2tleQEAAAAXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MAAAAAAgAAABRzdGF0aWNfb3JhY2xlQWRkcmVzcwEAAAAUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAAAAAAgAAABFzdGF0aWNfZWdnQXNzZXRJZAEAAAAac3RhdGljS2V5X2luY3ViYXRvckFkZHJlc3MAAAAAAgAAABdzdGF0aWNfaW5jdWJhdG9yQWRkcmVzcwEAAAAYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAAAAAIAAAAVc3RhdGljX2JyZWVkZXJBZGRyZXNzAQAAABZzdGF0aWNLZXlfaXRlbXNBZGRyZXNzAAAAAAIAAAATc3RhdGljX2l0ZW1zQWRkcmVzcwEAAAAZc3RhdGljS2V5X21ldGFSYWNlQWRkcmVzcwAAAAACAAAAFnN0YXRpY19tZXRhUmFjZUFkZHJlc3MBAAAAG3N0YXRpY0tleV9hY2NCb29zdGVyQWRkcmVzcwAAAAACAAAAGHN0YXRpY19hY2NCb29zdGVyQWRkcmVzcwEAAAAfc3RhdGljS2V5X3Byb3h5U3Rha2luZ0NvbnRyYWN0cwAAAAACAAAAHHN0YXRpY19wcm94eVN0YWtpbmdDb250cmFjdHMBAAAAFXN0YXRpY0tleV9tYWludGVuYW5jZQAAAAACAAAAEnN0YXRpY19tYWludGVuYW5jZQEAAAAZc3RhdGljS2V5X2NmTWFzdGVyQWRkcmVzcwAAAAACAAAAFnN0YXRpY19jZk1hc3RlckFkZHJlc3MBAAAAEnN0YXRpY0tleV9leHRyYUZlZQAAAAACAAAAD3N0YXRpY19leHRyYUZlZQEAAAAXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAAAAAgAAABRzdGF0aWNfZmVlQWdncmVnYXRvcgEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQEAAAAXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MAAAAAAQAAAA1nZXRFZ2dBc3NldElkAAAAAAkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAFHN0YXRpY0tleV9lZ2dBc3NldElkAAAAAAEAAAATZ2V0SW5jdWJhdG9yQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAGnN0YXRpY0tleV9pbmN1YmF0b3JBZGRyZXNzAAAAAAEAAAARZ2V0QnJlZWRlckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABhzdGF0aWNLZXlfYnJlZWRlckFkZHJlc3MAAAAAAQAAAA9nZXRJdGVtc0FkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABZzdGF0aWNLZXlfaXRlbXNBZGRyZXNzAAAAAAEAAAASZ2V0TWV0YXJhY2VBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAZc3RhdGljS2V5X21ldGFSYWNlQWRkcmVzcwAAAAABAAAAFGdldEFjY0Jvb3N0ZXJBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAbc3RhdGljS2V5X2FjY0Jvb3N0ZXJBZGRyZXNzAAAAAAEAAAAPZ2V0UHJveHlTdGFraW5nAAAAAAkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAAB9zdGF0aWNLZXlfcHJveHlTdGFraW5nQ29udHJhY3RzAAAAAAEAAAAOZ2V0TWFpbnRlbmFuY2UAAAAACQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAFXN0YXRpY0tleV9tYWludGVuYW5jZQAAAAABAAAAEmdldENmTWFzdGVyQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAGXN0YXRpY0tleV9jZk1hc3RlckFkZHJlc3MAAAAAAQAAABBnZXRGZWVBZ2dyZWdhdG9yAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAAAAAAAAAA1SZWZlcmVyUmV3YXJkAAAAAAAAAAAFAQAAABZjaGVja0FkZGl0aW9uYWxQYXltZW50AAAAAQAAAAdwYXltZW50AwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQJAAACAAAAAQIAAAAZRkNBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQAAAAJZmVlQW1vdW50CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAEnN0YXRpY0tleV9leHRyYUZlZQAAAAADCQEAAAACIT0AAAACCAUA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AAAACWZhcm1Cb29zdAAAAAAAAAAAZAkABRQAAAACBQAAAAdmYXJtR2VuBQAAABF0b3RhbEZhcm1pbmdQb3dlcgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAADW5vdCB2YWxpZCBORlQBAAAAHWdldExhc3RLbm93bkFzc2V0RmFybWluZ1Bvd2VyAAAAAgAAAAdhZGRyZXNzAAAAB2Fzc2V0SWQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAHYXNzZXRJZAIAAAANX2Zhcm1pbmdQb3dlcgEAAAAMY2FsY0ludGVyZXN0AAAAAwAAABBwcmV2aW91c0ludGVyZXN0AAAAFnByZXZpb3VzSW50ZXJlc3RIZWlnaHQAAAARdG90YWxGYXJtaW5nUG93ZXIJAABkAAAAAgUAAAAQcHJldmlvdXNJbnRlcmVzdAkAAGkAAAACCQAAaAAAAAIJAABoAAAAAgUAAAAFc2NhbGUJAQAAABFnZXRSZXdhcmRQZXJCbG9jawAAAAAJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABZwcmV2aW91c0ludGVyZXN0SGVpZ2h0BQAAABF0b3RhbEZhcm1pbmdQb3dlcgEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAMJAABmAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABJ0b3RhbF9mYXJtaW5nUG93ZXIAAAAAAAAAAAAEAAAAEHByZXZpb3VzSW50ZXJlc3QJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQIAAAAXdG90YWxfbGFzdENoZWNrSW50ZXJlc3QEAAAAFnByZXZpb3VzSW50ZXJlc3RIZWlnaHQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQIAAAAddG90YWxfbGFzdENoZWNrSW50ZXJlc3RIZWlnaHQEAAAAEXRvdGFsRmFybWluZ1Bvd2VyCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgkBAAAADGNhbGNJbnRlcmVzdAAAAAMFAAAAEHByZXZpb3VzSW50ZXJlc3QFAAAAFnByZXZpb3VzSW50ZXJlc3RIZWlnaHQFAAAAEXRvdGFsRmFybWluZ1Bvd2VyAwkBAAAAAiE9AAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABF0b3RhbF9zdGFydEhlaWdodAAAAAAAAAAAAAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAkAAAIAAAABAgAAABxmYXJtaW5nIGlzIG5vdCBsYXVuY2hlZCwgeWV0AQAAABRjYWxjQXNzZXRSZXdhcmREZWx0YQAAAAMAAAAHYWRkcmVzcwAAAAdhc3NldElkAAAAEWFzc2V0RmFybWluZ1Bvd2VyBAAAABZsYXN0Q2hlY2tBc3NldEludGVyZXN0CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAAB2Fzc2V0SWQCAAAAEl9sYXN0Q2hlY2tJbnRlcmVzdAQAAAAPY3VycmVudEludGVyZXN0CQEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAkAAGgAAAACBQAAABFhc3NldEZhcm1pbmdQb3dlcgkAAGUAAAACBQAAAA9jdXJyZW50SW50ZXJlc3QFAAAAFmxhc3RDaGVja0Fzc2V0SW50ZXJlc3QBAAAAFGFkZEFzc2V0SWRUb0dlbkVudHJ5AAAAAgAAAAdhc3NldElkAAAACGFzc2V0R2VuBAAAAAxjdXJyZW50VmFsdWUJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAHYXNzZXRzXwUAAAAIYXNzZXRHZW4CAAAAB19sb2NrZWQDCQAAAAAAAAIFAAAADGN1cnJlbnRWYWx1ZQIAAAAABQAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgUAAAAMY3VycmVudFZhbHVlAgAAAAEsBQAAAAdhc3NldElkAQAAAA5nZXRTdGFrZVJlc3VsdAAAAAQAAAAHYWRkcmVzcwAAAAdhc3NldElkAAAAEWFzc2V0RmFybWluZ1Bvd2VyAAAACHVuc3Rha2VyBAAAAAVhc3NldAkAAlgAAAABBQAAAAdhc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABJ0b3RhbF9mYXJtaW5nUG93ZXIJAABkAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABJ0b3RhbF9mYXJtaW5nUG93ZXIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAkBAAAAEmdldEN1cnJlbnRJbnRlcmVzdAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAHXRvdGFsX2xhc3RDaGVja0ludGVyZXN0SGVpZ2h0BQAAAAZoZWlnaHQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkAASwAAAACCQABLAAAAAICAAAABmFzc2V0XwUAAAAFYXNzZXQCAAAABl9vd25lcgUAAAAHYWRkcmVzcwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAADV9mYXJtaW5nUG93ZXIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAASX2xhc3RDaGVja0ludGVyZXN0CQEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAJX3Vuc3Rha2VyBQAAAAh1bnN0YWtlcgUAAAADbmlsAQAAABBnZXRVbnN0YWtlUmVzdWx0AAAABgAAAAdhZGRyZXNzAAAAB2Fzc2V0SWQAAAAFY29sb3IAAAAGY2FsbGVyAAAACnJlYWxDYWxsZXIAAAAJY2xhaW1FZ2dzBAAAAAZsb2NrZWQJAQAAAAhpc0xvY2tlZAAAAAADCQAAAAAAAAIFAAAABmxvY2tlZAUAAAAGbG9ja2VkBAAAAAVhc3NldAkAAlgAAAABBQAAAAdhc3NldElkBAAAAAh1bnN0YWtlcgkBAAAADHRyeUdldFN0cmluZwAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAAAlfdW5zdGFrZXIDAwkBAAAAAiE9AAAAAgUAAAAIdW5zdGFrZXICAAAAAAkBAAAAAiE9AAAAAgUAAAAIdW5zdGFrZXIFAAAACnJlYWxDYWxsZXIHCQAAAgAAAAECAAAAV0ZVTjogSXQgc2VlbXMgZHVjayB3YXMgc3Rha2VkIHRocm91aCBhIGRhcHAsIG5vdCBkaXJlY3RseSwgcGxlYXNlIHVuc3Rha2UgdGhyb3VnaCBkYXBwIQQAAAARYXNzZXRGYXJtaW5nUG93ZXIJAQAAAB1nZXRMYXN0S25vd25Bc3NldEZhcm1pbmdQb3dlcgAAAAIFAAAAB2FkZHJlc3MFAAAABWFzc2V0AwkBAAAAASEAAAABCQAAZgAAAAIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyAAAAAAAAAAAACQAAAgAAAAECAAAAKkZHVTogQXNzZXQgZmFybWluZyBwb3dlciBub3QgYmlnZ2VyIHRoZW4gMAQAAAAQYXNzZXRSZXdhcmREZWx0YQkBAAAAFGNhbGNBc3NldFJld2FyZERlbHRhAAAAAwUAAAAHYWRkcmVzcwUAAAAFYXNzZXQFAAAAEWFzc2V0RmFybWluZ1Bvd2VyBAAAAAxmYXJtZWRBbW91bnQJAABkAAAAAgUAAAAQYXNzZXRSZXdhcmREZWx0YQkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3Nf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bWVudAMJAAAAAAAAAggFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyCQEAAAASZ2V0Q2ZNYXN0ZXJBZGRyZXNzAAAAAAUAAAADbmlsCQEAAAAWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAADCQAAAAAAAAIFAAAADHZhbGlkUGF5bWVudAUAAAAMdmFsaWRQYXltZW50BAAAAAdhZGRyZXNzAwkAAAAAAAACCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIJAQAAABJnZXRDZk1hc3RlckFkZHJlc3MAAAAACQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkABCUAAAABCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIEAAAAB2Fzc2V0SWQJAAJZAAAAAQUAAAAFYXNzZXQEAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQEAAAAdZ2V0TGFzdEtub3duQXNzZXRGYXJtaW5nUG93ZXIAAAACBQAAAAdhZGRyZXNzBQAAAAVhc3NldAQAAAAQYXNzZXRSZXdhcmREZWx0YQkBAAAAFGNhbGNBc3NldFJld2FyZERlbHRhAAAAAwUAAAAHYWRkcmVzcwUAAAAFYXNzZXQFAAAAEWFzc2V0RmFybWluZ1Bvd2VyBAAAAAxmYXJtZWRBbW91bnQJAABkAAAAAgUAAAAQYXNzZXRSZXdhcmREZWx0YQkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAWX2xhc3RDaGVja0Zhcm1lZEFtb3VudAQAAAAPd2l0aGRyYXduQW1vdW50CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAABBfd2l0aGRyYXduQW1vdW50BAAAAAZyZXdhcmQJAABpAAAAAgkAAGUAAAACBQAAAAxmYXJtZWRBbW91bnQFAAAAD3dpdGhkcmF3bkFtb3Vu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", "height": 4130226, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BTEUMWfctZ81YiwuiYhSQ2ibVNUWiSzWDFEUkg8myUJM Next: none Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let perchPrice = (100 * 1000000)
66 let scale = 10000
77
88 let scale2 = 1000000
9-
10-func isSickDuck (duckId) = (duckId + "_sick")
11-
129
1310 func tryGetStringExternal (address,key) = match getString(address, key) {
1411 case a: String =>
3027 func staticKey_incubatorAddress () = "static_incubatorAddress"
3128
3229
33-func staticKey_rebirthAddress () = "static_rebirthAddress"
34-
35-
36-func staticKey_turtleRebirthAddress () = "static_turtleRebirthAddress"
37-
38-
3930 func staticKey_breederAddress () = "static_breederAddress"
40-
41-
42-func staticKey_refContractAddress () = "static_refContractAddress"
4331
4432
4533 func staticKey_itemsAddress () = "static_itemsAddress"
6048 func staticKey_cfMasterAddress () = "static_cfMasterAddress"
6149
6250
63-func staticKey_duckWrapper () = "static_duckWrapper"
64-
65-
66-func staticKey_couponsAddress () = "static_couponsAddress"
67-
68-
69-func staticKey_burnAddress () = "static_burnAddress"
70-
71-
7251 func staticKey_extraFee () = "static_extraFee"
7352
7453
7554 func staticKey_feeAggregator () = "static_feeAggregator"
76-
77-
78-func staticKey_huntAddress () = "static_huntAddress"
7955
8056
8157 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
8763 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_incubatorAddress())))
8864
8965
90-func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rebirthAddress())))
91-
92-
93-func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
94-
95-
9666 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
97-
98-
99-func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
10067
10168
10269 func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
11784 func getCfMasterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_cfMasterAddress())))
11885
11986
120-func getDuckWrapperSc () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckWrapper())))
121-
122-
123-func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
124-
125-
126-func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
127-
128-
12987 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
130-
131-
132-func getHuntAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_huntAddress())))
13388
13489
13590 let RefererReward = 5
391346
392347
393348 @Callable(i)
394-func buyPerch (colorI,refererAddress) = {
395- let locked = isLocked()
396- if ((locked == locked))
397- then {
398- let validPayment = if (if ((i.caller == getHuntAddress()))
399- then true
400- else (i.caller == getMetaraceAddress()))
401- then nil
402- else checkAdditionalPayment(i.payments[0])
403- if ((validPayment == validPayment))
404- then {
405- let color = if ((colorI == "U"))
406- then "B"
407- else colorI
408- if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
409- then throw("you need to set color properly")
410- else {
411- let exactPrice = calculatePerchPrice(toString(i.caller))
412- let leftToPay = if ((i.originCaller == i.caller))
413- then {
414- let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [exactPrice], nil))
415- if ((amountPaidByCoupons == amountPaidByCoupons))
416- then (exactPrice - amountPaidByCoupons)
417- else throw("Strict value is not equal to itself.")
418- }
419- else exactPrice
420- let payment = if ((leftToPay != 0))
421- then {
422- let firstPayment = if ((size(i.payments) == 2))
423- then value(i.payments[1])
424- else value(i.payments[0])
425- if ((firstPayment.assetId != getEggAssetId()))
426- then throw(("FBP: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
427- else if ((firstPayment.amount != leftToPay))
428- then throw(((("FBP: To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay)) + " ") + toString(i.caller)))
429- else {
430- let refererRewardForPerch = fraction(leftToPay, RefererReward, 100)
431- let refCall = asBoolean(invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]))
432- if ((refCall == refCall))
433- then {
434- let toBurn = if (refCall)
435- then (leftToPay - refererRewardForPerch)
436- else leftToPay
437- let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), toBurn)])
438- if ((burnCall == burnCall))
439- then leftToPay
440- else throw("Strict value is not equal to itself.")
441- }
442- else throw("Strict value is not equal to itself.")
443- }
444- }
445- else 0
446- if ((payment == payment))
447- then {
448- let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)
449- let perchAmount = tryGetInteger(perchAmountKey)
450- ([IntegerEntry(perchAmountKey, (perchAmount + 1))] ++ validPayment)
451- }
452- else throw("Strict value is not equal to itself.")
453- }
454- }
455- else throw("Strict value is not equal to itself.")
456- }
457- else throw("Strict value is not equal to itself.")
458- }
349+func buyPerch (colorI,refererAddress) = throw("FBN: function is disabled, migration to new sc ongoing")
459350
460351
461352
462353 @Callable(i)
463-func addFreePerch (address,color) = {
464- let locked = isLocked()
465- if ((locked == locked))
466- then if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
467- then throw("you need to set color properly")
468- else if (if (if ((i.caller != getRebirthAddress()))
469- then (i.caller != getTurtleRebirthAddress())
470- else false)
471- then (i.caller != this)
472- else false)
473- then throw("rebirth and swop promo only")
474- else {
475- let perchAmountKey = ((("address_" + address) + "_perchesAvailable_") + color)
476- let perchAmount = tryGetInteger(perchAmountKey)
477- $Tuple2([IntegerEntry(perchAmountKey, (perchAmount + 1))], "")
478- }
479- else throw("Strict value is not equal to itself.")
480- }
354+func addFreePerch (address,color) = throw("FBN: function is disabled, migration to new sc ongoing")
481355
482356
483357
484358 @Callable(i)
485-func stakeNFT () = {
486- let locked = isLocked()
487- if ((locked == locked))
488- then {
489- let validPayment = if (if ((i.caller == getHuntAddress()))
490- then true
491- else (i.caller == getMetaraceAddress()))
492- then nil
493- else checkAdditionalPayment(i.payments[1])
494- if ((validPayment == validPayment))
495- then {
496- let pmt = value(i.payments[0])
497- let assetId = value(value(i.payments[0]).assetId)
498- let realCaller = toString(i.caller)
499- let address = if (isProxyStakingSc(toString(i.caller)))
500- then toString(i.originCaller)
501- else realCaller
502- let color = takeRight(value(assetInfo(assetId)).name, 1)
503- let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color))
504- if ((pmt.amount != 1))
505- then throw("NFT is not attached")
506- else if ((0 >= availablePerches))
507- then throw(("no perches available for the color " + color))
508- else {
509- let $t01660416677 = getAssetFarmingPower(assetId, address)
510- let assetGen = $t01660416677._1
511- let assetFarmingPower = $t01660416677._2
512- ((getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1))]) ++ validPayment)
513- }
514- }
515- else throw("Strict value is not equal to itself.")
516- }
517- else throw("Strict value is not equal to itself.")
518- }
359+func stakeNFT () = throw("FBN: function is disabled, migration to new sc ongoing")
519360
520361
521362
522363 @Callable(i)
523-func stakeNFTWithoutPerch () = {
524- let locked = isLocked()
525- if ((locked == locked))
526- then {
527- let dappToCall = toString(i.caller)
528- if (!(isProxyStakingSc(dappToCall)))
529- then throw("FSNWP: Only trusted smart contracts can stake without a perch!")
530- else {
531- let pmt = value(i.payments[0])
532- let assetId = value(value(i.payments[0]).assetId)
533- let address = toString(i.originCaller)
534- if ((pmt.amount != 1))
535- then throw("NFT is not attached")
536- else {
537- let $t01731517388 = getAssetFarmingPower(assetId, address)
538- let assetGen = $t01731517388._1
539- let assetFarmingPower = $t01731517388._2
540- let asset = toBase58String(assetId)
541- let realCaller = toString(i.caller)
542- (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)])
543- }
544- }
545- }
546- else throw("Strict value is not equal to itself.")
547- }
364+func stakeNFTWithoutPerch () = throw("FBN: function is disabled, migration to new sc ongoing")
548365
549366
550367
569386
570387
571388 @Callable(i)
572-func stakeJackpot (color) = {
573- let locked = isLocked()
574- if ((locked == locked))
575- then {
576- let validPayment = if (if ((i.caller == getHuntAddress()))
577- then true
578- else (i.caller == getMetaraceAddress()))
579- then nil
580- else checkAdditionalPayment(i.payments[1])
581- if ((validPayment == validPayment))
582- then {
583- let pmt = value(i.payments[0])
584- let assetId = value(pmt.assetId)
585- let realCaller = toString(i.caller)
586- let address = if (isProxyStakingSc(toString(i.caller)))
587- then toString(i.originCaller)
588- else realCaller
589- let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color))
590- let assetIssuer = value(assetInfo(assetId)).issuer
591- if ((pmt.amount != 1))
592- then throw("NFT is not attached")
593- else if (if ((assetIssuer == getIncubatorAddress()))
594- then true
595- else (assetIssuer == getBreederAddress()))
596- then if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U"))
597- then throw("jackpot only")
598- else if ((0 >= availablePerches))
599- then throw(("FSJ: no perches available for the color " + color))
600- else {
601- let farmingPower = getAssetFarmingPower(assetId, address)
602- ((getStakeResult(address, assetId, farmingPower._2, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((((("address_" + address) + "_asset_") + toBase58String(assetId)) + "_perchColor"), color)]) ++ validPayment)
603- }
604- else throw("asset is not valid")
605- }
606- else throw("Strict value is not equal to itself.")
607- }
608- else throw("Strict value is not equal to itself.")
609- }
389+func stakeJackpot (color) = throw("FBN: function is disabled, migration to new sc ongoing")
610390
611391
612392
687467 else 0
688468 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
689469 match tx {
690- case dtx: DataTransaction =>
691- sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
692470 case _ =>
693471 (signaturesCount >= 2)
694472 }
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let perchPrice = (100 * 1000000)
55
66 let scale = 10000
77
88 let scale2 = 1000000
9-
10-func isSickDuck (duckId) = (duckId + "_sick")
11-
129
1310 func tryGetStringExternal (address,key) = match getString(address, key) {
1411 case a: String =>
1512 a
1613 case _ =>
1714 ""
1815 }
1916
2017
2118 func tryGetString (key) = tryGetStringExternal(this, key)
2219
2320
2421 func staticKey_oracleAddress () = "static_oracleAddress"
2522
2623
2724 func staticKey_eggAssetId () = "static_eggAssetId"
2825
2926
3027 func staticKey_incubatorAddress () = "static_incubatorAddress"
3128
3229
33-func staticKey_rebirthAddress () = "static_rebirthAddress"
34-
35-
36-func staticKey_turtleRebirthAddress () = "static_turtleRebirthAddress"
37-
38-
3930 func staticKey_breederAddress () = "static_breederAddress"
40-
41-
42-func staticKey_refContractAddress () = "static_refContractAddress"
4331
4432
4533 func staticKey_itemsAddress () = "static_itemsAddress"
4634
4735
4836 func staticKey_metaRaceAddress () = "static_metaRaceAddress"
4937
5038
5139 func staticKey_accBoosterAddress () = "static_accBoosterAddress"
5240
5341
5442 func staticKey_proxyStakingContracts () = "static_proxyStakingContracts"
5543
5644
5745 func staticKey_maintenance () = "static_maintenance"
5846
5947
6048 func staticKey_cfMasterAddress () = "static_cfMasterAddress"
6149
6250
63-func staticKey_duckWrapper () = "static_duckWrapper"
64-
65-
66-func staticKey_couponsAddress () = "static_couponsAddress"
67-
68-
69-func staticKey_burnAddress () = "static_burnAddress"
70-
71-
7251 func staticKey_extraFee () = "static_extraFee"
7352
7453
7554 func staticKey_feeAggregator () = "static_feeAggregator"
76-
77-
78-func staticKey_huntAddress () = "static_huntAddress"
7955
8056
8157 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
8258
8359
8460 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
8561
8662
8763 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_incubatorAddress())))
8864
8965
90-func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rebirthAddress())))
91-
92-
93-func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
94-
95-
9666 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
97-
98-
99-func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
10067
10168
10269 func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
10370
10471
10572 func getMetaraceAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_metaRaceAddress())))
10673
10774
10875 func getAccBoosterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_accBoosterAddress())))
10976
11077
11178 func getProxyStaking () = tryGetStringExternal(getOracle(), staticKey_proxyStakingContracts())
11279
11380
11481 func getMaintenance () = tryGetStringExternal(getOracle(), staticKey_maintenance())
11582
11683
11784 func getCfMasterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_cfMasterAddress())))
11885
11986
120-func getDuckWrapperSc () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckWrapper())))
121-
122-
123-func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
124-
125-
126-func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
127-
128-
12987 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
130-
131-
132-func getHuntAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_huntAddress())))
13388
13489
13590 let RefererReward = 5
13691
13792 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
13893 then throw("FCAP: Please attach waves")
13994 else {
14095 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
14196 if ((payment.amount != feeAmount))
14297 then throw((("FCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
14398 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
14499 }
145100
146101
147102 func getRewardPerBlock () = 0
148103
149104
150105 func isLocked () = if ((getMaintenance() != ""))
151106 then throw(getMaintenance())
152107 else 0
153108
154109
155110 func tryGetInteger (key) = match getInteger(this, key) {
156111 case b: Int =>
157112 b
158113 case _ =>
159114 0
160115 }
161116
162117
163118 func tryGetBoolean (key) = match getBoolean(this, key) {
164119 case b: Boolean =>
165120 b
166121 case _ =>
167122 false
168123 }
169124
170125
171126 func tryGetBooleanExternal (address,key) = match getBoolean(address, key) {
172127 case b: Boolean =>
173128 b
174129 case _ =>
175130 false
176131 }
177132
178133
179134 func getAssetOrigin (generation) = if ((generation == "G"))
180135 then getIncubatorAddress()
181136 else getBreederAddress()
182137
183138
184139 func getAssetRarity (genotype,generation) = {
185140 let quantity = valueOrErrorMessage(getInteger(getAssetOrigin(generation), (("stats_" + genotype) + "_quantity")), (("stats_" + genotype) + "_quantity not found"))
186141 let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR)
187142 if ((power > 0))
188143 then power
189144 else 2
190145 }
191146
192147
193148 func asString (value) = match value {
194149 case string: String =>
195150 string
196151 case _ =>
197152 throw("FAS: wrong type, expected: String")
198153 }
199154
200155
201156 func asInt (value) = match value {
202157 case int: Int =>
203158 int
204159 case _ =>
205160 throw("FAI: wrong type, expected: Int")
206161 }
207162
208163
209164 func asBoolean (value) = match value {
210165 case boolean: Boolean =>
211166 boolean
212167 case _ =>
213168 throw("FAB: wrong type, expected: Boolean")
214169 }
215170
216171
217172 func getAssetFarmingPower (assetId,address) = if (if ((value(assetInfo(assetId)).issuer == getBreederAddress()))
218173 then true
219174 else (value(assetInfo(assetId)).issuer == getIncubatorAddress()))
220175 then {
221176 let farmBoost = asInt(invoke(getItemsAddress(), "calculateFarmingPowerBoost", [toBase58String(assetId), address], nil))
222177 if ((farmBoost == farmBoost))
223178 then {
224179 let assetName = value(assetInfo(assetId)).name
225180 let isJackpot = (takeRight(value(assetName), 1) == "U")
226181 let farmGen = if (isJackpot)
227182 then ""
228183 else asString(invoke(getBreederAddress(), "getGenFromName", [assetName], nil))
229184 if ((farmGen == farmGen))
230185 then {
231186 let rarity = if (isJackpot)
232187 then 100
233188 else {
234189 let generation = take(takeRight(assetName, 2), 1)
235190 getAssetRarity(farmGen, generation)
236191 }
237192 let totalFarmingPower = (rarity + fraction(rarity, farmBoost, 100))
238193 $Tuple2(farmGen, totalFarmingPower)
239194 }
240195 else throw("Strict value is not equal to itself.")
241196 }
242197 else throw("Strict value is not equal to itself.")
243198 }
244199 else throw("not valid NFT")
245200
246201
247202 func getLastKnownAssetFarmingPower (address,assetId) = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_farmingPower"))
248203
249204
250205 func calcInterest (previousInterest,previousInterestHeight,totalFarmingPower) = (previousInterest + (((scale * getRewardPerBlock()) * (height - previousInterestHeight)) / totalFarmingPower))
251206
252207
253208 func getCurrentInterest () = if ((tryGetInteger("total_farmingPower") > 0))
254209 then {
255210 let previousInterest = tryGetInteger("total_lastCheckInterest")
256211 let previousInterestHeight = tryGetInteger("total_lastCheckInterestHeight")
257212 let totalFarmingPower = tryGetInteger("total_farmingPower")
258213 calcInterest(previousInterest, previousInterestHeight, totalFarmingPower)
259214 }
260215 else if ((tryGetInteger("total_startHeight") != 0))
261216 then tryGetInteger("total_lastCheckInterest")
262217 else throw("farming is not launched, yet")
263218
264219
265220 func calcAssetRewardDelta (address,assetId,assetFarmingPower) = {
266221 let lastCheckAssetInterest = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_lastCheckInterest"))
267222 let currentInterest = getCurrentInterest()
268223 (assetFarmingPower * (currentInterest - lastCheckAssetInterest))
269224 }
270225
271226
272227 func addAssetIdToGenEntry (assetId,assetGen) = {
273228 let currentValue = tryGetString((("assets_" + assetGen) + "_locked"))
274229 if ((currentValue == ""))
275230 then assetId
276231 else ((currentValue + ",") + assetId)
277232 }
278233
279234
280235 func getStakeResult (address,assetId,assetFarmingPower,unstaker) = {
281236 let asset = toBase58String(assetId)
282237 [IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") + assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), StringEntry((("asset_" + asset) + "_owner"), address), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), assetFarmingPower), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest()), StringEntry((((("address_" + address) + "_asset_") + asset) + "_unstaker"), unstaker)]
283238 }
284239
285240
286241 func getUnstakeResult (address,assetId,color,caller,realCaller,claimEggs) = {
287242 let locked = isLocked()
288243 if ((locked == locked))
289244 then {
290245 let asset = toBase58String(assetId)
291246 let unstaker = tryGetString((((("address_" + address) + "_asset_") + asset) + "_unstaker"))
292247 if (if ((unstaker != ""))
293248 then (unstaker != realCaller)
294249 else false)
295250 then throw("FUN: It seems duck was staked throuh a dapp, not directly, please unstake through dapp!")
296251 else {
297252 let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset)
298253 if (!((assetFarmingPower > 0)))
299254 then throw("FGU: Asset farming power not bigger then 0")
300255 else {
301256 let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower)
302257 let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")))
303258 let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"))
304259 let reward = ((farmedAmount - withdrawnAmount) / (scale * 100))
305260 let isWithoutPerch = tryGetBoolean((((("address_" + address) + "_asset_") + asset) + "_without_perch"))
306261 let rewardAfterSickNess = reward
307262 let appendPerches = if (isWithoutPerch)
308263 then [DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"))]
309264 else [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) + 1))]
310265 let sendTx = if (claimEggs)
311266 then $Tuple2([ScriptTransfer(caller, (rewardAfterSickNess * 1000000), getEggAssetId())], (rewardAfterSickNess * 1000000))
312267 else $Tuple2(nil, 0)
313268 $Tuple2(((([IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") - assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), DeleteEntry((("asset_" + asset) + "_owner")), DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_unstaker")), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), 0), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest()), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (withdrawnAmount + (rewardAfterSickNess * scale2))), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")) + assetRewardDelta))] ++ appendPerches) ++ [ScriptTransfer(caller, 1, assetId)]) ++ sendTx._1), sendTx._2)
314269 }
315270 }
316271 }
317272 else throw("Strict value is not equal to itself.")
318273 }
319274
320275
321276 func calculatePerchPrice (address) = {
322277 let hasArtefactStaked = tryGetStringExternal(getAccBoosterAddress(), (("ART-XMISTL_" + address) + "_owner"))
323278 if ((hasArtefactStaked == ""))
324279 then perchPrice
325280 else ((perchPrice / 10) * 9)
326281 }
327282
328283
329284 func isProxyStakingSc (address) = {
330285 let allowedContracts = getProxyStaking()
331286 let allowedContractsList = split(allowedContracts, ";")
332287 (indexOf(allowedContractsList, address) != unit)
333288 }
334289
335290
336291 func unstakeNFTInternal (asset,i,claimEgg) = {
337292 let assetId = fromBase58String(asset)
338293 let realCaller = toString(i.caller)
339294 let address = if (isProxyStakingSc(toString(i.caller)))
340295 then toString(i.originCaller)
341296 else realCaller
342297 let color = takeRight(value(assetInfo(assetId)).name, 1)
343298 if ((color == "U"))
344299 then throw("FUN: use another function to unstake Jackpot NFT")
345300 else {
346301 let result = getUnstakeResult(address, assetId, color, i.caller, realCaller, claimEgg)
347302 result
348303 }
349304 }
350305
351306
352307 func unstakeJackpotInternal (asset,i,claimEgg) = {
353308 let assetId = fromBase58String(asset)
354309 let realCaller = toString(i.caller)
355310 let address = if (isProxyStakingSc(toString(i.caller)))
356311 then toString(i.originCaller)
357312 else realCaller
358313 let color = tryGetString((((("address_" + address) + "_asset_") + asset) + "_perchColor"))
359314 if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U"))
360315 then throw("jackpot only")
361316 else {
362317 let result = getUnstakeResult(address, assetId, color, i.caller, realCaller, claimEgg)
363318 result
364319 }
365320 }
366321
367322
368323 func getBool (key) = match getBoolean(this, key) {
369324 case b: Boolean =>
370325 b
371326 case _ =>
372327 false
373328 }
374329
375330
376331 func isTestEnv () = getBool("TESTENV")
377332
378333
379334 @Callable(i)
380335 func configureOracle (oracle) = if ((i.caller != this))
381336 then throw("FCO: admin only")
382337 else [StringEntry(staticKey_oracleAddress(), oracle)]
383338
384339
385340
386341 @Callable(i)
387342 func init () = if ((i.caller != this))
388343 then throw("FI: admin only")
389344 else [IntegerEntry("total_startHeight", height)]
390345
391346
392347
393348 @Callable(i)
394-func buyPerch (colorI,refererAddress) = {
395- let locked = isLocked()
396- if ((locked == locked))
397- then {
398- let validPayment = if (if ((i.caller == getHuntAddress()))
399- then true
400- else (i.caller == getMetaraceAddress()))
401- then nil
402- else checkAdditionalPayment(i.payments[0])
403- if ((validPayment == validPayment))
404- then {
405- let color = if ((colorI == "U"))
406- then "B"
407- else colorI
408- if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
409- then throw("you need to set color properly")
410- else {
411- let exactPrice = calculatePerchPrice(toString(i.caller))
412- let leftToPay = if ((i.originCaller == i.caller))
413- then {
414- let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [exactPrice], nil))
415- if ((amountPaidByCoupons == amountPaidByCoupons))
416- then (exactPrice - amountPaidByCoupons)
417- else throw("Strict value is not equal to itself.")
418- }
419- else exactPrice
420- let payment = if ((leftToPay != 0))
421- then {
422- let firstPayment = if ((size(i.payments) == 2))
423- then value(i.payments[1])
424- else value(i.payments[0])
425- if ((firstPayment.assetId != getEggAssetId()))
426- then throw(("FBP: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
427- else if ((firstPayment.amount != leftToPay))
428- then throw(((("FBP: To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay)) + " ") + toString(i.caller)))
429- else {
430- let refererRewardForPerch = fraction(leftToPay, RefererReward, 100)
431- let refCall = asBoolean(invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]))
432- if ((refCall == refCall))
433- then {
434- let toBurn = if (refCall)
435- then (leftToPay - refererRewardForPerch)
436- else leftToPay
437- let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), toBurn)])
438- if ((burnCall == burnCall))
439- then leftToPay
440- else throw("Strict value is not equal to itself.")
441- }
442- else throw("Strict value is not equal to itself.")
443- }
444- }
445- else 0
446- if ((payment == payment))
447- then {
448- let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)
449- let perchAmount = tryGetInteger(perchAmountKey)
450- ([IntegerEntry(perchAmountKey, (perchAmount + 1))] ++ validPayment)
451- }
452- else throw("Strict value is not equal to itself.")
453- }
454- }
455- else throw("Strict value is not equal to itself.")
456- }
457- else throw("Strict value is not equal to itself.")
458- }
349+func buyPerch (colorI,refererAddress) = throw("FBN: function is disabled, migration to new sc ongoing")
459350
460351
461352
462353 @Callable(i)
463-func addFreePerch (address,color) = {
464- let locked = isLocked()
465- if ((locked == locked))
466- then if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
467- then throw("you need to set color properly")
468- else if (if (if ((i.caller != getRebirthAddress()))
469- then (i.caller != getTurtleRebirthAddress())
470- else false)
471- then (i.caller != this)
472- else false)
473- then throw("rebirth and swop promo only")
474- else {
475- let perchAmountKey = ((("address_" + address) + "_perchesAvailable_") + color)
476- let perchAmount = tryGetInteger(perchAmountKey)
477- $Tuple2([IntegerEntry(perchAmountKey, (perchAmount + 1))], "")
478- }
479- else throw("Strict value is not equal to itself.")
480- }
354+func addFreePerch (address,color) = throw("FBN: function is disabled, migration to new sc ongoing")
481355
482356
483357
484358 @Callable(i)
485-func stakeNFT () = {
486- let locked = isLocked()
487- if ((locked == locked))
488- then {
489- let validPayment = if (if ((i.caller == getHuntAddress()))
490- then true
491- else (i.caller == getMetaraceAddress()))
492- then nil
493- else checkAdditionalPayment(i.payments[1])
494- if ((validPayment == validPayment))
495- then {
496- let pmt = value(i.payments[0])
497- let assetId = value(value(i.payments[0]).assetId)
498- let realCaller = toString(i.caller)
499- let address = if (isProxyStakingSc(toString(i.caller)))
500- then toString(i.originCaller)
501- else realCaller
502- let color = takeRight(value(assetInfo(assetId)).name, 1)
503- let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color))
504- if ((pmt.amount != 1))
505- then throw("NFT is not attached")
506- else if ((0 >= availablePerches))
507- then throw(("no perches available for the color " + color))
508- else {
509- let $t01660416677 = getAssetFarmingPower(assetId, address)
510- let assetGen = $t01660416677._1
511- let assetFarmingPower = $t01660416677._2
512- ((getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1))]) ++ validPayment)
513- }
514- }
515- else throw("Strict value is not equal to itself.")
516- }
517- else throw("Strict value is not equal to itself.")
518- }
359+func stakeNFT () = throw("FBN: function is disabled, migration to new sc ongoing")
519360
520361
521362
522363 @Callable(i)
523-func stakeNFTWithoutPerch () = {
524- let locked = isLocked()
525- if ((locked == locked))
526- then {
527- let dappToCall = toString(i.caller)
528- if (!(isProxyStakingSc(dappToCall)))
529- then throw("FSNWP: Only trusted smart contracts can stake without a perch!")
530- else {
531- let pmt = value(i.payments[0])
532- let assetId = value(value(i.payments[0]).assetId)
533- let address = toString(i.originCaller)
534- if ((pmt.amount != 1))
535- then throw("NFT is not attached")
536- else {
537- let $t01731517388 = getAssetFarmingPower(assetId, address)
538- let assetGen = $t01731517388._1
539- let assetFarmingPower = $t01731517388._2
540- let asset = toBase58String(assetId)
541- let realCaller = toString(i.caller)
542- (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)])
543- }
544- }
545- }
546- else throw("Strict value is not equal to itself.")
547- }
364+func stakeNFTWithoutPerch () = throw("FBN: function is disabled, migration to new sc ongoing")
548365
549366
550367
551368 @Callable(i)
552369 func unstakeNFT (asset) = {
553370 let validPayment = if ((i.caller == getMetaraceAddress()))
554371 then nil
555372 else checkAdditionalPayment(i.payments[0])
556373 if ((validPayment == validPayment))
557374 then {
558375 let result = unstakeNFTInternal(asset, i, true)
559376 $Tuple2((result._1 ++ validPayment), result._2)
560377 }
561378 else throw("Strict value is not equal to itself.")
562379 }
563380
564381
565382
566383 @Callable(i)
567384 func unstakeNFTWithoutClaim (asset) = unstakeNFTInternal(asset, i, false)
568385
569386
570387
571388 @Callable(i)
572-func stakeJackpot (color) = {
573- let locked = isLocked()
574- if ((locked == locked))
575- then {
576- let validPayment = if (if ((i.caller == getHuntAddress()))
577- then true
578- else (i.caller == getMetaraceAddress()))
579- then nil
580- else checkAdditionalPayment(i.payments[1])
581- if ((validPayment == validPayment))
582- then {
583- let pmt = value(i.payments[0])
584- let assetId = value(pmt.assetId)
585- let realCaller = toString(i.caller)
586- let address = if (isProxyStakingSc(toString(i.caller)))
587- then toString(i.originCaller)
588- else realCaller
589- let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color))
590- let assetIssuer = value(assetInfo(assetId)).issuer
591- if ((pmt.amount != 1))
592- then throw("NFT is not attached")
593- else if (if ((assetIssuer == getIncubatorAddress()))
594- then true
595- else (assetIssuer == getBreederAddress()))
596- then if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U"))
597- then throw("jackpot only")
598- else if ((0 >= availablePerches))
599- then throw(("FSJ: no perches available for the color " + color))
600- else {
601- let farmingPower = getAssetFarmingPower(assetId, address)
602- ((getStakeResult(address, assetId, farmingPower._2, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((((("address_" + address) + "_asset_") + toBase58String(assetId)) + "_perchColor"), color)]) ++ validPayment)
603- }
604- else throw("asset is not valid")
605- }
606- else throw("Strict value is not equal to itself.")
607- }
608- else throw("Strict value is not equal to itself.")
609- }
389+func stakeJackpot (color) = throw("FBN: function is disabled, migration to new sc ongoing")
610390
611391
612392
613393 @Callable(i)
614394 func unstakeJackpot (asset) = {
615395 let validPayment = checkAdditionalPayment(i.payments[0])
616396 if ((validPayment == validPayment))
617397 then {
618398 let result = unstakeJackpotInternal(asset, i, true)
619399 $Tuple2((result._1 ++ validPayment), result._2)
620400 }
621401 else throw("Strict value is not equal to itself.")
622402 }
623403
624404
625405
626406 @Callable(i)
627407 func unstakeJackpotWithoutClaimEgg (asset) = unstakeJackpotInternal(asset, i, false)
628408
629409
630410
631411 @Callable(i)
632412 func claimReward (asset) = {
633413 let locked = isLocked()
634414 if ((locked == locked))
635415 then {
636416 let validPayment = if ((i.originCaller == getCfMasterAddress()))
637417 then nil
638418 else checkAdditionalPayment(i.payments[0])
639419 if ((validPayment == validPayment))
640420 then {
641421 let address = if ((i.originCaller == getCfMasterAddress()))
642422 then toString(i.caller)
643423 else toString(i.originCaller)
644424 let assetId = fromBase58String(asset)
645425 let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset)
646426 let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower)
647427 let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")))
648428 let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"))
649429 let reward = ((farmedAmount - withdrawnAmount) / (scale * 100))
650430 if ((0 >= reward))
651431 then throw("FCR: you have no EGGs to withdraw")
652432 else $Tuple2(([IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) + (reward * scale2))), ScriptTransfer(Address(fromBase58String(address)), (reward * 1000000), getEggAssetId())] ++ validPayment), (reward * 1000000))
653433 }
654434 else throw("Strict value is not equal to itself.")
655435 }
656436 else throw("Strict value is not equal to itself.")
657437 }
658438
659439
660440 @Verifier(tx)
661441 func verify () = if (isTestEnv())
662442 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
663443 else {
664444 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
665445 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
666446 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
667447 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
668448 then 1
669449 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
670450 then 1
671451 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
672452 then 1
673453 else 0
674454 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
675455 then 1
676456 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
677457 then 1
678458 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
679459 then 1
680460 else 0
681461 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
682462 then 1
683463 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
684464 then 1
685465 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
686466 then 1
687467 else 0
688468 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
689469 match tx {
690- case dtx: DataTransaction =>
691- sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
692470 case _ =>
693471 (signaturesCount >= 2)
694472 }
695473 }
696474

github/deemru/w8io/6500d08 
340.45 ms