tx · 8NfaQ8gHfBULnMVLWNv2jJfwjfwjBssDJmXo3mWWzYwz

3N1GV8JC5YrZEAennbKL7BSrJUV4wMi2QiW:  -0.01000000 Waves

2020.04.13 17:45 [952756] smart account 3N1GV8JC5YrZEAennbKL7BSrJUV4wMi2QiW > SELF 0.00000000 Waves

{ "type": 13, "id": "8NfaQ8gHfBULnMVLWNv2jJfwjfwjBssDJmXo3mWWzYwz", "fee": 1000000, "feeAssetId": null, "timestamp": 1586789156955, "version": 1, "sender": "3N1GV8JC5YrZEAennbKL7BSrJUV4wMi2QiW", "senderPublicKey": "H8smePdyyUsH68QbPLqpmnVXYYYB2wjKihZFc8Kjwk7a", "proofs": [ "e6XUsMa9DBnaA7ap8zVbcGNjD5uyC9uhn85JDgk8ZYhoXif9vPdgxx2ZQmfbidjghUeB71bUeXzPERjQ5bxHXKJ" ], "script": "base64:AAIDAAAAAAAAABQIARIHCgUICAgICBIAEgMKAQgSAAAAAB4AAAAAB0JVTExLZXkCAAAABkJVTExJZAAAAAAHQkVBUktleQIAAAAGQkVBUklkAAAAAAxtYWluVG9rZW5LZXkCAAAAC21haW5Ub2tlbklkAAAAABBvcmFjbGVBZGRyZXNzS2V5AgAAAAZvcmFjbGUAAAAAF29yYWNsZUN1cnJlbnRQcmljZUlkS2V5AgAAAAtsYXN0UHJpY2VJZAAAAAAXbGFzdFJlYmFsYW5jZVByaWNlSWRLZXkCAAAAFWxhc3RTZXR0bGVtZW50UHJpY2VJZAAAAAARYnVsbENvbGxhdGVyYWxLZXkCAAAADmJ1bGxDb2xsYXRlcmFsAAAAABFiZWFyQ29sbGF0ZXJhbEtleQIAAAAOYmVhckNvbGxhdGVyYWwAAAAAEmJ1bGxDaXJjdWxhdGlvbktleQIAAAAPYnVsbENpcmN1bGF0aW9uAAAAABJiZWFyQ2lyY3VsYXRpb25LZXkCAAAAD2JlYXJDaXJjdWxhdGlvbgAAAAAHYnVsbENvbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEWJ1bGxDb2xsYXRlcmFsS2V5AgAAABRubyBidWxsQ29sbGF0ZXJhbEtleQAAAAAHYmVhckNvbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEWJlYXJDb2xsYXRlcmFsS2V5AgAAABRubyBiZWFyQ29sbGF0ZXJhbEtleQAAAAAIYnVsbENpcmMJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABJidWxsQ2lyY3VsYXRpb25LZXkCAAAAFW5vIGJ1bGxDaXJjdWxhdGlvbktleQAAAAAIYmVhckNpcmMJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABJiZWFyQ2lyY3VsYXRpb25LZXkCAAAAFW5vIGJlYXJDaXJjdWxhdGlvbktleQAAAAAEQlVMTAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAB0JVTExLZXkCAAAACm5vIEJVTExLZXkAAAAABEJFQVIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAdCRUFSS2V5AgAAAApubyBCRUFSS2V5AAAAAAltYWluVG9rZW4JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAxtYWluVG9rZW5LZXkCAAAAD25vIG1haW5Ub2tlbktleQAAAAAGb3JhY2xlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAQAAABFhZGRyZXNzRnJvbVN0cmluZwAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAABBvcmFjbGVBZGRyZXNzS2V5AgAAABNubyBvcmFjbGVBZGRyZXNzS2V5AgAAABJiYWQgb3JhY2xlIGFkZHJlc3MAAAAAEXJlYmFsYW5jZWRQcmljZUlkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAXbGFzdFJlYmFsYW5jZVByaWNlSWRLZXkCAAAAF25vIGxhc3QgcmViYWxhbmNlIHByaWNlAAAAAA1vcmFjbGVQcmljZUlkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGb3JhY2xlBQAAABdvcmFjbGVDdXJyZW50UHJpY2VJZEtleQIAAAAPYmFkIG9yYWNsZSBkYXRhAAAAAA5oZWFkUG9pbnRlcktleQIAAAALaGVhZFBvaW50ZXIAAAAADnRhaWxQb2ludGVyS2V5AgAAAAt0YWlsUG9pbnRlcgAAAAALaGVhZFBvaW50ZXIEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwUAAAAOaGVhZFBvaW50ZXJLZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABcwUAAAAHJG1hdGNoMAUAAAABcwIAAAAAAAAAAAt0YWlsUG9pbnRlcgQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzBQAAAA50YWlsUG9pbnRlcktleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIA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BQAAAA5oZWFkUG9pbnRlcktleQUAAAAEbmV4dAUAAAADbmlsCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQMFAAAADWlzTGFzdEVsZW1lbnQJAARMAAAAAgUAAAANb3ZlcndyaXRlVGFpbAUAAAAFaXRlbXMFAAAABWl0ZW1zCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAB2ludm9rZXIFAAAAEmFkZGVkVG9DaXJjdWxhdGlvbgkAAlkAAAABBQAAAARCVUxMBQAAAANuaWwDCQAAAAAAAAIFAAAABXRva2VuBQAAAARCRUFSBAAAABJhZGRlZFRvQ2lyY3VsYXRpb24JAABrAAAAAwUAAAAIYmVhckNpcmMFAAAAD2FkZGVkQ29sbGF0ZXJhbAUAAAAHYmVhckNvbAQAAAAFaXRlbXMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEWJlYXJDb2xsYXRlcmFsS2V5CQAAZAAAAAIFAAAAB2JlYXJDb2wFAAAAD2FkZGVkQ29sbGF0ZXJhbAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAASYmVhckNpcmN1bGF0aW9uS2V5CQAAZAAAAAIFAAAACGJlYXJDaXJjBQAAABJhZGRlZFRvQ2lyY3VsYXRpb24JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADmhlYWRQb2ludGVyS2V5BQAAAARuZXh0BQAAAANuaWwJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABAwUAAAANaXNMYXN0RWxlbWVudAkABEwAAAACBQAAAA1vdmVyd3JpdGVUYWlsBQAAAAVpdGVtcwUAAAAFaXRlbXMJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAHaW52b2tlcgUAAAASYWRkZWRUb0NpcmN1bGF0aW9uCQACWQAAAAEFAAAABEJFQVIFAAAAA25pbAkAAAIAAAABAgAAAAxiYWQgdG9rZW4gaWQDCQAAAAAAAAIFAAAABmFjdGlvbgUAAAAGUkVERUVNBAAAAA1yZW1vdmVkVG9rZW5zBQAAAANhbXQDCQAAAAAAAAIFAAAABXRva2VuBQAAAARCVUxMBAAAABFyZW1vdmVkQ29sbGF0ZXJhbAkAAGsAAAADBQAAAAdidWxsQ29sBQAAAA1yZW1vdmVkVG9rZW5zBQAAAAhidWxsQ2lyYwQAAAAFaXRlbXMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEWJ1bGxDb2xsYXRlcmFsS2V5CQAAZQAAAAIFAAAAB2J1bGxDb2wFAAAAEXJlbW92ZWRDb2xsYXRlcmFsCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABJidWxsQ2lyY3VsYXRpb25LZXkJAABlAAAAAgUAAAAIYnVsbENpcmMFAAAADXJlbW92ZWRUb2tlbnMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADmhlYWRQb2ludGVyS2V5BQAAAARuZXh0BQAAAANuaWwJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABAwUAAAANaXNMYXN0RWxlbWVudAkABEwAAAACBQAAAA1vdmVyd3JpdGVUYWlsBQAAAAVpdGVtcwUAAAAFaXRlbXMJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAHaW52b2tlcgUAAAARcmVtb3ZlZENvbGxhdGVyYWwJAAJZAAAAAQUAAAAJbWFpblRva2VuBQAAAANuaWwDCQAAAAAAAAIFAAAABXRva2VuBQAAAARCRUFSBAAAABFyZW1vdmVkQ29sbGF0ZXJhbAkAAGsAAAADBQAAAAdiZWFyQ29sBQAAAA1yZW1vdmVkVG9rZW5zBQAAAAhiZWFyQ2lyYwQAAAAFaXRlbXMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEWJlYXJDb2xsYXRlcmFsS2V5CQAAZQAAAAIFAAAAB2JlYXJDb2wFAAAAEXJlbW92ZWRDb2xsYXRlcmFsCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABJiZWFyQ2lyY3VsYXRpb25LZXkJAABlAAAAAgUAAAAIYmVhckNpcmMFAAAADXJlbW92ZWRUb2tlbnMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADmhlYWRQb2ludGVyS2V5BQAAAARuZXh0BQAAAANuaWwJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABAwUAAAANaXNMYXN0RWxlbWVudAkABEwAAAACBQAAAA1vdmVyd3JpdGVUYWlsBQAAAAVpdGVtcwUAAAAFaXRlbXMJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAHaW52b2tlcgUAAAARcmVtb3ZlZENvbGxhdGVyYWwJAAJZAAAAAQUAAAAJbWFpblRva2VuBQAAAANuaWwJAAACAAAAAQIAAAAMYmFkIHRva2VuIGlkCQAAAgAAAAEJAAEsAAAAAgIAAAAMYmFkIGFjdGlvbjogBQAAAAZhY3Rpb24BAAAACXJlYmFsYW5jZQAAAAAKAQAAAAJMVgAAAAMAAAABdgAAAAJwMAAAAAJwMQQAAAAFZGVub20AAAAAAAAAAGQEAAAABHBtYXgJAABpAAAAAgMJAABmAAAAAgUAAAACcDEFAAAAAnAwBQAAAAJwMQUAAAACcDAFAAAABWRlbm9tBAAAAARwbWluCQAAaQAAAAIDCQAAZgAAAAIFAAAAAnAwBQAAAAJwMQUAAAACcDEFAAAAAnAwBQAAAAVkZW5vbQQAAAABYQkAAGgAAAACBQAAAARwbWluBQAAAARwbWluBAAAAAFiCQAAZQAAAAIJAABoAAAAAgkAAGgAAAACAAAAAAAAAAAJBQAAAARwbWF4BQAAAARwbWF4CQAAaAAAAAIJAABoAAAAAgAAAAAAAAAADwUAAAAEcG1heAUAAAAEcG1pbgkAAGsAAAADBQAAAAF2CQAAZAAAAAIJAABoAAAAAgAAAAAAAAAABgUAAAABYQUAAAABYgkAAGQAAAACCQAAaAAAAAIAAAAAAAAAAAcFAAAAAWEFAAAAAWIEAAAADnNldHRsZWRQcmljZUlkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAXbGFzdFJlYmFsYW5jZVByaWNlSWRLZXkCAAAAEWluY29uc2lzdGVudCBkYXRhBAAAABB1bnNldHRsZWRQcmljZUlkCQAAZAAAAAIFAAAADnNldHRsZWRQcmljZUlkAAAAAAAAAAABBAAAAAxzZXR0bGVkUHJpY2UJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZvcmFjbGUJAAGkAAAAAQUAAAAOc2V0dGxlZFByaWNlSWQCAAAAIWJhZCBvcmFjbGUgZGF0YSBmb3Igc2VsbHRlZCBwcmljZQQAAAAJbmV4dFByaWNlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGb3JhY2xlCQABpAAAAAEFAAAAEHVuc2V0dGxlZFByaWNlSWQCAAAADW5vIG5leHQgcHJpY2UEAAAABm1pblZvbAMJAABmAAAAAgUAAAAHYmVhckNvbAUAAAAHYnVsbENvbAUAAAAHYnVsbENvbAUAAAAHYmVhckNvbAQAAAAGcmVkaXN0CQEAAAACTFYAAAADBQAAAAZtaW5Wb2wFAAAADHNldHRsZWRQcmljZQUAAAAJbmV4dFByaWNlAwkAAGYAAAACBQAAAAluZXh0UHJpY2UFAAAADHNldHRsZWRQcmljZQkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAARYnVsbENvbGxhdGVyYWxLZXkJAABkAAAAAgUAAAAHYnVsbENvbAUAAAAGcmVkaXN0CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABFiZWFyQ29sbGF0ZXJhbEtleQkAAGUAAAACBQAAAAdiZWFyQ29sBQAAAAZyZWRpc3QJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAF2xhc3RSZWJhbGFuY2VQcmljZUlkS2V5BQAAABB1bnNldHRsZWRQcmljZUlkBQAAAANuaWwDCQAAZgAAAAIFAAAADHNldHRsZWRQcmljZQUAAAAJbmV4dFByaWNlCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABFidWxsQ29sbGF0ZXJhbEtleQkAAGUAAAACBQAAAAdidWxsQ29sBQAAAAZyZWRpc3QJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEWJlYXJDb2xsYXRlcmFsS2V5CQAAZAAAAAIFAAAAB2JlYXJDb2wFAAAABnJlZGlzdAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAXbGFzdFJlYmFsYW5jZVByaWNlSWRLZXkFAAAAEHVuc2V0dGxlZFByaWNlSWQFAAAAA25pbAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAXbGFzdFJlYmFsYW5jZVByaWNlSWRLZXkFAAAAEHVuc2V0dGxlZFByaWNlSWQFAAAAA25pbAAAAAQAAAADaW52AQAAAARpbml0AAAABQAAAAZidWxsSWQAAAAGYmVhcklkAAAAC21haW5Ub2tlbklkAAAADW9yYWNsZUFkZHJlc3MAAAAJaW5pdGlhdG9yAwkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAEdGhpcwUAAAAHQlVMTEtleQkAAAIAAAABAgAAABNhbHJlYWR5IGluaXRpYWxpemVkAwkBAAAAAiE9AAAAAggFAAAAA2ludgAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAASb25seSBzZWxmIGNhbiBpbml0BAAAABN0b3RhbE93bmVkTWFpblRva2VuCQAD6wAAAAIFAAAABHRoaXMJAAJZAAAAAQUAAAALbWFpblRva2VuSWQEAAAABWJ1bGxzCQAAaQAAAAIFAAAAE3RvdGFsT3duZWRNYWluVG9rZW4AAAAAAAAAAAIEAAAABWJlYXJzCQAAZQAAAAIFAAAAE3RvdGFsT3duZWRNYWluVG9rZW4FAAAABWJ1bGxzAwMJAAAAAAAAAgUAAAAFYmVhcnMAAAAAAAAAAAAGCQAAAAAAAAIFAAAABWJ1bGxzAAAAAAAAAAAACQAAAgAAAAECAAAAE2Nhbid0IGluaXQgYmFsYW5jZXMEAAAAFG9yYWNsZUN1cnJlbnRQcmljZUlkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQEAAAARYWRkcmVzc0Zyb21TdHJpbmcAAAABBQAAAA1vcmFjbGVBZGRyZXNzAgAAABJiYWQgb3JhY2xlIGFkZHJlc3MFAAAAF29yYWNsZUN1cnJlbnRQcmljZUlkS2V5AgAAABpjYW4ndCBmaW5kIG9yYWNsZSBwcmljZSBpZAQAAAAJcmVjaXBpZW50CQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAACWluaXRpYXRvcgkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAB0JVTExLZXkFAAAABmJ1bGxJZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAHQkVBUktleQUAAAAGYmVhcklkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAxtYWluVG9rZW5LZXkFAAAAC21haW5Ub2tlbklkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABBvcmFjbGVBZGRyZXNzS2V5BQAAAA1vcmFjbGVBZGRyZXNzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABFidWxsQ29sbGF0ZXJhbEtleQUAAAAFYnVsbHMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEWJlYXJDb2xsYXRlcmFsS2V5BQAAAAViZWFycwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAASYnVsbENpcmN1bGF0aW9uS2V5BQAAAAVidWxscwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAASYmVhckNpcmN1bGF0aW9uS2V5BQAAAAViZWFycwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAXbGFzdFJlYmFsYW5jZVByaWNlSWRLZXkFAAAAFG9yYWNsZUN1cnJlbnRQcmljZUlkBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAJcmVjaXBpZW50BQAAAAVidWxscwkAAlkAAAABBQAAAAZidWxsSWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAJcmVjaXBpZW50BQAAAAViZWFycwkAAlkAAAABBQAAAAZiZWFySWQFAAAAA25pbAAAAANpbnYBAAAADXJlcXVlc3RSZWRlZW0AAAAAAwkAAAAAAAACCAUAAAADaW52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", "chainId": 84, "height": 952756, "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 3 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let BULLKey = "BULLId"
5+
6+let BEARKey = "BEARId"
7+
8+let mainTokenKey = "mainTokenId"
9+
10+let oracleAddressKey = "oracle"
11+
12+let oracleCurrentPriceIdKey = "lastPriceId"
13+
14+let lastRebalancePriceIdKey = "lastSettlementPriceId"
15+
16+let bullCollateralKey = "bullCollateral"
17+
18+let bearCollateralKey = "bearCollateral"
19+
20+let bullCirculationKey = "bullCirculation"
21+
22+let bearCirculationKey = "bearCirculation"
23+
24+let bullCol = valueOrErrorMessage(getInteger(this, bullCollateralKey), "no bullCollateralKey")
25+
26+let bearCol = valueOrErrorMessage(getInteger(this, bearCollateralKey), "no bearCollateralKey")
27+
28+let bullCirc = valueOrErrorMessage(getInteger(this, bullCirculationKey), "no bullCirculationKey")
29+
30+let bearCirc = valueOrErrorMessage(getInteger(this, bearCirculationKey), "no bearCirculationKey")
31+
32+let BULL = valueOrErrorMessage(getString(this, BULLKey), "no BULLKey")
33+
34+let BEAR = valueOrErrorMessage(getString(this, BEARKey), "no BEARKey")
35+
36+let mainToken = valueOrErrorMessage(getString(this, mainTokenKey), "no mainTokenKey")
37+
38+let oracle = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, oracleAddressKey), "no oracleAddressKey")), "bad oracle address")
39+
40+let rebalancedPriceId = valueOrErrorMessage(getInteger(this, lastRebalancePriceIdKey), "no last rebalance price")
41+
42+let oraclePriceId = valueOrErrorMessage(getInteger(oracle, oracleCurrentPriceIdKey), "bad oracle data")
43+
44+let headPointerKey = "headPointer"
45+
46+let tailPointerKey = "tailPointer"
47+
48+let headPointer = match getString(this, headPointerKey) {
49+ case s: String =>
50+ s
51+ case _ =>
52+ ""
53+}
54+
55+let tailPointer = match getString(this, tailPointerKey) {
56+ case s: String =>
57+ s
58+ case _ =>
59+ ""
60+}
61+
62+let ISSUE = "ISSUE"
63+
64+let REDEEM = "REDEEM"
65+
66+func buildNewItem (action,amt,token,priceId,invoker) = (((((((((action + "|") + toString(amt)) + "|") + token) + "|") + toString(priceId)) + "|") + invoker) + "|")
67+
68+
69+func enqueue (id,action,amt,token,priceId,invoker) = if ((tailPointer == ""))
70+ then {
71+ let itm = buildNewItem(action, amt, token, priceId, invoker)
72+ WriteSet([DataEntry(headPointerKey, id), DataEntry(tailPointerKey, id), DataEntry(id, itm)])
73+ }
74+ else {
75+ let prevId = valueOrErrorMessage(getString(this, tailPointerKey), "can't get tail pointer")
76+ let prevItm = split(valueOrErrorMessage(getString(this, prevId), "can't resolve pointer"), "|")
77+ let updatedPrevItm = ((((((((((prevItm[0] + "|") + prevItm[1]) + "|") + prevItm[2]) + "|") + prevItm[3]) + "|") + prevItm[4]) + "|") + id)
78+ let itm = buildNewItem(action, amt, token, priceId, invoker)
79+ WriteSet([DataEntry(prevId, updatedPrevItm), DataEntry(id, itm), DataEntry(tailPointerKey, id)])
80+ }
81+
82+
83+func dequeue () = if ((headPointer == ""))
84+ then throw("nothing to settle")
85+ else {
86+ let isLastElement = (headPointer == tailPointer)
87+ let overwriteTail = DataEntry(tailPointerKey, "")
88+ let data = split(valueOrErrorMessage(getString(this, headPointer), "bad head pointer"), "|")
89+ let action = data[0]
90+ let amt = parseIntValue(data[1])
91+ let token = data[2]
92+ let priceId = parseIntValue(data[3])
93+ let invoker = addressFromStringValue(data[4])
94+ let next = data[5]
95+ if ((rebalancedPriceId > priceId))
96+ then throw(((("corrupt state, rebalancedPriceId=" + toString(rebalancedPriceId)) + ", request price id=") + toString(priceId)))
97+ else if ((priceId > rebalancedPriceId))
98+ then throw("can't dequeue, too early, rebalance first")
99+ else if ((action == ISSUE))
100+ then {
101+ let addedCollateral = amt
102+ if ((token == BULL))
103+ then {
104+ let addedToCirculation = fraction(bullCirc, addedCollateral, bullCol)
105+ let items = [DataEntry(bullCollateralKey, (bullCol + addedCollateral)), DataEntry(bullCirculationKey, (bullCirc + addedToCirculation)), DataEntry(headPointerKey, next)]
106+ ScriptResult(WriteSet(if (isLastElement)
107+ then overwriteTail :: items
108+ else items), TransferSet([ScriptTransfer(invoker, addedToCirculation, fromBase58String(BULL))]))
109+ }
110+ else if ((token == BEAR))
111+ then {
112+ let addedToCirculation = fraction(bearCirc, addedCollateral, bearCol)
113+ let items = [DataEntry(bearCollateralKey, (bearCol + addedCollateral)), DataEntry(bearCirculationKey, (bearCirc + addedToCirculation)), DataEntry(headPointerKey, next)]
114+ ScriptResult(WriteSet(if (isLastElement)
115+ then overwriteTail :: items
116+ else items), TransferSet([ScriptTransfer(invoker, addedToCirculation, fromBase58String(BEAR))]))
117+ }
118+ else throw("bad token id")
119+ }
120+ else if ((action == REDEEM))
121+ then {
122+ let removedTokens = amt
123+ if ((token == BULL))
124+ then {
125+ let removedCollateral = fraction(bullCol, removedTokens, bullCirc)
126+ let items = [DataEntry(bullCollateralKey, (bullCol - removedCollateral)), DataEntry(bullCirculationKey, (bullCirc - removedTokens)), DataEntry(headPointerKey, next)]
127+ ScriptResult(WriteSet(if (isLastElement)
128+ then overwriteTail :: items
129+ else items), TransferSet([ScriptTransfer(invoker, removedCollateral, fromBase58String(mainToken))]))
130+ }
131+ else if ((token == BEAR))
132+ then {
133+ let removedCollateral = fraction(bearCol, removedTokens, bearCirc)
134+ let items = [DataEntry(bearCollateralKey, (bearCol - removedCollateral)), DataEntry(bearCirculationKey, (bearCirc - removedTokens)), DataEntry(headPointerKey, next)]
135+ ScriptResult(WriteSet(if (isLastElement)
136+ then overwriteTail :: items
137+ else items), TransferSet([ScriptTransfer(invoker, removedCollateral, fromBase58String(mainToken))]))
138+ }
139+ else throw("bad token id")
140+ }
141+ else throw(("bad action: " + action))
142+ }
143+
144+
145+func rebalance () = {
146+ func LV (v,p0,p1) = {
147+ let denom = 100
148+ let pmax = ((if ((p1 > p0))
149+ then p1
150+ else p0) / denom)
151+ let pmin = ((if ((p0 > p1))
152+ then p1
153+ else p0) / denom)
154+ let a = (pmin * pmin)
155+ let b = (((9 * pmax) * pmax) - ((15 * pmax) * pmin))
156+ fraction(v, ((6 * a) + b), ((7 * a) + b))
157+ }
158+
159+ let settledPriceId = valueOrErrorMessage(getInteger(this, lastRebalancePriceIdKey), "inconsistent data")
160+ let unsettledPriceId = (settledPriceId + 1)
161+ let settledPrice = valueOrErrorMessage(getInteger(oracle, toString(settledPriceId)), "bad oracle data for sellted price")
162+ let nextPrice = valueOrErrorMessage(getInteger(oracle, toString(unsettledPriceId)), "no next price")
163+ let minVol = if ((bearCol > bullCol))
164+ then bullCol
165+ else bearCol
166+ let redist = LV(minVol, settledPrice, nextPrice)
167+ if ((nextPrice > settledPrice))
168+ then WriteSet([DataEntry(bullCollateralKey, (bullCol + redist)), DataEntry(bearCollateralKey, (bearCol - redist)), DataEntry(lastRebalancePriceIdKey, unsettledPriceId)])
169+ else if ((settledPrice > nextPrice))
170+ then WriteSet([DataEntry(bullCollateralKey, (bullCol - redist)), DataEntry(bearCollateralKey, (bearCol + redist)), DataEntry(lastRebalancePriceIdKey, unsettledPriceId)])
171+ else WriteSet([DataEntry(lastRebalancePriceIdKey, unsettledPriceId)])
172+ }
173+
174+
175+@Callable(inv)
176+func init (bullId,bearId,mainTokenId,oracleAddress,initiator) = if (isDefined(getString(this, BULLKey)))
177+ then throw("already initialized")
178+ else if ((inv.caller != this))
179+ then throw("only self can init")
180+ else {
181+ let totalOwnedMainToken = assetBalance(this, fromBase58String(mainTokenId))
182+ let bulls = (totalOwnedMainToken / 2)
183+ let bears = (totalOwnedMainToken - bulls)
184+ if (if ((bears == 0))
185+ then true
186+ else (bulls == 0))
187+ then throw("can't init balances")
188+ else {
189+ let oracleCurrentPriceId = valueOrErrorMessage(getInteger(valueOrErrorMessage(addressFromString(oracleAddress), "bad oracle address"), oracleCurrentPriceIdKey), "can't find oracle price id")
190+ let recipient = addressFromStringValue(initiator)
191+ ScriptResult(WriteSet([DataEntry(BULLKey, bullId), DataEntry(BEARKey, bearId), DataEntry(mainTokenKey, mainTokenId), DataEntry(oracleAddressKey, oracleAddress), DataEntry(bullCollateralKey, bulls), DataEntry(bearCollateralKey, bears), DataEntry(bullCirculationKey, bulls), DataEntry(bearCirculationKey, bears), DataEntry(lastRebalancePriceIdKey, oracleCurrentPriceId)]), TransferSet([ScriptTransfer(recipient, bulls, fromBase58String(bullId)), ScriptTransfer(recipient, bears, fromBase58String(bearId))]))
192+ }
193+ }
194+
195+
196+
197+@Callable(inv)
198+func requestRedeem () = if ((inv.caller == this))
199+ then throw("can't do")
200+ else {
201+ func errorMessage (got) = throw(((((("only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") tokens are accepted, received: ") + got))
202+
203+ if (!(isDefined(inv.payment)))
204+ then errorMessage("no attached payment")
205+ else {
206+ let assetId = toBase58String(valueOrErrorMessage(value(inv.payment).assetId, "waves are not accepted here"))
207+ if (if ((assetId != BEAR))
208+ then (assetId != BULL)
209+ else false)
210+ then errorMessage(assetId)
211+ else enqueue(toBase58String(inv.transactionId), REDEEM, value(inv.payment).amount, assetId, (oraclePriceId + 1), toString(inv.caller))
212+ }
213+ }
214+
215+
216+
217+@Callable(inv)
218+func requestIssue (tokenId) = if ((inv.caller == this))
219+ then throw("can't do")
220+ else {
221+ let errorMessage = throw((((((("only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") tokens are available in exchange for USDN(") + mainToken) + ")"))
222+ if (if ((tokenId != BULL))
223+ then (tokenId != BEAR)
224+ else false)
225+ then errorMessage
226+ else if (!(isDefined(inv.payment)))
227+ then errorMessage
228+ else if ((value(inv.payment).assetId != fromBase58String(mainToken)))
229+ then errorMessage
230+ else enqueue(toBase58String(inv.transactionId), ISSUE, value(inv.payment).amount, tokenId, (oraclePriceId + 1), toString(inv.caller))
231+ }
232+
233+
234+
235+@Callable(inv)
236+func settle () = {
237+ let queueEmpty = (headPointer == "")
238+ let canRebalance = (oraclePriceId > rebalancedPriceId)
239+ if (queueEmpty)
240+ then if (canRebalance)
241+ then rebalance()
242+ else throw("[OK] all done, carry on")
243+ else {
244+ let data = split(valueOrErrorMessage(getString(this, headPointer), "bad head pointer"), "|")
245+ let priceId = parseIntValue(data[3])
246+ if ((priceId > rebalancedPriceId))
247+ then if (canRebalance)
248+ then rebalance()
249+ else throw("[OK] need to wait")
250+ else if ((priceId == rebalancedPriceId))
251+ then dequeue()
252+ else throw("corrupt data, future price id already rebalanced")
253+ }
254+ }
255+
256+

github/deemru/w8io/873ac7e 
21.75 ms