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:
OldNewDifferences
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