tx · EQVPsKZcHmA1Qcn2G67M57Ykway7mF1EREquAEnzWCrk 3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA: -0.01400000 Waves 2022.06.06 14:20 [3150009] smart account 3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA > SELF 0.00000000 Waves
{ "type": 13, "id": "EQVPsKZcHmA1Qcn2G67M57Ykway7mF1EREquAEnzWCrk", "fee": 1400000, "feeAssetId": null, "timestamp": 1654514438977, "version": 2, "chainId": 87, "sender": "3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA", "senderPublicKey": "3GtkwhnMmG1yeozW51o4dJ1x3BDToPaLBXyBWKGdAc2e", "proofs": [ "5M8UXkC5jtZbsJsXPUKWoTLrXf3x1z1Th1H8Va8zDBaZwm6BWP95TrhXK4sZpCpGE1uLdGhLAsPBWjcNzUVL1vtN" ], "script": "base64:AAIFAAAAAAAAAC0IAhIDCgEIEgASBAoCCAgSBAoCCAgSABIAEgMKAQgSAwoBCBIDCgEIEgMKAQgAAAApAAAAAApwZXJjaFByaWNlCQAAaAAAAAIAAAAAAAAAAGQAAAAAAAAPQkAAAAAABXNjYWxlAAAAAAAAACcQAAAAAAZzY2FsZTIAAAAAAAAPQkABAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAAAQAAAAx0cnlHZXRTdHJpbmcAAAABAAAAA2tleQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgUAAAAEdGhpcwUAAAADa2V5AQAAAAlnZXRPcmFjbGUAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAADHRyeUdldFN0cmluZwAAAAECAAAAFHN0YXRpY19vcmFjbGVBZGRyZXNzAQAAAA1nZXRFZ2dBc3NldElkAAAAAAkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAIAAAARc3RhdGljX2VnZ0Fzc2V0SWQBAAAAE2dldEluY3ViYXRvckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAF3N0YXRpY19pbmN1YmF0b3JBZGRyZXNzAQAAABFnZXRSZWJpcnRoQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAIAAAAVc3RhdGljX3JlYmlydGhBZGRyZXNzAQAAABNnZXRTd29wUHJvbW9BZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABdzdGF0aWNfc3dvcFByb21vQWRkcmVzcwEAAAARZ2V0QnJlZWRlckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAFXN0YXRpY19icmVlZGVyQWRkcmVzcwEAAAAVZ2V0UmVmQ29udHJhY3RBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABlzdGF0aWNfcmVmQ29udHJhY3RBZGRyZXNzAQAAAA9nZXRJdGVtc0FkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAE3N0YXRpY19pdGVtc0FkZHJlc3MBAAAAEmdldE1ldGFyYWNlQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAIAAAAWc3RhdGljX21ldGFSYWNlQWRkcmVzcwEAAAAUZ2V0QWNjQm9vc3RlckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAGHN0YXRpY19hY2NCb29zdGVyQWRkcmVzcwEAAAATZ2V0VHJ1c3RlZENvbnRyYWN0cwAAAAAJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABdzdGF0aWNfdHJ1c3RlZENvbnRyYWN0cwEAAAAOZ2V0TWFpbnRlbmFuY2UAAAAACQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAIAAAASc3RhdGljX21haW50ZW5hbmNlAQAAABJnZXRDZk1hc3RlckFk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AAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAADW5vdCB2YWxpZCBORlQBAAAAHWdldExhc3RLbm93bkFzc2V0RmFybWluZ1Bvd2VyAAAAAgAAAAdhZGRyZXNzAAAAB2Fzc2V0SWQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAHYXNzZXRJZAIAAAANX2Zhcm1pbmdQb3dlcgEAAAAOZ2V0QXNzZXRzQnlHZW4AAAABAAAAA2dlbgQAAAABcwkBAAAADHRyeUdldFN0cmluZwAAAAEJAAEsAAAAAgIAAAAHYXNzZXRzXwUAAAADZ2VuAwkAAAAAAAACBQAAAAFzAgAAAAAFAAAAA25pbAkABLUAAAACBQAAAAFzAgAAAAEsAQAAAAxjYWxjSW50ZXJlc3QAAAADAAAAEHByZXZpb3VzSW50ZXJlc3QAAAAWcHJldmlvdXNJbnRlcmVzdEhlaWdodAAAABF0b3RhbEZhcm1pbmdQb3dlcgkAAGQAAAACBQAAABBwcmV2aW91c0ludGVyZXN0CQAAaQAAAAIJAABoAAAAAgkAAGgAAAACBQAAAAVzY2FsZQkBAAAAEWdldFJld2FyZFBlckJsb2NrAAAAAAkAAGUAAAACBQAAAAZoZWlnaHQFAAAAFnByZXZpb3VzSW50ZXJlc3RIZWlnaHQFAAAAEXRvdGFsRmFybWluZ1Bvd2VyAQAAABJnZXRDdXJyZW50SW50ZXJlc3QAAAAAAwkAAGYAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgAAAAAAAAAAAAQAAAAQcHJldmlvdXNJbnRlcmVzdAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAQAAAAWcHJldmlvdXNJbnRlcmVzdEhlaWdodAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAAB10b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdEhlaWdodAQAAAARdG90YWxGYXJtaW5nUG93ZXIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQIAAAASdG90YWxfZmFybWluZ1Bvd2VyCQEAAAAMY2FsY0ludGVyZXN0AAAAAwUAAAAQcHJldmlvdXNJbnRlcmVzdAUAAAAWcHJldmlvdXNJbnRlcmVzdEhlaWdodAUAAAARdG90YWxGYXJtaW5nUG93ZXIDCQEAAAACIT0AAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEXRvdGFsX3N0YXJ0SGVpZ2h0AAAAAAAAAAAACQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAF3RvdGFsX2xhc3RDaGVja0ludGVyZXN0CQAAAgAAAAECAAAAHGZhcm1pbmcgaXMgbm90IGxhdW5jaGVkLCB5ZXQBAAAAFGNhbGNBc3NldFJld2FyZERlbHRhAAAAAwAAAAdhZGRyZXNzAAAAB2Fzc2V0SWQAAAARYXNzZXRGYXJtaW5nUG93ZXIEAAAAFmxhc3RDaGVja0Fzc2V0SW50ZXJlc3QJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAHYXNzZXRJZAIAAAASX2xhc3RDaGVja0ludGVyZXN0BAAAAA9jdXJyZW50SW50ZXJlc3QJAQAAABJnZXRDdXJyZW50SW50ZXJlc3QAAAAACQAAaAAAAAIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAAZQAAAAIFAAAAD2N1cnJlbnRJbnRlcmVzdAUAAAAWbGFzdENoZWNrQXNzZXRJbnRlcmVzdAEAAAAUYWRkQXNzZXRJZFRvR2VuRW50cnkAAAACAAAAB2Fzc2V0SWQAAAAIYXNzZXRHZW4EAAAADGN1cnJlbnRWYWx1ZQkBAAAADHRyeUdldFN0cmluZwAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAdhc3NldHNfBQAAAAhhc3NldEdlbgIAAAAHX2xvY2tlZAMJAAAAAAAAAgUAAAAMY3VycmVudFZhbHVlAgAAAAAFAAAAB2Fzc2V0SWQJAAEsAAAAAgkAASwAAAACBQAAAAxjdXJyZW50VmFsdWUCAAAAASwFAAAAB2Fzc2V0SWQBAAAADmdldFN0YWtlUmVzdWx0AAAABAAAAAdhZGRyZXNzAAAAB2Fzc2V0SWQAAAARYXNzZXRGYXJtaW5nUG93ZXIAAAAIdW5zdGFrZXIEAAAABWFzc2V0CQACWAAAAAEFAAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgkAAGQAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgUAAAARYXNzZXRGYXJtaW5nUG93ZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAF3RvdGFsX2xhc3RDaGVja0ludGVyZXN0CQEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAddG90YWxfbGFzdENoZWNrSW50ZXJlc3RIZWlnaHQFAAAABmhlaWdodAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGYXNzZXRfBQAAAAVhc3NldAIAAAAGX293bmVyBQAAAAdhZGRyZXNzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAANX2Zhcm1pbmdQb3dlcgUAAAARYXNzZXRGYXJtaW5nUG93ZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAABJfbGFzdENoZWNrSW50ZXJlc3QJAQAAABJnZXRDdXJyZW50SW50ZXJlc3QAAAAACQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAAAlfdW5zdGFrZXIFAAAACHVuc3Rha2VyBQAAAANuaWwBAAAAEGdldFVuc3Rha2VSZXN1bHQAAAAFAAAAB2FkZHJlc3MAAAAHYXNzZXRJZAAAAAtyZXdhcmREZWx0YQAAAA93aXRoZHJhd25BbW91bnQAAAARYXNzZXRGYXJtaW5nUG93ZXIEAAAABWFzc2V0CQACWAAAAAEFAAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgkAAGUAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgUAAAARYXNzZXRGYXJtaW5nUG93ZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAF3RvdGFsX2xhc3RDaGVja0ludGVyZXN0CQEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAddG90YWxfbGFzdENoZWNrSW50ZXJlc3RIZWlnaHQFAAAABmhlaWdodAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAGYXNzZXRfBQAAAAVhc3NldAIAAAAGX293bmVyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAANX2Zhcm1pbmdQb3dlcgAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAEl9sYXN0Q2hlY2tJbnRlcmVzdAkBAAAAEmdldEN1cnJlbnRJbnRlcmVzdAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAABBfd2l0aGRyYXduQW1vdW50CQAAZAAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAEF93aXRoZHJhd25BbW91bnQJAABoAAAAAgUAAAAPd2l0aGRyYXduQW1vdW50BQAAAAZzY2FsZTIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAABZfbGFzdENoZWNrRmFybWVkQW1vdW50CQAAZAAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAFl9sYXN0Q2hlY2tGYXJtZWRBbW91bnQFAAAAC3Jld2FyZERlbHRhBQAAAANuaWwBAAAAE2NhbGN1bGF0ZVBlcmNoUHJpY2UAAAABAAAAB2FkZHJlc3MEAAAAEWhhc0FydGVmYWN0U3Rha2VkCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAUZ2V0QWNjQm9vc3RlckFkZHJlc3MAAAAACQABLAAAAAIJAAEsAAAAAgIAAAALQVJULVhNSVNUTF8FAAAAB2FkZHJlc3MCAAAABl9vd25lcgMJAAAAAAAAAgUAAAARaGFzQXJ0ZWZhY3RTdGFrZWQCAAAAAAUAAAAKcGVyY2hQcmljZQkAAGgAAAACCQAAaQAAAAIFAAAACnBlcmNoUHJpY2UAAAAAAAAAAAoAAAAAAAAAAAkBAAAAC2lzVHJ1c3RlZFNjAAAAAQAAAAdhZGRyZXNzBAAAABBhbGxvd2VkQ29udHJhY3RzCQEAAAATZ2V0VHJ1c3RlZENvbnRyYWN0cwAAAAAEAAAAFGFsbG93ZWRD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eW91IHdpbGwgYmUgbm90IGFibGUgdG8gY2xhaW0geW91ciBmYXJtaW5nIHJld2FyZHMgdGlsbCB0aGUgZW5kIG9mIER1Y2tTcXVpZCBnYW1lLiBRdWFjayBpbiBwZWFjZSEEAAAAB2Fzc2V0SWQJAAJZAAAAAQUAAAAFYXNzZXQEAAAABWNvbG9yCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAC19wZXJjaENvbG9yBAAAABFhc3NldEZhcm1pbmdQb3dlcgkBAAAAHWdldExhc3RLbm93bkFzc2V0RmFybWluZ1Bvd2VyAAAAAgUAAAAHYWRkcmVzcwUAAAAFYXNzZXQEAAAAEGFzc2V0UmV3YXJkRGVsdGEJAQAAABRjYWxjQXNzZXRSZXdhcmREZWx0YQAAAAMFAAAAB2FkZHJlc3MFAAAABWFzc2V0BQAAABFhc3NldEZhcm1pbmdQb3dlcgQAAAAMZmFybWVkQW1vdW50CQAAZAAAAAIFAAAAEGFzc2V0UmV3YXJkRGVsdGEJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAFl9sYXN0Q2hlY2tGYXJtZWRBbW91bnQEAAAAD3dpdGhkcmF3bkFtb3VudAkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAQX3dpdGhkcmF3bkFtb3VudAQAAAAGcmV3YXJkCQAAaQAAAAIJAABlAAAAAgUAAAAMZmFybWVkQW1vdW50BQAAAA93aXRoZHJhd25BbW91bnQJAABoAAAAAgUAAAAFc2NhbGUAAAAAAAAAAGQEAAAACHVuc3Rha2VyCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAA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", "height": 3150009, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 49HFdCE23qpe6RY5EmCzuvuTsMuLyEuDvuXZtpkvSDY2 Next: 9uL7bkYat89d43MjfuG8JkFzDcDRCWetbsqoS5W2jSiA Diff:
Old | New | Differences | |
---|---|---|---|
110 | 110 | case string: String => | |
111 | 111 | string | |
112 | 112 | case _ => | |
113 | - | throw("wrong type, expected: String") | |
113 | + | throw("FAS: wrong type, expected: String") | |
114 | 114 | } | |
115 | 115 | ||
116 | 116 | ||
118 | 118 | case int: Int => | |
119 | 119 | int | |
120 | 120 | case _ => | |
121 | - | throw("wrong type, expected: Int") | |
121 | + | throw("FAI: wrong type, expected: Int") | |
122 | 122 | } | |
123 | 123 | ||
124 | 124 | ||
213 | 213 | } | |
214 | 214 | ||
215 | 215 | ||
216 | + | func isTrustedSc (address) = { | |
217 | + | let allowedContracts = getTrustedContracts() | |
218 | + | let allowedContractsList = split(allowedContracts, ";") | |
219 | + | (indexOf(allowedContractsList, address) == unit) | |
220 | + | } | |
221 | + | ||
222 | + | ||
216 | 223 | @Callable(i) | |
217 | 224 | func configureOracle (oracle) = if ((i.caller != this)) | |
218 | - | then throw("admin only") | |
225 | + | then throw("FCO: admin only") | |
219 | 226 | else [StringEntry("static_oracleAddress", oracle)] | |
220 | 227 | ||
221 | 228 | ||
222 | 229 | ||
223 | 230 | @Callable(i) | |
224 | 231 | func init () = if ((i.caller != this)) | |
225 | - | then throw("admin only") | |
232 | + | then throw("FI: admin only") | |
226 | 233 | else [IntegerEntry("total_startHeight", height)] | |
227 | 234 | ||
228 | 235 | ||
243 | 250 | then { | |
244 | 251 | let firstPayment = value(i.payments[0]) | |
245 | 252 | if ((firstPayment.assetId != getEggAssetId())) | |
246 | - | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId()))) | |
253 | + | then throw(("FBP: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId()))) | |
247 | 254 | else if ((firstPayment.amount != leftToPay)) | |
248 | - | then throw(("To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay))) | |
255 | + | then throw(("FBP: To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay))) | |
249 | 256 | else { | |
250 | 257 | let refererRewardForPerch = fraction(leftToPay, RefererReward, 100) | |
251 | 258 | let refCall = invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]) | |
300 | 307 | let pmt = value(i.payments[0]) | |
301 | 308 | let assetId = value(value(i.payments[0]).assetId) | |
302 | 309 | let realCaller = toString(i.caller) | |
303 | - | let address = if (if ((getMetaraceAddress() == i.caller)) | |
304 | - | then true | |
305 | - | else (getDuckWrapperSc() == i.caller)) | |
306 | - | then realCaller | |
307 | - | else toString(i.originCaller) | |
310 | + | let address = if (isTrustedSc(toString(i.caller))) | |
311 | + | then toString(i.originCaller) | |
312 | + | else realCaller | |
308 | 313 | let color = takeRight(value(assetInfo(assetId)).name, 1) | |
309 | 314 | let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) | |
310 | 315 | if ((pmt.amount != 1)) | |
312 | 317 | else if ((0 >= availablePerches)) | |
313 | 318 | then throw(("no perches available for the color " + color)) | |
314 | 319 | else { | |
315 | - | let $ | |
316 | - | let assetGen = $ | |
317 | - | let assetFarmingPower = $ | |
320 | + | let $t01112911202 = getAssetFarmingPower(assetId, address) | |
321 | + | let assetGen = $t01112911202._1 | |
322 | + | let assetFarmingPower = $t01112911202._2 | |
318 | 323 | (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1))]) | |
319 | 324 | } | |
320 | 325 | } | |
328 | 333 | let locked = isLocked() | |
329 | 334 | if ((locked == locked)) | |
330 | 335 | then { | |
331 | - | let allowedContracts = getTrustedContracts() | |
332 | - | let allowedContractsList = split(allowedContracts, ";") | |
333 | 336 | let dappToCall = toString(i.caller) | |
334 | - | if (( | |
335 | - | then throw("Only trusted smart contracts can stake without a perch!") | |
337 | + | if (isTrustedSc(dappToCall)) | |
338 | + | then throw("FSNWP: Only trusted smart contracts can stake without a perch!") | |
336 | 339 | else { | |
337 | 340 | let pmt = value(i.payments[0]) | |
338 | 341 | let assetId = value(value(i.payments[0]).assetId) | |
340 | 343 | if ((pmt.amount != 1)) | |
341 | 344 | then throw("NFT is not attached") | |
342 | 345 | else { | |
343 | - | let $ | |
344 | - | let assetGen = $ | |
345 | - | let assetFarmingPower = $ | |
346 | + | let $t01182011893 = getAssetFarmingPower(assetId, address) | |
347 | + | let assetGen = $t01182011893._1 | |
348 | + | let assetFarmingPower = $t01182011893._2 | |
346 | 349 | let asset = toBase58String(assetId) | |
347 | 350 | let realCaller = toString(i.caller) | |
348 | 351 | (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)]) | |
361 | 364 | then { | |
362 | 365 | let add = toString(i.originCaller) | |
363 | 366 | if (isUserBlacklisted(add)) | |
364 | - | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
367 | + | then throw("FUN: Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
365 | 368 | else { | |
366 | 369 | let assetId = fromBase58String(asset) | |
367 | 370 | let unstaker = tryGetString((((("address_" + add) + "_asset_") + asset) + "_unstaker")) | |
368 | - | let address = if (if ((getMetaraceAddress() == i.caller)) | |
369 | - | then true | |
370 | - | else (getDuckWrapperSc() == i.caller)) | |
371 | - | then toString(i.caller) | |
372 | - | else add | |
371 | + | let address = if (isTrustedSc(toString(i.caller))) | |
372 | + | then add | |
373 | + | else toString(i.caller) | |
373 | 374 | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
374 | 375 | let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower) | |
375 | 376 | let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"))) | |
380 | 381 | if (if ((unstaker != "")) | |
381 | 382 | then (unstaker != realCaller) | |
382 | 383 | else false) | |
383 | - | then throw("It seems duck was staked throuh a dapp, not directly, please unstake through dapp!") | |
384 | + | then throw("FUN: It seems duck was staked throuh a dapp, not directly, please unstake through dapp!") | |
384 | 385 | else if ((0 >= assetFarmingPower)) | |
385 | - | then throw("asset not available") | |
386 | + | then throw("FUN: asset not available") | |
386 | 387 | else { | |
387 | 388 | let isWithoutPerch = tryGetBoolean((((("address_" + address) + "_asset_") + asset) + "_without_perch")) | |
388 | 389 | if ((color == "U")) | |
389 | - | then throw("use another function to unstake Jackpot NFT") | |
390 | + | then throw("FUN: use another function to unstake Jackpot NFT") | |
390 | 391 | else { | |
391 | 392 | let result = getUnstakeResult(address, assetId, assetRewardDelta, reward, assetFarmingPower) | |
392 | 393 | let appendPerches = if (isWithoutPerch) | |
410 | 411 | let pmt = value(i.payments[0]) | |
411 | 412 | let assetId = value(pmt.assetId) | |
412 | 413 | let realCaller = toString(i.caller) | |
413 | - | let address = if (if ((getMetaraceAddress() == i.caller)) | |
414 | - | then true | |
415 | - | else (getDuckWrapperSc() == i.caller)) | |
416 | - | then realCaller | |
417 | - | else toString(i.originCaller) | |
414 | + | let address = if (isTrustedSc(toString(i.caller))) | |
415 | + | then toString(i.originCaller) | |
416 | + | else realCaller | |
418 | 417 | let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) | |
419 | 418 | let assetIssuer = value(assetInfo(assetId)).issuer | |
420 | 419 | if ((pmt.amount != 1)) | |
425 | 424 | then if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U")) | |
426 | 425 | then throw("jackpot only") | |
427 | 426 | else if ((0 >= availablePerches)) | |
428 | - | then throw(("no perches available for the color " + color)) | |
427 | + | then throw(("FSJ: no perches available for the color " + color)) | |
429 | 428 | else { | |
430 | 429 | let farmingPower = getAssetFarmingPower(assetId, address) | |
431 | 430 | (getStakeResult(address, assetId, farmingPower._2, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((((("address_" + address) + "_asset_") + toBase58String(assetId)) + "_perchColor"), color)]) | |
443 | 442 | if ((locked == locked)) | |
444 | 443 | then { | |
445 | 444 | let realCaller = toString(i.caller) | |
446 | - | let address = if (if ((getMetaraceAddress() == i.caller)) | |
447 | - | then true | |
448 | - | else (getDuckWrapperSc() == i.caller)) | |
449 | - | then realCaller | |
450 | - | else toString(i.originCaller) | |
445 | + | let address = if (isTrustedSc(toString(i.caller))) | |
446 | + | then toString(i.originCaller) | |
447 | + | else realCaller | |
451 | 448 | if (isUserBlacklisted(address)) | |
452 | - | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
449 | + | then throw("FUJ: Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
453 | 450 | else { | |
454 | 451 | let assetId = fromBase58String(asset) | |
455 | 452 | let color = tryGetString((((("address_" + address) + "_asset_") + asset) + "_perchColor")) | |
462 | 459 | if (if ((unstaker != "")) | |
463 | 460 | then (unstaker != realCaller) | |
464 | 461 | else false) | |
465 | - | then throw("It seems duck was staked throuh a dapp, not directly, please unstake through dapp!") | |
462 | + | then throw("FUJ: It seems duck was staked throuh a dapp, not directly, please unstake through dapp!") | |
466 | 463 | else if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U")) | |
467 | 464 | then throw("jackpot only") | |
468 | 465 | else if ((assetFarmingPower > 0)) | |
474 | 471 | else [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) + 1))] | |
475 | 472 | $Tuple2(((result ++ appendPerches) ++ [ScriptTransfer(i.caller, (reward * 1000000), getEggAssetId()), ScriptTransfer(i.caller, 1, assetId)]), (reward * 1000000)) | |
476 | 473 | } | |
477 | - | else throw("Asset farming power not bigger then 0") | |
474 | + | else throw("FUJ: Asset farming power not bigger then 0") | |
478 | 475 | } | |
479 | 476 | } | |
480 | 477 | else throw("Strict value is not equal to itself.") | |
491 | 488 | then toString(i.caller) | |
492 | 489 | else toString(i.originCaller) | |
493 | 490 | if (isUserBlacklisted(address)) | |
494 | - | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
491 | + | then throw("FCR: Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
495 | 492 | else { | |
496 | 493 | let assetId = fromBase58String(asset) | |
497 | 494 | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
500 | 497 | let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) | |
501 | 498 | let reward = ((farmedAmount - withdrawnAmount) / (scale * 100)) | |
502 | 499 | if ((0 >= reward)) | |
503 | - | then throw("you have no EGGs to withdraw") | |
500 | + | then throw("FCR: you have no EGGs to withdraw") | |
504 | 501 | else $Tuple2([IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) + (reward * scale2))), ScriptTransfer(Address(fromBase58String(address)), (reward * 1000000), getEggAssetId())], (reward * 1000000)) | |
505 | 502 | } | |
506 | 503 | } |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let perchPrice = (100 * 1000000) | |
5 | 5 | ||
6 | 6 | let scale = 10000 | |
7 | 7 | ||
8 | 8 | let scale2 = 1000000 | |
9 | 9 | ||
10 | 10 | func tryGetStringExternal (address,key) = match getString(address, key) { | |
11 | 11 | case a: String => | |
12 | 12 | a | |
13 | 13 | case _ => | |
14 | 14 | "" | |
15 | 15 | } | |
16 | 16 | ||
17 | 17 | ||
18 | 18 | func tryGetString (key) = tryGetStringExternal(this, key) | |
19 | 19 | ||
20 | 20 | ||
21 | 21 | func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress"))) | |
22 | 22 | ||
23 | 23 | ||
24 | 24 | func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId")) | |
25 | 25 | ||
26 | 26 | ||
27 | 27 | func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress"))) | |
28 | 28 | ||
29 | 29 | ||
30 | 30 | func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress"))) | |
31 | 31 | ||
32 | 32 | ||
33 | 33 | func getSwopPromoAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_swopPromoAddress"))) | |
34 | 34 | ||
35 | 35 | ||
36 | 36 | func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress"))) | |
37 | 37 | ||
38 | 38 | ||
39 | 39 | func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_refContractAddress"))) | |
40 | 40 | ||
41 | 41 | ||
42 | 42 | func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress"))) | |
43 | 43 | ||
44 | 44 | ||
45 | 45 | func getMetaraceAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_metaRaceAddress"))) | |
46 | 46 | ||
47 | 47 | ||
48 | 48 | func getAccBoosterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_accBoosterAddress"))) | |
49 | 49 | ||
50 | 50 | ||
51 | 51 | func getTrustedContracts () = tryGetStringExternal(getOracle(), "static_trustedContracts") | |
52 | 52 | ||
53 | 53 | ||
54 | 54 | func getMaintenance () = tryGetStringExternal(getOracle(), "static_maintenance") | |
55 | 55 | ||
56 | 56 | ||
57 | 57 | func getCfMasterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_cfMasterAddress"))) | |
58 | 58 | ||
59 | 59 | ||
60 | 60 | func getDuckWrapperSc () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_duckWrapper"))) | |
61 | 61 | ||
62 | 62 | ||
63 | 63 | func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_couponsAddress"))) | |
64 | 64 | ||
65 | 65 | ||
66 | 66 | let RefererReward = 5 | |
67 | 67 | ||
68 | 68 | func getRewardPerBlock () = 684 | |
69 | 69 | ||
70 | 70 | ||
71 | 71 | func isLocked () = if ((getMaintenance() != "")) | |
72 | 72 | then throw(getMaintenance()) | |
73 | 73 | else 0 | |
74 | 74 | ||
75 | 75 | ||
76 | 76 | func tryGetInteger (key) = match getInteger(this, key) { | |
77 | 77 | case b: Int => | |
78 | 78 | b | |
79 | 79 | case _ => | |
80 | 80 | 0 | |
81 | 81 | } | |
82 | 82 | ||
83 | 83 | ||
84 | 84 | func tryGetBoolean (key) = match getBoolean(this, key) { | |
85 | 85 | case b: Boolean => | |
86 | 86 | b | |
87 | 87 | case _ => | |
88 | 88 | false | |
89 | 89 | } | |
90 | 90 | ||
91 | 91 | ||
92 | 92 | func isUserBlacklisted (address) = false | |
93 | 93 | ||
94 | 94 | ||
95 | 95 | func getAssetOrigin (generation) = if ((generation == "G")) | |
96 | 96 | then getIncubatorAddress() | |
97 | 97 | else getBreederAddress() | |
98 | 98 | ||
99 | 99 | ||
100 | 100 | func getAssetRarity (genotype,generation) = { | |
101 | 101 | let quantity = valueOrErrorMessage(getInteger(getAssetOrigin(generation), (("stats_" + genotype) + "_quantity")), (("stats_" + genotype) + "_quantity not found")) | |
102 | 102 | let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR) | |
103 | 103 | if ((power > 0)) | |
104 | 104 | then power | |
105 | 105 | else 2 | |
106 | 106 | } | |
107 | 107 | ||
108 | 108 | ||
109 | 109 | func asString (value) = match value { | |
110 | 110 | case string: String => | |
111 | 111 | string | |
112 | 112 | case _ => | |
113 | - | throw("wrong type, expected: String") | |
113 | + | throw("FAS: wrong type, expected: String") | |
114 | 114 | } | |
115 | 115 | ||
116 | 116 | ||
117 | 117 | func asInt (value) = match value { | |
118 | 118 | case int: Int => | |
119 | 119 | int | |
120 | 120 | case _ => | |
121 | - | throw("wrong type, expected: Int") | |
121 | + | throw("FAI: wrong type, expected: Int") | |
122 | 122 | } | |
123 | 123 | ||
124 | 124 | ||
125 | 125 | func getAssetFarmingPower (assetId,address) = if (if ((value(assetInfo(assetId)).issuer == getBreederAddress())) | |
126 | 126 | then true | |
127 | 127 | else (value(assetInfo(assetId)).issuer == getIncubatorAddress())) | |
128 | 128 | then { | |
129 | 129 | let farmBoost = asInt(invoke(getItemsAddress(), "calculateFarmingPowerBoost", [toBase58String(assetId), address], nil)) | |
130 | 130 | if ((farmBoost == farmBoost)) | |
131 | 131 | then { | |
132 | 132 | let assetName = value(assetInfo(assetId)).name | |
133 | 133 | let isJackpot = (takeRight(value(assetName), 1) == "U") | |
134 | 134 | let farmGen = if (isJackpot) | |
135 | 135 | then "" | |
136 | 136 | else asString(invoke(getBreederAddress(), "getGenFromName", [assetName], nil)) | |
137 | 137 | if ((farmGen == farmGen)) | |
138 | 138 | then { | |
139 | 139 | let rarity = if (isJackpot) | |
140 | 140 | then 100 | |
141 | 141 | else { | |
142 | 142 | let generation = take(takeRight(assetName, 2), 1) | |
143 | 143 | getAssetRarity(farmGen, generation) | |
144 | 144 | } | |
145 | 145 | let totalFarmingPower = (rarity + fraction(rarity, farmBoost, 100)) | |
146 | 146 | $Tuple2(farmGen, totalFarmingPower) | |
147 | 147 | } | |
148 | 148 | else throw("Strict value is not equal to itself.") | |
149 | 149 | } | |
150 | 150 | else throw("Strict value is not equal to itself.") | |
151 | 151 | } | |
152 | 152 | else throw("not valid NFT") | |
153 | 153 | ||
154 | 154 | ||
155 | 155 | func getLastKnownAssetFarmingPower (address,assetId) = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_farmingPower")) | |
156 | 156 | ||
157 | 157 | ||
158 | 158 | func getAssetsByGen (gen) = { | |
159 | 159 | let s = tryGetString(("assets_" + gen)) | |
160 | 160 | if ((s == "")) | |
161 | 161 | then nil | |
162 | 162 | else split(s, ",") | |
163 | 163 | } | |
164 | 164 | ||
165 | 165 | ||
166 | 166 | func calcInterest (previousInterest,previousInterestHeight,totalFarmingPower) = (previousInterest + (((scale * getRewardPerBlock()) * (height - previousInterestHeight)) / totalFarmingPower)) | |
167 | 167 | ||
168 | 168 | ||
169 | 169 | func getCurrentInterest () = if ((tryGetInteger("total_farmingPower") > 0)) | |
170 | 170 | then { | |
171 | 171 | let previousInterest = tryGetInteger("total_lastCheckInterest") | |
172 | 172 | let previousInterestHeight = tryGetInteger("total_lastCheckInterestHeight") | |
173 | 173 | let totalFarmingPower = tryGetInteger("total_farmingPower") | |
174 | 174 | calcInterest(previousInterest, previousInterestHeight, totalFarmingPower) | |
175 | 175 | } | |
176 | 176 | else if ((tryGetInteger("total_startHeight") != 0)) | |
177 | 177 | then tryGetInteger("total_lastCheckInterest") | |
178 | 178 | else throw("farming is not launched, yet") | |
179 | 179 | ||
180 | 180 | ||
181 | 181 | func calcAssetRewardDelta (address,assetId,assetFarmingPower) = { | |
182 | 182 | let lastCheckAssetInterest = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_lastCheckInterest")) | |
183 | 183 | let currentInterest = getCurrentInterest() | |
184 | 184 | (assetFarmingPower * (currentInterest - lastCheckAssetInterest)) | |
185 | 185 | } | |
186 | 186 | ||
187 | 187 | ||
188 | 188 | func addAssetIdToGenEntry (assetId,assetGen) = { | |
189 | 189 | let currentValue = tryGetString((("assets_" + assetGen) + "_locked")) | |
190 | 190 | if ((currentValue == "")) | |
191 | 191 | then assetId | |
192 | 192 | else ((currentValue + ",") + assetId) | |
193 | 193 | } | |
194 | 194 | ||
195 | 195 | ||
196 | 196 | func getStakeResult (address,assetId,assetFarmingPower,unstaker) = { | |
197 | 197 | let asset = toBase58String(assetId) | |
198 | 198 | [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)] | |
199 | 199 | } | |
200 | 200 | ||
201 | 201 | ||
202 | 202 | func getUnstakeResult (address,assetId,rewardDelta,withdrawnAmount,assetFarmingPower) = { | |
203 | 203 | let asset = toBase58String(assetId) | |
204 | 204 | [IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") - assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), DeleteEntry((("asset_" + asset) + "_owner")), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), 0), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest()), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) + (withdrawnAmount * scale2))), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")) + rewardDelta))] | |
205 | 205 | } | |
206 | 206 | ||
207 | 207 | ||
208 | 208 | func calculatePerchPrice (address) = { | |
209 | 209 | let hasArtefactStaked = tryGetStringExternal(getAccBoosterAddress(), (("ART-XMISTL_" + address) + "_owner")) | |
210 | 210 | if ((hasArtefactStaked == "")) | |
211 | 211 | then perchPrice | |
212 | 212 | else ((perchPrice / 10) * 9) | |
213 | 213 | } | |
214 | 214 | ||
215 | 215 | ||
216 | + | func isTrustedSc (address) = { | |
217 | + | let allowedContracts = getTrustedContracts() | |
218 | + | let allowedContractsList = split(allowedContracts, ";") | |
219 | + | (indexOf(allowedContractsList, address) == unit) | |
220 | + | } | |
221 | + | ||
222 | + | ||
216 | 223 | @Callable(i) | |
217 | 224 | func configureOracle (oracle) = if ((i.caller != this)) | |
218 | - | then throw("admin only") | |
225 | + | then throw("FCO: admin only") | |
219 | 226 | else [StringEntry("static_oracleAddress", oracle)] | |
220 | 227 | ||
221 | 228 | ||
222 | 229 | ||
223 | 230 | @Callable(i) | |
224 | 231 | func init () = if ((i.caller != this)) | |
225 | - | then throw("admin only") | |
232 | + | then throw("FI: admin only") | |
226 | 233 | else [IntegerEntry("total_startHeight", height)] | |
227 | 234 | ||
228 | 235 | ||
229 | 236 | ||
230 | 237 | @Callable(i) | |
231 | 238 | func buyPerch (color,refererAddress) = { | |
232 | 239 | let locked = isLocked() | |
233 | 240 | if ((locked == locked)) | |
234 | 241 | then if ((0 > value(indexOf(["B", "R", "G", "Y"], color)))) | |
235 | 242 | then throw("you need to set color properly") | |
236 | 243 | else { | |
237 | 244 | let exactPrice = calculatePerchPrice(toString(i.caller)) | |
238 | 245 | let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [exactPrice], nil)) | |
239 | 246 | if ((amountPaidByCoupons == amountPaidByCoupons)) | |
240 | 247 | then { | |
241 | 248 | let leftToPay = (exactPrice - amountPaidByCoupons) | |
242 | 249 | let payment = if ((leftToPay != 0)) | |
243 | 250 | then { | |
244 | 251 | let firstPayment = value(i.payments[0]) | |
245 | 252 | if ((firstPayment.assetId != getEggAssetId())) | |
246 | - | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId()))) | |
253 | + | then throw(("FBP: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId()))) | |
247 | 254 | else if ((firstPayment.amount != leftToPay)) | |
248 | - | then throw(("To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay))) | |
255 | + | then throw(("FBP: To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay))) | |
249 | 256 | else { | |
250 | 257 | let refererRewardForPerch = fraction(leftToPay, RefererReward, 100) | |
251 | 258 | let refCall = invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]) | |
252 | 259 | if ((refCall == refCall)) | |
253 | 260 | then leftToPay | |
254 | 261 | else throw("Strict value is not equal to itself.") | |
255 | 262 | } | |
256 | 263 | } | |
257 | 264 | else 0 | |
258 | 265 | if ((payment == payment)) | |
259 | 266 | then { | |
260 | 267 | let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color) | |
261 | 268 | let perchAmount = tryGetInteger(perchAmountKey) | |
262 | 269 | [IntegerEntry(perchAmountKey, (perchAmount + 1))] | |
263 | 270 | } | |
264 | 271 | else throw("Strict value is not equal to itself.") | |
265 | 272 | } | |
266 | 273 | else throw("Strict value is not equal to itself.") | |
267 | 274 | } | |
268 | 275 | else throw("Strict value is not equal to itself.") | |
269 | 276 | } | |
270 | 277 | ||
271 | 278 | ||
272 | 279 | ||
273 | 280 | @Callable(i) | |
274 | 281 | func addFreePerch (address,color) = { | |
275 | 282 | let locked = isLocked() | |
276 | 283 | if ((locked == locked)) | |
277 | 284 | then if ((0 > value(indexOf(["B", "R", "G", "Y"], color)))) | |
278 | 285 | then throw("you need to set color properly") | |
279 | 286 | else if (if (if ((i.caller != getRebirthAddress())) | |
280 | 287 | then (i.caller != this) | |
281 | 288 | else false) | |
282 | 289 | then (i.caller != getSwopPromoAddress()) | |
283 | 290 | else false) | |
284 | 291 | then throw("rebirth and swop promo only") | |
285 | 292 | else { | |
286 | 293 | let perchAmountKey = ((("address_" + address) + "_perchesAvailable_") + color) | |
287 | 294 | let perchAmount = tryGetInteger(perchAmountKey) | |
288 | 295 | $Tuple2([IntegerEntry(perchAmountKey, (perchAmount + 1))], "") | |
289 | 296 | } | |
290 | 297 | else throw("Strict value is not equal to itself.") | |
291 | 298 | } | |
292 | 299 | ||
293 | 300 | ||
294 | 301 | ||
295 | 302 | @Callable(i) | |
296 | 303 | func stakeNFT () = { | |
297 | 304 | let locked = isLocked() | |
298 | 305 | if ((locked == locked)) | |
299 | 306 | then { | |
300 | 307 | let pmt = value(i.payments[0]) | |
301 | 308 | let assetId = value(value(i.payments[0]).assetId) | |
302 | 309 | let realCaller = toString(i.caller) | |
303 | - | let address = if (if ((getMetaraceAddress() == i.caller)) | |
304 | - | then true | |
305 | - | else (getDuckWrapperSc() == i.caller)) | |
306 | - | then realCaller | |
307 | - | else toString(i.originCaller) | |
310 | + | let address = if (isTrustedSc(toString(i.caller))) | |
311 | + | then toString(i.originCaller) | |
312 | + | else realCaller | |
308 | 313 | let color = takeRight(value(assetInfo(assetId)).name, 1) | |
309 | 314 | let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) | |
310 | 315 | if ((pmt.amount != 1)) | |
311 | 316 | then throw("NFT is not attached") | |
312 | 317 | else if ((0 >= availablePerches)) | |
313 | 318 | then throw(("no perches available for the color " + color)) | |
314 | 319 | else { | |
315 | - | let $ | |
316 | - | let assetGen = $ | |
317 | - | let assetFarmingPower = $ | |
320 | + | let $t01112911202 = getAssetFarmingPower(assetId, address) | |
321 | + | let assetGen = $t01112911202._1 | |
322 | + | let assetFarmingPower = $t01112911202._2 | |
318 | 323 | (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1))]) | |
319 | 324 | } | |
320 | 325 | } | |
321 | 326 | else throw("Strict value is not equal to itself.") | |
322 | 327 | } | |
323 | 328 | ||
324 | 329 | ||
325 | 330 | ||
326 | 331 | @Callable(i) | |
327 | 332 | func stakeNFTWithoutPerch () = { | |
328 | 333 | let locked = isLocked() | |
329 | 334 | if ((locked == locked)) | |
330 | 335 | then { | |
331 | - | let allowedContracts = getTrustedContracts() | |
332 | - | let allowedContractsList = split(allowedContracts, ";") | |
333 | 336 | let dappToCall = toString(i.caller) | |
334 | - | if (( | |
335 | - | then throw("Only trusted smart contracts can stake without a perch!") | |
337 | + | if (isTrustedSc(dappToCall)) | |
338 | + | then throw("FSNWP: Only trusted smart contracts can stake without a perch!") | |
336 | 339 | else { | |
337 | 340 | let pmt = value(i.payments[0]) | |
338 | 341 | let assetId = value(value(i.payments[0]).assetId) | |
339 | 342 | let address = toString(i.originCaller) | |
340 | 343 | if ((pmt.amount != 1)) | |
341 | 344 | then throw("NFT is not attached") | |
342 | 345 | else { | |
343 | - | let $ | |
344 | - | let assetGen = $ | |
345 | - | let assetFarmingPower = $ | |
346 | + | let $t01182011893 = getAssetFarmingPower(assetId, address) | |
347 | + | let assetGen = $t01182011893._1 | |
348 | + | let assetFarmingPower = $t01182011893._2 | |
346 | 349 | let asset = toBase58String(assetId) | |
347 | 350 | let realCaller = toString(i.caller) | |
348 | 351 | (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)]) | |
349 | 352 | } | |
350 | 353 | } | |
351 | 354 | } | |
352 | 355 | else throw("Strict value is not equal to itself.") | |
353 | 356 | } | |
354 | 357 | ||
355 | 358 | ||
356 | 359 | ||
357 | 360 | @Callable(i) | |
358 | 361 | func unstakeNFT (asset) = { | |
359 | 362 | let locked = isLocked() | |
360 | 363 | if ((locked == locked)) | |
361 | 364 | then { | |
362 | 365 | let add = toString(i.originCaller) | |
363 | 366 | if (isUserBlacklisted(add)) | |
364 | - | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
367 | + | then throw("FUN: Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
365 | 368 | else { | |
366 | 369 | let assetId = fromBase58String(asset) | |
367 | 370 | let unstaker = tryGetString((((("address_" + add) + "_asset_") + asset) + "_unstaker")) | |
368 | - | let address = if (if ((getMetaraceAddress() == i.caller)) | |
369 | - | then true | |
370 | - | else (getDuckWrapperSc() == i.caller)) | |
371 | - | then toString(i.caller) | |
372 | - | else add | |
371 | + | let address = if (isTrustedSc(toString(i.caller))) | |
372 | + | then add | |
373 | + | else toString(i.caller) | |
373 | 374 | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
374 | 375 | let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower) | |
375 | 376 | let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"))) | |
376 | 377 | let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) | |
377 | 378 | let reward = ((farmedAmount - withdrawnAmount) / (scale * 100)) | |
378 | 379 | let color = takeRight(value(assetInfo(assetId)).name, 1) | |
379 | 380 | let realCaller = toString(i.caller) | |
380 | 381 | if (if ((unstaker != "")) | |
381 | 382 | then (unstaker != realCaller) | |
382 | 383 | else false) | |
383 | - | then throw("It seems duck was staked throuh a dapp, not directly, please unstake through dapp!") | |
384 | + | then throw("FUN: It seems duck was staked throuh a dapp, not directly, please unstake through dapp!") | |
384 | 385 | else if ((0 >= assetFarmingPower)) | |
385 | - | then throw("asset not available") | |
386 | + | then throw("FUN: asset not available") | |
386 | 387 | else { | |
387 | 388 | let isWithoutPerch = tryGetBoolean((((("address_" + address) + "_asset_") + asset) + "_without_perch")) | |
388 | 389 | if ((color == "U")) | |
389 | - | then throw("use another function to unstake Jackpot NFT") | |
390 | + | then throw("FUN: use another function to unstake Jackpot NFT") | |
390 | 391 | else { | |
391 | 392 | let result = getUnstakeResult(address, assetId, assetRewardDelta, reward, assetFarmingPower) | |
392 | 393 | let appendPerches = if (isWithoutPerch) | |
393 | 394 | then [DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"))] | |
394 | 395 | else [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) + 1))] | |
395 | 396 | $Tuple2(((result ++ [ScriptTransfer(i.caller, (reward * 1000000), getEggAssetId()), ScriptTransfer(i.caller, 1, assetId)]) ++ appendPerches), (reward * 1000000)) | |
396 | 397 | } | |
397 | 398 | } | |
398 | 399 | } | |
399 | 400 | } | |
400 | 401 | else throw("Strict value is not equal to itself.") | |
401 | 402 | } | |
402 | 403 | ||
403 | 404 | ||
404 | 405 | ||
405 | 406 | @Callable(i) | |
406 | 407 | func stakeJackpot (color) = { | |
407 | 408 | let locked = isLocked() | |
408 | 409 | if ((locked == locked)) | |
409 | 410 | then { | |
410 | 411 | let pmt = value(i.payments[0]) | |
411 | 412 | let assetId = value(pmt.assetId) | |
412 | 413 | let realCaller = toString(i.caller) | |
413 | - | let address = if (if ((getMetaraceAddress() == i.caller)) | |
414 | - | then true | |
415 | - | else (getDuckWrapperSc() == i.caller)) | |
416 | - | then realCaller | |
417 | - | else toString(i.originCaller) | |
414 | + | let address = if (isTrustedSc(toString(i.caller))) | |
415 | + | then toString(i.originCaller) | |
416 | + | else realCaller | |
418 | 417 | let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) | |
419 | 418 | let assetIssuer = value(assetInfo(assetId)).issuer | |
420 | 419 | if ((pmt.amount != 1)) | |
421 | 420 | then throw("NFT is not attached") | |
422 | 421 | else if (if ((assetIssuer == getIncubatorAddress())) | |
423 | 422 | then true | |
424 | 423 | else (assetIssuer == getBreederAddress())) | |
425 | 424 | then if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U")) | |
426 | 425 | then throw("jackpot only") | |
427 | 426 | else if ((0 >= availablePerches)) | |
428 | - | then throw(("no perches available for the color " + color)) | |
427 | + | then throw(("FSJ: no perches available for the color " + color)) | |
429 | 428 | else { | |
430 | 429 | let farmingPower = getAssetFarmingPower(assetId, address) | |
431 | 430 | (getStakeResult(address, assetId, farmingPower._2, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((((("address_" + address) + "_asset_") + toBase58String(assetId)) + "_perchColor"), color)]) | |
432 | 431 | } | |
433 | 432 | else throw("asset is not valid") | |
434 | 433 | } | |
435 | 434 | else throw("Strict value is not equal to itself.") | |
436 | 435 | } | |
437 | 436 | ||
438 | 437 | ||
439 | 438 | ||
440 | 439 | @Callable(i) | |
441 | 440 | func unstakeJackpot (asset) = { | |
442 | 441 | let locked = isLocked() | |
443 | 442 | if ((locked == locked)) | |
444 | 443 | then { | |
445 | 444 | let realCaller = toString(i.caller) | |
446 | - | let address = if (if ((getMetaraceAddress() == i.caller)) | |
447 | - | then true | |
448 | - | else (getDuckWrapperSc() == i.caller)) | |
449 | - | then realCaller | |
450 | - | else toString(i.originCaller) | |
445 | + | let address = if (isTrustedSc(toString(i.caller))) | |
446 | + | then toString(i.originCaller) | |
447 | + | else realCaller | |
451 | 448 | if (isUserBlacklisted(address)) | |
452 | - | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
449 | + | then throw("FUJ: Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
453 | 450 | else { | |
454 | 451 | let assetId = fromBase58String(asset) | |
455 | 452 | let color = tryGetString((((("address_" + address) + "_asset_") + asset) + "_perchColor")) | |
456 | 453 | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
457 | 454 | let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower) | |
458 | 455 | let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"))) | |
459 | 456 | let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) | |
460 | 457 | let reward = ((farmedAmount - withdrawnAmount) / (scale * 100)) | |
461 | 458 | let unstaker = tryGetString((((("address_" + address) + "_asset_") + asset) + "_unstaker")) | |
462 | 459 | if (if ((unstaker != "")) | |
463 | 460 | then (unstaker != realCaller) | |
464 | 461 | else false) | |
465 | - | then throw("It seems duck was staked throuh a dapp, not directly, please unstake through dapp!") | |
462 | + | then throw("FUJ: It seems duck was staked throuh a dapp, not directly, please unstake through dapp!") | |
466 | 463 | else if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U")) | |
467 | 464 | then throw("jackpot only") | |
468 | 465 | else if ((assetFarmingPower > 0)) | |
469 | 466 | then { | |
470 | 467 | let result = getUnstakeResult(address, assetId, assetRewardDelta, reward, assetFarmingPower) | |
471 | 468 | let isWithoutPerch = tryGetBoolean((((("address_" + address) + "_asset_") + asset) + "_without_perch")) | |
472 | 469 | let appendPerches = if (isWithoutPerch) | |
473 | 470 | then [DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"))] | |
474 | 471 | else [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) + 1))] | |
475 | 472 | $Tuple2(((result ++ appendPerches) ++ [ScriptTransfer(i.caller, (reward * 1000000), getEggAssetId()), ScriptTransfer(i.caller, 1, assetId)]), (reward * 1000000)) | |
476 | 473 | } | |
477 | - | else throw("Asset farming power not bigger then 0") | |
474 | + | else throw("FUJ: Asset farming power not bigger then 0") | |
478 | 475 | } | |
479 | 476 | } | |
480 | 477 | else throw("Strict value is not equal to itself.") | |
481 | 478 | } | |
482 | 479 | ||
483 | 480 | ||
484 | 481 | ||
485 | 482 | @Callable(i) | |
486 | 483 | func claimReward (asset) = { | |
487 | 484 | let locked = isLocked() | |
488 | 485 | if ((locked == locked)) | |
489 | 486 | then { | |
490 | 487 | let address = if ((i.originCaller == getCfMasterAddress())) | |
491 | 488 | then toString(i.caller) | |
492 | 489 | else toString(i.originCaller) | |
493 | 490 | if (isUserBlacklisted(address)) | |
494 | - | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
491 | + | then throw("FCR: Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
495 | 492 | else { | |
496 | 493 | let assetId = fromBase58String(asset) | |
497 | 494 | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
498 | 495 | let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower) | |
499 | 496 | let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"))) | |
500 | 497 | let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) | |
501 | 498 | let reward = ((farmedAmount - withdrawnAmount) / (scale * 100)) | |
502 | 499 | if ((0 >= reward)) | |
503 | - | then throw("you have no EGGs to withdraw") | |
500 | + | then throw("FCR: you have no EGGs to withdraw") | |
504 | 501 | else $Tuple2([IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) + (reward * scale2))), ScriptTransfer(Address(fromBase58String(address)), (reward * 1000000), getEggAssetId())], (reward * 1000000)) | |
505 | 502 | } | |
506 | 503 | } | |
507 | 504 | else throw("Strict value is not equal to itself.") | |
508 | 505 | } | |
509 | 506 | ||
510 | 507 |
github/deemru/w8io/3ef1775 82.22 ms ◑