tx · 94YcD23cVGNXNU8YRow3MjaLTdKRVFf1cQJSwZrfEi4u

3Mr4AtgcKHK4v4VnNDdFcyJGR1kSFkKU7RU:  -0.01400000 Waves

2022.03.10 16:54 [1957927] smart account 3Mr4AtgcKHK4v4VnNDdFcyJGR1kSFkKU7RU > SELF 0.00000000 Waves

{ "type": 13, "id": "94YcD23cVGNXNU8YRow3MjaLTdKRVFf1cQJSwZrfEi4u", "fee": 1400000, "feeAssetId": null, "timestamp": 1646920468050, "version": 2, "chainId": 84, "sender": "3Mr4AtgcKHK4v4VnNDdFcyJGR1kSFkKU7RU", "senderPublicKey": "CBrP6pyJ9ht8Dei2HsD8DvNtxNYEw47NcFxatXjR6k8i", "proofs": [ "3WjR3D46CckZyxcX69mRfX4sxBqURYwDctPvU4G9ixFBhTmP6YkFATKSsa5sQRx5mVVJadPFcG26dpiMe8zzCFBe", "3HP7FAY2sUmo2wTo7SqRVuWYnw5gm6SSCUhL3vYbHswhducxeHdJvpt5BDaKquXDex6BZTun6y469aoLLuTX6RwB" ], "script": "base64:AAIFAAAAAAAAACMIAhIAEgASBAoCAQESABIECgIBARIAEgASABIAEgUKAwQBCAAAAFIAAAAAB3ZlcnNpb24CAAAABTIuMC4wAAAAAAhrVmVyc2lvbgIAAAAHdmVyc2lvbgAAAAAHa0FjdGl2ZQIAAAAGYWN0aXZlAAAAAAlrQXNzZXRJZEECAAAACkFfYXNzZXRfaWQAAAAACWtBc3NldElkQgIAAAAKQl9hc3NldF9pZAAAAAAJa0JhbGFuY2VBAgAAAA9BX2Fzc2V0X2JhbGFuY2UAAAAACWtCYWxhbmNlQgIAAAAPQl9hc3NldF9iYWxhbmNlAAAAAA1rU2hhcmVBc3NldElkAgAAAA5zaGFyZV9hc3NldF9pZAAAAAARa1NoYXJlQXNzZXRTdXBwbHkCAAAAEnNoYXJlX2Fzc2V0X3N1cHBseQAAAAAEa0ZlZQIAAAAKY29tbWlzc2lvbgAAAAASa0ZlZVNjYWxlRGVsaW1pdGVyAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAAKa0ludmFyaWFudAIAAAAJaW52YXJpYW50AAAAAAZrQ2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAABJrZXlVU0ROTlNCVEFkZHJlc3MCAAAAGHN0YWtpbmdfdXNkbm5zYnRfYWRkcmVzcwAAAAAOa2V5RVVSTkFkZHJlc3MCAAAAFHN0YWtpbmdfZXVybl9hZGRyZXNzAAAAAA9rZXlBZG1pblB1YktleTECAAAAC2FkbWluX3B1Yl8xAAAAAA9rZXlBZG1pblB1YktleTICAAAAC2FkbWluX3B1Yl8yAAAAAA9rZXlBZG1pblB1YktleTMCAAAAC2FkbWluX3B1Yl8zAAAAABRVU0ROVG9XYXZlc0V4Y2hhbmdlcgkBAAAAB0FkZHJlc3MAAAABAQAAABoBVLyvLOw52HwgF6zPLvnW0fXFIi/xmKAk8gAAAAAGb3JhY2xlCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU6UWqHpAvOq7xug7mLpqSXxqYhOHzYrMIAQAAAAtnZXRBZG1pblB1YgAAAAEAAAALa2V5QWRtaW5QdWIEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAGb3JhY2xlBQAAAAtrZXlBZG1pblB1YgMJAAABAAAAAgUAAAAHJG1h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bnRCYWxhbmNlAAAAAQUAAAAIYXNzZXRJZEICAAAAASAFAAAACmFzc2V0TmFtZUIBAAAAGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwAAAAIAAAAFc3Rha2UAAAAHYXNzZXRJZAMFAAAABXN0YWtlAwkAAAAAAAACBQAAAAdhc3NldElkBQAAAARVU0ROCQAFFAAAAAICAAAADGxvY2tOZXV0cmlubwUAAAAWc3Rha2luZ1VTRE5OU0JUQWRkcmVzcwkABRQAAAACAgAAAAxzdGFydFN0YWtpbmcFAAAAEnN0YWtpbmdFVVJOQWRkcmVzcwMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAEVVNETgkABRQAAAACAgAAAA51bmxvY2tOZXV0cmlubwUAAAAWc3Rha2luZ1VTRE5OU0JUQWRkcmVzcwkABRQAAAACAgAAAAtzdG9wU3Rha2luZwUAAAASc3Rha2luZ0VVUk5BZGRyZXNzAQAAABFjYWxjU3Rha2luZ1BhcmFtcwAAAAMAAAAFc3Rha2UAAAAGYW1vdW50AAAAB2Fzc2V0SWQDBQAAAAVzdGFrZQQAAAALJHQwOTcxMTk3NzcJAQAAABhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMAAAACBQAAAAVzdGFrZQUAAAAHYXNzZXRJZAQAAAAEY2FsbAgFAAAACyR0MDk3MTE5Nzc3AAAAAl8xBAAAAAtzdGFraW5nQWRkcggFAAAACyR0MDk3MTE5Nzc3AAAAAl8yCQAFFgAAAAQFAAAABGNhbGwFAAAAC3N0YWtpbmdBZGRyBQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIFAAAAB2Fzc2V0SWQFAAAABmFtb3VudAUAAAADbmlsBAAAAAskdDA5ODYzOTkyOQkBAAAAGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwAAAAIFAAAABXN0YWtlBQAAAAdhc3NldElkBAAAAARjYWxsCAUAAAALJHQwOTg2Mzk5MjkAAAACXzEEAAAAC3N0YWtpbmdBZGRyCAUAAAALJHQwOTg2Mzk5MjkAAAACXzIJAAUWAAAABAUAAAAEY2FsbAUAAAALc3Rha2luZ0FkZHIJAARMAAAAAgUAAAAGYW1vdW50CQAETAAAAAIJAAJYAAAAAQUA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YXlBbW91bnQGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BQAAAAxzaGFyZUFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAZjaGFuZ2UFAAAADWNoYW5nZUFzc2V0SWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAFXJlcGxlbmlzaFdpdGhPbmVUb2tlbgAAAAIAAAATdmlydHVhbFN3YXBUb2tlblBheQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAAIaXNBY3RpdmUAAAAABAAAAA0kdDAxNTI5NTE1MzcwCQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAANJHQwMTUyOTUxNTM3MAAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAADSR0MDE1Mjk1MTUzNzAAAAACXzIEAAAADSR0MDE1Mzc1MTU0NDgJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAApwbXRBc3NldElkBAAAAA1wbXRTdHJBc3NldElkCAUAAAANJHQwMTUzNzUxNTQ0OAAAAAJfMQQAAAAMcG10QXNzZXROYW1lCAUAAAANJHQwMTUzNzUxNTQ0OAAAAAJfMgQAAAALcG10RGVjaW1hbHMIBQAAAA0kdDAxNTM3NTE1NDQ4AAAAAl8zBAAAAA9wbXRNaW5UaHJlc2hvbGQAAAAAAABMS0AEAAAAHXRocmVzaG9sZFZhbHVlRm9yTWluVG9sZXJhbmNlAAAAAAAC+vCABAAAAAl0b2xlcmFuY2UDCQAAZgAAAAIFAAAAHXRocmVzaG9sZFZhbHVlRm9yTWluVG9sZXJhbmNlBQAAAAlwbXRBbW91bnQAAAAAAAABhqAAAAAAAAAAAAEEAAAAHHNsaXBwYWdlVmFsdWVNaW5Gb3JSZXBsZW5pc2gJAABlAAAAAgUAAAAGc2NhbGU4CQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGU4BQAAAAl0b2xlcmFuY2UAAAAAAACYloAEAAAAHHNsaXBwYWdlVmFsdWVNYXhGb3JSZXBsZW5pc2gJAABkAAAAAgUAAAAGc2NhbGU4CQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGU4BQAAAAl0b2xlcmFuY2UAAAAAAACYloAEAAAAF3NsaXBwYWdlVmFsdWVNaW5Gb3JTd2FwCQAAZQAAAAIFAAAABnNjYWxlOAkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlOAAAAAAAAAAAAQAAAAAAAJiWgAMJAABmAAAAAgUAAAAPcG10TWluVGhyZXNob2xkBQAAAAlwbXRBbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAA9QYXltZW50IGFtb3VudCAJAAGkAAAAAQUAAAAJcG10QW1vdW50AgAAACcgZG9lcyBub3QgZXhjZWVkIHRoZSBtaW5pbXVtIGFtb3VudCBvZiAJAAGkAAAAAQUAAAAPcG10TWluVGhyZXNob2xkAgAAAAcgdG9rZW5zAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkBAAAAD3Rocm93T25lUGF5bWVudAAAAAADCQEAAAABIQAAAAEFAAAAEGhhc0Vub3VnaEJhbGFuY2UJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAAAwMJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRBCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQgcJAQAAAAt0aHJvd0Fzc2V0cwAAAAAEAAAADSR0MDE2Mzg2MTcxNTEDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRBCQAFGQAAAAcJAABlAAAAAgUAAAAJcG10QW1vdW50BQAAABN2aXJ0dWFsU3dhcFRva2VuUGF5BQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAABN2aXJ0dWFsU3dhcFRva2VuUGF5CQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUIJAAUZAAAABwUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGUAAAACBQAAAAlwbXRBbW91bnQFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAAIYmFsYW5jZUEJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUEJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAQAAAARdmlydHVhbFJlcGxlbmlzaEEIBQAAAA0kdDAxNjM4NjE3MTUxAAAAAl8xBAAAABF2aXJ0dWFsUmVwbGVuaXNoQggFAAAADSR0MDE2Mzg2MTcxNTEAAAACXzIEAAAAEWJhbGFuY2VBZnRlclN3YXBBCAUAAAANJHQwMTYzODYxNzE1MQAAAAJfMwQAAAARYmFsYW5jZUFmdGVyU3dhcEIIBQAAAA0kdDAxNjM4NjE3MTUxAAAAAl80BAAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCAUAAAANJHQwMTYzODYxNzE1MQAAAAJfNQQAAAALbmV3QmFsYW5jZUEIBQAAAA0kdDAxNjM4NjE3MTUxAAAAAl82BAAAAAtuZXdCYWxhbmNlQggFAAAADSR0MDE2Mzg2MTcxNTEAAAACXzcEAAAAD25ld0JhbGFuY2VFbnRyeQMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUEFAAAAC25ld0JhbGFuY2VBCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgQAAAAMaW52YXJpYW50TmV3CQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAAEWJhbGFuY2VBZnRlclN3YXBBBQAAABFiYWxhbmNlQWZ0ZXJTd2FwQgQAAAAXaW52YXJpYW50RXN0aW1hdGVkUmF0aW8JAABrAAAAAwUAAAAGc2NhbGU4BQAAAAlpbnZhcmlhbnQFAAAADGludmFyaWFudE5ldwQAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAkAAGkAAAACCQAAawAAAAMJAABoAAAAAgUAAAAGc2NhbGU4BQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBBBQAAABFiYWxhbmNlQWZ0ZXJTd2FwQgkAAGsAAAADBQAAAAZzY2FsZTgFAAAAEXZpcnR1YWxSZXBsZW5pc2hBBQAAABF2aXJ0dWFsUmVwbGVuaXNoQgQAAAATZEFwcFRocmVzaG9sZEFtb3VudAkAAGsAAAADCQAAZAAAAAIFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgUAAAANZEFwcFRocmVzaG9sZAkAAGgAAAACAAAAAAAAAAACBQAAABNkQXBwVGhyZXNob2xkU2NhbGUyAwMJAABnAAAAAgUAAAAXc2xpcHBhZ2VWYWx1ZU1pbkZvclN3YXAFAAAAF2ludmFyaWFudEVzdGltYXRlZFJhdGlvBgkAAGYAAAACBQAAAAlpbnZhcmlhbnQFAAAADGludmFyaWFudE5ldwkAAAIAAAABAgAAADpJbmNvcnJlY3QgdmlydHVhbFN3YXBUb2tlblBheSBvciB2aXJ0dWFsU3dhcFRva2VuR2V0IHZhbHVlAwMJAABmAAAAAgUAAAAcc2xpcHBhZ2VWYWx1ZU1pbkZvclJlcGxlbmlzaAUAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAYJAABmAAAAAgUAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAUAAAAcc2xpcHBhZ2VWYWx1ZU1heEZvclJlcGxlbmlzaAkAAAIAAAABAgAAAGxTd2FwIHdpdGggdmlydHVhbFN3YXBUb2tlblBheSBhbmQgdmlydHVhbFN3YXBUb2tlbkdldCBpcyBwb3NzaWJsZSwgYnV0IHJhdGlvIGFmdGVyIHZpcnR1YWwgc3dhcCBpcyBpbmNvcnJlY3QDAwkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQYJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUIJAQAAAA50aHJvd1RocmVzaG9sZAAAAAMFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgQAAAAGc3Rha2UxAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADXBtdFN0ckFzc2V0SWQJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAACXBtdEFtb3VudAkABEwAAAACBQAAAA1wbXRTdHJBc3NldElkBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAGc3Rha2UxBQAAAAZzdGFrZTEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAABrAAAAAwUAAAARdmlydHVhbFJlcGxlbmlzaEEFAAAABnNjYWxlOAUAAAARYmFsYW5jZUFmdGVyU3dhcEEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIJAABrAAAAAwUAAAARdmlydHVhbFJlcGxlbmlzaEIFAAAABnNjYWxlOAUAAAARYmFsYW5jZUFmdGVyU3dhcEIEAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAAGsAAAADCQABlwAAAAEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkABEwAAAACBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5CBQAAAANuaWwFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAABnNjYWxlOAkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAADHNoYXJlQXNzZXRJZAUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUAAAAMc2hhcmVBc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQkAAGQAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAARMAAAAAgUAAAAPbmV3QmFsYW5jZUVudHJ5CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACHdpdGhkcmF3AAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAACGlzQWN0aXZlAAAAAAQAAAANJHQwMTk0MDExOTU0NAkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDE5NDAxMTk1NDQAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAxOTQwMTE5NTQ0AAAAAl8yBAAAAAxhbW91bnRUb1BheUEJAABrAAAAAwUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQQUAAAAQc2hhcmVBc3NldFN1cHBseQQAAAAMYW1vdW50VG9QYXlCCQAAawAAAAMFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUIFAAAAEHNoYXJlQXNzZXRTdXBwbHkEAAAA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aGFuZ2VSYXRpb0xpbWl0TWluCQAAawAAAAMFAAAABnNjYWxlOAUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQGCQAAZgAAAAIJAABrAAAAAwUAAAAGc2NhbGU4BQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUFAAAACXBtdEFtb3VudAUAAAAVZXhjaGFuZ2VSYXRpb0xpbWl0TWF4CQAAAgAAAAECAAAAHEluY29ycmVjdCBhcmdzIGFuZCBwbXQgcmF0aW8EAAAAC3NlbmRBc3NldElkAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQUAAAAIYXNzZXRJZEIFAAAACGFzc2V0SWRBBAAAAA0kdDAyMjE3MzIyMjkyCQEAAAATY2FsY3VsYXRlU2VuZEFtb3VudAAAAAQFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQEAAAABmFtb3VudAgFAAAADSR0MDIyMTczMjIyOTIAAAACXzEEAAAADmFtb3VudEludmFyaWFuCAUAAAANJHQwMjIxNzMyMjI5MgAAAAJfMgQAAAAQZ292ZXJuYW5jZVJld2FyZAkAAGsAAAADBQAAAAZhbW91bnQFAAAADWZlZUdvdmVybmFuY2UFAAAACWZlZVNjYWxlNgQAAAAOYW1vdW50TWludXNGZWUJAABrAAAAAwUAAAAGYW1vdW50CQAAZQAAAAIFAAAACWZlZVNjYWxlNgUAAAADZmVlBQAAAAlmZWVTY2FsZTYEAAAADSR0MDIyNDQ4MjI3MTADCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRBCQAFFAAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACXBtdEFtb3VudAkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkABRQAAAACCQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAADmFtb3VudE1pbnVzRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAAlwbXRBbW91bnQEAAAAC25ld0JhbGFuY2VBCAUAAAANJHQwMjI0NDgyMjcxMAAAAAJfMQQAAAALbmV3QmFsYW5jZUIIBQAAAA0kdDAyMjQ0ODIyNzEwAAAAAl8yBAAAABNkQXBwVGhyZXNob2xkQW1vdW50CQAAawAAAAMJAABkAAAAAgUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBQAAAA1kQXBwVGhyZXNob2xkCQAAaAAAAAIAAAAAAAAAAAIFAAAAE2RBcHBUaHJlc2hvbGRTY2FsZTIDAwkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQYJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUIJAQAAAA50aHJvd1RocmVzaG9sZAAAAAMFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgQAAAANJHQwMjMwMDgyMzA4MQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAACnBtdEFzc2V0SWQEAAAADXBtdFN0ckFzc2V0SWQIBQAAAA0kdDAyMzAwODIzMDgxAAAAAl8xBAAAAAxwbXRBc3NldE5hbWUIBQAAAA0kdDAyMzAwODIzMDgxAAAAAl8yBAAAAAtwbXREZWNpbWFscwgFAAAADSR0MDIzMDA4MjMwODEAAAACXzMEAAAADSR0MDIzMDk0MjMxNzEJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtzZW5kQXNzZXRJZAQAAAAOc2VuZFN0ckFzc2V0SWQIBQAAAA0kdDAyMzA5NDIzMTcxAAAAAl8xBAAAAA1zZW5kQXNzZXROYW1lCAUAAAANJHQwMjMwOTQyMzE3MQAAAAJfMgQAAAAMc2VuZERlY2ltYWxzCAUAAAANJHQwMjMwOTQyMzE3MQAAAAJfMwQAAAAGc3Rha2UxAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADXBtdFN0ckFzc2V0SWQJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAE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Z2VyRW50cnkAAAACCQABLAAAAAICAAAADGxhc3RfaW5jb21lXwUAAAALc3RyQXNzZXRJZEEFAAAADWFtb3VudEVucm9sbEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgIAAAAMbGFzdF9pbmNvbWVfBQAAAAtzdHJBc3NldElkQgUAAAANYW1vdW50RW5yb2xsQgUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAUd3JpdGVCaWdJbnRJbnZhcmlhbnQAAAAACQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAALaXNBZG1pbkNhbGwAAAABBQAAAAFpBAAAAAxpbnZhcmlhbnROZXcJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAAIYmFsYW5jZUEFAAAACGJhbGFuY2VCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAAAxpbnZhcmlhbnROZXcFAAAAA25pbAAAAAFpAQAAAAxzdGFrZVVuc3Rha2UAAAADAAAABXN0YWtlAAAABmFtb3VudAAAAA1hc3NldElkU3RyaW5nAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAALU9ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBpbnZva2UgdGhpcyBmdW5jdGlvbgQAAAANJHQwMjYxMzYyNjIzOQkBAAAAEWNhbGNTdGFraW5nUGFyYW1zAAAAAwUAAAAFc3Rha2UFAAAABmFtb3VudAkAAlkAAAABBQAAAA1hc3NldElkU3RyaW5nBAAAAARjYWxsCAUAAAANJHQwMjYxMzYyNjIzOQAAAAJfMQQAAAAEYWRkcggFAAAADSR0MDI2MTM2MjYyMzkAAAACXzIEAAAABnBhcmFtcwgFAAAADSR0MDI2MTM2MjYyMzkAAAACXzMEAAAACHBheW1lbnRzCAUAAAANJHQwMjYxMzYyNjIzOQAAAAJfNAQAAAADaW52CQAD/AAAAAQFAAAABGFkZHIFAAAABGNhbGwFAAAABnBhcmFtcwUAAAAIcGF5bWVudHMDCQAAAAAAAAIFAAAAA2ludgUAAAADaW52BQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAATbXVsdGlTaWduZWRCeUFkbWlucwQAAAASYWRtaW5QdWJLZXkxU2lnbmVkAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAADGFkbWluUHViS2V5MQAAAAAAAAAAAQAAAAAAAAAAAAQAAAASYWRtaW5QdWJLZXkyU2lnbmVkAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAEFAAAADGFkbWluUHViS2V5MgAAAAAAAAAAAQAAAAAAAAAAAAQAAAASYWRtaW5QdWJLZXkzU2lnbmVkAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAIFAAAADGFkbWluUHViS2V5MwAAAAAAAAAAAQAAAAAAAAAAAAkAAGcAAAACCQAAZAAAAAIJAABkAAAAAgUAAAASYWRtaW5QdWJLZXkxU2lnbmVkBQAAABJhZG1pblB1YktleTJTaWduZWQFAAAAEmFkbWluUHViS2V5M1NpZ25lZAAAAAAAAAAAAgQAAAAHJG1hdGNoMAUAAAACdHgDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBAAAAANpbnYFAAAAByRtYXRjaDAEAAAAE2NhbGxUYWtlSW50b0FjY291bnQDCQAAAAAAAAIIBQAAAANpbnYAAAAEZEFwcAUAAAAEdGhpcwkAAAAAAAACCAUAAAADaW52AAAACGZ1bmN0aW9uAgAAABl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzBwQAAAANc2lnbmVkQnlBZG1pbgMDAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAADGFkbWluUHViS2V5MQYJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAAxhZG1pblB1YktleTIGCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAMYWRtaW5QdWJLZXkzBgkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAACmFkbVN0YWtpbmcDAwUAAAATY2FsbFRha2VJbnRvQWNjb3VudAUAAAANc2lnbmVkQnlBZG1pbgcGBQAAABNtdWx0aVNpZ25lZEJ5QWRtaW5zBQAAABNtdWx0aVNpZ25lZEJ5QWRtaW5zml6qjg==", "height": 1957927, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6zyWSXV9ZtsyJfHv9BFaQ5tmp2Vqs6qjJiL7Hqdnk4e8 Next: QoeUaL6niL2tqWt6LXiLKzLA3S39N7GqC8osZUjvBCc Diff:
OldNewDifferences
5454 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
5555
5656 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
57+
58+let admStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
5759
5860 let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
5961
324326
325327 func calcStakingParams (stake,amount,assetId) = if (stake)
326328 then {
327- let $t096399705 = calcStakingFuncAndAddres(stake, assetId)
328- let call = $t096399705._1
329- let stakingAddr = $t096399705._2
329+ let $t097119777 = calcStakingFuncAndAddres(stake, assetId)
330+ let call = $t097119777._1
331+ let stakingAddr = $t097119777._2
330332 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
331333 }
332334 else {
333- let $t097919857 = calcStakingFuncAndAddres(stake, assetId)
334- let call = $t097919857._1
335- let stakingAddr = $t097919857._2
335+ let $t098639929 = calcStakingFuncAndAddres(stake, assetId)
336+ let call = $t098639929._1
337+ let stakingAddr = $t098639929._2
336338 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
337339 }
338340
339341
340342 @Callable(i)
341343 func init () = {
342- let $t0996210039 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
343- let pmtAmountA = $t0996210039._1
344- let pmtAssetIdA = $t0996210039._2
345- let $t01004410121 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
346- let pmtAmountB = $t01004410121._1
347- let pmtAssetIdB = $t01004410121._2
348- let $t01012610203 = getAssetInfo(pmtAssetIdA)
349- let pmtStrAssetIdA = $t01012610203._1
350- let pmtAssetNameA = $t01012610203._2
351- let pmtDecimalsA = $t01012610203._3
352- let $t01020810285 = getAssetInfo(pmtAssetIdB)
353- let pmtStrAssetIdB = $t01020810285._1
354- let pmtAssetNameB = $t01020810285._2
355- let pmtDecimalsB = $t01020810285._3
344+ let $t01003410111 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
345+ let pmtAmountA = $t01003410111._1
346+ let pmtAssetIdA = $t01003410111._2
347+ let $t01011610193 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
348+ let pmtAmountB = $t01011610193._1
349+ let pmtAssetIdB = $t01011610193._2
350+ let $t01019810275 = getAssetInfo(pmtAssetIdA)
351+ let pmtStrAssetIdA = $t01019810275._1
352+ let pmtAssetNameA = $t01019810275._2
353+ let pmtDecimalsA = $t01019810275._3
354+ let $t01028010357 = getAssetInfo(pmtAssetIdB)
355+ let pmtStrAssetIdB = $t01028010357._1
356+ let pmtAssetNameB = $t01028010357._2
357+ let pmtDecimalsB = $t01028010357._3
356358 if (isDefined(getBoolean(this, kActive)))
357359 then throwIsActive()
358360 else if ((pmtAssetIdA == pmtAssetIdB))
389391 let pmtAssetIdB = i.payments[1].assetId
390392 let ratioShareTokensInA = fraction(scale8, i.payments[0].amount, balanceA)
391393 let ratioShareTokensInB = fraction(scale8, i.payments[1].amount, balanceB)
392- let $t01286612943 = getAssetInfo(pmtAssetIdA)
393- let pmtStrAssetIdA = $t01286612943._1
394- let pmtAssetNameA = $t01286612943._2
395- let pmtDecimalsA = $t01286612943._3
396- let $t01294813065 = getAssetInfo(pmtAssetIdB)
397- let pmtStrAssetIdB = $t01294813065._1
398- let pmtAssetNameB = $t01294813065._2
399- let pmtDecimalsB = $t01294813065._3
400- let $t01307013574 = if ((ratioShareTokensInB > ratioShareTokensInA))
394+ let $t01293813015 = getAssetInfo(pmtAssetIdA)
395+ let pmtStrAssetIdA = $t01293813015._1
396+ let pmtAssetNameA = $t01293813015._2
397+ let pmtDecimalsA = $t01293813015._3
398+ let $t01302013137 = getAssetInfo(pmtAssetIdB)
399+ let pmtStrAssetIdB = $t01302013137._1
400+ let pmtAssetNameB = $t01302013137._2
401+ let pmtDecimalsB = $t01302013137._3
402+ let $t01314213646 = if ((ratioShareTokensInB > ratioShareTokensInA))
401403 then {
402404 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
403405 $Tuple5(i.payments[0].amount, pmt, (i.payments[1].amount - pmt), pmtAssetIdB, ratioShareTokensInA)
406408 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
407409 $Tuple5(pmt, i.payments[1].amount, (i.payments[0].amount - pmt), pmtAssetIdA, ratioShareTokensInB)
408410 }
409- let pmtAmountA = $t01307013574._1
410- let pmtAmountB = $t01307013574._2
411- let change = $t01307013574._3
412- let changeAssetId = $t01307013574._4
413- let shareTokenRatio = $t01307013574._5
411+ let pmtAmountA = $t01314213646._1
412+ let pmtAmountB = $t01314213646._2
413+ let change = $t01314213646._3
414+ let changeAssetId = $t01314213646._4
415+ let shareTokenRatio = $t01314213646._5
414416 let shareTokenToPayAmount = fraction(shareTokenRatio, shareAssetSupply, scale8)
415417 if ((size(i.payments) != 2))
416418 then throw("Two attached assets expected")
445447
446448 @Callable(i)
447449 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = valueOrElse(isActive(), {
448- let $t01522315298 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
449- let pmtAmount = $t01522315298._1
450- let pmtAssetId = $t01522315298._2
451- let $t01530315376 = getAssetInfo(pmtAssetId)
452- let pmtStrAssetId = $t01530315376._1
453- let pmtAssetName = $t01530315376._2
454- let pmtDecimals = $t01530315376._3
450+ let $t01529515370 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
451+ let pmtAmount = $t01529515370._1
452+ let pmtAssetId = $t01529515370._2
453+ let $t01537515448 = getAssetInfo(pmtAssetId)
454+ let pmtStrAssetId = $t01537515448._1
455+ let pmtAssetName = $t01537515448._2
456+ let pmtDecimals = $t01537515448._3
455457 let pmtMinThreshold = 5000000
456458 let thresholdValueForMinTolerance = 50000000
457459 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
471473 else false)
472474 then throwAssets()
473475 else {
474- let $t01631417079 = if ((pmtAssetId == assetIdA))
476+ let $t01638617151 = if ((pmtAssetId == assetIdA))
475477 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
476478 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
477- let virtualReplenishA = $t01631417079._1
478- let virtualReplenishB = $t01631417079._2
479- let balanceAfterSwapA = $t01631417079._3
480- let balanceAfterSwapB = $t01631417079._4
481- let invariantCalculated = $t01631417079._5
482- let newBalanceA = $t01631417079._6
483- let newBalanceB = $t01631417079._7
479+ let virtualReplenishA = $t01638617151._1
480+ let virtualReplenishB = $t01638617151._2
481+ let balanceAfterSwapA = $t01638617151._3
482+ let balanceAfterSwapB = $t01638617151._4
483+ let invariantCalculated = $t01638617151._5
484+ let newBalanceA = $t01638617151._6
485+ let newBalanceB = $t01638617151._7
484486 let newBalanceEntry = if ((pmtAssetId == assetIdA))
485487 then IntegerEntry(kBalanceA, newBalanceA)
486488 else IntegerEntry(kBalanceB, newBalanceB)
520522
521523 @Callable(i)
522524 func withdraw () = valueOrElse(isActive(), {
523- let $t01932919472 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
524- let pmtAmount = $t01932919472._1
525- let pmtAssetId = $t01932919472._2
525+ let $t01940119544 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
526+ let pmtAmount = $t01940119544._1
527+ let pmtAssetId = $t01940119544._2
526528 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
527529 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
528530 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
553555
554556 @Callable(i)
555557 func exchange (estimatedAmountToReceive,minAmountToReceive) = valueOrElse(isActive(), {
556- let $t02093521010 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
557- let pmtAmount = $t02093521010._1
558- let pmtAssetId = $t02093521010._2
558+ let $t02100721082 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
559+ let pmtAmount = $t02100721082._1
560+ let pmtAssetId = $t02100721082._2
559561 if ((0 >= estimatedAmountToReceive))
560562 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
561563 else if ((minAmountToReceive > estimatedAmountToReceive))
578580 let sendAssetId = if ((pmtAssetId == assetIdA))
579581 then assetIdB
580582 else assetIdA
581- let $t02210122220 = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
582- let amount = $t02210122220._1
583- let amountInvarian = $t02210122220._2
583+ let $t02217322292 = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
584+ let amount = $t02217322292._1
585+ let amountInvarian = $t02217322292._2
584586 let governanceReward = fraction(amount, feeGovernance, feeScale6)
585587 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
586- let $t02237622638 = if ((pmtAssetId == assetIdA))
588+ let $t02244822710 = if ((pmtAssetId == assetIdA))
587589 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
588590 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
589- let newBalanceA = $t02237622638._1
590- let newBalanceB = $t02237622638._2
591+ let newBalanceA = $t02244822710._1
592+ let newBalanceB = $t02244822710._2
591593 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
592594 if (if ((dAppThresholdAmount > newBalanceA))
593595 then true
594596 else (dAppThresholdAmount > newBalanceB))
595597 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
596598 else {
597- let $t02293623009 = getAssetInfo(pmtAssetId)
598- let pmtStrAssetId = $t02293623009._1
599- let pmtAssetName = $t02293623009._2
600- let pmtDecimals = $t02293623009._3
601- let $t02302223099 = getAssetInfo(sendAssetId)
602- let sendStrAssetId = $t02302223099._1
603- let sendAssetName = $t02302223099._2
604- let sendDecimals = $t02302223099._3
599+ let $t02300823081 = getAssetInfo(pmtAssetId)
600+ let pmtStrAssetId = $t02300823081._1
601+ let pmtAssetName = $t02300823081._2
602+ let pmtDecimals = $t02300823081._3
603+ let $t02309423171 = getAssetInfo(sendAssetId)
604+ let sendStrAssetId = $t02309423171._1
605+ let sendAssetName = $t02309423171._2
606+ let sendDecimals = $t02309423171._3
605607 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
606608 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
607609 else 0
674676
675677
676678 @Callable(i)
679+func writeBigIntInvariant () = valueOrElse(isAdminCall(i), {
680+ let invariantNew = invariantCalc(balanceA, balanceB)
681+[IntegerEntry(kInvariant, invariantNew)]
682+ })
683+
684+
685+
686+@Callable(i)
677687 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
678688 then throw("Only contract itself can invoke this function")
679689 else {
680- let $t02588625989 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
681- let call = $t02588625989._1
682- let addr = $t02588625989._2
683- let params = $t02588625989._3
684- let payments = $t02588625989._4
690+ let $t02613626239 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
691+ let call = $t02613626239._1
692+ let addr = $t02613626239._2
693+ let params = $t02613626239._3
694+ let payments = $t02613626239._4
685695 let inv = invoke(addr, call, params, payments)
686696 if ((inv == inv))
687697 then nil
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "2.0.0"
55
66 let kVersion = "version"
77
88 let kActive = "active"
99
1010 let kAssetIdA = "A_asset_id"
1111
1212 let kAssetIdB = "B_asset_id"
1313
1414 let kBalanceA = "A_asset_balance"
1515
1616 let kBalanceB = "B_asset_balance"
1717
1818 let kShareAssetId = "share_asset_id"
1919
2020 let kShareAssetSupply = "share_asset_supply"
2121
2222 let kFee = "commission"
2323
2424 let kFeeScaleDelimiter = "commission_scale_delimiter"
2525
2626 let kInvariant = "invariant"
2727
2828 let kCause = "shutdown_cause"
2929
3030 let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
3131
3232 let keyEURNAddress = "staking_eurn_address"
3333
3434 let keyAdminPubKey1 = "admin_pub_1"
3535
3636 let keyAdminPubKey2 = "admin_pub_2"
3737
3838 let keyAdminPubKey3 = "admin_pub_3"
3939
4040 let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
4141
4242 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
4343
4444 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
4545 case string: String =>
4646 fromBase58String(string)
4747 case nothing =>
4848 throw("Admin public key is empty")
4949 }
5050
5151
5252 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
5353
5454 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
5555
5656 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
57+
58+let admStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
5759
5860 let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
5961
6062 let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
6163
6264 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
6365
6466 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
6567
6668 let stakingAssets = [toBase58String(USDN), toBase58String(EURN)]
6769
6870 let stakingUSDNNSBTAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyUSDNNSBTAddress), "no usdn staking address")))
6971
7072 let stakingEURNAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyEURNAddress), "no usdn staking address")))
7173
7274 let active = getBooleanValue(this, kActive)
7375
7476 let strAssetIdA = getStringValue(this, kAssetIdA)
7577
7678 let strAssetIdB = getStringValue(this, kAssetIdB)
7779
7880 let assetIdA = if ((strAssetIdA == "WAVES"))
7981 then unit
8082 else fromBase58String(strAssetIdA)
8183
8284 let assetIdB = if ((strAssetIdB == "WAVES"))
8385 then unit
8486 else fromBase58String(strAssetIdB)
8587
8688 let assetNameA = match assetIdA {
8789 case id: ByteVector =>
8890 value(assetInfo(id)).name
8991 case waves: Unit =>
9092 "WAVES"
9193 case _ =>
9294 throw("Match error")
9395 }
9496
9597 let assetNameB = match assetIdB {
9698 case id: ByteVector =>
9799 value(assetInfo(id)).name
98100 case waves: Unit =>
99101 "WAVES"
100102 case _ =>
101103 throw("Match error")
102104 }
103105
104106 let balanceA = getIntegerValue(this, kBalanceA)
105107
106108 let balanceB = getIntegerValue(this, kBalanceB)
107109
108110 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
109111
110112 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
111113
112114 let invariant = getIntegerValue(this, kInvariant)
113115
114116 let fee = 500
115117
116118 let feeGovernance = 200
117119
118120 let feeScale6 = 1000000
119121
120122 let scale3 = 1000
121123
122124 let scale8 = 100000000
123125
124126 let scale16 = 10000000000000000
125127
126128 let slippageScale3 = 1000
127129
128130 let digits8 = 8
129131
130132 let dAppThreshold = 50
131133
132134 let dAppThresholdScale2 = 100
133135
134136 let exchangeRatioLimitMin = 90000000
135137
136138 let exchangeRatioLimitMax = 110000000
137139
138140 let alpha = 50
139141
140142 let alphaDigits = 2
141143
142144 let beta = 4600000000000000
143145
144146 func accountBalance (assetId) = match assetId {
145147 case id: ByteVector =>
146148 assetBalance(this, id)
147149 case waves: Unit =>
148150 wavesBalance(this).available
149151 case _ =>
150152 throw("Match error")
151153 }
152154
153155
154156 func stakedAmount (assetId) = {
155157 let stakedAmountCalculated = match assetId {
156158 case aId: ByteVector =>
157159 if ((aId == USDN))
158160 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
159161 else if ((aId == EURN))
160162 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
161163 else 0
162164 case _: Unit =>
163165 0
164166 case _ =>
165167 throw("Match error")
166168 }
167169 match stakedAmountCalculated {
168170 case i: Int =>
169171 i
170172 case _ =>
171173 0
172174 }
173175 }
174176
175177
176178 let stakedAmountA = stakedAmount(assetIdA)
177179
178180 let stakedAmountB = stakedAmount(assetIdB)
179181
180182 let availableBalanceA = (balanceA - stakedAmountA)
181183
182184 let availableBalanceB = (balanceB - stakedAmountB)
183185
184186 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
185187
186188 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
187189
188190 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
189191 then (accountBalanceWithStakedB >= balanceB)
190192 else false
191193
192194 func skewness (x,y) = ((fraction(scale16, x, y) + fraction(scale16, y, x)) / 2)
193195
194196
195197 func invariantCalc (x,y) = {
196198 let sk = skewness(x, y)
197199 (fraction((x + y), scale16, pow(sk, digits8, alpha, alphaDigits, digits8, CEILING)) + (2 * fraction(toInt(pow(fraction(toBigInt(x), toBigInt(y), toBigInt(scale8)), 0, toBigInt(5), 1, (digits8 / 2), DOWN)), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
198200 }
199201
200202
201203 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
202204 let worstAllowedNewInvariantRatio = (scale8 - ((scale8 * 1) / 10000000))
203205 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
204206 let x = (balanceA + tokenReceiveAmount)
205207 let y = (balanceB + tokenReceiveAmount)
206208 func getStepAmount (acc,step) = if ((acc._1 == -1))
207209 then {
208210 let amountToSend = (amountToSendEstimated - (((step * deltaBetweenMaxAndMinSendValue) / 3) / scale3))
209211 let stepInvariant = if ((tokenId == assetIdA))
210212 then invariantCalc(x, (balanceB - amountToSend))
211213 else invariantCalc((balanceA - amountToSend), y)
212214 if ((stepInvariant > invariant))
213215 then $Tuple2(amountToSend, stepInvariant)
214216 else $Tuple2(-1, 0)
215217 }
216218 else acc
217219
218220 let amountToSendMin = getStepAmount($Tuple2(-1, 0), 3000)
219221 if ((0 > amountToSendMin._1))
220222 then throw("Price is worse than minReceived")
221223 else {
222224 let invEstimated = if ((tokenId == assetIdA))
223225 then invariantCalc(x, (balanceB - amountToSendEstimated))
224226 else if ((tokenId == assetIdB))
225227 then invariantCalc((balanceA - amountToSendEstimated), y)
226228 else throw("Wrong asset in payment")
227229 let amountToSendBest = if ((invariant > invEstimated))
228230 then if ((worstAllowedNewInvariantRatio >= fraction(scale8, invariant, invEstimated)))
229231 then throw("Bad estimation provided 1")
230232 else {
231233 let a = {
232234 let $l = [25, 200, 500]
233235 let $s = size($l)
234236 let $acc0 = $Tuple2(-1, 0)
235237 func $f0_1 ($a,$i) = if (($i >= $s))
236238 then $a
237239 else getStepAmount($a, $l[$i])
238240
239241 func $f0_2 ($a,$i) = if (($i >= $s))
240242 then $a
241243 else throw("List size exceeds 3")
242244
243245 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
244246 }
245247 if ((0 > a._1))
246248 then amountToSendMin
247249 else a
248250 }
249251 else {
250252 let a = {
251253 let $l = [-500, -200, -25]
252254 let $s = size($l)
253255 let $acc0 = $Tuple2(-1, 0)
254256 func $f0_1 ($a,$i) = if (($i >= $s))
255257 then $a
256258 else getStepAmount($a, $l[$i])
257259
258260 func $f0_2 ($a,$i) = if (($i >= $s))
259261 then $a
260262 else throw("List size exceeds 3")
261263
262264 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
263265 }
264266 let tupleSendBetter = if ((0 > a._1))
265267 then $Tuple2(amountToSendEstimated, invEstimated)
266268 else a
267269 if ((worstAllowedNewInvariantRatio >= fraction(scale8, invariant, tupleSendBetter._2)))
268270 then throw("Bad estimation provided 2")
269271 else tupleSendBetter
270272 }
271273 amountToSendBest
272274 }
273275 }
274276
275277
276278 func getAssetInfo (assetId) = match assetId {
277279 case id: ByteVector =>
278280 let stringId = toBase58String(id)
279281 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
280282 $Tuple3(stringId, info.name, info.decimals)
281283 case waves: Unit =>
282284 $Tuple3("WAVES", "WAVES", 8)
283285 case _ =>
284286 throw("Match error")
285287 }
286288
287289
288290 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
289291
290292
291293 func throwIsActive () = throw("DApp is already active")
292294
293295
294296 func isActive () = if (active)
295297 then unit
296298 else throw("DApp is inactive at this moment")
297299
298300
299301 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
300302 then unit
301303 else throw("Only admin can call this function")
302304
303305
304306 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
305307
306308
307309 func throwOnePayment () = throw("One attached payment expected")
308310
309311
310312 func throwThreshold (threshold,amountA,amountB) = throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(threshold)) + ": ") + toString(amountA)) + " ") + assetNameA) + ", ") + toString(amountB)) + " ") + assetNameB))
311313
312314
313315 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
314316
315317
316318 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
317319 then if ((assetId == USDN))
318320 then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
319321 else $Tuple2("startStaking", stakingEURNAddress)
320322 else if ((assetId == USDN))
321323 then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
322324 else $Tuple2("stopStaking", stakingEURNAddress)
323325
324326
325327 func calcStakingParams (stake,amount,assetId) = if (stake)
326328 then {
327- let $t096399705 = calcStakingFuncAndAddres(stake, assetId)
328- let call = $t096399705._1
329- let stakingAddr = $t096399705._2
329+ let $t097119777 = calcStakingFuncAndAddres(stake, assetId)
330+ let call = $t097119777._1
331+ let stakingAddr = $t097119777._2
330332 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
331333 }
332334 else {
333- let $t097919857 = calcStakingFuncAndAddres(stake, assetId)
334- let call = $t097919857._1
335- let stakingAddr = $t097919857._2
335+ let $t098639929 = calcStakingFuncAndAddres(stake, assetId)
336+ let call = $t098639929._1
337+ let stakingAddr = $t098639929._2
336338 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
337339 }
338340
339341
340342 @Callable(i)
341343 func init () = {
342- let $t0996210039 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
343- let pmtAmountA = $t0996210039._1
344- let pmtAssetIdA = $t0996210039._2
345- let $t01004410121 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
346- let pmtAmountB = $t01004410121._1
347- let pmtAssetIdB = $t01004410121._2
348- let $t01012610203 = getAssetInfo(pmtAssetIdA)
349- let pmtStrAssetIdA = $t01012610203._1
350- let pmtAssetNameA = $t01012610203._2
351- let pmtDecimalsA = $t01012610203._3
352- let $t01020810285 = getAssetInfo(pmtAssetIdB)
353- let pmtStrAssetIdB = $t01020810285._1
354- let pmtAssetNameB = $t01020810285._2
355- let pmtDecimalsB = $t01020810285._3
344+ let $t01003410111 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
345+ let pmtAmountA = $t01003410111._1
346+ let pmtAssetIdA = $t01003410111._2
347+ let $t01011610193 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
348+ let pmtAmountB = $t01011610193._1
349+ let pmtAssetIdB = $t01011610193._2
350+ let $t01019810275 = getAssetInfo(pmtAssetIdA)
351+ let pmtStrAssetIdA = $t01019810275._1
352+ let pmtAssetNameA = $t01019810275._2
353+ let pmtDecimalsA = $t01019810275._3
354+ let $t01028010357 = getAssetInfo(pmtAssetIdB)
355+ let pmtStrAssetIdB = $t01028010357._1
356+ let pmtAssetNameB = $t01028010357._2
357+ let pmtDecimalsB = $t01028010357._3
356358 if (isDefined(getBoolean(this, kActive)))
357359 then throwIsActive()
358360 else if ((pmtAssetIdA == pmtAssetIdB))
359361 then throw("Assets must be different")
360362 else {
361363 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
362364 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
363365 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
364366 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
365367 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
366368 let shareIssueId = calculateAssetId(shareIssue)
367369 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
368370 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
369371 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
370372 else 0
371373 if ((stake1 == stake1))
372374 then {
373375 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
374376 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
375377 else 0
376378 if ((stake2 == stake2))
377379 then [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, fee), IntegerEntry(kFeeScaleDelimiter, feeScale6), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
378380 else throw("Strict value is not equal to itself.")
379381 }
380382 else throw("Strict value is not equal to itself.")
381383 }
382384 }
383385
384386
385387
386388 @Callable(i)
387389 func replenishWithTwoTokens () = valueOrElse(isActive(), {
388390 let pmtAssetIdA = i.payments[0].assetId
389391 let pmtAssetIdB = i.payments[1].assetId
390392 let ratioShareTokensInA = fraction(scale8, i.payments[0].amount, balanceA)
391393 let ratioShareTokensInB = fraction(scale8, i.payments[1].amount, balanceB)
392- let $t01286612943 = getAssetInfo(pmtAssetIdA)
393- let pmtStrAssetIdA = $t01286612943._1
394- let pmtAssetNameA = $t01286612943._2
395- let pmtDecimalsA = $t01286612943._3
396- let $t01294813065 = getAssetInfo(pmtAssetIdB)
397- let pmtStrAssetIdB = $t01294813065._1
398- let pmtAssetNameB = $t01294813065._2
399- let pmtDecimalsB = $t01294813065._3
400- let $t01307013574 = if ((ratioShareTokensInB > ratioShareTokensInA))
394+ let $t01293813015 = getAssetInfo(pmtAssetIdA)
395+ let pmtStrAssetIdA = $t01293813015._1
396+ let pmtAssetNameA = $t01293813015._2
397+ let pmtDecimalsA = $t01293813015._3
398+ let $t01302013137 = getAssetInfo(pmtAssetIdB)
399+ let pmtStrAssetIdB = $t01302013137._1
400+ let pmtAssetNameB = $t01302013137._2
401+ let pmtDecimalsB = $t01302013137._3
402+ let $t01314213646 = if ((ratioShareTokensInB > ratioShareTokensInA))
401403 then {
402404 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
403405 $Tuple5(i.payments[0].amount, pmt, (i.payments[1].amount - pmt), pmtAssetIdB, ratioShareTokensInA)
404406 }
405407 else {
406408 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
407409 $Tuple5(pmt, i.payments[1].amount, (i.payments[0].amount - pmt), pmtAssetIdA, ratioShareTokensInB)
408410 }
409- let pmtAmountA = $t01307013574._1
410- let pmtAmountB = $t01307013574._2
411- let change = $t01307013574._3
412- let changeAssetId = $t01307013574._4
413- let shareTokenRatio = $t01307013574._5
411+ let pmtAmountA = $t01314213646._1
412+ let pmtAmountB = $t01314213646._2
413+ let change = $t01314213646._3
414+ let changeAssetId = $t01314213646._4
415+ let shareTokenRatio = $t01314213646._5
414416 let shareTokenToPayAmount = fraction(shareTokenRatio, shareAssetSupply, scale8)
415417 if ((size(i.payments) != 2))
416418 then throw("Two attached assets expected")
417419 else if (if ((pmtAssetIdA != assetIdA))
418420 then true
419421 else (pmtAssetIdB != assetIdB))
420422 then throwAssets()
421423 else if ((shareTokenToPayAmount == 0))
422424 then throw("Too small amount to replenish")
423425 else if ((0 > change))
424426 then throw("Change < 0")
425427 else if (!(hasEnoughBalance))
426428 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
427429 else {
428430 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
429431 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
430432 else 0
431433 if ((stake1 == stake1))
432434 then {
433435 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
434436 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
435437 else 0
436438 if ((stake2 == stake2))
437439 then [IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(kInvariant, invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), ScriptTransfer(i.caller, change, changeAssetId)]
438440 else throw("Strict value is not equal to itself.")
439441 }
440442 else throw("Strict value is not equal to itself.")
441443 }
442444 })
443445
444446
445447
446448 @Callable(i)
447449 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = valueOrElse(isActive(), {
448- let $t01522315298 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
449- let pmtAmount = $t01522315298._1
450- let pmtAssetId = $t01522315298._2
451- let $t01530315376 = getAssetInfo(pmtAssetId)
452- let pmtStrAssetId = $t01530315376._1
453- let pmtAssetName = $t01530315376._2
454- let pmtDecimals = $t01530315376._3
450+ let $t01529515370 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
451+ let pmtAmount = $t01529515370._1
452+ let pmtAssetId = $t01529515370._2
453+ let $t01537515448 = getAssetInfo(pmtAssetId)
454+ let pmtStrAssetId = $t01537515448._1
455+ let pmtAssetName = $t01537515448._2
456+ let pmtDecimals = $t01537515448._3
455457 let pmtMinThreshold = 5000000
456458 let thresholdValueForMinTolerance = 50000000
457459 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
458460 then 100000
459461 else 1
460462 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
461463 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
462464 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
463465 if ((pmtMinThreshold > pmtAmount))
464466 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
465467 else if ((size(i.payments) != 1))
466468 then throwOnePayment()
467469 else if (!(hasEnoughBalance))
468470 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
469471 else if (if ((pmtAssetId != assetIdA))
470472 then (pmtAssetId != assetIdB)
471473 else false)
472474 then throwAssets()
473475 else {
474- let $t01631417079 = if ((pmtAssetId == assetIdA))
476+ let $t01638617151 = if ((pmtAssetId == assetIdA))
475477 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
476478 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
477- let virtualReplenishA = $t01631417079._1
478- let virtualReplenishB = $t01631417079._2
479- let balanceAfterSwapA = $t01631417079._3
480- let balanceAfterSwapB = $t01631417079._4
481- let invariantCalculated = $t01631417079._5
482- let newBalanceA = $t01631417079._6
483- let newBalanceB = $t01631417079._7
479+ let virtualReplenishA = $t01638617151._1
480+ let virtualReplenishB = $t01638617151._2
481+ let balanceAfterSwapA = $t01638617151._3
482+ let balanceAfterSwapB = $t01638617151._4
483+ let invariantCalculated = $t01638617151._5
484+ let newBalanceA = $t01638617151._6
485+ let newBalanceB = $t01638617151._7
484486 let newBalanceEntry = if ((pmtAssetId == assetIdA))
485487 then IntegerEntry(kBalanceA, newBalanceA)
486488 else IntegerEntry(kBalanceB, newBalanceB)
487489 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
488490 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
489491 let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
490492 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
491493 if (if ((slippageValueMinForSwap >= invariantEstimatedRatio))
492494 then true
493495 else (invariant > invariantNew))
494496 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
495497 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
496498 then true
497499 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
498500 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
499501 else if (if ((dAppThresholdAmount > newBalanceA))
500502 then true
501503 else (dAppThresholdAmount > newBalanceB))
502504 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
503505 else {
504506 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
505507 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
506508 else 0
507509 if ((stake1 == stake1))
508510 then {
509511 let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
510512 let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
511513 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
512514 [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), newBalanceEntry, IntegerEntry(kInvariant, invariantCalculated)]
513515 }
514516 else throw("Strict value is not equal to itself.")
515517 }
516518 }
517519 })
518520
519521
520522
521523 @Callable(i)
522524 func withdraw () = valueOrElse(isActive(), {
523- let $t01932919472 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
524- let pmtAmount = $t01932919472._1
525- let pmtAssetId = $t01932919472._2
525+ let $t01940119544 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
526+ let pmtAmount = $t01940119544._1
527+ let pmtAssetId = $t01940119544._2
526528 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
527529 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
528530 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
529531 if ((size(i.payments) != 1))
530532 then throwOnePayment()
531533 else if ((pmtAssetId != shareAssetId))
532534 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
533535 else if (!(hasEnoughBalance))
534536 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
535537 else {
536538 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
537539 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
538540 else 0
539541 if ((stake1 == stake1))
540542 then {
541543 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
542544 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
543545 else 0
544546 if ((stake2 == stake2))
545547 then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(kInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
546548 else throw("Strict value is not equal to itself.")
547549 }
548550 else throw("Strict value is not equal to itself.")
549551 }
550552 })
551553
552554
553555
554556 @Callable(i)
555557 func exchange (estimatedAmountToReceive,minAmountToReceive) = valueOrElse(isActive(), {
556- let $t02093521010 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
557- let pmtAmount = $t02093521010._1
558- let pmtAssetId = $t02093521010._2
558+ let $t02100721082 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
559+ let pmtAmount = $t02100721082._1
560+ let pmtAssetId = $t02100721082._2
559561 if ((0 >= estimatedAmountToReceive))
560562 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
561563 else if ((minAmountToReceive > estimatedAmountToReceive))
562564 then throw(((("Minimal amount can't be greater than estimated. Estimated: " + toString(estimatedAmountToReceive)) + ". Minimal: ") + toString(minAmountToReceive)))
563565 else if ((size(i.payments) != 1))
564566 then throwOnePayment()
565567 else if (!(hasEnoughBalance))
566568 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
567569 else if (if ((pmtAssetId != assetIdA))
568570 then (pmtAssetId != assetIdB)
569571 else false)
570572 then throwAssets()
571573 else if ((10000000 > pmtAmount))
572574 then throw("Only swap of 10.000000 or more tokens is allowed")
573575 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
574576 then true
575577 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
576578 then throw("Incorrect args and pmt ratio")
577579 else {
578580 let sendAssetId = if ((pmtAssetId == assetIdA))
579581 then assetIdB
580582 else assetIdA
581- let $t02210122220 = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
582- let amount = $t02210122220._1
583- let amountInvarian = $t02210122220._2
583+ let $t02217322292 = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
584+ let amount = $t02217322292._1
585+ let amountInvarian = $t02217322292._2
584586 let governanceReward = fraction(amount, feeGovernance, feeScale6)
585587 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
586- let $t02237622638 = if ((pmtAssetId == assetIdA))
588+ let $t02244822710 = if ((pmtAssetId == assetIdA))
587589 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
588590 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
589- let newBalanceA = $t02237622638._1
590- let newBalanceB = $t02237622638._2
591+ let newBalanceA = $t02244822710._1
592+ let newBalanceB = $t02244822710._2
591593 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
592594 if (if ((dAppThresholdAmount > newBalanceA))
593595 then true
594596 else (dAppThresholdAmount > newBalanceB))
595597 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
596598 else {
597- let $t02293623009 = getAssetInfo(pmtAssetId)
598- let pmtStrAssetId = $t02293623009._1
599- let pmtAssetName = $t02293623009._2
600- let pmtDecimals = $t02293623009._3
601- let $t02302223099 = getAssetInfo(sendAssetId)
602- let sendStrAssetId = $t02302223099._1
603- let sendAssetName = $t02302223099._2
604- let sendDecimals = $t02302223099._3
599+ let $t02300823081 = getAssetInfo(pmtAssetId)
600+ let pmtStrAssetId = $t02300823081._1
601+ let pmtAssetName = $t02300823081._2
602+ let pmtDecimals = $t02300823081._3
603+ let $t02309423171 = getAssetInfo(sendAssetId)
604+ let sendStrAssetId = $t02309423171._1
605+ let sendAssetName = $t02309423171._2
606+ let sendDecimals = $t02309423171._3
605607 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
606608 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
607609 else 0
608610 if ((stake1 == stake1))
609611 then {
610612 let stake2 = if (containsElement(stakingAssets, sendStrAssetId))
611613 then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
612614 else 0
613615 if ((stake2 == stake2))
614616 then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, amountInvarian), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(walletAddress, governanceReward, sendAssetId)]
615617 else throw("Strict value is not equal to itself.")
616618 }
617619 else throw("Strict value is not equal to itself.")
618620 }
619621 }
620622 })
621623
622624
623625
624626 @Callable(i)
625627 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
626628 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
627629 else suspend("Paused by admin"))
628630
629631
630632
631633 @Callable(i)
632634 func activate () = valueOrElse(isAdminCall(i), if (active)
633635 then throwIsActive()
634636 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
635637
636638
637639
638640 @Callable(i)
639641 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
640642 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
641643 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
642644 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
643645 if ((i.caller != walletAddress))
644646 then throw("Only the wallet can call this function")
645647 else if (if ((0 > amountEnrollA))
646648 then true
647649 else (0 > amountEnrollB))
648650 then suspend("Enroll amount negative")
649651 else if (if ((amountEnrollA == 0))
650652 then (amountEnrollB == 0)
651653 else false)
652654 then throw("No money to take")
653655 else {
654656 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
655657 then (amountEnrollA > 0)
656658 else false)
657659 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
658660 else 0
659661 if ((stake1 == stake1))
660662 then {
661663 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
662664 then (amountEnrollB > 0)
663665 else false)
664666 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
665667 else 0
666668 if ((stake2 == stake2))
667669 then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
668670 else throw("Strict value is not equal to itself.")
669671 }
670672 else throw("Strict value is not equal to itself.")
671673 }
672674 })
673675
674676
675677
676678 @Callable(i)
679+func writeBigIntInvariant () = valueOrElse(isAdminCall(i), {
680+ let invariantNew = invariantCalc(balanceA, balanceB)
681+[IntegerEntry(kInvariant, invariantNew)]
682+ })
683+
684+
685+
686+@Callable(i)
677687 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
678688 then throw("Only contract itself can invoke this function")
679689 else {
680- let $t02588625989 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
681- let call = $t02588625989._1
682- let addr = $t02588625989._2
683- let params = $t02588625989._3
684- let payments = $t02588625989._4
690+ let $t02613626239 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
691+ let call = $t02613626239._1
692+ let addr = $t02613626239._2
693+ let params = $t02613626239._3
694+ let payments = $t02613626239._4
685695 let inv = invoke(addr, call, params, payments)
686696 if ((inv == inv))
687697 then nil
688698 else throw("Strict value is not equal to itself.")
689699 }
690700
691701
692702 @Verifier(tx)
693703 func verify () = {
694704 let multiSignedByAdmins = {
695705 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
696706 then 1
697707 else 0
698708 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
699709 then 1
700710 else 0
701711 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
702712 then 1
703713 else 0
704714 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
705715 }
706716 match tx {
707717 case inv: InvokeScriptTransaction =>
708718 let callTakeIntoAccount = if ((inv.dApp == this))
709719 then (inv.function == "takeIntoAccountExtraFunds")
710720 else false
711721 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
712722 then true
713723 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
714724 then true
715725 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
716726 then true
717727 else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
718728 if (if (callTakeIntoAccount)
719729 then signedByAdmin
720730 else false)
721731 then true
722732 else multiSignedByAdmins
723733 case _ =>
724734 multiSignedByAdmins
725735 }
726736 }
727737

github/deemru/w8io/026f985 
99.53 ms