tx · GpHdhtY2p4z1w2LbuWqfPSRdkZYKfasNhf1sUoNe64tY 3N1GCc3cRYvQifTKU2zmbq9ede25pPN6kQy: -0.01000000 Waves 2020.09.10 11:09 [1170949] smart account 3N1GCc3cRYvQifTKU2zmbq9ede25pPN6kQy > SELF 0.00000000 Waves
{ "type": 13, "id": "GpHdhtY2p4z1w2LbuWqfPSRdkZYKfasNhf1sUoNe64tY", "fee": 1000000, "feeAssetId": null, "timestamp": 1599725401601, "version": 1, "sender": "3N1GCc3cRYvQifTKU2zmbq9ede25pPN6kQy", "senderPublicKey": "9C4SsikwCuhjfQoKQZUzBx9DTzRb3ArE9uesiGbWJKxD", "proofs": [ "2p6Mer6eBzm8vuzQGb1KBBLBrGTzmkPyEQUf845M8cjhxqboTfCSeSwKrrV2zBcGyLYhdMq6Ni2EXTqgj4k6sWfS" ], "script": "base64:AAIEAAAAAAAAAA0IAhIAEgASBQoDCAEBAAAARQEAAAAOa2V5VWNvbGxhdGVyYWwAAAAAAgAAAAt1Y29sbGF0ZXJhbAEAAAAbZ2VuZXJhdGVLZXlBc3NldExvY2tlZFRvdGFsAAAAAQAAAAdhc3NldElkCQABLAAAAAICAAAAFGFzc2V0X2xvY2tlZF90b3RhbF9fBQAAAAdhc3NldElkAQAAABNrZXlBY2NvdW50T3BlcmF0aW9uAAAAAwAAAAx1bmxvY2tIZWlnaHQAAAAHYWRkcmVzcwAAAAZzdGF0dXMJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABVkZWZvQXNzZXRfb3BlcmF0aW9uX18FAAAAB2FkZHJlc3MCAAAAAl9fCQABpAAAAAEFAAAADHVubG9ja0hlaWdodAIAAAACX18FAAAABnN0YXR1cwAAAAAUSWR4T3BlcmF0aW9uQW1vdW50SW4AAAAAAAAAAAAAAAAAE0lkeE9wZXJhdGlvbkFzc2V0SW4AAAAAAAAAAAEAAAAAEUlkeE9wZXJhdGlvblByaWNlAAAAAAAAAAACAAAAABVJZHhPcGVyYXRpb25BbW91bnRPdXQAAAAAAAAAAAMAAAAAFElkeE9wZXJhdGlvbkFzc2V0T3V0AAAAAAAAAAAEAQAAABRkYXRhQWNjb3VudE9wZXJhdGlvbgAAAAcAAAAIYW1vdW50SW4AAAAHYXNzZXRJbgAAAAVwcmljZQAAAAlhbW91bnRPdXQAAAAIYXNzZXRPdXQAAAAMYnJ1dHRvQW1vdW50AAAACWZlZUFtb3VudAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAAaQAAAABBQAAAAhhbW91bnRJbgIAAAACX18FAAAAB2Fzc2V0SW4CAAAAAl9fCQABpAAAAAEFAAAACWFtb3VudE91dAIAAAACX18FAAAACGFzc2V0T3V0AgAAAAJfXwkAAaQAAAABBQAAAAVwcmljZQIAAAACX18JAAGkAAAAAQUAAAAMYnJ1dHRvQW1vdW50AgAAAAJfXwkAAaQAAAABBQAAAAlmZWVBbW91bnQBAAAAI3JlYWRBY2NvdW50T3BlcmF0aW9uRGF0YUFycmF5T3JGYWlsAAAAAQAAAA9hY2NPcGVyYXRpb25LZXkEAAAAE2FjY09wZXJhdGlvbkRhdGFTdHIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAA9hY2NPcGVyYXRpb25LZXkJAAEsAAAAAgIAAAAqVGhlcmUgaXMgbm8gcmVxdWVzdCBmb3IgcGFzc2VkIGFyZ3VtZW50czogBQAAAA9hY2NPcGVyYXRpb25LZXkJAAS1AAAAAgUAAAATYWNjT3BlcmF0aW9uRGF0YVN0cgIAAAACX18AAAAAB251bGxJbnQA//////////8AAAAAB251bGxTdHICAAAABE5VTEwAAAAACmZhY3RvcnlBY2MJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMCAAAAB2ZhY3RvcnkBAAAAGmdldEFzc2V0QWRkcmVzc0J5U3ltYm9sS2V5AAAAAQAAAAthc3NldFN5bWJvbAkAASwAAAACCQABLAAAAAICAAAABmFzc2V0XwUAAAALYXNzZXRTeW1ib2wCAAAACF9hZGRyZXNzAQAAABFnZXRBc3NldFN5bWJvbEtleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAGYXNzZXRfBQAAAAxhc3NldEFkZHJlc3MCAAAAB19zeW1ib2wBAAAAD2dldEFzc2V0TWV0YUtleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAGYXNzZXRfBQAAAAxhc3NldEFkZHJlc3MCAAAABV9tZXRhAQAAABFnZXRBc3NldFN0YXR1c0tleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAGYXNzZXRfBQAAAAxhc3NldEFkZHJlc3MCAAAAB19zdGF0dXMBAAAAFWdldEFzc2V0SW5pdEhlaWdodEtleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAGYXNzZXRfBQAAAAxhc3NldEFkZHJlc3MCAAAADF9pbml0X2hlaWdodAEAAAAZZ2V0QXNzZXRBY3RpdmF0ZUhlaWdodEtleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAGYXNzZXRfBQAAAAxhc3NldEFkZHJlc3MCAAAAEF9hY3RpdmF0ZV9oZWlnaHQBAAAAEmdldEFzc2V0QWRkcmVzc0tleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAGYXNzZXRfBQAAAAxhc3NldEFkZHJlc3MCAAAACF9hZGRyZXNzAQAAACBnZXRBc3NldE1pblJlcXVpcmVkUG9vbEFtb3VudEtleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAGYXNzZXRfBQAAAAxhc3NldEFkZHJlc3MCAAAACV9taW5fcG9vbAEAAAAdZ2V0QXNzZXRDdXJycmVudFBvb2xBbW91bnRLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAABmFzc2V0XwUAAAAMYXNzZXRBZGRyZXNzAgAAAA1fY3VycmVudF9wb29sAQAAABhnZXRBc3NldE1heFBvb2xBbW91bnRLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAABmFzc2V0XwUAAAAMYXNzZXRBZGRyZXNzAgAAAAlfbWF4X3Bvb2wBAAAAImdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25BbW91bnRLZXkAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABXBvb2xfBQAAAAxhc3NldEFkZHJlc3MCAAAAAV8FAAAAEHBvb2xNYWtlckFkZHJlc3MCAAAAB19hbW91bnQBAAAAJWdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25NYXhBbW91bnRLZXkAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABXBvb2xfBQAAAAxhc3NldEFkZHJlc3MCAAAAAV8FAAAAEHBvb2xNYWtlckFkZHJlc3MCAAAACm1heF9hbW91bnQAAAAAEElkeERlZm9Bc3NldENvZGUAAAAAAAAAAAAAAAAADklkeERlZm9Bc3NldElkAAAAAAAAAAABAAAAABJJZHhEZWZvQXNzZXRTdGF0dXMAAAAAAAAAAAIAAAAAEElkeFByaWNlRGVjaW1hbHMAAAAAAAAAAAMAAAAADklkeEJhc2VBc3NldElkAAAAAAAAAAAEAAAAABhJZHhPdmVyQ29sbGF0ZXJhbFBlcmNlbnQAAAAAAAAAAAUAAAAADklkeE1pbkluaXRQb29sAAAAAAAAAAAGAAAAABVJZHhQcmljZU9yYWNsZUFkZHJlc3MAAAAAAAAAAAcAAAAAEElkeE1pbkJ1eVBheW1lbnQAAAAAAAAAAAgAAAAAEUlkeE1pblNlbGxQYXltZW50AAAAAAAAAAAJAAAAABJJZHhCdXlMb2NrSW50ZXJ2YWwAAAAAAAAAAAoAAAAAE0lkeFNlbGxMb2NrSW50ZXJ2YWwAAAAAAAAAAAsAAAAAEElkeEJ1eUZlZVBlcmNlbnQAAAAAAAAAAAwAAAAAEUlkeFNlbGxGZWVQZXJjZW50AAAAAAAAAAANAAAAABFzdGFraW5nQWRkcmVzc1N0cgkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAKZmFjdG9yeUFjYwIAAAAQbmV1dHJpbm9fc3Rha2luZwAAAAAOc3Rha2luZ0FkZHJlc3MJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAEXN0YWtpbmdBZGRyZXNzU3RyAAAAAANjZmcJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAACmZhY3RvcnlBY2MJAAEsAAAAAgIAAAAKZGVmb0Fzc2V0XwkABCUAAAABBQAAAAR0aGlzAAAAAAhjZmdBcnJheQkABLUAAAACBQAAAANjZmcCAAAAAl9fAAAAAA1kZWZvQXNzZXRDb2RlCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABBJZHhEZWZvQXNzZXRDb2RlAAAAAAtkZWZvQXNzZXRJZAkAAlkAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAAA5JZHhEZWZvQXNzZXRJZAAAAAAScHJpY2VPcmFjbGVBZGRyZXNzCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABVJZHhQcmljZU9yYWNsZUFkZHJlc3MAAAAAFW92ZXJDb2xsYXRlcmFsUGVyY2VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABhJZHhPdmVyQ29sbGF0ZXJhbFBlcmNlbnQAAAAADmJhc2VBc3NldElkU3RyCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAAA5JZHhCYXNlQXNzZXRJZAAAAAALYmFzZUFzc2V0SWQJAAJZAAAAAQUAAAAOYmFzZUFzc2V0SWRTdHIAAAAADXByaWNlRGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAQSWR4UHJpY2VEZWNpbWFscwAAAAARbWluQmFzaWNCdXlBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAQSWR4TWluQnV5UGF5bWVudAAAAAASbWluU3ludGhTZWxsQW1vdW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAEUlkeE1pblNlbGxQYXltZW50AAAAAA9idXlMb2NrSW50ZXJ2YWwJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAASSWR4QnV5TG9ja0ludGVydmFsAAAAABBzZWxsTG9ja0ludGVydmFsCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAE0lkeFNlbGxMb2NrSW50ZXJ2YWwAAAAADWJ1eUZlZVBlcmNlbnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAQSWR4QnV5RmVlUGVyY2VudAEAAAAbY29udHJvbEFjY1JlYWRDdXJySWR4T3JGYWlsAAAAAAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwIAAAAHY3VycklkeAkAASwAAAACAgAAABlObyBjdXJySWR4IGF0IGNvbnRyb2xBY2M9CQAEJQAAAAEFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwEAAAAXY29udHJvbEFjY1JlYWRJZHhIZWlnaHQAAAABAAAAA2lkeAQAAAAMaWR4SGVpZ2h0S2V5CQABLAAAAAICAAAACmlkeEhlaWdodF8JAAGkAAAAAQUAAAADaWR4CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwUAAAAMaWR4SGVpZ2h0S2V5AAAAAAAAAAAAAQAAABtjb250cm9sQWNjUmVhZFByaWNlQnlIZWlnaHQAAAABAAAAC3ByaWNlSGVpZ2h0BAAAABBwcmljZUJ5SGVpZ2h0S2V5CQABLAAAAAICAAAABnByaWNlXwkAAaQAAAABBQAAAAtwcmljZUhlaWdodAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwUAAAAQcHJpY2VCeUhlaWdodEtleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAADTm8gBQAAABBwcmljZUJ5SGVpZ2h0S2V5AgAAAA8gYXQgY29udHJvbEFjYz0JAAQlAAAAAQUAAAAScHJpY2VPcmFjbGVBZGRyZXNzAQAAABFnZXRTdGFraW5nQmFsYW5jZQAAAAAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMcnBkX2JhbGFuY2VfBQAAAA5iYXNlQXNzZXRJZFN0cgIAAAABXwkABCUAAAABBQAAAAR0aGlzAAAAAAAAAAAAAAAAAAt1Y29sbGF0ZXJhbAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAOa2V5VWNvbGxhdGVyYWwAAAAAAAAAAAAAAAAAAAAAAA5jdXJyUG9vbEFtb3VudAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAKZmFjdG9yeUFjYwkAASwAAAACCQABLAAAAAICAAAACmRlZm9Bc3NldF8JAAQlAAAAAQUAAAAEdGhpcwIAAAAMX2N1cnJlbnRQb29sAAAAABdkb3VibGVDaGVja0Jhc2ljQmFsYW5jZQkAAGQAAAACCQAD8AAAAAIFAAAABHRoaXMFAAAAC2Jhc2VBc3NldElkCQEAAAARZ2V0U3Rha2luZ0JhbGFuY2UAAAAAAAAAABZkb3VibGVDaGVja1Vjb2xsYXRlcmFsAwkAAGYAAAACAAAAAAAAAAAABQAAAAt1Y29sbGF0ZXJhbAAAAAAAAAAAAAUAAAALdWNvbGxhdGVyYWwAAAAAGWRvdWJsZUNoZWNrQ3VyclBvb2xBbW91bnQJAABlAAAAAgUAAAAXZG91YmxlQ2hlY2tCYXNpY0JhbGFuY2UFAAAAFmRvdWJsZUNoZWNrVWNvbGxhdGVyYWwAAAAABXByaWNlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAABJwcmljZU9yYWNsZUFkZHJlc3MJAAEsAAAAAgIAAAAGcHJpY2VfBQAAAA1kZWZvQXNzZXRDb2RlAAAAAAlvdmVyUHJpY2UJAABpAAAAAgkAAGgAAAACCQAAZAAAAAIFAAAADXByaWNlRGVjaW1hbHMFAAAAFW92ZXJDb2xsYXRlcmFsUGVyY2VudAUAAAAFcHJpY2UFAAAADXByaWNlRGVjaW1hbHMAAAAACGVtaXNzaW9uCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAtkZWZvQXNzZXRJZAAAAAhxdWFudGl0eQAAAAATYmFzaWNBc3NldExvY2tlZEFtdAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAbZ2VuZXJhdGVLZXlBc3NldExvY2tlZFRvdGFsAAAAAQUAAAAOYmFzZUFzc2V0SWRTdHIAAAAAAAAAAAAAAAAAFGF2YWlsYWJsZVBvb2xCYWxhbmNlCQAAZQAAAAIFAAAADmN1cnJQb29sQW1vdW50BQAAABNiYXNpY0Fzc2V0TG9ja2VkQW10AAAAAwAAAAFpAQAAAAhidXlBc3NldAAAAAADCQEAAAACIT0AAAACBQAAAA5jdXJyUG9vbEFtb3VudAUAAAAZZG91YmxlQ2hlY2tDdXJyUG9vbEFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAADRJbnZhbGlkIGN1cnJQb29sQW1vdW50IGNhbGN1bGF0aW9uczogY3VyclBvb2xBbW91bnQ9CQABpAAAAAEFAAAADmN1cnJQb29sQW1vdW50AgAAABsgZG91YmxlQ2hlY2tDdXJyUG9vbEFtb3VudD0JAAGkAAAAAQUAAAAZZG91YmxlQ2hlY2tDdXJyUG9vbEFtb3VudAQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAhwbXRBc3NldAkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAABhhdmFpbGFibGVEZWZvQXNzZXRJblBvb2wJAABlAAAAAgkAAGsAAAADBQAAABRhdmFpbGFibGVQb29sQmFsYW5jZQUAAAANcHJpY2VEZWNpbWFscwUAAAAJb3ZlclByaWNlBQAAAAhlbWlzc2lvbgQAAAAZZnVsbERlZm9Bc3NldEFtb3VudEJydXR0bwkAAGsAAAADCAUAAAADcG10AAAABmFtb3VudAUAAAANcHJpY2VEZWNpbWFscwUAAAAFcHJpY2UEAAAAE2Z1bGxEZWZvQXNzZXRBbW91bnQJAABrAAAAAwkAAGUAAAACBQAAAA1wcmljZURlY2ltYWxzBQAAAA1idXlGZWVQZXJjZW50BQAAABlmdWxsRGVmb0Fzc2V0QW1vdW50QnJ1dHRvBQAAAA1wcmljZURlY2ltYWxzBAAAAAlmZWVBbW91bnQJAABlAAAAAgUAAAAZZnVsbERlZm9Bc3NldEFtb3VudEJydXR0bwUAAAATZnVsbERlZm9Bc3NldEFtb3VudAQAAAAPZGVmb0Fzc2V0QW1vdW50AwkAAGYAAAACBQAAABNmdWxsRGVmb0Fzc2V0QW1vdW50BQAAABhhdmFpbGFibGVEZWZvQXNzZXRJblBvb2wJAABlAAAAAgUAAAATZnVsbERlZm9Bc3NldEFtb3VudAUAAAAYYXZhaWxhYmxlRGVmb0Fzc2V0SW5Qb29sBQAAABNmdWxsRGVmb0Fzc2V0QW1vdW50BAAAABhyZXF1aXJlZEJhc2ljQXNzZXRBbW91bnQJAABrAAAAAwUAAAAZZnVsbERlZm9Bc3NldEFtb3VudEJydXR0bwUAAAAFcHJpY2UFAAAADXByaWNlRGVjaW1hbHMEAAAABmNoYW5nZQkAAGUAAAACCAUAAAADcG10AAAABmFtb3VudAUAAAAYcmVxdWlyZWRCYXNpY0Fzc2V0QW1vdW50AwkAAGcAAAACAAAAAAAAAAAABQAAABhhdmFpbGFibGVEZWZvQXNzZXRJblBvb2wJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAGEltcG9zc2libGUgdG8gaXNzdWUgbmV3IAUAAAANZGVmb0Fzc2V0Q29kZQIAAAAXOiBub3QgZW5vdWdoIGNvbGxhdGVyYWwDCQEAAAACIT0AAAACBQAAAAhwbXRBc3NldAUAAAALYmFzZUFzc2V0SWQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAA1UGF5bWVudCBhc3NldCBpZCBkb2Vzbid0IG1hdGNoIGJhc2ljIGFzc2V0OiBleHBlY3RlZD0JAAJYAAAAAQUAAAALYmFzZUFzc2V0SWQCAAAACCBhY3R1YWw9CQACWAAAAAEFAAAACHBtdEFzc2V0AwkAAGYAAAACBQAAABFtaW5CYXNpY0J1eUFtb3VudAgFAAAAA3BtdAAAAAZhbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAGEltcG9zc2libGUgdG8gaXNzdWUgbmV3IAUAAAANZGVmb0Fzc2V0Q29kZQIAAAAKOiBwYXltZW50PQkAAaQAAAABCAUAAAADcG10AAAABmFtb3VudAIAAAAYaXMgbGVzcyB0aGVuIG1pbiBhbW91bnQ9CQABpAAAAAEFAAAAEW1pbkJhc2ljQnV5QW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOa2V5VWNvbGxhdGVyYWwAAAAACQAAZAAAAAIFAAAAC3Vjb2xsYXRlcmFsBQAAABhyZXF1aXJlZEJhc2ljQXNzZXRBbW91bnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAE2tleUFjY291bnRPcGVyYXRpb24AAAADBQAAAAZoZWlnaHQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAgAAAAhGSU5JU0hFRAkBAAAAFGRhdGFBY2NvdW50T3BlcmF0aW9uAAAABwgFAAAAA3BtdAAAAAZhbW91bnQJAAJYAAAAAQUAAAAIcG10QXNzZXQFAAAABXByaWNlBQAAABNmdWxsRGVmb0Fzc2V0QW1vdW50CQACWAAAAAEFAAAAC2RlZm9Bc3NldElkBQAAABlmdWxsRGVmb0Fzc2V0QW1vdW50QnJ1dHRvBQAAAAlmZWVBbW91bnQJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAAtkZWZvQXNzZXRJZAUAAAAPZGVmb0Fzc2V0QW1vdW50BgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAD2RlZm9Bc3NldEFtb3VudAUAAAALZGVmb0Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAZjaGFuZ2UFAAAAC2Jhc2VBc3NldElkBQAAAANuaWwAAAABaQEAAAAQc2VsbEFzc2V0UmVxdWVzdAAAAAAEAAAAA3BtdAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAIcG10QXNzZXQJAQAAAAV2YWx1ZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAQAAAANY2FsbGVyQWRkcmVzcwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAE2tleUFzc2V0TG9ja2VkVG90YWwJAQAAABtnZW5lcmF0ZUtleUFzc2V0TG9ja2VkVG90YWwAAAABCQACWAAAAAEFAAAACHBtdEFzc2V0BAAAABRjdXJyQXNzZXRUb3RhbExvY2tlZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABNrZXlBc3NldExvY2tlZFRvdGFsAAAAAAAAAAAABAAAAAx1bmxvY2tIZWlnaHQJAABkAAAAAgUAAAAGaGVpZ2h0BQAAABBzZWxsTG9ja0ludGVydmFsBAAAAA5rZXlBY2NvdW50TG9jawkBAAAAE2tleUFjY291bnRPcGVyYXRpb24AAAADBQAAAAx1bmxvY2tIZWlnaHQFAAAADWNhbGxlckFkZHJlc3MCAAAAB1BFTkRJTkcDCQEAAAACIT0AAAACBQAAAAhwbXRBc3NldAUAAAALZGVmb0Fzc2V0SWQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAjSW52YWxpZCBwYXltZW50IGFzc2V0IGlkOiBleHBlY3RlZD0JAAJYAAAAAQUAAAALZGVmb0Fzc2V0SWQCAAAACCBhY3R1YWw9CQACWAAAAAEFAAAACHBtdEFzc2V0AwkAAGYAAAACBQAAABJtaW5TeW50aFNlbGxBbW91bnQIBQAAAANwbXQAAAAGYW1vdW50CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAOlBheW1lbnQgYW1vdW50IGxlc3MgdGhlbiBtaW5pbmltYWwgYWxsb3dlZDogcGF5bWVudEFtb3VudD0JAAGkAAAAAQgFAAAAA3BtdAAAAAZhbW91bnQCAAAACyBtaW5BbW91bnQ9CQABpAAAAAEFAAAAEm1pblN5bnRoU2VsbEFtb3VudAMJAQAAAAlpc0RlZmluZWQAAAABCQAEGgAAAAIFAAAABHRoaXMFAAAADmtleUFjY291bnRMb2NrCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAqU2VsbCByZXF1ZXN0IGhhcyBiZWVuIGFscmVhZHkgZGVmaW5lZCBmb3IgBQAAAA1jYWxsZXJBZGRyZXNzAgAAAAFfCQABpAAAAAEFAAAADHVubG9ja0hlaWdodAIAAAAeIHBhaXI6IG5lZWQgdG8gd2FpdCBuZXh0IGJsb2NrCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABNrZXlBc3NldExvY2tlZFRvdGFsCQAAZAAAAAIFAAAAFGN1cnJBc3NldFRvdGFsTG9ja2VkCAUAAAADcG10AAAABmFtb3VudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA5rZXlBY2NvdW50TG9jawkBAAAAFGRhdGFBY2NvdW50T3BlcmF0aW9uAAAABwgFAAAAA3BtdAAAAAZhbW91bnQJAAJYAAAAAQUAAAALZGVmb0Fzc2V0SWQFAAAAB251bGxJbnQFAAAAB251bGxJbnQJAAJYAAAAAQUAAAALYmFzZUFzc2V0SWQFAAAAB251bGxJbnQFAAAAB251bGxJbnQFAAAAA25pbAAAAAFpAQAAAAh3aXRoZHJhdwAAAAMAAAAOYWNjb3VudEFkZHJlc3MAAAAMdW5sb2NrSGVpZ2h0AAAAA2lkeAQAAAAPYWNjT3BlcmF0aW9uS2V5CQEAAAATa2V5QWNjb3VudE9wZXJhdGlvbgAAAAMFAAAADHVubG9ja0hlaWdodAUAAAAOYWNjb3VudEFkZHJlc3MCAAAAB1BFTkRJTkcEAAAAFWFjY09wZXJhdGlvbkRhdGFBcnJheQkBAAAAI3JlYWRBY2NvdW50T3BlcmF0aW9uRGF0YUFycmF5T3JGYWlsAAAAAQUAAAAPYWNjT3BlcmF0aW9uS2V5BAAAAAhhbW91bnRJbgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFWFjY09wZXJhdGlvbkRhdGFBcnJheQUAAAAUSWR4T3BlcmF0aW9uQW1vdW50SW4EAAAAB2Fzc2V0SW4JAAGRAAAAAgUAAAAVYWNjT3BlcmF0aW9uRGF0YUFycmF5BQAAABNJZHhPcGVyYXRpb25Bc3NldEluBAAAAAhhc3NldE91dAkAAZEAAAACBQAAABVhY2NPcGVyYXRpb25EYXRhQXJyYXkFAAAAFElkeE9wZXJhdGlvbkFzc2V0T3V0AwkAAGYAAAACBQAAAAx1bmxvY2tIZWlnaHQFAAAABmhlaWdodAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAMUGxlYXNlIHdhaXQgCQABpAAAAAEFAAAADHVubG9ja0hlaWdodAIAAAAXIHRvIHdpdGhkcmF3IHlvdXIgZnVuZHMEAAAAEGFjY291bnRMb2NrZWRBbXQFAAAACGFtb3VudEluAwkAAGcAAAACAAAAAAAAAAAABQAAABBhY2NvdW50TG9ja2VkQW10CQAAAgAAAAECAAAAEUxvY2tlZEFtb3VudCA8PSAwBAAAABNrZXlBc3NldExvY2tlZFRvdGFsCQEAAAAbZ2VuZXJhdGVLZXlBc3NldExvY2tlZFRvdGFsAAAAAQkAAZEAAAACBQAAABVhY2NPcGVyYXRpb25EYXRhQXJyYXkFAAAAE0lkeE9wZXJhdGlvbkFzc2V0SW4EAAAAFGN1cnJBc3NldExvY2tlZFRvdGFsCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAATa2V5QXNzZXRMb2NrZWRUb3RhbAkAASwAAAACCQABLAAAAAICAAAAIFN0YXRlIGNvbnRhaW5zIHNlbGxBc3NldFJlcXVlc3Q9BQAAAA9hY2NPcGVyYXRpb25LZXkCAAAAEyBCVVQgbm8gdG90YWxMb2NrZWQEAAAACWlkeEhlaWdodAkBAAAAF2NvbnRyb2xBY2NSZWFkSWR4SGVpZ2h0AAAAAQUAAAADaWR4BAAAAA1wcmV2SWR4SGVpZ2h0CQEAAAAXY29udHJvbEFjY1JlYWRJZHhIZWlnaHQAAAABCQAAZQAAAAIFAAAAA2lkeAAAAAAAAAAAAQQAAAAHY3VycklkeAkBAAAAG2NvbnRyb2xBY2NSZWFkQ3VycklkeE9yRmFpbAAAAAADAwMJAABmAAAAAgUAAAADaWR4BQAAAAdjdXJySWR4BgkAAGYAAAACBQAAAAx1bmxvY2tIZWlnaHQFAAAACWlkeEhlaWdodAYDCQEAAAACIT0AAAACBQAAAA1wcmV2SWR4SGVpZ2h0AAAAAAAAAAAACQAAZwAAAAIFAAAADXByZXZJZHhIZWlnaHQFAAAADHVubG9ja0hlaWdodAcJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAXaW52YWxpZCBwcmljZSBpZHg6IGlkeD0JAAGkAAAAAQUAAAADaWR4AgAAAAkgY3VycklkeD0JAAGkAAAAAQUAAAAHY3VycklkeAIAAAALIGlkeEhlaWdodD0JAAGkAAAAAQUAAAAJaWR4SGVpZ2h0AgAAAA4gdW5sb2NrSGVpZ2h0PQkAAaQAAAABBQAAAAx1bmxvY2tIZWlnaHQCAAAADyBwcmV2SWR4SGVpZ2h0PQkAAaQAAAABBQAAAA1wcmV2SWR4SGVpZ2h0BAAAABBzeW50aDJiYXNpY1ByaWNlCQEAAAAbY29udHJvbEFjY1JlYWRQcmljZUJ5SGVpZ2h0AAAAAQUAAAAJaWR4SGVpZ2h0BAAAAAxhc3NldEluQnl0ZXMJAAJZAAAAAQUAAAAHYXNzZXRJbgQAAAANJHQwMTE1MTMxMjM4MwMJAAAAAAAAAgUAAAAMYXNzZXRJbkJ5dGVzBQAAAAtiYXNlQXNzZXRJZAQAAAAIc3ludGhBbXQJAABrAAAAAwUAAAAIYW1vdW50SW4FAAAADXByaWNlRGVjaW1hbHMFAAAAEHN5bnRoMmJhc2ljUHJpY2UJAAUWAAAABAUAAAAIc3ludGhBbXQJAQAAAAdSZWlzc3VlAAAAAwUAAAALZGVmb0Fzc2V0SWQFAAAACHN5bnRoQW10BgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAOYWNjb3VudEFkZHJlc3MFAAAACHN5bnRoQW10BQAAAAtkZWZvQXNzZXRJZAkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA5rZXlVY29sbGF0ZXJhbAAAAAAJAABkAAAAAgUAAAALdWNvbGxhdGVyYWwFAAAACGFtb3VudEluAwkAAAAAAAACBQAAAAxhc3NldEluQnl0ZXMFAAAAC2RlZm9Bc3NldElkBAAAAAhiYXNpY0FtdAkAAGsAAAADBQAAAAhhbW91bnRJbgUAAAAQc3ludGgyYmFzaWNQcmljZQUAAAANcHJpY2VEZWNpbWFscwQAAAAObmV3VWNvbGxhdGVyYWwJAABlAAAAAgUAAAALdWNvbGxhdGVyYWwFAAAACGJhc2ljQW10CQAFFgAAAAQFAAAACGJhc2ljQW10CQEAAAAEQnVybgAAAAIFAAAAC2Jhc2VBc3NldElkBQAAAAhiYXNpY0FtdAkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAOYWNjb3VudEFkZHJlc3MFAAAACGJhc2ljQW10BQAAAAtiYXNlQXNzZXRJZAkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA5rZXlVY29sbGF0ZXJhbAAAAAAJAABlAAAAAgUAAAALdWNvbGxhdGVyYWwFAAAACGJhc2ljQW10CQAAAgAAAAEJAAEsAAAAAgIAAAAUVW5zdXBwb3J0ZWQgYXNzZXRJbj0FAAAAB2Fzc2V0SW4EAAAACWFtb3VudE91dAgFAAAADSR0MDExNTEzMTIzODMAAAACXzEEAAAAC2J1cm5Pcklzc3VlCAUAAAANJHQwMTE1MTMxMjM4MwAAAAJfMgQAAAAUdHJhbnNmZXJTeW50aE9yQmFzaWMIBQAAAA0kdDAxMTUxMzEyMzgzAAAAAl8zBAAAABB1Y29sbGF0ZXJhbEVudHJ5CAUAAAANJHQwMTE1MTMxMjM4MwAAAAJfNAMJAABmAAAAAgAAAAAAAAAAAAkAAGUAAAACBQAAABRjdXJyQXNzZXRMb2NrZWRUb3RhbAUAAAAQYWNjb3VudExvY2tlZEFtdAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAUSW52YWxpZCBkYXRhIHN0YXRlOiAFAAAAE2tleUFzc2V0TG9ja2VkVG90YWwCAAAADCBsZXNzIHRoZW4gMAkABE0AAAACCQAETQAAAAIJAARNAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa2V5QXNzZXRMb2NrZWRUb3RhbAkAAGUAAAACBQAAABRjdXJyQXNzZXRMb2NrZWRUb3RhbAUAAAAQYWNjb3VudExvY2tlZEFtdAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAA9hY2NPcGVyYXRpb25LZXkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAE2tleUFjY291bnRPcGVyYXRpb24AAAADBQAAAAx1bmxvY2tIZWlnaHQFAAAADmFjY291bnRBZGRyZXNzAgAAAAhGSU5JU0hFRAkBAAAAFGRhdGFBY2NvdW50T3BlcmF0aW9uAAAABwUAAAAIYW1vdW50SW4FAAAAB2Fzc2V0SW4FAAAAEHN5bnRoMmJhc2ljUHJpY2UFAAAACWFtb3VudE91dAUAAAAIYXNzZXRPdXQAAAAAAAAAAAAAAAAAAAAAAAAFAAAAA25pbAUAAAALYnVybk9ySXNzdWUFAAAAFHRyYW5zZmVyU3ludGhPckJhc2ljBQAAABB1Y29sbGF0ZXJhbEVudHJ5AAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkGaOTZ", "chainId": 84, "height": 1170949, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: BDzWdjchNnF3VvEVz34y4NtgecGrDZYwBsYdK1mwnygc 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_operation__" + 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,bruttoAmount,feeAmount) = ((((((((((((toString(amountIn) + "__") + assetIn) + "__") + toString(amountOut)) + "__") + assetOut) + "__") + toString(price)) + "__") + toString(bruttoAmount)) + "__") + toString(feeAmount)) | |
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 IdxPriceDecimals = 3 | |
81 | + | ||
82 | + | let IdxBaseAssetId = 4 | |
83 | + | ||
84 | + | let IdxOverCollateralPercent = 5 | |
85 | + | ||
86 | + | let IdxMinInitPool = 6 | |
87 | + | ||
88 | + | let IdxPriceOracleAddress = 7 | |
89 | + | ||
90 | + | let IdxMinBuyPayment = 8 | |
91 | + | ||
92 | + | let IdxMinSellPayment = 9 | |
93 | + | ||
94 | + | let IdxBuyLockInterval = 10 | |
95 | + | ||
96 | + | let IdxSellLockInterval = 11 | |
97 | + | ||
98 | + | let IdxBuyFeePercent = 12 | |
99 | + | ||
100 | + | let IdxSellFeePercent = 13 | |
101 | + | ||
102 | + | let stakingAddressStr = getStringValue(factoryAcc, "neutrino_staking") | |
103 | + | ||
104 | + | let stakingAddress = addressFromStringValue(stakingAddressStr) | |
105 | + | ||
106 | + | let cfg = getStringValue(factoryAcc, ("defoAsset_" + toString(this))) | |
107 | + | ||
108 | + | let cfgArray = split(cfg, "__") | |
109 | + | ||
110 | + | let defoAssetCode = cfgArray[IdxDefoAssetCode] | |
111 | + | ||
112 | + | let defoAssetId = fromBase58String(cfgArray[IdxDefoAssetId]) | |
113 | + | ||
114 | + | let priceOracleAddress = addressFromStringValue(cfgArray[IdxPriceOracleAddress]) | |
115 | + | ||
116 | + | let overCollateralPercent = parseIntValue(cfgArray[IdxOverCollateralPercent]) | |
117 | + | ||
118 | + | let baseAssetIdStr = cfgArray[IdxBaseAssetId] | |
119 | + | ||
120 | + | let baseAssetId = fromBase58String(baseAssetIdStr) | |
121 | + | ||
122 | + | let priceDecimals = parseIntValue(cfgArray[IdxPriceDecimals]) | |
123 | + | ||
124 | + | let minBasicBuyAmount = parseIntValue(cfgArray[IdxMinBuyPayment]) | |
125 | + | ||
126 | + | let minSynthSellAmount = parseIntValue(cfgArray[IdxMinSellPayment]) | |
127 | + | ||
128 | + | let buyLockInterval = parseIntValue(cfgArray[IdxBuyLockInterval]) | |
129 | + | ||
130 | + | let sellLockInterval = parseIntValue(cfgArray[IdxSellLockInterval]) | |
131 | + | ||
132 | + | let buyFeePercent = parseIntValue(cfgArray[IdxBuyFeePercent]) | |
133 | + | ||
134 | + | func controlAccReadCurrIdxOrFail () = valueOrErrorMessage(getInteger(priceOracleAddress, "currIdx"), ("No currIdx at controlAcc=" + toString(priceOracleAddress))) | |
135 | + | ||
136 | + | ||
137 | + | func controlAccReadIdxHeight (idx) = { | |
138 | + | let idxHeightKey = ("idxHeight_" + toString(idx)) | |
139 | + | valueOrElse(getInteger(priceOracleAddress, idxHeightKey), 0) | |
140 | + | } | |
141 | + | ||
142 | + | ||
143 | + | func controlAccReadPriceByHeight (priceHeight) = { | |
144 | + | let priceByHeightKey = ("price_" + toString(priceHeight)) | |
145 | + | valueOrErrorMessage(getInteger(priceOracleAddress, priceByHeightKey), ((("No " + priceByHeightKey) + " at controlAcc=") + toString(priceOracleAddress))) | |
146 | + | } | |
147 | + | ||
148 | + | ||
149 | + | func getStakingBalance () = valueOrElse(getInteger(this, ((("rpd_balance_" + baseAssetIdStr) + "_") + toString(this))), 0) | |
150 | + | ||
151 | + | ||
152 | + | let ucollateral = valueOrElse(getInteger(this, keyUcollateral()), 0) | |
153 | + | ||
154 | + | let currPoolAmount = getIntegerValue(factoryAcc, (("defoAsset_" + toString(this)) + "_currentPool")) | |
155 | + | ||
156 | + | let doubleCheckBasicBalance = (assetBalance(this, baseAssetId) + getStakingBalance()) | |
157 | + | ||
158 | + | let doubleCheckUcollateral = if ((0 > ucollateral)) | |
159 | + | then 0 | |
160 | + | else ucollateral | |
161 | + | ||
162 | + | let doubleCheckCurrPoolAmount = (doubleCheckBasicBalance - doubleCheckUcollateral) | |
163 | + | ||
164 | + | let price = getIntegerValue(priceOracleAddress, ("price_" + defoAssetCode)) | |
165 | + | ||
166 | + | let overPrice = (((priceDecimals + overCollateralPercent) * price) / priceDecimals) | |
167 | + | ||
168 | + | let emission = value(assetInfo(defoAssetId)).quantity | |
169 | + | ||
170 | + | let basicAssetLockedAmt = valueOrElse(getInteger(this, generateKeyAssetLockedTotal(baseAssetIdStr)), 0) | |
171 | + | ||
172 | + | let availablePoolBalance = (currPoolAmount - basicAssetLockedAmt) | |
173 | + | ||
174 | + | @Callable(i) | |
175 | + | func buyAsset () = if ((currPoolAmount != doubleCheckCurrPoolAmount)) | |
176 | + | then throw(((("Invalid currPoolAmount calculations: currPoolAmount=" + toString(currPoolAmount)) + " doubleCheckCurrPoolAmount=") + toString(doubleCheckCurrPoolAmount))) | |
177 | + | else { | |
178 | + | let pmt = value(i.payments[0]) | |
179 | + | let pmtAsset = value(pmt.assetId) | |
180 | + | let availableDefoAssetInPool = (fraction(availablePoolBalance, priceDecimals, overPrice) - emission) | |
181 | + | let fullDefoAssetAmountBrutto = fraction(pmt.amount, priceDecimals, price) | |
182 | + | let fullDefoAssetAmount = fraction((priceDecimals - buyFeePercent), fullDefoAssetAmountBrutto, priceDecimals) | |
183 | + | let feeAmount = (fullDefoAssetAmountBrutto - fullDefoAssetAmount) | |
184 | + | let defoAssetAmount = if ((fullDefoAssetAmount > availableDefoAssetInPool)) | |
185 | + | then (fullDefoAssetAmount - availableDefoAssetInPool) | |
186 | + | else fullDefoAssetAmount | |
187 | + | let requiredBasicAssetAmount = fraction(fullDefoAssetAmountBrutto, price, priceDecimals) | |
188 | + | let change = (pmt.amount - requiredBasicAssetAmount) | |
189 | + | if ((0 >= availableDefoAssetInPool)) | |
190 | + | then throw((("Impossible to issue new " + defoAssetCode) + ": not enough collateral")) | |
191 | + | else if ((pmtAsset != baseAssetId)) | |
192 | + | then throw(((("Payment asset id doesn't match basic asset: expected=" + toBase58String(baseAssetId)) + " actual=") + toBase58String(pmtAsset))) | |
193 | + | else if ((minBasicBuyAmount > pmt.amount)) | |
194 | + | then throw(((((("Impossible to issue new " + defoAssetCode) + ": payment=") + toString(pmt.amount)) + "is less then min amount=") + toString(minBasicBuyAmount))) | |
195 | + | else [IntegerEntry(keyUcollateral(), (ucollateral + requiredBasicAssetAmount)), StringEntry(keyAccountOperation(height, toString(i.caller), "FINISHED"), dataAccountOperation(pmt.amount, toBase58String(pmtAsset), price, fullDefoAssetAmount, toBase58String(defoAssetId), fullDefoAssetAmountBrutto, feeAmount)), Reissue(defoAssetId, defoAssetAmount, true), ScriptTransfer(i.caller, defoAssetAmount, defoAssetId), ScriptTransfer(i.caller, change, baseAssetId)] | |
196 | + | } | |
197 | + | ||
198 | + | ||
199 | + | ||
200 | + | @Callable(i) | |
201 | + | func sellAssetRequest () = { | |
202 | + | let pmt = value(i.payments[0]) | |
203 | + | let pmtAsset = value(pmt.assetId) | |
204 | + | let callerAddress = toString(i.caller) | |
205 | + | let keyAssetLockedTotal = generateKeyAssetLockedTotal(toBase58String(pmtAsset)) | |
206 | + | let currAssetTotalLocked = valueOrElse(getInteger(this, keyAssetLockedTotal), 0) | |
207 | + | let unlockHeight = (height + sellLockInterval) | |
208 | + | let keyAccountLock = keyAccountOperation(unlockHeight, callerAddress, "PENDING") | |
209 | + | if ((pmtAsset != defoAssetId)) | |
210 | + | then throw(((("Invalid payment asset id: expected=" + toBase58String(defoAssetId)) + " actual=") + toBase58String(pmtAsset))) | |
211 | + | else if ((minSynthSellAmount > pmt.amount)) | |
212 | + | then throw(((("Payment amount less then mininimal allowed: paymentAmount=" + toString(pmt.amount)) + " minAmount=") + toString(minSynthSellAmount))) | |
213 | + | else if (isDefined(getInteger(this, keyAccountLock))) | |
214 | + | then throw((((("Sell request has been already defined for " + callerAddress) + "_") + toString(unlockHeight)) + " pair: need to wait next block")) | |
215 | + | else [IntegerEntry(keyAssetLockedTotal, (currAssetTotalLocked + pmt.amount)), StringEntry(keyAccountLock, dataAccountOperation(pmt.amount, toBase58String(defoAssetId), nullInt, nullInt, toBase58String(baseAssetId), nullInt, nullInt))] | |
216 | + | } | |
217 | + | ||
218 | + | ||
219 | + | ||
220 | + | @Callable(i) | |
221 | + | func withdraw (accountAddress,unlockHeight,idx) = { | |
222 | + | let accOperationKey = keyAccountOperation(unlockHeight, accountAddress, "PENDING") | |
223 | + | let accOperationDataArray = readAccountOperationDataArrayOrFail(accOperationKey) | |
224 | + | let amountIn = parseIntValue(accOperationDataArray[IdxOperationAmountIn]) | |
225 | + | let assetIn = accOperationDataArray[IdxOperationAssetIn] | |
226 | + | let assetOut = accOperationDataArray[IdxOperationAssetOut] | |
227 | + | if ((unlockHeight > height)) | |
228 | + | then throw((("Please wait " + toString(unlockHeight)) + " to withdraw your funds")) | |
229 | + | else { | |
230 | + | let accountLockedAmt = amountIn | |
231 | + | if ((0 >= accountLockedAmt)) | |
232 | + | then throw("LockedAmount <= 0") | |
233 | + | else { | |
234 | + | let keyAssetLockedTotal = generateKeyAssetLockedTotal(accOperationDataArray[IdxOperationAssetIn]) | |
235 | + | let currAssetLockedTotal = valueOrErrorMessage(getInteger(this, keyAssetLockedTotal), (("State contains sellAssetRequest=" + accOperationKey) + " BUT no totalLocked")) | |
236 | + | let idxHeight = controlAccReadIdxHeight(idx) | |
237 | + | let prevIdxHeight = controlAccReadIdxHeight((idx - 1)) | |
238 | + | let currIdx = controlAccReadCurrIdxOrFail() | |
239 | + | if (if (if ((idx > currIdx)) | |
240 | + | then true | |
241 | + | else (unlockHeight > idxHeight)) | |
242 | + | then true | |
243 | + | else if ((prevIdxHeight != 0)) | |
244 | + | then (prevIdxHeight >= unlockHeight) | |
245 | + | else false) | |
246 | + | then throw(((((((((("invalid price idx: idx=" + toString(idx)) + " currIdx=") + toString(currIdx)) + " idxHeight=") + toString(idxHeight)) + " unlockHeight=") + toString(unlockHeight)) + " prevIdxHeight=") + toString(prevIdxHeight))) | |
247 | + | else { | |
248 | + | let synth2basicPrice = controlAccReadPriceByHeight(idxHeight) | |
249 | + | let assetInBytes = fromBase58String(assetIn) | |
250 | + | let $t01151312383 = if ((assetInBytes == baseAssetId)) | |
251 | + | then { | |
252 | + | let synthAmt = fraction(amountIn, priceDecimals, synth2basicPrice) | |
253 | + | $Tuple4(synthAmt, Reissue(defoAssetId, synthAmt, true), ScriptTransfer(addressFromStringValue(accountAddress), synthAmt, defoAssetId), IntegerEntry(keyUcollateral(), (ucollateral + amountIn))) | |
254 | + | } | |
255 | + | else if ((assetInBytes == defoAssetId)) | |
256 | + | then { | |
257 | + | let basicAmt = fraction(amountIn, synth2basicPrice, priceDecimals) | |
258 | + | let newUcollateral = (ucollateral - basicAmt) | |
259 | + | $Tuple4(basicAmt, Burn(baseAssetId, basicAmt), ScriptTransfer(addressFromStringValue(accountAddress), basicAmt, baseAssetId), IntegerEntry(keyUcollateral(), (ucollateral - basicAmt))) | |
260 | + | } | |
261 | + | else throw(("Unsupported assetIn=" + assetIn)) | |
262 | + | let amountOut = $t01151312383._1 | |
263 | + | let burnOrIssue = $t01151312383._2 | |
264 | + | let transferSynthOrBasic = $t01151312383._3 | |
265 | + | let ucollateralEntry = $t01151312383._4 | |
266 | + | if ((0 > (currAssetLockedTotal - accountLockedAmt))) | |
267 | + | then throw((("Invalid data state: " + keyAssetLockedTotal) + " less then 0")) | |
268 | + | else ((([IntegerEntry(keyAssetLockedTotal, (currAssetLockedTotal - accountLockedAmt)), DeleteEntry(accOperationKey), StringEntry(keyAccountOperation(unlockHeight, accountAddress, "FINISHED"), dataAccountOperation(amountIn, assetIn, synth2basicPrice, amountOut, assetOut, 0, 0))] :+ burnOrIssue) :+ transferSynthOrBasic) :+ ucollateralEntry) | |
269 | + | } | |
270 | + | } | |
271 | + | } | |
272 | + | } | |
273 | + | ||
274 | + | ||
275 | + | @Verifier(tx) | |
276 | + | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
277 | + |
github/deemru/w8io/169f3d6 52.09 ms ◑![]()