tx · HDoVXExPvAmYpm3krZRECdhHF2oVuPvvGHFDCPnDGvqu 3MztEGxPimSg5sunfGXqcQ4E8XyfCUdFuR4: -0.01000000 Waves 2020.09.10 10:13 [1170895] smart account 3MztEGxPimSg5sunfGXqcQ4E8XyfCUdFuR4 > SELF 0.00000000 Waves
{ "type": 13, "id": "HDoVXExPvAmYpm3krZRECdhHF2oVuPvvGHFDCPnDGvqu", "fee": 1000000, "feeAssetId": null, "timestamp": 1599721984720, "version": 1, "sender": "3MztEGxPimSg5sunfGXqcQ4E8XyfCUdFuR4", "senderPublicKey": "HsPwhJfQ8X8geAdxMReSS5zWVoAfAPMhGKfMcpoV8eP4", "proofs": [ "63z8Tq6uTuy7m6QRhpxmb7QQatGvNF3q6YNMYBVXriK1UzwFVCacbfs4Ah4CcfAuB1d9YWpsNAhE3SJ2Bb8kMfJa" ], "script": "base64:AAIEAAAAAAAAAA0IAhIAEgASBQoDCAEBAAAASAEAAAAOa2V5VWNvbGxhdGVyYWwAAAAAAgAAAAt1Y29sbGF0ZXJhbAEAAAAbZ2VuZXJhdGVLZXlBc3NldExvY2tlZFRvdGFsAAAAAQAAAAdhc3NldElkCQABLAAAAAICAAAAFGFzc2V0X2xvY2tlZF90b3RhbF9fBQAAAAdhc3NldElkAQAAABNrZXlBY2NvdW50T3BlcmF0aW9uAAAAAwAAAAx1bmxvY2tIZWlnaHQAAAAHYWRkcmVzcwAAAAZzdGF0dXMJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABJkZWZvQXNzZXRfbG9ja2VkX18FAAAAB2FkZHJlc3MCAAAAAl9fCQABpAAAAAEFAAAADHVubG9ja0hlaWdodAIAAAACX18FAAAABnN0YXR1cwAAAAAUSWR4T3BlcmF0aW9uQW1vdW50SW4AAAAAAAAAAAAAAAAAE0lkeE9wZXJhdGlvbkFzc2V0SW4AAAAAAAAAAAEAAAAAEUlkeE9wZXJhdGlvblByaWNlAAAAAAAAAAACAAAAABVJZHhPcGVyYXRpb25BbW91bnRPdXQAAAAAAAAAAAMAAAAAFElkeE9wZXJhdGlvbkFzc2V0T3V0AAAAAAAAAAAEAQAAABRkYXRhQWNjb3VudE9wZXJhdGlvbgAAAAUAAAAIYW1vdW50SW4AAAAHYXNzZXRJbgAAAAVwcmljZQAAAAlhbW91bnRPdXQAAAAIYXNzZXRPdXQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABpAAAAAEFAAAACGFtb3VudEluAgAAAAJfXwUAAAAHYXNzZXRJbgIAAAACX18JAAGkAAAAAQUAAAAFcHJpY2UCAAAAAl9fCQABpAAAAAEFAAAACWFtb3VudE91dAIAAAACX18FAAAACGFzc2V0T3V0AQAAACNyZWFkQWNjb3VudE9wZXJhdGlvbkRhdGFBcnJheU9yRmFpbAAAAAEAAAAPYWNjT3BlcmF0aW9uS2V5BAAAABNhY2NPcGVyYXRpb25EYXRhU3RyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAPYWNjT3BlcmF0aW9uS2V5CQABLAAAAAICAAAAKlRoZXJlIGlzIG5vIHJlcXVlc3QgZm9yIHBhc3NlZCBhcmd1bWVudHM6IAUAAAAPYWNjT3BlcmF0aW9uS2V5CQAEtQAAAAIFAAAAE2FjY09wZXJhdGlvbkRhdGFTdHICAAAAAl9fAAAAAAdudWxsSW50AP//////////AAAAAAdudWxsU3RyAgAAAAROVUxMAAAAAApmYWN0b3J5QWNjCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzAgAAAAdmYWN0b3J5AQAAABpnZXRBc3NldEFkZHJlc3NCeVN5bWJvbEtleQAAAAEAAAALYXNzZXRTeW1ib2wJAAEsAAAAAgkAASwAAAACAgAAAAZhc3NldF8FAAAAC2Fzc2V0U3ltYm9sAgAAAAhfYWRkcmVzcwEAAAARZ2V0QXNzZXRTeW1ib2xLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAABmFzc2V0XwUAAAAMYXNzZXRBZGRyZXNzAgAAAAdfc3ltYm9sAQAAAA9nZXRBc3NldE1ldGFLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAABmFzc2V0XwUAAAAMYXNzZXRBZGRyZXNzAgAAAAVfbWV0YQEAAAARZ2V0QXNzZXRTdGF0dXNLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAABmFzc2V0XwUAAAAMYXNzZXRBZGRyZXNzAgAAAAdfc3RhdHVzAQAAABVnZXRBc3NldEluaXRIZWlnaHRLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAABmFzc2V0XwUAAAAMYXNzZXRBZGRyZXNzAgAAAAxfaW5pdF9oZWlnaHQBAAAAGWdldEFzc2V0QWN0aXZhdGVIZWlnaHRLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAABmFzc2V0XwUAAAAMYXNzZXRBZGRyZXNzAgAAABBfYWN0aXZhdGVfaGVpZ2h0AQAAABJnZXRBc3NldEFkZHJlc3NLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAABmFzc2V0XwUAAAAMYXNzZXRBZGRyZXNzAgAAAAhfYWRkcmVzcwEAAAAgZ2V0QXNzZXRNaW5SZXF1aXJlZFBvb2xBbW91bnRLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAABmFzc2V0XwUAAAAMYXNzZXRBZGRyZXNzAgAAAAlfbWluX3Bvb2wBAAAAHWdldEFzc2V0Q3VycnJlbnRQb29sQW1vdW50S2V5AAAAAQAAAAxhc3NldEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAAAZhc3NldF8FAAAADGFzc2V0QWRkcmVzcwIAAAANX2N1cnJlbnRfcG9vbAEAAAAYZ2V0QXNzZXRNYXhQb29sQW1vdW50S2V5AAAAAQAAAAxhc3NldEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAAAZhc3NldF8FAAAADGFzc2V0QWRkcmVzcwIAAAAJX21heF9wb29sAQAAACJnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uQW1vdW50S2V5AAAAAgAAAAxhc3NldEFkZHJlc3MAAAAQcG9vbE1ha2VyQWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAVwb29sXwUAAAAMYXNzZXRBZGRyZXNzAgAAAAFfBQAAABBwb29sTWFrZXJBZGRyZXNzAgAAAAdfYW1vdW50AQAAACVnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uTWF4QW1vdW50S2V5AAAAAgAAAAxhc3NldEFkZHJlc3MAAAAQcG9vbE1ha2VyQWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAVwb29sXwUAAAAMYXNzZXRBZGRyZXNzAgAAAAFfBQAAABBwb29sTWFrZXJBZGRyZXNzAgAAAAptYXhfYW1vdW50AAAAABBJZHhEZWZvQXNzZXRDb2RlAAAAAAAAAAAAAAAAAA5JZHhEZWZvQXNzZXRJZAAAAAAAAAAAAQAAAAASSWR4RGVmb0Fzc2V0U3RhdHVzAAAAAAAAAAACAAAAABZJZHhEZWZvQXNzZXRJbml0SGVpZ2h0AAAAAAAAAAADAAAAABpJZHhEZWZvQXNzZXRBY3RpdmF0ZUhlaWdodAAAAAAAAAAABAAAAAAQSWR4QnV5RmVlUGVyY2VudAAAAAAAAAAABQAAAAARSWR4U2VsbEZlZVBlcmNlbnQAAAAAAAAAAAYAAAAACklkeE1pblBvb2wAAAAAAAAAAAcAAAAADklkeEN1cnJlbnRQb29sAAAAAAAAAAAIAAAAAApJZHhNYXhQb29sAAAAAAAAAAAJAAAAABhJZHhPdmVyQ29sbGF0ZXJhbFBlcmNlbnQAAAAAAAAAAAoAAAAAEElkeFByaWNlRGVjaW1hbHMAAAAAAAAAAAsAAAAADklkeEJhc2VBc3NldElkAAAAAAAAAAAMAAAAABBJZHhNaW5CdXlQYXltZW50AAAAAAAAAAANAAAAABFJZHhNaW5TZWxsUGF5bWVudAAAAAAAAAAADgAAAAASSWR4QnV5TG9ja0ludGVydmFsAAAAAAAAAAAPAAAAABNJZHhTZWxsTG9ja0ludGVydmFsAAAAAAAAAAAQAAAAABVJZHhQcmljZU9yYWNsZUFkZHJlc3MAAAAAAAAAABEAAAAAEXN0YWtpbmdBZGRyZXNzU3RyCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAApmYWN0b3J5QWNjAgAAABBuZXV0cmlub19zdGFraW5nAAAAAA5zdGFraW5nQWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAARc3Rha2luZ0FkZHJlc3NTdHIAAAAAA2NmZwkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAKZmFjdG9yeUFjYwkAASwAAAACAgAAAApkZWZvQXNzZXRfCQAEJQAAAAEFAAAABHRoaXMAAAAACGNmZ0FycmF5CQAEtQAAAAIFAAAAA2NmZwIAAAACX18AAAAADWRlZm9Bc3NldENvZGUJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAEElkeERlZm9Bc3NldENvZGUAAAAAC2RlZm9Bc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAADklkeERlZm9Bc3NldElkAAAAABJwcmljZU9yYWNsZUFkZHJlc3MJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAFUlkeFByaWNlT3JhY2xlQWRkcmVzcwAAAAAVb3ZlckNvbGxhdGVyYWxQZXJjZW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAGElkeE92ZXJDb2xsYXRlcmFsUGVyY2VudAAAAAAOYmFzZUFzc2V0SWRTdHIJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAADklkeEJhc2VBc3NldElkAAAAAAtiYXNlQXNzZXRJZAkAAlkAAAABBQAAAA5iYXNlQXNzZXRJZFN0cgAAAAANcHJpY2VEZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABBJZHhQcmljZURlY2ltYWxzAAAAABFtaW5CYXNpY0J1eUFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABBJZHhNaW5CdXlQYXltZW50AAAAABJtaW5TeW50aFNlbGxBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAARSWR4TWluU2VsbFBheW1lbnQAAAAAD2J1eUxvY2tJbnRlcnZhbAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABJJZHhCdXlMb2NrSW50ZXJ2YWwAAAAAEHNlbGxMb2NrSW50ZXJ2YWwJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAATSWR4U2VsbExvY2tJbnRlcnZhbAEAAAAbY29udHJvbEFjY1JlYWRDdXJySWR4T3JGYWlsAAAAAAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwIAAAAHY3VycklkeAkAASwAAAACAgAAABlObyBjdXJySWR4IGF0IGNvbnRyb2xBY2M9CQAEJQAAAAEFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwEAAAAXY29udHJvbEFjY1JlYWRJZHhIZWlnaHQAAAABAAAAA2lkeAQAAAAMaWR4SGVpZ2h0S2V5CQABLAAAAAICAAAACmlkeEhlaWdodF8JAAGkAAAAAQUAAAADaWR4CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwUAAAAMaWR4SGVpZ2h0S2V5AAAAAAAAAAAAAQAAABtjb250cm9sQWNjUmVhZFByaWNlQnlIZWlnaHQAAAABAAAAC3ByaWNlSGVpZ2h0BAAAABBwcmljZUJ5SGVpZ2h0S2V5CQABLAAAAAICAAAABnByaWNlXwkAAaQAAAABBQAAAAtwcmljZUhlaWdodAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwUAAAAQcHJpY2VCeUhlaWdodEtleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAADTm8gBQAAABBwcmljZUJ5SGVpZ2h0S2V5AgAAAA8gYXQgY29udHJvbEFjYz0JAAQlAAAAAQUAAAAScHJpY2VPcmFjbGVBZGRyZXNzAQAAABFnZXRTdGFraW5nQmFsYW5jZQAAAAAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMcnBkX2JhbGFuY2VfBQAAAA5iYXNlQXNzZXRJZFN0cgIAAAABXwkABCUAAAABBQAAAAR0aGlzAAAAAAAAAAAAAAAAAAt1Y29sbGF0ZXJhbAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAOa2V5VWNvbGxhdGVyYWwAAAAAAAAAAAAAAAAAAAAAAA5jdXJyUG9vbEFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAAA5JZHhDdXJyZW50UG9vbAAAAAAXZG91YmxlQ2hlY2tCYXNpY0JhbGFuY2UJAABkAAAAAgkAA/AAAAACBQAAAAR0aGlzBQAAAAtiYXNlQXNzZXRJZAkBAAAAEWdldFN0YWtpbmdCYWxhbmNlAAAAAAAAAAAWZG91YmxlQ2hlY2tVY29sbGF0ZXJhbAMJAABmAAAAAgAAAAAAAAAAAAUAAAALdWNvbGxhdGVyYWwAAAAAAAAAAAAFAAAAC3Vjb2xsYXRlcmFsAAAAABlkb3VibGVDaGVja0N1cnJQb29sQW1vdW50CQAAZQAAAAIFAAAAF2RvdWJsZUNoZWNrQmFzaWNCYWxhbmNlBQAAABZkb3VibGVDaGVja1Vjb2xsYXRlcmFsAAAAAAVwcmljZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAScHJpY2VPcmFjbGVBZGRyZXNzCQABLAAAAAICAAAABnByaWNlXwUAAAANZGVmb0Fzc2V0Q29kZQAAAAAJb3ZlclByaWNlCQAAaQAAAAIJAABoAAAAAgkAAGQAAAACBQAAAA1wcmljZURlY2ltYWxzBQAAABVvdmVyQ29sbGF0ZXJhbFBlcmNlbnQFAAAABXByaWNlBQAAAA1wcmljZURlY2ltYWxzAAAAAAhlbWlzc2lvbggJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQUAAAALZGVmb0Fzc2V0SWQAAAAIcXVhbnRpdHkAAAAAE2Jhc2ljQXNzZXRMb2NrZWRBbXQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAG2dlbmVyYXRlS2V5QXNzZXRMb2NrZWRUb3RhbAAAAAEFAAAADmJhc2VBc3NldElkU3RyAAAAAAAAAAAAAAAAABRhdmFpbGFibGVQb29sQmFsYW5jZQkAAGUAAAACBQAAAA5jdXJyUG9vbEFtb3VudAUAAAATYmFzaWNBc3NldExvY2tlZEFtdAAAAAMAAAABaQEAAAAIYnV5QXNzZXQAAAAAAwkBAAAAAiE9AAAAAgUAAAAOY3VyclBvb2xBbW91bnQFAAAAGWRvdWJsZUNoZWNrQ3VyclBvb2xBbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAA0SW52YWxpZCBjdXJyUG9vbEFtb3VudCBjYWxjdWxhdGlvbnM6IGN1cnJQb29sQW1vdW50PQkAAaQAAAABBQAAAA5jdXJyUG9vbEFtb3VudAIAAAAbIGRvdWJsZUNoZWNrQ3VyclBvb2xBbW91bnQ9CQABpAAAAAEFAAAAGWRvdWJsZUNoZWNrQ3VyclBvb2xBbW91bnQEAAAAA3BtdAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAIcG10QXNzZXQJAQAAAAV2YWx1ZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAQAAAAYYXZhaWxhYmxlRGVmb0Fzc2V0SW5Qb29sCQAAZQAAAAIJAABrAAAAAwUAAAAUYXZhaWxhYmxlUG9vbEJhbGFuY2UFAAAADXByaWNlRGVjaW1hbHMFAAAACW92ZXJQcmljZQUAAAAIZW1pc3Npb24EAAAAE2Z1bGxEZWZvQXNzZXRBbW91bnQJAABrAAAAAwgFAAAAA3BtdAAAAAZhbW91bnQFAAAADXByaWNlRGVjaW1hbHMFAAAABXByaWNlBAAAAA9kZWZvQXNzZXRBbW91bnQDCQAAZgAAAAIFAAAAE2Z1bGxEZWZvQXNzZXRBbW91bnQFAAAAGGF2YWlsYWJsZURlZm9Bc3NldEluUG9vbAkAAGUAAAACBQAAABNmdWxsRGVmb0Fzc2V0QW1vdW50BQAAABhhdmFpbGFibGVEZWZvQXNzZXRJblBvb2wFAAAAE2Z1bGxEZWZvQXNzZXRBbW91bnQEAAAAGHJlcXVpcmVkQmFzaWNBc3NldEFtb3VudAkAAGsAAAADBQAAAA9kZWZvQXNzZXRBbW91bnQFAAAABXByaWNlBQAAAA1wcmljZURlY2ltYWxzBAAAAAZjaGFuZ2UJAABlAAAAAggFAAAAA3BtdAAAAAZhbW91bnQFAAAAGHJlcXVpcmVkQmFzaWNBc3NldEFtb3VudAMJAABnAAAAAgAAAAAAAAAAAAUAAAAYYXZhaWxhYmxlRGVmb0Fzc2V0SW5Qb29sCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABhJbXBvc3NpYmxlIHRvIGlzc3VlIG5ldyAFAAAADWRlZm9Bc3NldENvZGUCAAAAFzogbm90IGVub3VnaCBjb2xsYXRlcmFsAwkBAAAAAiE9AAAAAgUAAAAIcG10QXNzZXQFAAAAC2Jhc2VBc3NldElkCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAANVBheW1lbnQgYXNzZXQgaWQgZG9lc24ndCBtYXRjaCBiYXNpYyBhc3NldDogZXhwZWN0ZWQ9CQACWAAAAAEFAAAA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ZXRMb2NrZWRUb3RhbAkAAGQAAAACBQAAABRjdXJyQXNzZXRUb3RhbExvY2tlZAgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAOa2V5QWNjb3VudExvY2sJAQAAABRkYXRhQWNjb3VudE9wZXJhdGlvbgAAAAUIBQAAAANwbXQAAAAGYW1vdW50CQACWAAAAAEFAAAAC2RlZm9Bc3NldElkBQAAAAdudWxsSW50BQAAAAdudWxsSW50CQACWAAAAAEFAAAAC2Jhc2VBc3NldElkBQAAAANuaWwAAAABaQEAAAAId2l0aGRyYXcAAAADAAAADmFjY291bnRBZGRyZXNzAAAADHVubG9ja0hlaWdodAAAAANpZHgEAAAAD2FjY09wZXJhdGlvbktleQkBAAAAE2tleUFjY291bnRPcGVyYXRpb24AAAADBQAAAAx1bmxvY2tIZWlnaHQFAAAADmFjY291bnRBZGRyZXNzAgAAAAdQRU5ESU5HBAAAABVhY2NPcGVyYXRpb25EYXRhQXJyYXkJAQAAACNyZWFkQWNjb3VudE9wZXJhdGlvbkRhdGFBcnJheU9yRmFpbAAAAAEFAAAAD2FjY09wZXJhdGlvbktleQQAAAAIYW1vdW50SW4JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABVhY2NPcGVyYXRpb25EYXRhQXJyYXkFAAAAFElkeE9wZXJhdGlvbkFtb3VudEluBAAAAAdhc3NldEluCQABkQAAAAIFAAAAFWFjY09wZXJhdGlvbkRhdGFBcnJheQUAAAATSWR4T3BlcmF0aW9uQXNzZXRJbgQAAAAIYXNzZXRPdXQJAAGRAAAAAgUAAAAVYWNjT3BlcmF0aW9uRGF0YUFycmF5BQAAABRJZHhPcGVyYXRpb25Bc3NldE91dAMJAABmAAAAAgUAAAAMdW5sb2NrSGVpZ2h0BQAAAAZoZWlnaHQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAADFBsZWFzZSB3YWl0IAkAAaQAAAABBQAAAAx1bmxvY2tIZWlnaHQCAAAAFyB0byB3aXRoZHJhdyB5b3VyIGZ1bmRzBAAAABBhY2NvdW50TG9ja2VkQW10BQAAAAhhbW91bnRJbgMJAABnAAAAAgAAAAAAAAAAAAUAAAAQYWNjb3VudExvY2tlZEFtdAkAAAIAAAABAgAAABFMb2NrZWRBbW91bnQgPD0gMAQAAAATa2V5QXNzZXRMb2NrZWRUb3RhbAkBAAAAG2dlbmVyYXRlS2V5QXNzZXRMb2NrZWRUb3RhbAAAAAEJAAGRAAAAAgUAAAAVYWNjT3BlcmF0aW9uRGF0YUFycmF5BQAAABNJZHhPcGVyYXRpb25Bc3NldEluBAAAABRjdXJyQXNzZXRMb2NrZWRUb3RhbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAE2tleUFzc2V0TG9ja2VkVG90YWwJAAEsAAAAAgkAASwAAAACAgAAACBTdGF0ZSBjb250YWlucyBzZWxsQXNzZXRSZXF1ZXN0PQUAAAAPYWNjT3BlcmF0aW9uS2V5AgAAABMgQlVUIG5vIHRvdGFsTG9ja2VkBAAAAAlpZHhIZWlnaHQJAQAAABdjb250cm9sQWNjUmVhZElkeEhlaWdodAAAAAEFAAAAA2lkeAQAAAANcHJldklkeEhlaWdodAkBAAAAF2NvbnRyb2xBY2NSZWFkSWR4SGVpZ2h0AAAAAQkAAGUAAAACBQAAAANpZHgAAAAAAAAAAAEEAAAAB2N1cnJJZHgJAQAAABtjb250cm9sQWNjUmVhZEN1cnJJZHhPckZhaWwAAAAAAwMDCQAAZgAAAAIFAAAAA2lkeAUAAAAHY3VycklkeAYJAABmAAAAAgUAAAAMdW5sb2NrSGVpZ2h0BQAAAAlpZHhIZWlnaHQGAwkBAAAAAiE9AAAAAgUAAAANcHJldklkeEhlaWdodAAAAAAAAAAAAAkAAGcAAAACBQAAAA1wcmV2SWR4SGVpZ2h0BQAAAAx1bmxvY2tIZWlnaHQHCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAF2ludmFsaWQgcHJpY2UgaWR4OiBpZHg9CQABpAAAAAEFAAAAA2lkeAIAAAAJIGN1cnJJZHg9CQABpAAAAAEFAAAAB2N1cnJJZHgCAAAACyBpZHhIZWlnaHQ9CQABpAAAAAEFAAAACWlkeEhlaWdodAIAAAAOIHVubG9ja0hlaWdodD0JAAGkAAAAAQUAAAAMdW5sb2NrSGVpZ2h0AgAAAA8gcHJldklkeEhlaWdodD0JAAGkAAAAAQUAAAANcHJldklkeEhlaWdodAQAAAAQc3ludGgyYmFzaWNQcmljZQkBAAAAG2NvbnRyb2xBY2NSZWFkUHJpY2VCeUhlaWdodAAAAAEFAAAACWlkeEhlaWdodAQAAAAMYXNzZXRJbkJ5dGVzCQACWQAAAAEFAAAAB2Fzc2V0SW4EAAAADSR0MDEwOTU0MTE4MjQDCQAAAAAAAAIFAAAADGFzc2V0SW5CeXRlcwUAAAALYmFzZUFzc2V0SWQEAAAACHN5bnRoQW10CQAAawAAAAMFAAAACGFtb3VudEluBQAAAA1wcmljZURlY2ltYWxzBQAAABBzeW50aDJiYXNpY1ByaWNlCQAFFgAAAAQFAAAACHN5bnRoQW10CQEAAAAHUmVpc3N1ZQAAAAMFAAAAC2RlZm9Bc3NldElkBQAAAAhzeW50aEFtdAYJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAADmFjY291bnRBZGRyZXNzBQAAAAhzeW50aEFtdAUAAAALZGVmb0Fzc2V0SWQJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOa2V5VWNvbGxhdGVyYWwAAAAACQAAZAAAAAIFAAAAC3Vjb2xsYXRlcmFsBQAAAAhhbW91bnRJbgMJAAAAAAAAAgUAAAAMYXNzZXRJbkJ5dGVzBQAAAAtkZWZvQXNzZXRJZAQAAAAIYmFzaWNBbXQJAABrAAAAAwUAAAAIYW1vdW50SW4FAAAAEHN5bnRoMmJhc2ljUHJpY2UFAAAADXByaWNlRGVjaW1hbHMEAAAADm5ld1Vjb2xsYXRlcmFsCQAAZQAAAAIFAAAAC3Vjb2xsYXRlcmFsBQAAAAhiYXNpY0FtdAkABRYAAAAEBQAAAAhiYXNpY0FtdAkBAAAABEJ1cm4AAAACBQAAAAtiYXNlQXNzZXRJZAUAAAAIYmFzaWNBbXQJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAADmFjY291bnRBZGRyZXNzBQAAAAhiYXNpY0FtdAUAAAALYmFzZUFzc2V0SWQJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOa2V5VWNvbGxhdGVyYWwAAAAACQAAZQAAAAIFAAAAC3Vjb2xsYXRlcmFsBQAAAAhiYXNpY0FtdAkAAAIAAAABCQABLAAAAAICAAAAFFVuc3VwcG9ydGVkIGFzc2V0SW49BQAAAAdhc3NldEluBAAAAAlhbW91bnRPdXQIBQAAAA0kdDAxMDk1NDExODI0AAAAAl8xBAAAAAtidXJuT3JJc3N1ZQgFAAAADSR0MDEwOTU0MTE4MjQAAAACXzIEAAAAFHRyYW5zZmVyU3ludGhPckJhc2ljCAUAAAANJHQwMTA5NTQxMTgyNAAAAAJfMwQAAAAQdWNvbGxhdGVyYWxFbnRyeQgFAAAADSR0MDEwOTU0MTE4MjQAAAACXzQDCQAAZgAAAAIAAAAAAAAAAAAJAABlAAAAAgUAAAAUY3VyckFzc2V0TG9ja2VkVG90YWwFAAAAEGFjY291bnRMb2NrZWRBbXQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAFEludmFsaWQgZGF0YSBzdGF0ZTogBQAAABNrZXlBc3NldExvY2tlZFRvdGFsAgAAAAwgbGVzcyB0aGVuIDAJAARNAAAAAgkABE0AAAACCQAETQAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tleUFzc2V0TG9ja2VkVG90YWwJAABlAAAAAgUAAAAUY3VyckFzc2V0TG9ja2VkVG90YWwFAAAAEGFjY291bnRMb2NrZWRBbXQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAPYWNjT3BlcmF0aW9uS2V5CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABNrZXlBY2NvdW50T3BlcmF0aW9uAAAAAwUAAAAMdW5sb2NrSGVpZ2h0BQAAAA5hY2NvdW50QWRkcmVzcwIAAAAIRklOSVNIRUQJAQAAABRkYXRhQWNjb3VudE9wZXJhdGlvbgAAAAUFAAAACGFtb3VudEluBQAAAAdhc3NldEluBQAAABBzeW50aDJiYXNpY1ByaWNlBQAAAAlhbW91bnRPdXQFAAAACGFzc2V0T3V0BQAAAANuaWwFAAAAC2J1cm5Pcklzc3VlBQAAABR0cmFuc2ZlclN5bnRoT3JCYXNpYwUAAAAQdWNvbGxhdGVyYWxFbnRyeQAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5epDPvQ==", "chainId": 84, "height": 1170895, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 4 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | func keyUcollateral () = "ucollateral" | |
5 | + | ||
6 | + | ||
7 | + | func generateKeyAssetLockedTotal (assetId) = ("asset_locked_total__" + assetId) | |
8 | + | ||
9 | + | ||
10 | + | func keyAccountOperation (unlockHeight,address,status) = ((((("defoAsset_locked__" + address) + "__") + toString(unlockHeight)) + "__") + status) | |
11 | + | ||
12 | + | ||
13 | + | let IdxOperationAmountIn = 0 | |
14 | + | ||
15 | + | let IdxOperationAssetIn = 1 | |
16 | + | ||
17 | + | let IdxOperationPrice = 2 | |
18 | + | ||
19 | + | let IdxOperationAmountOut = 3 | |
20 | + | ||
21 | + | let IdxOperationAssetOut = 4 | |
22 | + | ||
23 | + | func dataAccountOperation (amountIn,assetIn,price,amountOut,assetOut) = ((((((((toString(amountIn) + "__") + assetIn) + "__") + toString(price)) + "__") + toString(amountOut)) + "__") + assetOut) | |
24 | + | ||
25 | + | ||
26 | + | func readAccountOperationDataArrayOrFail (accOperationKey) = { | |
27 | + | let accOperationDataStr = valueOrErrorMessage(getString(this, accOperationKey), ("There is no request for passed arguments: " + accOperationKey)) | |
28 | + | split(accOperationDataStr, "__") | |
29 | + | } | |
30 | + | ||
31 | + | ||
32 | + | let nullInt = -1 | |
33 | + | ||
34 | + | let nullStr = "NULL" | |
35 | + | ||
36 | + | let factoryAcc = addressFromStringValue(getStringValue(this, "factory")) | |
37 | + | ||
38 | + | func getAssetAddressBySymbolKey (assetSymbol) = (("asset_" + assetSymbol) + "_address") | |
39 | + | ||
40 | + | ||
41 | + | func getAssetSymbolKey (assetAddress) = (("asset_" + assetAddress) + "_symbol") | |
42 | + | ||
43 | + | ||
44 | + | func getAssetMetaKey (assetAddress) = (("asset_" + assetAddress) + "_meta") | |
45 | + | ||
46 | + | ||
47 | + | func getAssetStatusKey (assetAddress) = (("asset_" + assetAddress) + "_status") | |
48 | + | ||
49 | + | ||
50 | + | func getAssetInitHeightKey (assetAddress) = (("asset_" + assetAddress) + "_init_height") | |
51 | + | ||
52 | + | ||
53 | + | func getAssetActivateHeightKey (assetAddress) = (("asset_" + assetAddress) + "_activate_height") | |
54 | + | ||
55 | + | ||
56 | + | func getAssetAddressKey (assetAddress) = (("asset_" + assetAddress) + "_address") | |
57 | + | ||
58 | + | ||
59 | + | func getAssetMinRequiredPoolAmountKey (assetAddress) = (("asset_" + assetAddress) + "_min_pool") | |
60 | + | ||
61 | + | ||
62 | + | func getAssetCurrrentPoolAmountKey (assetAddress) = (("asset_" + assetAddress) + "_current_pool") | |
63 | + | ||
64 | + | ||
65 | + | func getAssetMaxPoolAmountKey (assetAddress) = (("asset_" + assetAddress) + "_max_pool") | |
66 | + | ||
67 | + | ||
68 | + | func getPoolMakerParticipationAmountKey (assetAddress,poolMakerAddress) = (((("pool_" + assetAddress) + "_") + poolMakerAddress) + "_amount") | |
69 | + | ||
70 | + | ||
71 | + | func getPoolMakerParticipationMaxAmountKey (assetAddress,poolMakerAddress) = (((("pool_" + assetAddress) + "_") + poolMakerAddress) + "max_amount") | |
72 | + | ||
73 | + | ||
74 | + | let IdxDefoAssetCode = 0 | |
75 | + | ||
76 | + | let IdxDefoAssetId = 1 | |
77 | + | ||
78 | + | let IdxDefoAssetStatus = 2 | |
79 | + | ||
80 | + | let IdxDefoAssetInitHeight = 3 | |
81 | + | ||
82 | + | let IdxDefoAssetActivateHeight = 4 | |
83 | + | ||
84 | + | let IdxBuyFeePercent = 5 | |
85 | + | ||
86 | + | let IdxSellFeePercent = 6 | |
87 | + | ||
88 | + | let IdxMinPool = 7 | |
89 | + | ||
90 | + | let IdxCurrentPool = 8 | |
91 | + | ||
92 | + | let IdxMaxPool = 9 | |
93 | + | ||
94 | + | let IdxOverCollateralPercent = 10 | |
95 | + | ||
96 | + | let IdxPriceDecimals = 11 | |
97 | + | ||
98 | + | let IdxBaseAssetId = 12 | |
99 | + | ||
100 | + | let IdxMinBuyPayment = 13 | |
101 | + | ||
102 | + | let IdxMinSellPayment = 14 | |
103 | + | ||
104 | + | let IdxBuyLockInterval = 15 | |
105 | + | ||
106 | + | let IdxSellLockInterval = 16 | |
107 | + | ||
108 | + | let IdxPriceOracleAddress = 17 | |
109 | + | ||
110 | + | let stakingAddressStr = getStringValue(factoryAcc, "neutrino_staking") | |
111 | + | ||
112 | + | let stakingAddress = addressFromStringValue(stakingAddressStr) | |
113 | + | ||
114 | + | let cfg = getStringValue(factoryAcc, ("defoAsset_" + toString(this))) | |
115 | + | ||
116 | + | let cfgArray = split(cfg, "__") | |
117 | + | ||
118 | + | let defoAssetCode = cfgArray[IdxDefoAssetCode] | |
119 | + | ||
120 | + | let defoAssetId = fromBase58String(cfgArray[IdxDefoAssetId]) | |
121 | + | ||
122 | + | let priceOracleAddress = addressFromStringValue(cfgArray[IdxPriceOracleAddress]) | |
123 | + | ||
124 | + | let overCollateralPercent = parseIntValue(cfgArray[IdxOverCollateralPercent]) | |
125 | + | ||
126 | + | let baseAssetIdStr = cfgArray[IdxBaseAssetId] | |
127 | + | ||
128 | + | let baseAssetId = fromBase58String(baseAssetIdStr) | |
129 | + | ||
130 | + | let priceDecimals = parseIntValue(cfgArray[IdxPriceDecimals]) | |
131 | + | ||
132 | + | let minBasicBuyAmount = parseIntValue(cfgArray[IdxMinBuyPayment]) | |
133 | + | ||
134 | + | let minSynthSellAmount = parseIntValue(cfgArray[IdxMinSellPayment]) | |
135 | + | ||
136 | + | let buyLockInterval = parseIntValue(cfgArray[IdxBuyLockInterval]) | |
137 | + | ||
138 | + | let sellLockInterval = parseIntValue(cfgArray[IdxSellLockInterval]) | |
139 | + | ||
140 | + | func controlAccReadCurrIdxOrFail () = valueOrErrorMessage(getInteger(priceOracleAddress, "currIdx"), ("No currIdx at controlAcc=" + toString(priceOracleAddress))) | |
141 | + | ||
142 | + | ||
143 | + | func controlAccReadIdxHeight (idx) = { | |
144 | + | let idxHeightKey = ("idxHeight_" + toString(idx)) | |
145 | + | valueOrElse(getInteger(priceOracleAddress, idxHeightKey), 0) | |
146 | + | } | |
147 | + | ||
148 | + | ||
149 | + | func controlAccReadPriceByHeight (priceHeight) = { | |
150 | + | let priceByHeightKey = ("price_" + toString(priceHeight)) | |
151 | + | valueOrErrorMessage(getInteger(priceOracleAddress, priceByHeightKey), ((("No " + priceByHeightKey) + " at controlAcc=") + toString(priceOracleAddress))) | |
152 | + | } | |
153 | + | ||
154 | + | ||
155 | + | func getStakingBalance () = valueOrElse(getInteger(this, ((("rpd_balance_" + baseAssetIdStr) + "_") + toString(this))), 0) | |
156 | + | ||
157 | + | ||
158 | + | let ucollateral = valueOrElse(getInteger(this, keyUcollateral()), 0) | |
159 | + | ||
160 | + | let currPoolAmount = parseIntValue(cfgArray[IdxCurrentPool]) | |
161 | + | ||
162 | + | let doubleCheckBasicBalance = (assetBalance(this, baseAssetId) + getStakingBalance()) | |
163 | + | ||
164 | + | let doubleCheckUcollateral = if ((0 > ucollateral)) | |
165 | + | then 0 | |
166 | + | else ucollateral | |
167 | + | ||
168 | + | let doubleCheckCurrPoolAmount = (doubleCheckBasicBalance - doubleCheckUcollateral) | |
169 | + | ||
170 | + | let price = getIntegerValue(priceOracleAddress, ("price_" + defoAssetCode)) | |
171 | + | ||
172 | + | let overPrice = (((priceDecimals + overCollateralPercent) * price) / priceDecimals) | |
173 | + | ||
174 | + | let emission = value(assetInfo(defoAssetId)).quantity | |
175 | + | ||
176 | + | let basicAssetLockedAmt = valueOrElse(getInteger(this, generateKeyAssetLockedTotal(baseAssetIdStr)), 0) | |
177 | + | ||
178 | + | let availablePoolBalance = (currPoolAmount - basicAssetLockedAmt) | |
179 | + | ||
180 | + | @Callable(i) | |
181 | + | func buyAsset () = if ((currPoolAmount != doubleCheckCurrPoolAmount)) | |
182 | + | then throw(((("Invalid currPoolAmount calculations: currPoolAmount=" + toString(currPoolAmount)) + " doubleCheckCurrPoolAmount=") + toString(doubleCheckCurrPoolAmount))) | |
183 | + | else { | |
184 | + | let pmt = value(i.payments[0]) | |
185 | + | let pmtAsset = value(pmt.assetId) | |
186 | + | let availableDefoAssetInPool = (fraction(availablePoolBalance, priceDecimals, overPrice) - emission) | |
187 | + | let fullDefoAssetAmount = fraction(pmt.amount, priceDecimals, price) | |
188 | + | let defoAssetAmount = if ((fullDefoAssetAmount > availableDefoAssetInPool)) | |
189 | + | then (fullDefoAssetAmount - availableDefoAssetInPool) | |
190 | + | else fullDefoAssetAmount | |
191 | + | let requiredBasicAssetAmount = fraction(defoAssetAmount, price, priceDecimals) | |
192 | + | let change = (pmt.amount - requiredBasicAssetAmount) | |
193 | + | if ((0 >= availableDefoAssetInPool)) | |
194 | + | then throw((("Impossible to issue new " + defoAssetCode) + ": not enough collateral")) | |
195 | + | else if ((pmtAsset != baseAssetId)) | |
196 | + | then throw(((("Payment asset id doesn't match basic asset: expected=" + toBase58String(baseAssetId)) + " actual=") + toBase58String(pmtAsset))) | |
197 | + | else if ((minBasicBuyAmount > pmt.amount)) | |
198 | + | then throw(((((("Impossible to issue new " + defoAssetCode) + ": payment=") + toString(pmt.amount)) + "is less then min amount=") + toString(minBasicBuyAmount))) | |
199 | + | else [IntegerEntry(keyUcollateral(), (ucollateral + requiredBasicAssetAmount)), Reissue(defoAssetId, defoAssetAmount, true), ScriptTransfer(i.caller, defoAssetAmount, defoAssetId), ScriptTransfer(i.caller, change, baseAssetId)] | |
200 | + | } | |
201 | + | ||
202 | + | ||
203 | + | ||
204 | + | @Callable(i) | |
205 | + | func sellAssetRequest () = { | |
206 | + | let pmt = value(i.payments[0]) | |
207 | + | let pmtAsset = value(pmt.assetId) | |
208 | + | let callerAddress = toString(i.caller) | |
209 | + | let keyAssetLockedTotal = generateKeyAssetLockedTotal(toBase58String(pmtAsset)) | |
210 | + | let currAssetTotalLocked = valueOrElse(getInteger(this, keyAssetLockedTotal), 0) | |
211 | + | let unlockHeight = (height + sellLockInterval) | |
212 | + | let keyAccountLock = keyAccountOperation(unlockHeight, callerAddress, "PENDING") | |
213 | + | if ((pmtAsset != defoAssetId)) | |
214 | + | then throw(((("Invalid payment asset id: expected=" + toBase58String(defoAssetId)) + " actual=") + toBase58String(pmtAsset))) | |
215 | + | else if ((minSynthSellAmount > pmt.amount)) | |
216 | + | then throw(((("Payment amount less then mininimal allowed: paymentAmount=" + toString(pmt.amount)) + " minAmount=") + toString(minSynthSellAmount))) | |
217 | + | else if (isDefined(getInteger(this, keyAccountLock))) | |
218 | + | then throw((((("Sell request has been already defined for " + callerAddress) + "_") + toString(unlockHeight)) + " pair: need to wait next block")) | |
219 | + | else [IntegerEntry(keyAssetLockedTotal, (currAssetTotalLocked + pmt.amount)), StringEntry(keyAccountLock, dataAccountOperation(pmt.amount, toBase58String(defoAssetId), nullInt, nullInt, toBase58String(baseAssetId)))] | |
220 | + | } | |
221 | + | ||
222 | + | ||
223 | + | ||
224 | + | @Callable(i) | |
225 | + | func withdraw (accountAddress,unlockHeight,idx) = { | |
226 | + | let accOperationKey = keyAccountOperation(unlockHeight, accountAddress, "PENDING") | |
227 | + | let accOperationDataArray = readAccountOperationDataArrayOrFail(accOperationKey) | |
228 | + | let amountIn = parseIntValue(accOperationDataArray[IdxOperationAmountIn]) | |
229 | + | let assetIn = accOperationDataArray[IdxOperationAssetIn] | |
230 | + | let assetOut = accOperationDataArray[IdxOperationAssetOut] | |
231 | + | if ((unlockHeight > height)) | |
232 | + | then throw((("Please wait " + toString(unlockHeight)) + " to withdraw your funds")) | |
233 | + | else { | |
234 | + | let accountLockedAmt = amountIn | |
235 | + | if ((0 >= accountLockedAmt)) | |
236 | + | then throw("LockedAmount <= 0") | |
237 | + | else { | |
238 | + | let keyAssetLockedTotal = generateKeyAssetLockedTotal(accOperationDataArray[IdxOperationAssetIn]) | |
239 | + | let currAssetLockedTotal = valueOrErrorMessage(getInteger(this, keyAssetLockedTotal), (("State contains sellAssetRequest=" + accOperationKey) + " BUT no totalLocked")) | |
240 | + | let idxHeight = controlAccReadIdxHeight(idx) | |
241 | + | let prevIdxHeight = controlAccReadIdxHeight((idx - 1)) | |
242 | + | let currIdx = controlAccReadCurrIdxOrFail() | |
243 | + | if (if (if ((idx > currIdx)) | |
244 | + | then true | |
245 | + | else (unlockHeight > idxHeight)) | |
246 | + | then true | |
247 | + | else if ((prevIdxHeight != 0)) | |
248 | + | then (prevIdxHeight >= unlockHeight) | |
249 | + | else false) | |
250 | + | then throw(((((((((("invalid price idx: idx=" + toString(idx)) + " currIdx=") + toString(currIdx)) + " idxHeight=") + toString(idxHeight)) + " unlockHeight=") + toString(unlockHeight)) + " prevIdxHeight=") + toString(prevIdxHeight))) | |
251 | + | else { | |
252 | + | let synth2basicPrice = controlAccReadPriceByHeight(idxHeight) | |
253 | + | let assetInBytes = fromBase58String(assetIn) | |
254 | + | let $t01095411824 = if ((assetInBytes == baseAssetId)) | |
255 | + | then { | |
256 | + | let synthAmt = fraction(amountIn, priceDecimals, synth2basicPrice) | |
257 | + | $Tuple4(synthAmt, Reissue(defoAssetId, synthAmt, true), ScriptTransfer(addressFromStringValue(accountAddress), synthAmt, defoAssetId), IntegerEntry(keyUcollateral(), (ucollateral + amountIn))) | |
258 | + | } | |
259 | + | else if ((assetInBytes == defoAssetId)) | |
260 | + | then { | |
261 | + | let basicAmt = fraction(amountIn, synth2basicPrice, priceDecimals) | |
262 | + | let newUcollateral = (ucollateral - basicAmt) | |
263 | + | $Tuple4(basicAmt, Burn(baseAssetId, basicAmt), ScriptTransfer(addressFromStringValue(accountAddress), basicAmt, baseAssetId), IntegerEntry(keyUcollateral(), (ucollateral - basicAmt))) | |
264 | + | } | |
265 | + | else throw(("Unsupported assetIn=" + assetIn)) | |
266 | + | let amountOut = $t01095411824._1 | |
267 | + | let burnOrIssue = $t01095411824._2 | |
268 | + | let transferSynthOrBasic = $t01095411824._3 | |
269 | + | let ucollateralEntry = $t01095411824._4 | |
270 | + | if ((0 > (currAssetLockedTotal - accountLockedAmt))) | |
271 | + | then throw((("Invalid data state: " + keyAssetLockedTotal) + " less then 0")) | |
272 | + | else ((([IntegerEntry(keyAssetLockedTotal, (currAssetLockedTotal - accountLockedAmt)), DeleteEntry(accOperationKey), StringEntry(keyAccountOperation(unlockHeight, accountAddress, "FINISHED"), dataAccountOperation(amountIn, assetIn, synth2basicPrice, amountOut, assetOut))] :+ burnOrIssue) :+ transferSynthOrBasic) :+ ucollateralEntry) | |
273 | + | } | |
274 | + | } | |
275 | + | } | |
276 | + | } | |
277 | + | ||
278 | + | ||
279 | + | @Verifier(tx) | |
280 | + | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
281 | + |
github/deemru/w8io/026f985 23.61 ms ◑