tx · 6r9GJCVKHSTieZPQzysTH4SncsbqC2CzRCMZdy85Lqxz

3Mtzn1SRUhygEXMVpHNMckc8HKCWjq2fTiG:  -0.01400000 Waves

2020.08.03 16:31 [1116241] smart account 3Mtzn1SRUhygEXMVpHNMckc8HKCWjq2fTiG > SELF 0.00000000 Waves

{ "type": 13, "id": "6r9GJCVKHSTieZPQzysTH4SncsbqC2CzRCMZdy85Lqxz", "fee": 1400000, "feeAssetId": null, "timestamp": 1596461501416, "version": 1, "sender": "3Mtzn1SRUhygEXMVpHNMckc8HKCWjq2fTiG", "senderPublicKey": "2WHjsmTCwLeerJuc5YMaJNou8UGSHuy4TE3F6DneRaJt", "proofs": [ "31vyeGB4eL6qsJKRJN3Ky4h7Z5aghyPLGBVWhQswS956Jcei8M7hq6Yi5PBAFGRf3WfpqhYPwc4cVjJBYdSoo4Dw" ], "script": "base64:AAIDAAAAAAAAACIIARIHCgUICAgICBIHCgUBAQEBBBIDCgEIEgASAwoBCBIAAAAAMgAAAAAHQlVMTEtleQIAAAAGQlVMTElkAAAAAAdCRUFSS2V5AgAAAAZCRUFSSWQAAAAADG1haW5Ub2tlbktleQIAAAALbWFpblRva2VuSWQAAAAAEmlzc3VlUGVyY2VudGlsZUtleQIAAAAPaXNzdWVQZXJjZW50aWxlAAAAABNyZWRlZW1QZXJjZW50aWxlS2V5AgAAABByZWRlZW1QZXJjZW50aWxlAAAAAAttaW5Jc3N1ZUtleQIAAAAIbWluSXNzdWUAAAAADG1pblJlZGVlbUtleQIAAAAJbWluUmVkZWVtAAAAABB3aGl0ZWxpc3RPbmx5S2V5AgAAAA13aGl0ZWxpc3RPbmx5AAAAAAtvcmFjbGVQS0tleQIAAAAGb3JhY2xlAAAAABFsYXN0UHJpY2VJbmRleEtleQIAAAALcHJpY2VfaW5kZXgAAAAAEHByaWNlSW5kZXhQcmVmaXgCAAAADHByaWNlX2luZGV4XwAAAAARcHJpY2VIZWlnaHRQcmVmaXgCAAAABnByaWNlXwAAAAAab3JhY2xlQ3VycmVudFByaWNlSW5kZXhLZXkCAAAAC3ByaWNlX2luZGV4AAAAABpsYXN0UmViYWxhbmNlUHJpY2VJbmRleEtleQIAAAAVbGFzdFNldHRsZW1lbnRQcmljZUlkAAAAABFidWxsQ29sbGF0ZXJhbEtleQIAAAAOYnVsbENvbGxhdGVyYWwAAAAAEWJlYXJDb2xsYXRlcmFsS2V5AgAAAA5iZWFyQ29sbGF0ZXJhbAAAAAASYnVsbENpcmN1bGF0aW9uS2V5AgAAAA9idWxsQ2lyY3VsYXRpb24AAAAAEmJlYXJDaXJjdWxhdGlvbktleQIAAAAPYmVhckNpcmN1bGF0aW9uAAAAAAx3aGl0ZWxpc3RLZXkCAAAADmlzc3VlV2hpdGVMaXN0AAAAAAl3aGl0ZWxpc3QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAx3aGl0ZWxpc3RLZXkCAAAAFG5vIGJ1bGxDb2xsYXRlcmFsS2V5AAAAAAdidWxsQ29sCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAARYnVsbENvbGxhdGVyYWxLZXkCAAAAFG5vIGJ1bGxDb2xsYXRlcmFsS2V5AAAAAAdiZWFyQ29sCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAARYmVhckNvbGxhdGVyYWxLZXkCAAAAFG5vIGJlYXJDb2xsYXRlcmFsS2V5AAAAAAhidWxsQ2lyYwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEmJ1bGxDaXJjdWxhdGlvbktleQIAAAAVbm8gYnVsbENpcmN1bGF0aW9uS2V5AAAAAAhiZWFyQ2lyYwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEmJlYXJDaXJjdWxhdGlvbktleQIAAAAVbm8gYmVhckNpcmN1bGF0aW9uS2V5AAAAAARCVUxMCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAHQlVMTEtleQIAAAAKbm8gQlVMTEtleQAAAAAEQkVBUgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAB0JFQVJLZXkCAAAACm5vIEJFQVJLZXkAAAAACW1haW5Ub2tlbgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAADG1haW5Ub2tlbktleQIAAAAPbm8gbWFpblRva2VuS2V5AAAAAA9pc3N1ZVBlcmNlbnRpbGUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABJpc3N1ZVBlcmNlbnRpbGVLZXkCAAAAFW5vIGlzc3VlUGVyY2VudGlsZUtleQAAAAAQcmVkZWVtUGVyY2VudGlsZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAE3JlZGVlbVBlcmNlbnRpbGVLZXkCAAAAFm5vIHJlZGVlbVBlcmNlbnRpbGVLZXkAAAAACG1pbklzc3VlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAALbWluSXNzdWVLZXkCAAAADm5vIG1pbklzc3VlS2V5AAAAAAltaW5SZWRlZW0JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAxtaW5SZWRlZW1LZXkCAAAAD25vIG1pblJlZGVlbUtleQAAAAANd2hpdGVsaXN0T25seQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGwAAAAIFAAAABHRoaXMFAAAAEHdoaXRlbGlzdE9ubHlLZXkCAAAAE25vIHdoaXRlbGlzdE9ubHlLZXkAAAAABm9yYWNsZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABCQACWQAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAtvcmFjbGVQS0tleQIAAAAObm8gb3JhY2xlUEtLZXkCAAAAEmJhZCBvcmFjbGUgYWRkcmVzcwAAAAAUcmViYWxhbmNlZFByaWNlSW5kZXgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABpsYXN0UmViYWxhbmNlUHJpY2VJbmRleEtleQIAAAAXbm8gbGFzdCByZWJhbGFuY2UgcHJpY2UAAAAAEG9yYWNsZVByaWNlSW5kZXgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZvcmFjbGUFAAAAEWxhc3RQcmljZUluZGV4S2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABNiYWQgb3JhY2xlIGRhdGEgYXQgCQAEJQAAAAEFAAAABm9yYWNsZQIAAAAQOiBubyBpbnRlZ2VyIGF0IAUAAAARbGFzdFByaWNlSW5kZXhLZXkAAAAADmhlYWRQb2ludGVyS2V5AgAAAAtoZWFkUG9pbnRlcgAAAAAOdGFpbFBvaW50ZXJLZXkCAAAAC3RhaWxQb2ludGVyAAAAAAxxdWV1ZVNpemVLZXkCAAAACXF1ZXVlU2l6ZQAAAAAJ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YnVsbENpcmMFAAAAEmFkZGVkVG9DaXJjdWxhdGlvbgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAOaGVhZFBvaW50ZXJLZXkFAAAABG5leHQJAARMAAAAAgkBAAAACmNvbGxlY3RGZWUAAAABBQAAAAdmZWVTaXplCQAETAAAAAIFAAAAEWRlY3JlYXNlUXVldWVTaXplBQAAAANuaWwJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABAwUAAAANaXNMYXN0RWxlbWVudAkABEwAAAACBQAAAA1vdmVyd3JpdGVUYWlsBQAAAAVpdGVtcwUAAAAFaXRlbXMJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAHaW52b2tlcgUAAAASYWRkZWRUb0NpcmN1bGF0aW9uCQACWQAAAAEFAAAABEJVTEwFAAAAA25pbAMJAAAAAAAAAgUAAAAFdG9rZW4FAAAABEJFQVIEAAAAEmFkZGVkVG9DaXJjdWxhdGlvbgkAAGsAAAADBQAAAAhiZWFyQ2lyYwUAAAAPYWRkZWRDb2xsYXRlcmFsBQAAAAdiZWFyQ29sBAAAAAVpdGVtcwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAARYmVhckNvbGxhdGVyYWxLZXkJAABkAAAAAgUAAAAHYmVhckNvbAUAAAAPYWRkZWRDb2xsYXRlcmFsCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABJiZWFyQ2lyY3VsYXRpb25LZXkJAABkAAAAAgUAAAAIYmVhckNpcmMFAAAAEmFkZGVkVG9DaXJjdWxhdGlvbgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAOaGVhZFBvaW50ZXJLZXkFAAAABG5leHQJAARMAAAAAgkBAAAACmNvbGxlY3RGZWUAAAABBQAAAAdmZWVTaXplCQAETAAAAAIFAAAAEWRlY3JlYXNlUXVldWVTaXplBQAAAANuaWwJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABAwUAAAANaXNMYXN0RWxlbWVudAkABEwAAAACBQAAAA1vdmVyd3JpdGVUYWlsBQAAAAVpdGVtcwUAAAAFaXRlbXMJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAHaW52b2tlcgUAAAASYWRkZWRUb0NpcmN1bGF0aW9uCQACWQAAAAEFAAAABEJFQVIFAAAAA25pbAkAAAIAAAABAgAAAAxiYWQgdG9rZW4gaWQDCQAAAAAAAAIFAAAABmFjdGlvbgUAAAAGUkVERUVNBAAAAA1yZW1vdmVkVG9rZW5zBQAAAANhbXQDCQAAAAAAAAIFAAAABXRva2VuBQAAAARCVUxMBAAAABFyZW1vdmVkQ29sbGF0ZXJhbAkAAGsAAAADBQAAAAdidWxsQ29sBQAAAA1yZW1vdmVkVG9rZW5zBQAAAAhidWxsQ2lyYwQAAAAHZmVlU2l6ZQkAAGsAAAADBQAAABFyZW1vdmVkQ29sbGF0ZXJhbAUAAAAQcmVkZWVtUGVyY2VudGlsZQAAAAAAAAAnEAQAAAAGcGF5b3V0AwkAAGYAAAACBQAAABFyZW1vdmVkQ29sbGF0ZXJhbAUAAAAHZmVlU2l6ZQkAAGUAAAACBQAAABFyZW1vdmVkQ29sbGF0ZXJhbAUAAAAHZmVlU2l6ZQAAAAAAAAAAAAQAAAAFaXRlbXMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEWJ1bGxDb2xsYXRlcmFsS2V5CQAAZQAAAAIFAAAAB2J1bGxDb2wFAAAAEXJlbW92ZWRDb2xsYXRlcmFsCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABJidWxsQ2lyY3VsYXRpb25LZXkJAABlAAAAAgUAAAAIYnVsbENpcmMFAAAADXJlbW92ZWRUb2tlbnMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADmhlYWRQb2ludGVyS2V5BQAAAARuZXh0CQAETAAAAAIJAQAAAApjb2xsZWN0RmVlAAAAAQUAAAAHZmVlU2l6ZQkABEwAAAACBQAAABFkZWNyZWFzZVF1ZXVlU2l6ZQUAAAADbmlsCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQMFAAAADWlzTGFzdEVsZW1lbnQJAARMAAAAAgUAAAANb3ZlcndyaXRlVGFpbAUAAAAFaXRlbXMFAAAABWl0ZW1zCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAB2ludm9rZXIFAAAABnBheW91dAkAAlkAAAABBQAAAAltYWluVG9rZW4FAAAAA25pbAMJAAAAAAAAAgUAAAAFdG9rZW4FAAAABEJFQVIEAAAAEXJlbW92ZWRDb2xsYXRlcmFsCQAAawAAAAMFAAAAB2JlYXJDb2wFAAAADXJlbW92ZWRUb2tlbnMFAAAACGJlYXJDaXJjBAAAAAdmZWVTaXplCQAAawAAAAMFAAAAEXJlbW92ZWRDb2xsYXRlcmFsBQAAABByZWRlZW1QZXJjZW50aWxlAAAAAAAAACcQBAAAAAZwYXlvdXQDCQAAZgAAAAIFAAAAEXJlbW92ZWRDb2xsYXRlcmFsBQAAAAdmZWVTaXplCQAAZQAAAAIFAAAAEXJlbW92ZWRDb2xsYXRlcmFsBQAAAAdmZWVTaXplAAAAAAAAAAAABAAAAAVpdGVtcwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAARYmVhckNvbGxhdGVyYWxLZXkJAABlAAAAAgUAAAAHYmVhckNvbAUAAAARcmVtb3ZlZENvbGxhdGVyYWwJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEmJlYXJDaXJjdWxhdGlvbktleQkAAGUAAAACBQAAAAhiZWFyQ2lyYwUAAAANcmVtb3ZlZFRva2VucwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAOaGVhZFBvaW50ZXJLZXkFAAAABG5leHQJAARMAAAAAgkBAAAACmNvbGxlY3RGZWUAAAABBQAAAAdmZWVTaXplCQAETAAAAAIFAAAAEWRlY3JlYXNlUXVldWVTaXplBQAAAANuaWwJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABAwUAAAANaXNMYXN0RWxlbWVudAkABEwAAAACBQAAAA1vdmVyd3JpdGVUYWlsBQAAAAVpdGVtcwUAAAAFaXRlbXMJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAHaW52b2tlcgUAAAAGcGF5b3V0CQACWQAAAAEFAAAACW1haW5Ub2tlbgUAAAADbmlsCQAAAgAAAAECAAAADGJhZCB0b2tlbiBpZAkAAAIAAAABCQABLAAAAAICAAAADGJhZCBhY3Rpb246IAUAAAAGYWN0aW9uAQAAAAlyZWJhbGFuY2UAAAAACgEAAAACTFYAAAADAAAAAXYAAAACcDAAAAACcDEEAAAABWRlbm9tAAAAAAAAAABkBAAAAARwbWF4CQAAaQAAAAIDCQAAZgAAAAIFAAAAAnAxBQAAAAJwMAUAAAACcDEFAAAAAnAwBQAAAAVkZW5vbQQAAAAEcG1pbgkAAGkAAAACAwkAAGYAAAACBQAAAAJwMAUAAAACcDEFAAAAAnAxBQAAAAJwMAUAAAAFZGVub20EAAAAAWEJAABoAAAAAgUAAAAEcG1pbgUAAAAEcG1pbgQAAAABYgkAAGUAAAACCQAAaAAAAAIJAABoAAAAAgAAAAAAAAAACQUAAAAEcG1heAUAAAAEcG1heAkAAGgAAAACCQAAaAAAAAIAAAAAAAAAAA8FAAAABHBtYXgFAAAABHBtaW4JAABrAAAAAwUAAAABdgkAAGQAAAACCQAAaAAAAAIAAAAAAAAAAAYFAAAAAWEFAAAAAWIJAABkAAAAAgkAAGgAAAACAAAAAAAAAAAHBQAAAAFhBQAAAAFiBAAAABFzZXR0bGVkUHJpY2VJbmRleAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAGmxhc3RSZWJhbGFuY2VQcmljZUluZGV4S2V5AgAAABFpbmNvbnNpc3RlbnQgZGF0YQQAAAATdW5zZXR0bGVkUHJpY2VJbmRleAkAAGQAAAACBQAAABFzZXR0bGVkUHJpY2VJbmRleAAAAAAAAAAAAQQAAAASc2V0dGxlZFByaWNlSGVpZ2h0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGb3JhY2xlCQABLAAAAAICAAAADHByaWNlX2luZGV4XwkAAaQAAAABBQAAABFzZXR0bGVkUHJpY2VJbmRleAIAAAAoYmFkIG9yYWNsZSBkYXRhIGZvciBzZXR0bGVkIHByaWNlIGhlaWdodAQAAAAMc2V0dGxlZFByaWNlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGb3JhY2xlCQABLAAAAAICAAAABnByaWNlXwkAAaQAAAABBQAAABJzZXR0bGVkUHJpY2VIZWlnaHQCAAAAGWJhZCBvcmFjbGUgZGF0YSBmb3IgcHJpY2UEAAAAD25leHRQcmljZUhlaWdodAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACAgAAAAxwcmljZV9pbmRleF8JAAGkAAAAAQUAAAATdW5zZXR0bGVkUHJpY2VJbmRleAIAAAAUbm8gbmV4dCBwcmljZSBoZWlnaHQEAAAACW5leHRQcmljZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACAgAAAAZwcmljZV8JAAGkAAAAAQUAAAAPbmV4dFByaWNlSGVpZ2h0AgAAAA1ubyBuZXh0IHByaWNlBAAAAAZtaW5Wb2wDCQAAZgAAAAIFAAAAB2JlYXJDb2wFAAAAB2J1bGxDb2wFAAAAB2J1bGxDb2wFAAAAB2JlYXJDb2wEAAAABnJlZGlzdAkBAAAAAkxWAAAAAwUAAAAGbWluVm9sBQAAAAxzZXR0bGVkUHJpY2UFAAAACW5leHRQcmljZQMJAABmAAAAAgUAAAAJbmV4dFByaWNlBQAAAAxzZXR0bGVkUHJpY2UJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEWJ1bGxDb2xsYXRlcmFsS2V5CQAAZAAAAAIFAAAAB2J1bGxDb2wFAAAABnJlZGlzdAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAARYmVhckNvbGxhdGVyYWxLZXkJAABlAAAAAgUAAAAHYmVhckNvbAUAAAAGcmVkaXN0CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABpsYXN0UmViYWxhbmNlUHJpY2VJbmRleEtleQUAAAATdW5zZXR0bGVkUHJpY2VJbmRleAUAAAADbmlsAwkAAGYAAAACBQAAAAxzZXR0bGVkUHJpY2UFAAAACW5leHRQcmljZQkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAARYnVsbENvbGxhdGVyYWxLZXkJAABlAAAAAgUAAAAHYnVsbENvbAUAAAAGcmVkaXN0CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABFiZWFyQ29sbGF0ZXJhbEtleQkAAGQAAAACBQAAAAdiZWFyQ29sBQAAAAZyZWRpc3QJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAGmxhc3RSZWJhbGFuY2VQcmljZUluZGV4S2V5BQAAABN1bnNldHRsZWRQcmljZUluZGV4BQAAAANuaWwJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAGmxhc3RSZWJhbGFuY2VQcmljZUluZGV4S2V5BQAAABN1bnNldHRsZWRQcmljZUluZGV4BQAAAANuaWwAAAAGAAAAA2ludgEAAAAEaW5pdAAAAAUAAAAGYnVsbElkAAAABmJlYXJJZAAAAAttYWluVG9rZW5JZAAAAAhvcmFjbGVQSwAAAAt3aGl0ZWxpc3RlZAMJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAAB0JVTExLZXkJAAACAAAAAQIAAAATYWxyZWFkeSBpbml0aWFsaXplZAMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAANpbnYAAAAHcGF5bWVudAkAAAIAAAABAgAAABluZXV0cmlubyBwYXltZW50IHJlcXVpcmVkAwkBAAAAAiE9AAAAAgkAAlgAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIICQEAAAAFdmFsdWUAAAABCAUAAAADaW52AAAAB3BheW1lbnQAAAAHYXNzZXRJZAIAAAAZbmV1dHJpbm8gcGF5bWVudCByZXF1aXJlZAUAAAALbWFpblRva2VuSWQJAAACAAAAAQIAAAAXcGF5bWVudCBub3QgaW4gbmV1dHJpbm8EAAAAE3RvdGFsT3duZWRNYWluVG9rZW4ICQEAAAAFdmFsdWUAAAABCAUAAAADaW52AAAAB3BheW1lbnQAAAAGYW1vdW50BAAAAAVidWxscwkAAGkAAAACBQAAABN0b3RhbE93bmVkTWFpblRva2VuAAAAAAAAAAACBAAAAAViZWFycwkAAGUAAAACBQAAABN0b3RhbE93bmVkTWFpblRva2VuBQAAAAVidWxscwMDCQAAAAAAAAIFAAAABWJlYXJzAAAAAAAAAAAABgkAAAAAAAACBQAAAAVidWxscwAAAAAAAAAAAAkAAAIAAAABAgAAABNjYW4ndCBpbml0IGJhbGFuY2VzBAAAABdvcmFjbGVDdXJyZW50UHJpY2VJbmRleAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAAhvcmFjbGVQSwIAAAASYmFkIG9yYWNsZSBhZGRyZXNzBQAAABFsYXN0UHJpY2VJbmRleEtleQIAAAAiY2FuJ3QgZmluZCBsYXN0IG9yYWNsZSBwcmljZSBpbmRleAkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAB0JVTExLZXkFAAAABmJ1bGxJZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAHQkVBUktleQUAAAAGYmVhcklkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAxtYWluVG9rZW5LZXkFAAAAC21haW5Ub2tlbklkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAtvcmFjbGVQS0tleQUAAAAIb3JhY2xlUEsJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEWJ1bGxDb2xsYXRlcmFsS2V5BQAAAAVidWxscwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAARYmVhckNvbGxhdGVyYWxLZXkFAAAABWJlYXJzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABJidWxsQ2lyY3VsYXRpb25LZXkFAAAABWJ1bGxzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABJiZWFyQ2lyY3VsYXRpb25LZXkFAAAABWJlYXJzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABpsYXN0UmViYWxhbmNlUHJpY2VJbmRleEtleQUAAAAXb3JhY2xlQ3VycmVudFByaWNlSW5kZXgJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADHdoaXRlbGlzdEtleQUAAAALd2hpdGVsaXN0ZWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEmlzc3VlUGVyY2VudGlsZUtleQAAAAAAAAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAATcmVkZWVtUGVyY2VudGlsZUtleQAAAAAAAAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAALbWluSXNzdWVLZXkAAAAAAAAAAAAJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADG1pblJlZGVlbUtleQAAAAAAAAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAQd2hpdGVsaXN0T25seUtleQYFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAADaW52AAAABmNhbGxlcgUAAAAFYnVsbHMJAAJZAAAAAQUAAAAGYnVsbElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAANpbnYAAAAGY2FsbGVyBQAAAAViZWFycwkAAlkAAAABBQAAAAZiZWFySWQFAAAAA25pbAAAAAFpAQAAAAlzZXRQYXJhbXMAAAAFAAAAAmlQAAAAAnJQAAAAAm1JAAAAAm1SAAAAAndsAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAHm9ubHkgc2VsZiBjYW4gY2hhbmdlIHdoaXRlbGlzdAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAASaXNzdWVQZXJjZW50aWxlS2V5BQAAAAJpUAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAATcmVkZWVtUGVyY2VudGlsZUtleQUAAAACclAJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAC21pbklzc3VlS2V5BQAAAAJtSQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAMbWluUmVkZWVtS2V5BQAAAAJtUgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAQd2hpdGVsaXN0T25seUtleQUAAAACd2wFAAAAA25pbAAAAAFpAQAAAAxzZXRXaGl0ZWxpc3QAAAABAAAAAWwDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAeb25seSBzZWxmIGNhbiBjaGFuZ2Ugd2hpdGVsaXN0CQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAx3aGl0ZWxpc3RLZXkFAAAAAWwFAAAAA25pbAAAAANpbnYBAAAADXJlcXVlc3RSZWRlZW0AAAAAAwkAAAAAAAACCQEAAAAPdmFsaWRhdGVFbnF1ZXVlAAAAAQUAAAADaW52BQAAAAR1bml0BAAAAAdhc3NldElkCQACWAAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAggJAQAAAAV2YWx1ZQAAAAEIBQAAAANpbnYAAAAHcGF5bWVudAAAAAdhc3NldElkAgAAABt3YXZlcyBhcmUgbm90IGFjY2VwdGVkIGhlcmUJAQAAAAdlbnF1ZXVlAAAABgkAAlgAAAABCAUAAAADaW52AAAADXRyYW5zYWN0aW9uSWQFAAAABlJFREVFTQgJAQAAAAV2YWx1ZQAAAAEIBQAAAANpbnYAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAAB2Fzc2V0SWQJAABkAAAAAgUAAAAQb3JhY2xlUHJpY2VJbmRleAAAAAAAAAAAAQkABCUAAAABCAUAAAADaW52AAAABmNhbGxlcgkAAAIAAAABAgAAAA5kb2Vzbid0IGhhcHBlbgAAAANpbnYBAAAADHJlcXVlc3RJc3N1ZQAAAAEAAAAHdG9rZW5JZAMJAAAAAAAAAggFAAAAA2ludgAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAIY2FuJ3QgZG8DAwUAAAANd2hpdGVsaXN0T25seQkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABLMAAAACBQAAAAl3aGl0ZWxpc3QJAAQlAAAAAQgFAAAAA2ludgAAAAZjYWxsZXIHCQAAAgAAAAECAAAAF29ubHkgd2hpdGVsaXN0ZWQgY2FuIGRvBAAAAAxlcnJvck1lc3NhZ2UJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAKb25seSBCVUxMKAUAAAAEQlVMTAIAAAAKKSBvciBCRUFSKAUAAAAEQkVBUgIAAAAsKSB0b2tlbnMgYXJlIGF2YWlsYWJsZSBpbiBleGNoYW5nZSBmb3IgVVNETigFAAAACW1haW5Ub2tlbgIAAAABKQMDCQEAAAACIT0AAAACBQAAAAd0b2tlbklkBQAAAARCVUxMCQEAAAACIT0AAAACBQAAAAd0b2tlbklkBQAAAARCRUFSBwUAAAAMZXJyb3JNZXNzYWdlAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAA2ludgAAAAdwYXltZW50BQAAAAxlcnJvck1lc3NhZ2UDCQEAAAACIT0AAAACCAkBAAAABXZhbHVlAAAAAQgFAAAAA2ludgAAAAdwYXltZW50AAAAB2Fzc2V0SWQJAAJZAAAAAQUAAAAJbWFpblRva2VuBQAAAAxlcnJvck1lc3NhZ2UDCQAAZgAAAAIFAAAACG1pbklzc3VlCAkBAAAABXZhbHVlAAAAAQgFAAAAA2ludgAAAAdwYXltZW50AAAABmFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAqQXR0YWNoZWQgcGF5bWVudCB0b28gc21hbGwuIE1pbiByZXF1aXJlZDogCQABpAAAAAEJAABpAAAAAgUAAAAIbWluSXNzdWUAAAAAAAAPQkACAAAABSBVU0ROCQEAAAAHZW5xdWV1ZQAAAAYJAAJYAAAAAQgFAAAAA2ludgAAAA10cmFuc2FjdGlvbklkBQAAAAVJU1NVRQgJAQAAAAV2YWx1ZQAAAAEIBQAAAANpbnYAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAAB3Rva2VuSWQJAABkAAAAAgUAAAAQb3JhY2xlUHJpY2VJbmRleAAAAAAAAAAAAQkABCUAAAABCAUAAAADaW52AAAABmNhbGxlcgAAAANpbnYBAAAABnNldHRsZQAAAAAEAAAACnF1ZXVlRW1wdHkJAAAAAAAAAgUAAAALaGVhZFBvaW50ZXICAAAAAAQAAAAMY2FuUmViYWxhbmNlCQAAZgAAAAIFAAAAEG9yYWNsZVByaWNlSW5kZXgFAAAAFHJlYmFsYW5jZWRQcmljZUluZGV4AwUAAAAKcXVldWVFbXB0eQMFAAAADGNhblJlYmFsYW5jZQkBAAAACXJlYmFsYW5jZQAAAAAJAAACAAAAAQIAAAAXW09LXSBhbGwgZG9uZSwgY2Fycnkgb24EAAAABGRhdGEJAAS1AAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAC2hlYWRQb2ludGVyAgAAABBiYWQgaGVhZCBwb2ludGVyAgAAAAF8BAAAAApwcmljZUluZGV4CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAEZGF0YQAAAAAAAAAAAwMJAABmAAAAAgUAAAAKcHJpY2VJbmRleAUAAAAUcmViYWxhbmNlZFByaWNlSW5kZXgDBQAAAAxjYW5SZWJhbGFuY2UJAQAAAAlyZWJhbGFuY2UAAAAACQAAAgAAAAECAAAAEVtPS10gbmVlZCB0byB3YWl0AwkAAAAAAAACBQAAAApwcmljZUluZGV4BQAAABRyZWJhbGFuY2VkUHJpY2VJbmRleAkBAAAAB2RlcXVldWUAAAAACQAAAgAAAAECAAAAMGNvcnJ1cHQgZGF0YSwgZnV0dXJlIHByaWNlIGlkIGFscmVhZHkgcmViYWxhbmNlZAAAAAC/bRD9", "chainId": 84, "height": 1116241, "spentComplexity": 0 } View: original | compacted Prev: 9tUhaUtJn6YF5TVg6bMYz6cEn1E4z8jNScYoDaaHYMTE Next: C1Q5XwVgGf6BBHdYevvLsPYnd6Y7LhDdKMGDfhhee56W Diff:
OldNewDifferences
6969
7070 let rebalancedPriceIndex = valueOrErrorMessage(getInteger(this, lastRebalancePriceIndexKey), "no last rebalance price")
7171
72-let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, oracleCurrentPriceIndexKey), "bad oracle data")
72+let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, lastPriceIndexKey), ((("bad oracle data at " + toString(oracle)) + ": no integer at ") + lastPriceIndexKey))
7373
7474 let headPointerKey = "headPointer"
7575
279279 else (bulls == 0))
280280 then throw("can't init balances")
281281 else {
282- let oracleCurrentPriceIndex = valueOrErrorMessage(getInteger(valueOrErrorMessage(addressFromPublicKey(fromBase58String(oraclePK)), "bad oracle address"), oracleCurrentPriceIndexKey), "can't find oracle price id")
282+ let oracleCurrentPriceIndex = valueOrErrorMessage(getInteger(valueOrErrorMessage(addressFromPublicKey(fromBase58String(oraclePK)), "bad oracle address"), lastPriceIndexKey), "can't find last oracle price index")
283283 ScriptResult(WriteSet([DataEntry(BULLKey, bullId), DataEntry(BEARKey, bearId), DataEntry(mainTokenKey, mainTokenId), DataEntry(oraclePKKey, oraclePK), DataEntry(bullCollateralKey, bulls), DataEntry(bearCollateralKey, bears), DataEntry(bullCirculationKey, bulls), DataEntry(bearCirculationKey, bears), DataEntry(lastRebalancePriceIndexKey, oracleCurrentPriceIndex), DataEntry(whitelistKey, whitelisted), DataEntry(issuePercentileKey, 0), DataEntry(redeemPercentileKey, 0), DataEntry(minIssueKey, 0), DataEntry(minRedeemKey, 0), DataEntry(whitelistOnlyKey, true)]), TransferSet([ScriptTransfer(inv.caller, bulls, fromBase58String(bullId)), ScriptTransfer(inv.caller, bears, fromBase58String(bearId))]))
284284 }
285285 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let BULLKey = "BULLId"
55
66 let BEARKey = "BEARId"
77
88 let mainTokenKey = "mainTokenId"
99
1010 let issuePercentileKey = "issuePercentile"
1111
1212 let redeemPercentileKey = "redeemPercentile"
1313
1414 let minIssueKey = "minIssue"
1515
1616 let minRedeemKey = "minRedeem"
1717
1818 let whitelistOnlyKey = "whitelistOnly"
1919
2020 let oraclePKKey = "oracle"
2121
2222 let lastPriceIndexKey = "price_index"
2323
2424 let priceIndexPrefix = "price_index_"
2525
2626 let priceHeightPrefix = "price_"
2727
2828 let oracleCurrentPriceIndexKey = "price_index"
2929
3030 let lastRebalancePriceIndexKey = "lastSettlementPriceId"
3131
3232 let bullCollateralKey = "bullCollateral"
3333
3434 let bearCollateralKey = "bearCollateral"
3535
3636 let bullCirculationKey = "bullCirculation"
3737
3838 let bearCirculationKey = "bearCirculation"
3939
4040 let whitelistKey = "issueWhiteList"
4141
4242 let whitelist = valueOrErrorMessage(getString(this, whitelistKey), "no bullCollateralKey")
4343
4444 let bullCol = valueOrErrorMessage(getInteger(this, bullCollateralKey), "no bullCollateralKey")
4545
4646 let bearCol = valueOrErrorMessage(getInteger(this, bearCollateralKey), "no bearCollateralKey")
4747
4848 let bullCirc = valueOrErrorMessage(getInteger(this, bullCirculationKey), "no bullCirculationKey")
4949
5050 let bearCirc = valueOrErrorMessage(getInteger(this, bearCirculationKey), "no bearCirculationKey")
5151
5252 let BULL = valueOrErrorMessage(getString(this, BULLKey), "no BULLKey")
5353
5454 let BEAR = valueOrErrorMessage(getString(this, BEARKey), "no BEARKey")
5555
5656 let mainToken = valueOrErrorMessage(getString(this, mainTokenKey), "no mainTokenKey")
5757
5858 let issuePercentile = valueOrErrorMessage(getInteger(this, issuePercentileKey), "no issuePercentileKey")
5959
6060 let redeemPercentile = valueOrErrorMessage(getInteger(this, redeemPercentileKey), "no redeemPercentileKey")
6161
6262 let minIssue = valueOrErrorMessage(getInteger(this, minIssueKey), "no minIssueKey")
6363
6464 let minRedeem = valueOrErrorMessage(getInteger(this, minRedeemKey), "no minRedeemKey")
6565
6666 let whitelistOnly = valueOrErrorMessage(getBoolean(this, whitelistOnlyKey), "no whitelistOnlyKey")
6767
6868 let oracle = valueOrErrorMessage(addressFromPublicKey(fromBase58String(valueOrErrorMessage(getString(this, oraclePKKey), "no oraclePKKey"))), "bad oracle address")
6969
7070 let rebalancedPriceIndex = valueOrErrorMessage(getInteger(this, lastRebalancePriceIndexKey), "no last rebalance price")
7171
72-let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, oracleCurrentPriceIndexKey), "bad oracle data")
72+let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, lastPriceIndexKey), ((("bad oracle data at " + toString(oracle)) + ": no integer at ") + lastPriceIndexKey))
7373
7474 let headPointerKey = "headPointer"
7575
7676 let tailPointerKey = "tailPointer"
7777
7878 let queueSizeKey = "queueSize"
7979
8080 let queueSize = match getInteger(this, queueSizeKey) {
8181 case i: Int =>
8282 i
8383 case _ =>
8484 0
8585 }
8686
8787 let headPointer = match getString(this, headPointerKey) {
8888 case s: String =>
8989 s
9090 case _ =>
9191 ""
9292 }
9393
9494 let tailPointer = match getString(this, tailPointerKey) {
9595 case s: String =>
9696 s
9797 case _ =>
9898 ""
9999 }
100100
101101 let feesAccumulatedKey = "feesAccumulated"
102102
103103 let feesAccumulated = match getInteger(this, feesAccumulatedKey) {
104104 case i: Int =>
105105 i
106106 case _ =>
107107 0
108108 }
109109
110110 let ISSUE = "ISSUE"
111111
112112 let REDEEM = "REDEEM"
113113
114114 func buildNewItem (action,amt,token,priceIndex,invoker) = (((((((((action + "|") + toString(amt)) + "|") + token) + "|") + toString(priceIndex)) + "|") + invoker) + "|")
115115
116116
117117 func validateEnqueue (inv) = if ((inv.caller == this))
118118 then throw("can't do")
119119 else {
120120 func errorMessage (got) = throw(((((("only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") tokens are accepted, received: ") + got))
121121
122122 if (!(isDefined(inv.payment)))
123123 then errorMessage("no attached payment")
124124 else {
125125 let assetId = toBase58String(valueOrErrorMessage(value(inv.payment).assetId, "waves are not accepted here"))
126126 if (if ((assetId != BEAR))
127127 then (assetId != BULL)
128128 else false)
129129 then errorMessage(assetId)
130130 else {
131131 let col = if ((assetId == BEAR))
132132 then bearCol
133133 else bullCol
134134 let circ = if ((assetId == BEAR))
135135 then bearCirc
136136 else bearCirc
137137 let estimated = fraction(col, value(inv.payment).amount, circ)
138138 if ((minRedeem > estimated))
139139 then throw((("Attached payment too small. Min redeem amount is " + toString((minRedeem / 1000000))) + " USDN"))
140140 else unit
141141 }
142142 }
143143 }
144144
145145
146146 func enqueue (id,action,amt,token,priceIndex,invoker) = {
147147 let increaseQueueSize = DataEntry(queueSizeKey, (queueSize + 1))
148148 let itm = buildNewItem(action, amt, token, priceIndex, invoker)
149149 if ((queueSize == 0))
150150 then WriteSet([DataEntry(headPointerKey, id), DataEntry(tailPointerKey, id), DataEntry(id, itm), increaseQueueSize])
151151 else {
152152 let prevId = valueOrErrorMessage(getString(this, tailPointerKey), "can't get tail pointer")
153153 let prevItm = split(valueOrErrorMessage(getString(this, prevId), "can't resolve pointer"), "|")
154154 let updatedPrevItm = ((((((((((prevItm[0] + "|") + prevItm[1]) + "|") + prevItm[2]) + "|") + prevItm[3]) + "|") + prevItm[4]) + "|") + id)
155155 WriteSet([DataEntry(prevId, updatedPrevItm), DataEntry(id, itm), DataEntry(tailPointerKey, id), increaseQueueSize])
156156 }
157157 }
158158
159159
160160 func dequeue () = if ((queueSize == 0))
161161 then throw("nothing to settle")
162162 else {
163163 func collectFee (fees) = DataEntry(feesAccumulatedKey, (feesAccumulated + fees))
164164
165165 let decreaseQueueSize = DataEntry(queueSizeKey, (queueSize - 1))
166166 let isLastElement = (headPointer == tailPointer)
167167 let overwriteTail = DataEntry(tailPointerKey, "")
168168 let data = split(valueOrErrorMessage(getString(this, headPointer), "bad head pointer"), "|")
169169 let action = data[0]
170170 let amt = parseIntValue(data[1])
171171 let token = data[2]
172172 let priceIndex = parseIntValue(data[3])
173173 let invoker = addressFromStringValue(data[4])
174174 let next = data[5]
175175 if ((rebalancedPriceIndex > priceIndex))
176176 then throw(((("corrupt state, rebalancedPriceIndex=" + toString(rebalancedPriceIndex)) + ", request price id=") + toString(priceIndex)))
177177 else if ((priceIndex > rebalancedPriceIndex))
178178 then throw("can't dequeue, too early, rebalance first")
179179 else if ((action == ISSUE))
180180 then {
181181 let feeSize = fraction(amt, issuePercentile, 10000)
182182 let addedCollateral = (amt - feeSize)
183183 if ((token == BULL))
184184 then {
185185 let addedToCirculation = fraction(bullCirc, addedCollateral, bullCol)
186186 let items = [DataEntry(bullCollateralKey, (bullCol + addedCollateral)), DataEntry(bullCirculationKey, (bullCirc + addedToCirculation)), DataEntry(headPointerKey, next), collectFee(feeSize), decreaseQueueSize]
187187 ScriptResult(WriteSet(if (isLastElement)
188188 then overwriteTail :: items
189189 else items), TransferSet([ScriptTransfer(invoker, addedToCirculation, fromBase58String(BULL))]))
190190 }
191191 else if ((token == BEAR))
192192 then {
193193 let addedToCirculation = fraction(bearCirc, addedCollateral, bearCol)
194194 let items = [DataEntry(bearCollateralKey, (bearCol + addedCollateral)), DataEntry(bearCirculationKey, (bearCirc + addedToCirculation)), DataEntry(headPointerKey, next), collectFee(feeSize), decreaseQueueSize]
195195 ScriptResult(WriteSet(if (isLastElement)
196196 then overwriteTail :: items
197197 else items), TransferSet([ScriptTransfer(invoker, addedToCirculation, fromBase58String(BEAR))]))
198198 }
199199 else throw("bad token id")
200200 }
201201 else if ((action == REDEEM))
202202 then {
203203 let removedTokens = amt
204204 if ((token == BULL))
205205 then {
206206 let removedCollateral = fraction(bullCol, removedTokens, bullCirc)
207207 let feeSize = fraction(removedCollateral, redeemPercentile, 10000)
208208 let payout = if ((removedCollateral > feeSize))
209209 then (removedCollateral - feeSize)
210210 else 0
211211 let items = [DataEntry(bullCollateralKey, (bullCol - removedCollateral)), DataEntry(bullCirculationKey, (bullCirc - removedTokens)), DataEntry(headPointerKey, next), collectFee(feeSize), decreaseQueueSize]
212212 ScriptResult(WriteSet(if (isLastElement)
213213 then overwriteTail :: items
214214 else items), TransferSet([ScriptTransfer(invoker, payout, fromBase58String(mainToken))]))
215215 }
216216 else if ((token == BEAR))
217217 then {
218218 let removedCollateral = fraction(bearCol, removedTokens, bearCirc)
219219 let feeSize = fraction(removedCollateral, redeemPercentile, 10000)
220220 let payout = if ((removedCollateral > feeSize))
221221 then (removedCollateral - feeSize)
222222 else 0
223223 let items = [DataEntry(bearCollateralKey, (bearCol - removedCollateral)), DataEntry(bearCirculationKey, (bearCirc - removedTokens)), DataEntry(headPointerKey, next), collectFee(feeSize), decreaseQueueSize]
224224 ScriptResult(WriteSet(if (isLastElement)
225225 then overwriteTail :: items
226226 else items), TransferSet([ScriptTransfer(invoker, payout, fromBase58String(mainToken))]))
227227 }
228228 else throw("bad token id")
229229 }
230230 else throw(("bad action: " + action))
231231 }
232232
233233
234234 func rebalance () = {
235235 func LV (v,p0,p1) = {
236236 let denom = 100
237237 let pmax = ((if ((p1 > p0))
238238 then p1
239239 else p0) / denom)
240240 let pmin = ((if ((p0 > p1))
241241 then p1
242242 else p0) / denom)
243243 let a = (pmin * pmin)
244244 let b = (((9 * pmax) * pmax) - ((15 * pmax) * pmin))
245245 fraction(v, ((6 * a) + b), ((7 * a) + b))
246246 }
247247
248248 let settledPriceIndex = valueOrErrorMessage(getInteger(this, lastRebalancePriceIndexKey), "inconsistent data")
249249 let unsettledPriceIndex = (settledPriceIndex + 1)
250250 let settledPriceHeight = valueOrErrorMessage(getInteger(oracle, ("price_index_" + toString(settledPriceIndex))), "bad oracle data for settled price height")
251251 let settledPrice = valueOrErrorMessage(getInteger(oracle, ("price_" + toString(settledPriceHeight))), "bad oracle data for price")
252252 let nextPriceHeight = valueOrErrorMessage(getInteger(oracle, ("price_index_" + toString(unsettledPriceIndex))), "no next price height")
253253 let nextPrice = valueOrErrorMessage(getInteger(oracle, ("price_" + toString(nextPriceHeight))), "no next price")
254254 let minVol = if ((bearCol > bullCol))
255255 then bullCol
256256 else bearCol
257257 let redist = LV(minVol, settledPrice, nextPrice)
258258 if ((nextPrice > settledPrice))
259259 then WriteSet([DataEntry(bullCollateralKey, (bullCol + redist)), DataEntry(bearCollateralKey, (bearCol - redist)), DataEntry(lastRebalancePriceIndexKey, unsettledPriceIndex)])
260260 else if ((settledPrice > nextPrice))
261261 then WriteSet([DataEntry(bullCollateralKey, (bullCol - redist)), DataEntry(bearCollateralKey, (bearCol + redist)), DataEntry(lastRebalancePriceIndexKey, unsettledPriceIndex)])
262262 else WriteSet([DataEntry(lastRebalancePriceIndexKey, unsettledPriceIndex)])
263263 }
264264
265265
266266 @Callable(inv)
267267 func init (bullId,bearId,mainTokenId,oraclePK,whitelisted) = if (isDefined(getString(this, BULLKey)))
268268 then throw("already initialized")
269269 else if (!(isDefined(inv.payment)))
270270 then throw("neutrino payment required")
271271 else if ((toBase58String(valueOrErrorMessage(value(inv.payment).assetId, "neutrino payment required")) != mainTokenId))
272272 then throw("payment not in neutrino")
273273 else {
274274 let totalOwnedMainToken = value(inv.payment).amount
275275 let bulls = (totalOwnedMainToken / 2)
276276 let bears = (totalOwnedMainToken - bulls)
277277 if (if ((bears == 0))
278278 then true
279279 else (bulls == 0))
280280 then throw("can't init balances")
281281 else {
282- let oracleCurrentPriceIndex = valueOrErrorMessage(getInteger(valueOrErrorMessage(addressFromPublicKey(fromBase58String(oraclePK)), "bad oracle address"), oracleCurrentPriceIndexKey), "can't find oracle price id")
282+ let oracleCurrentPriceIndex = valueOrErrorMessage(getInteger(valueOrErrorMessage(addressFromPublicKey(fromBase58String(oraclePK)), "bad oracle address"), lastPriceIndexKey), "can't find last oracle price index")
283283 ScriptResult(WriteSet([DataEntry(BULLKey, bullId), DataEntry(BEARKey, bearId), DataEntry(mainTokenKey, mainTokenId), DataEntry(oraclePKKey, oraclePK), DataEntry(bullCollateralKey, bulls), DataEntry(bearCollateralKey, bears), DataEntry(bullCirculationKey, bulls), DataEntry(bearCirculationKey, bears), DataEntry(lastRebalancePriceIndexKey, oracleCurrentPriceIndex), DataEntry(whitelistKey, whitelisted), DataEntry(issuePercentileKey, 0), DataEntry(redeemPercentileKey, 0), DataEntry(minIssueKey, 0), DataEntry(minRedeemKey, 0), DataEntry(whitelistOnlyKey, true)]), TransferSet([ScriptTransfer(inv.caller, bulls, fromBase58String(bullId)), ScriptTransfer(inv.caller, bears, fromBase58String(bearId))]))
284284 }
285285 }
286286
287287
288288
289289 @Callable(i)
290290 func setParams (iP,rP,mI,mR,wl) = if ((i.caller != this))
291291 then throw("only self can change whitelist")
292292 else WriteSet([DataEntry(issuePercentileKey, iP), DataEntry(redeemPercentileKey, rP), DataEntry(minIssueKey, mI), DataEntry(minRedeemKey, mR), DataEntry(whitelistOnlyKey, wl)])
293293
294294
295295
296296 @Callable(i)
297297 func setWhitelist (l) = if ((i.caller != this))
298298 then throw("only self can change whitelist")
299299 else WriteSet([DataEntry(whitelistKey, l)])
300300
301301
302302
303303 @Callable(inv)
304304 func requestRedeem () = if ((validateEnqueue(inv) == unit))
305305 then {
306306 let assetId = toBase58String(valueOrErrorMessage(value(inv.payment).assetId, "waves are not accepted here"))
307307 enqueue(toBase58String(inv.transactionId), REDEEM, value(inv.payment).amount, assetId, (oraclePriceIndex + 1), toString(inv.caller))
308308 }
309309 else throw("doesn't happen")
310310
311311
312312
313313 @Callable(inv)
314314 func requestIssue (tokenId) = if ((inv.caller == this))
315315 then throw("can't do")
316316 else if (if (whitelistOnly)
317317 then !(isDefined(indexOf(whitelist, toString(inv.caller))))
318318 else false)
319319 then throw("only whitelisted can do")
320320 else {
321321 let errorMessage = throw((((((("only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") tokens are available in exchange for USDN(") + mainToken) + ")"))
322322 if (if ((tokenId != BULL))
323323 then (tokenId != BEAR)
324324 else false)
325325 then errorMessage
326326 else if (!(isDefined(inv.payment)))
327327 then errorMessage
328328 else if ((value(inv.payment).assetId != fromBase58String(mainToken)))
329329 then errorMessage
330330 else if ((minIssue > value(inv.payment).amount))
331331 then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
332332 else enqueue(toBase58String(inv.transactionId), ISSUE, value(inv.payment).amount, tokenId, (oraclePriceIndex + 1), toString(inv.caller))
333333 }
334334
335335
336336
337337 @Callable(inv)
338338 func settle () = {
339339 let queueEmpty = (headPointer == "")
340340 let canRebalance = (oraclePriceIndex > rebalancedPriceIndex)
341341 if (queueEmpty)
342342 then if (canRebalance)
343343 then rebalance()
344344 else throw("[OK] all done, carry on")
345345 else {
346346 let data = split(valueOrErrorMessage(getString(this, headPointer), "bad head pointer"), "|")
347347 let priceIndex = parseIntValue(data[3])
348348 if ((priceIndex > rebalancedPriceIndex))
349349 then if (canRebalance)
350350 then rebalance()
351351 else throw("[OK] need to wait")
352352 else if ((priceIndex == rebalancedPriceIndex))
353353 then dequeue()
354354 else throw("corrupt data, future price id already rebalanced")
355355 }
356356 }
357357
358358

github/deemru/w8io/3ef1775 
72.54 ms