tx · 5Zd8yDuSDHmfB5G7NnVS9fN2n6rWGV8gfqoY9nMjEx4Y

3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT:  -0.01400000 Waves

2021.09.08 16:01 [1694103] smart account 3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT > SELF 0.00000000 Waves

{ "type": 13, "id": "5Zd8yDuSDHmfB5G7NnVS9fN2n6rWGV8gfqoY9nMjEx4Y", "fee": 1400000, "feeAssetId": null, "timestamp": 1631106071624, "version": 2, "chainId": 84, "sender": "3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT", "senderPublicKey": "3ijdmxaYrpDFsKVbQH2kvB7i6JzHj9bep9bGWiQPra2D", "proofs": [ "2uSA5iiof2augicBT3vJcNGaqUhxB4yvZnhoTCfxESgKyC7SW78PpxZTWPYwzJcF75ZLYdYiprPg1pQtiUoZHVKB", "2dgfCAV6tF2CXohwRwe44FB9xRA3wcNcrVJ6dg9zHqbMpEx7B9uy9gTMKNFQ8oLdM7Yfzz3abnXbqMnzfFXwtoP3" ], "script": "base64:AAIFAAAAAAAAE7UIAhIDCgEIEgMKAQgSAwoBCBIDCgEIEgQKAggBEgQKAggYEgQKAggIEgMKAQgSABIAGhoKAmExEhRrZXlTaGFyZVRva2Vuc0xvY2tlZBoRCgJhMhILa1NoYXJlTGltaXQaDwoCYTMSCWtleUFjdGl2ZRoOCgJhNBIIa2V5Q2F1c2UaIgoCYTUSHGtleVJld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQaIwoCYTYSHWtleVJld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzGhsKAmE3EhVrZXlIZWlnaHRQb29sRnJhY3Rpb24aIwoCYTgSHWtleVRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50GiQKAmE5Eh5rZXlUb3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMaGwoCYjESFWtleVJld2FyZFVwZGF0ZUhlaWdodBoVCgJiMhIPa2V5TGFzdEludGVyZXN0GhsKAmIzEhVrZXlMYXN0SW50ZXJlc3RIZWlnaHQaHgoCYjQSGGtleVVzZXJTaGFyZVRva2Vuc0xvY2tlZBoZCgJiNRITa2V5VXNlckxhc3RJbnRlcmVzdBoPCgJiNhIJa2V5U1dPUGlkGh4KAmI3EhhrZXlVc2VyU1dPUENsYWltZWRBbW91bnQaIgoCYjgSHGtleVVzZXJTV09QTGFzdENsYWltZWRBbW91bnQaFgoCYjkSEGtleUF2YWlsYWJsZVNXT1AaGwoCYzESFWtleUZhcm1pbmdTdGFydEhlaWdodBoMCgJjMhIGa2V5QVBZGhwKAmMzEhZrUHJldmlvdXNUb3RhbFZvdGVTV09QGhkKAmM0EhNrZXlTd29wWWVhckVtaXNzaW9uGhUKAmM1Eg9rZXlCYWxhbmNlY3BtbUEaFQoCYzYSD2tleUJhbGFuY2VjcG1tQhonCgJjNxIha0hhcnZlc3RQb29sQWN0aXZlVm90ZVN0cnVjVm90aW5nGisKAmM4EiVrSGFydmVzdFVzZXJQb29sQWN0aXZlVm90ZVN0cnVjVm90aW5nGh8KAmM5EhlrZXlMaW1pdFNoYXJlRmlyc3RIYXJ2ZXN0GhEKAmQxEgtrZXlBc3NldElkQRoRCgJkMhILa2V5QXNzZXRJZEIaGwoCZDMSFWtleUZpcnN0SGFydmVzdEhlaWdodBoZCgJkNBITa2V5Zmlyc3RIYXJ2ZXN0Q3BtbRoUCgJkNRIOa2V5VGVtcFByZXZTdW0aEwoCZDYSDWtleVRlbXBDdXJTdW0aFwoCZDcSEWdvdmVybmFuY2VBZGRyZXNzGgwKAmQ4EgZ3YWxsZXQaEwoCZDkSDXZvdGluZ0FkZHJlc3MaIgoCZTESHGFkbWluSW5jcmVhc2VJbnRlcmVzdEFkZHJlc3MaFAoCZTISDm9uZVdlZWtJbkJsb2NrGhQKAmUzEg50b3RhbFZvdGVTaGFyZRoRCgJlNBILc2NhbGVWYWx1ZTEaEQoCZTUSC3NjYWxlVmFsdWUzGhEKAmU2EgtzY2FsZVZhbHVlNRoRCgJlNxILc2NhbGVWYWx1ZTYaEQoCZTgSC3NjYWxlVmFsdWU4GhIKAmU5EgxzY2FsZVZhbHVlMTEaFQoCZjESD2tleUFkbWluUHViS2V5MRoVCgJmMhIPa2V5QWRtaW5QdWJLZXkyGhUKAmYzEg9rZXlBZG1pblB1YktleTMaDAoCZjQSBm9yYWNsZRoRCgJmNRILZ2V0QWRtaW5QdWIaEQoCZjYSC2tleUFkbWluUHViGg0KAmY3EgckbWF0Y2gwGgwKAmY4EgZzdHJpbmcaDQoCZjkSB25vdGhpbmcaEgoCZzESDGFkbWluUHViS2V5MRoSCgJnMhIMYWRtaW5QdWJLZXkyGhIKAmczEgxhZG1pblB1YktleTMaEQoCZzQSC3N0ckFzc2V0SWRBGgoKAmc1EgRwb29sGhEKAmc2EgtzdHJBc3NldElkQhoOCgJnNxIIYXNzZXRJZEEaDgoCZzgSCGFzc2V0SWRCGhEKAmc5EgtrQmFzZVBlcmlvZBoTCgJoMRINa1BlcmlvZExlbmd0aBoSCgJoMhIMa1N0YXJ0SGVpZ2h0GhkKAmgzEhNrRmlyc3RIYXJ2ZXN0SGVpZ2h0GhwKAmg0EhZrRHVyYXRpb25GdWxsVm90ZVBvd2VyGhMKAmg1Eg1rTWluVm90ZVBvd2VyGhAKAmg2EgpiYXNlUGVyaW9kGhEKAmg3EgtzdGFydEhlaWdodBoSCgJoOBIMcGVyaW9kTGVuZ3RoGhsKAmg5EhVkdXJhdGlvbkZ1bGxWb3RlUG93ZXIaEgoCaTESDG1pblZvdGVQb3dlchoOCgJpMhIIaXNBY3RpdmUaEAoCaTMSCmN1cnJQZXJpb2QaEwoCaTQSDWdldExpbWl0VG9rZW4aCQoCaTUSA0FQWRoWCgJpNhIQU3dvcFllYXJFbWlzc2lvbhoQCgJpNxIKYXNzZXROYW1lQRoICgJpOBICaWQaCwoCaTkSBXdhdmVzGhAKAmoxEgphc3NldE5hbWVCGgoKAmoyEgRTV09QGhQKAmozEg5pc0ZpcnN0SGFydmVzdBobCgJqNBIVZ2V0SGVpZ2h0Rmlyc3RIYXJ2ZXN0GhEKAmo1EgtnZXRCYWxhbmNlQRoRCgJqNhILZ2V0QmFsYW5jZUIaGAoCajcSEmdldFNoYXJlTGltaXRUb2tlbhoeCgJqOBIYZ2V0VG90YWxTaGFyZVRva2VuTG9ja2VkGhUKAmo5Eg9nZXRTaGFyZUFzc2V0SWQaFAoCazESDmFjY291bnRCYWxhbmNlGg0KAmsyEgdhc3NldElkGhIKAmszEgxnZXRBc3NldEluZm8aDgoCazQSCHN0cmluZ0lkGgoKAms1EgRpbmZvGhQKAms2Eg5jYWxjU2NhbGVWYWx1ZRoOCgJrNxIIYXNzZXRJZDEaDgoCazgSCGFzc2V0SWQyGhYKAms5EhBhc3NldElkMURlY2ltYWxzGhYKAmwxEhBhc3NldElkMkRlY2ltYWxzGhEKAmwyEgtzY2FsZURpZ2l0cxoXCgJsMxIRdXNlckF2YWlsYWJsZVNXT1AaCgoCbDQSBHVzZXIaEAoCbDUSCnJld2FyZEluZm8aIAoCbDYSGnRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50GiEKAmw3Eht0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMaHwoCbDgSGXJld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQaGAoCbDkSEnJld2FyZFVwZGF0ZUhlaWdodBocCgJtMRIWcG9vbFJld2FyZFVwZGF0ZUhlaWdodBogCgJtMhIacmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMaFwoCbTMSEXJld2FyZFBvb2xDdXJyZW50GhgKAm00EhJyZXdhcmRQb29sUHJldmlvdXMaGQoCbTUSE2dldExhc3RJbnRlcmVzdEluZm8aEgoCbTYSDGxhc3RJbnRlcmVzdBoYCgJtNxISbGFzdEludGVyZXN0SGVpZ2h0GhkKAm04EhNnZXRVc2VySW50ZXJlc3RJbmZvGhEKAm05Egt1c2VyQWRkclN0choWCgJuMRIQdXNlckxhc3RJbnRlcmVzdBoPCgJuMhIJdXNlclNoYXJlGhsKAm4zEhV1c2VyTGFzdEludGVyZXN0VmFsdWUaGwoCbjQSFXVzZXJTaGFyZVRva2Vuc0Ftb3VudBoSCgJuNRIMY2FsY0ludGVyZXN0GhsKAm42EhVjdXJyZW50UmV3YXJkUGVyQmxvY2saFgoCbjcSEHNoYXJlVG9rZW5Mb2NrZWQaHAoCbjgSFnByZXZpb3VzUmV3YXJkUGVyQmxvY2saEAoCbjkSCnNjYWxlVmFsdWUaBwoCbzESAWgaDAoCbzISBnJld2FyZBowCgJvMxIqcmV3YXJkQWZ0ZXJMYXN0SW50ZXJlc3RCZWZvcmVSZWF3YXJkVXBkYXRlGhkKAm80EhNpbnRlcmVzdEFmdGVyVXBkYXRlGg8KAm81EgljbGFpbUNhbGMaEgoCbzYSDHNoYXJlQXNzZXRJZBoTCgJvNxINJHQwMTMzNDQxMzQwORoTCgJvOBINJHQwMTM0MTQxMzUyNhoTCgJvORINJHQwMTM1MzExMzYxNRoVCgJwMRIPY3VycmVudEludGVyZXN0GhEKAnAyEgtjbGFpbUFtb3VudBoVCgJwMxIPdXNlck5ld0ludGVyZXN0GhsKAnA0EhVjbGFpbUNhbGNGb3JNaWdyYXRpb24aEwoCcDUSDSR0MDE0MzM4MTQ0MDMaEwoCcDYSDSR0MDE0NDA4MTQ1MjAaEwoCcDcSDSR0MDE0NTI1MTQ2MDkaHQoCcDgSF2NhbGN1bGF0ZVByb3RvY29sUmV3YXJkGhMKAnA5Eg0kdDAxNTExMzE1MTc4GhMKAnExEg0kdDAxNTE4MzE1Mjk0GhwKAnEyEhZjaGVja1BtdEFzc2V0SWRDb3JyZWN0GhAKAnEzEgpwbXRBc3NldElkGhYKAnE0EhBwb29sU2hhcmVBc3NldElkGh4KAnE1EhhnZXRVc2VyU1dPUENsYWltZWRBbW91bnQaDQoCcTYSB3N1c3BlbmQaCwoCcTcSBWNhdXNlGgcKAnE4EgFpGg0KAnE5EgdlYXJseUxQGhAKAnIxEgppbml0QW1vdW50Gg8KAnIyEglTV09QaXNzdWUaDAoCcjMSBlNXT1BpZBoTCgJyNBINJHQwMTgyNjQxODM2NxoTCgJyNRINY3VycmVudFJld2FyZBoTCgJyNhINJHQwMTg3NzYxODkxMhoTCgJyNxINJHQwMTg5MTcxOTAyMBoTCgJyOBINJHQwMTkyNTQxOTMyORoPCgJyORIJcG10QW1vdW50GhMKAnMxEg0kdDAxOTMzNDE5NDA3GhMKAnMyEg1wbXRTdHJBc3NldElkGhIKAnMzEgxwbXRBc3NldE5hbWUaEQoCczQSC3BtdERlY2ltYWxzGhMKAnM1Eg0kdDAxOTQxMjE5NTI4GhgKAnM2EhJ1c2VyU2hhcmVBbW91bnROZXcaFwoCczcSEWF2YWlsYWJsZUZ1bmRzTmV3GhYKAnM4EhB0b3RhbFNoYXJlQW1vdW50GhkKAnM5EhN0b3RhbFNoYXJlQW1vdW50TmV3GhcKAnQxEhF1c2VyQ2xhaW1lZEFtb3VudBoaCgJ0MhIUdXNlckNsYWltZWRBbW91bnROZXcaDwoCdDMSCWJhc2VFbnRyeRoTCgJ0NBINaGFydmVzdFBlcmlvZBoUCgJ0NRIOYW1vdW50T2ZWb3RpbmcaFgoCdDYSEGFtb3VudFBvb2xTdHJhY3QaJAoCdDcSHmFtb3VudEFjdGl2ZVZvdGVVc2VyUG9vbFN0cmFjdBogCgJ0OBIaYW1vdW50UG9vbEFjdGl2ZVZvdGVTdHJhY3QaGgoCdDkSFHVzZXJTaGFyZVRva2VuTG9ja2VkGhgKAnUxEhJ1c2VyUG9vbEFjdGl2ZVZvdGUaFAoCdTISDnBvb2xBY3RpdmVWb3RlGhQKAnUzEg5wcm90b2NvbFJld2FyZBoVCgJ1NBIPbGltaXRTaGFyZVRva2VuGhAKAnU1EgpzaGFyZVRva2VuGh8KAnU2EhlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50GhMKAnU3Eg1zaGFyZVRva2Vuc0lkGhMKAnU4Eg0kdDAyMzk0NDI0MDYwGgsKAnU5EgV1c2VycxoQCgJ2MRIKdXBkYXRlVXNlchoLCgJ2MhIFYWNjdW0aBwoCdjMSAXUaBwoCdjQSAXIaFQoCdjUSDyRsaXN0MjYxMTkyNjE1MBoVCgJ2NhIPJHNpemUyNjExOTI2MTUwGhUKAnY3Eg8kYWNjMDI2MTE5MjYxNTAaFQoCdjgSDyRhY2MxMjYxMTkyNjE1MBoVCgJ2ORIPJGFjYzIyNjExOTI2MTUwGhUKAncxEg8kYWNjMzI2MTE5MjYxNTAaFQoCdzISDyRhY2M0MjYxMTkyNjE1MBoVCgJ3MxIPJGFjYzUyNjExOTI2MTUwGhUKAnc0Eg8kYWNjNjI2MTE5MjYxNTAaFQoCdzUSDyRhY2M3MjYxMTkyNjE1MBoVCgJ3NhIPJGFjYzgyNjExOTI2MTUwGhUKAnc3Eg8kYWNjOTI2MTE5MjYxNTAaFgoCdzgSECRhY2MxMDI2MTE5MjYxNTAaFgoCdzkSECRhY2MxMTI2MTE5MjYxNTAaFgoCeDESECRhY2MxMjI2MTE5MjYxNTAaFgoCeDISECRhY2MxMzI2MTE5MjYxNTAaFQoCeDMSD21pZ3JhdGlvbkhlaWdodBoaCgJ4NBIUc2hhcmVUb2tlbk11bHRpcGx5ZXIaEwoCeDUSDSR0MDI2MzIzMjY0MzUaHgoCeDYSGHVzZXJTaGFyZVRva2Vuc0Ftb3VudE5ldxoTCgJ4NxINJHQwMjc0MjAyNzQ4NRoTCgJ4OBINJHQwMjc0OTAyNzYwMhoTCgJ4ORINJHQwMjc2MDcyNzcyMxoTCgJ5MRINYXZhaWxhYmxlRnVuZBoICgJ5MhICdHgaDAoCeTMSBnZlcmlmeRoYCgJ5NBISYWRtaW5QdWJLZXkxU2lnbmVkGhgKAnk1EhJhZG1pblB1YktleTJTaWduZWQaGAoCeTYSEmFkbWluUHViS2V5M1NpZ25lZAAAAGEAAAAAAmExAgAAABpfdG90YWxfc2hhcmVfdG9rZW5zX2xvY2tlZAAAAAACYTICAAAAHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAAAAAAmEzAgAAAAZhY3RpdmUAAAAAAmE0AgAAAA5zaHV0ZG93bl9jYXVzZQAAAAACYTUCAAAAHV9jdXJyZW50X3Bvb2xfZnJhY3Rpb25fcmV3YXJkAAAAAAJhNgIAAAAeX3ByZXZpb3VzX3Bvb2xfZnJhY3Rpb25fcmV3YXJkAAAAAAJhNwIAAAAaX3Bvb2xfcmV3YXJkX3VwZGF0ZV9oZWlnaHQAAAAAAmE4AgAAAB50b3RhbF9yZXdhcmRfcGVyX2Jsb2NrX2N1cnJlbnQAAAAAAmE5AgAAAB90b3RhbF9yZXdhcmRfcGVyX2Jsb2NrX3ByZXZpb3VzAAAAAAJiMQIAAAAUcmV3YXJkX3VwZGF0ZV9oZWlnaHQAAAAAAmIyAgAAAA5fbGFzdF9pbnRlcmVzdAAAAAACYjMCAAAAFV9sYXN0X2ludGVyZXN0X2hlaWdodAAAAAACYjQCAAAAFF9zaGFyZV90b2tlbnNfbG9ja2VkAAAAAAJiNQIAAAAOX2xhc3RfaW50ZXJlc3QAAAAAAmI2AgAAAAdTV09QX2lkAAAAAAJiNwIAAAAUX1NXT1BfY2xhaW1lZF9hbW91bnQAAAAAAmI4AgAAABlfU1dPUF9sYXN0X2NsYWltZWRfYW1vdW50AAAAAAJiOQIAAAAPX2F2YWlsYWJsZV9TV09QAAAAAAJjMQIAAAAUZmFybWluZ19zdGFydF9oZWlnaHQAAAAAAmMyAgAAAANhcHkAAAAAAmMzAgAAABhwcmV2aW91c190b3RhbF92b3RlX1NXT1AAAAAAAmM0AgAAABJzd29wX3llYXJfZW1pc3Npb24AAAAAAmM1AgAAAA9BX2Fzc2V0X2JhbGFuY2UAAAAAAmM2AgAAAA9CX2Fzc2V0X2JhbGFuY2UAAAAAAmM3AgAAAB5faGFydmVzdF9wb29sX2FjdGl2ZVZvdGVfc3RydWMAAAAAAmM4AgAAACNfaGFydmVzdF91c2VyX3Bvb2xfYWN0aXZlVm90ZV9zdHJ1YwAAAAACYzkCAAAAHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAAAAAAmQxAgAAAApBX2Fzc2V0X2lkAAAAAAJkMgIAAAAKQl9hc3NldF9pZAAAAAACZDMCAAAAFGZpcnN0X2hhcnZlc3RfaGVpZ2h0AAAAAAJkNAIAAAANZmlyc3RfaGFydmVzdAAAAAACZDUCAAAAE3N1bV9yZXdhcmRfcHJldmlvdXMAAAAAAmQ2AgAAABJzdW1fcmV3YXJkX2N1cnJlbnQAAAAAAmQ3CQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFUqvpp3oH0E1KFyj8uOohRsxnqmBxZ8g0tAAAAAAJkOAkBAAAAB0FkZHJlc3MAAAABAQAAABoBVN89S5eJWFneFeDkUQtW3T16X721f4UhiQAAAAACZDkJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVQaNn7fV6KdJ2lc/r/3JtTn+6HDaD4gyn8AAAAAAmUxCQEAAAAHQWRkcmVzcwAAAAEB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AAEDCQAAAAAAAAIFAAAAAnY2AAAAAAAAAAACBQAAAAJ2OQQAAAACdzEJAQAAAAJ2MQAAAAIFAAAAAnY5CQABkQAAAAIFAAAAAnY1AAAAAAAAAAACAwkAAAAAAAACBQAAAAJ2NgAAAAAAAAAAAwUAAAACdzEEAAAAAncyCQEAAAACdjEAAAACBQAAAAJ3MQkAAZEAAAACBQAAAAJ2NQAAAAAAAAAAAwMJAAAAAAAAAgUAAAACdjYAAAAAAAAAAAQFAAAAAncyBAAAAAJ3MwkBAAAAAnYxAAAAAgUAAAACdzIJAAGRAAAAAgUAAAACdjUAAAAAAAAAAAQDCQAAAAAAAAIFAAAAAnY2AAAAAAAAAAAFBQAAAAJ3MwQAAAACdzQJAQAAAAJ2MQAAAAIFAAAAAnczCQABkQAAAAIFAAAAAnY1AAAAAAAAAAAFAwkAAAAAAAACBQAAAAJ2NgAAAAAAAAAABgUAAAACdzQEAAAAAnc1CQEAAAACdjEAAAACBQAAAAJ3NAkAAZEAAAACBQAAAAJ2NQAAAAAAAAAABgMJAAAAAAAAAgUAAAACdjYAAAAAAAAAAAcFAAAAAnc1BAAAAAJ3NgkBAAAAAnYxAAAAAgUAAAACdzUJAAGRAAAAAgUAAAACdjUAAAAAAAAAAAcDCQAAAAAAAAIFAAAAAnY2AAAAAAAAAAAIBQAAAAJ3NgQAAAACdzcJAQAAAAJ2MQAAAAIFAAAAAnc2CQABkQAAAAIFAAAAAnY1AAAAAAAAAAAIAwkAAAAAAAACBQAAAAJ2NgAAAAAAAAAACQUAAAACdzcEAAAAAnc4CQEAAAACdjEAAAACBQAAAAJ3NwkAAZEAAAACBQAAAAJ2NQAAAAAAAAAACQMJAAAAAAAAAgUAAAACdjYAAAAAAAAAAAoFAAAAAnc4BAAAAAJ3OQkBAAAAAnYxAAAAAgUAAAACdzgJAAGRAAAAAgUAAAACdjUAAAAAAAAAAAoDCQAAAAAAAAIFAAAAAnY2AAAAAAAAAAALBQAAAAJ3OQQAAAACeDEJAQAAAAJ2MQAAAAIFAAAAAnc5CQABkQAAAAIFAAAAAnY1AAAAAAAAAAALAwkAAAAAAAACBQAAAAJ2NgAAAAAAAAAADAUAAAACeDEEAAAAAngyCQEAAAACdjEAAAACBQAAAAJ4MQkAAZEAAAACBQAAAAJ2NQAAAAAA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", "height": 1694103, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BGKJtM4QoRuw9hSh97CfRF2vnDDe5h5o7a96jKExfJeo Next: 5PKpwECL9sKAGbYbBYc5YH3b83nLdcJ7yeRg8nctM4m8 Diff:
OldNewDifferences
231231 let assetId1Decimals = value(assetInfo(assetId1)).decimals
232232 let assetId2Decimals = value(assetInfo(assetId2)).decimals
233233 let scaleDigits = ((assetId2Decimals - assetId1Decimals) + 8)
234- pow(10, 0, scaleDigits, 0, 0, DOWN)
234+ pow(10, 0, scaleDigits, 0, 0, FLOOR)
235235 }
236236
237237
238-func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyAvailableSWOP)), 0)
238+func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + keyAvailableSWOP)), 0)
239239
240240
241241 func rewardInfo (pool) = {
262262 }
263263
264264
265-func getUserInterestInfo (pool,userAddress) = {
266- let userLastInterest = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserLastInterest))
267- let userShare = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserShareTokensLocked))
265+func getUserInterestInfo (pool,userAddrStr) = {
266+ let userLastInterest = getInteger(this, (((pool + "_") + userAddrStr) + keyUserLastInterest))
267+ let userShare = getInteger(this, (((pool + "_") + userAddrStr) + keyUserShareTokensLocked))
268268 let lastInterest = valueOrErrorMessage(getInteger(this, (pool + keyLastInterest)), (("No data on the key: " + pool) + keyLastInterest))
269269 let userLastInterestValue = match userLastInterest {
270270 case userLastInterest: Int =>
282282 }
283283
284284
285-func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,shareAssetId,scaleValue,pmtAmount) = if ((shareTokenLocked == 0))
285+func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue,h) = if ((shareTokenLocked == 0))
286286 then 0
287287 else if ((poolRewardUpdateHeight != 0))
288- then if (if ((rewardUpdateHeight > height))
288+ then if (if ((rewardUpdateHeight > h))
289289 then (rewardUpdateHeight == poolRewardUpdateHeight)
290290 else false)
291291 then {
292- let reward = (previousRewardPerBlock * (height - lastInterestHeight))
292+ let reward = (previousRewardPerBlock * (h - lastInterestHeight))
293293 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
294294 }
295- else if (if ((height > rewardUpdateHeight))
295+ else if (if ((h > rewardUpdateHeight))
296296 then (rewardUpdateHeight != poolRewardUpdateHeight)
297297 else false)
298298 then {
299- let reward = (previousRewardPerBlock * (height - lastInterestHeight))
299+ let reward = (previousRewardPerBlock * (h - lastInterestHeight))
300300 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
301301 }
302- else if (if (if ((height > rewardUpdateHeight))
302+ else if (if (if ((h > rewardUpdateHeight))
303303 then (rewardUpdateHeight == poolRewardUpdateHeight)
304304 else false)
305305 then (lastInterestHeight > rewardUpdateHeight)
306306 else false)
307307 then {
308- let reward = (currentRewardPerBlock * (height - lastInterestHeight))
308+ let reward = (currentRewardPerBlock * (h - lastInterestHeight))
309309 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
310310 }
311311 else {
312312 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
313313 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
314- let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
314+ let reward = (currentRewardPerBlock * (h - rewardUpdateHeight))
315315 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
316316 }
317- else if ((rewardUpdateHeight > height))
317+ else if ((rewardUpdateHeight > h))
318318 then {
319- let reward = (previousRewardPerBlock * (height - lastInterestHeight))
319+ let reward = (previousRewardPerBlock * (h - lastInterestHeight))
320320 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
321321 }
322322 else if ((lastInterestHeight > rewardUpdateHeight))
323323 then {
324- let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
324+ let reward = (currentRewardPerBlock * (h - lastInterestHeight))
325325 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
326326 }
327327 else {
328328 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
329329 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
330- let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
330+ let reward = (currentRewardPerBlock * (h - rewardUpdateHeight))
331331 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
332332 }
333333
334334
335-func claimCalc (pool,caller,pmtAmount) = {
335+func claimCalc (pool,userAddrStr,h) = {
336336 let shareAssetId = getShareAssetId(pool)
337337 let scaleValue = calcScaleValue(SWOP, shareAssetId)
338338 let shareTokenLocked = getTotalShareTokenLocked(pool)
339- let $t01344513510 = getLastInterestInfo(pool)
340- let lastInterestHeight = $t01344513510._1
341- let lastInterest = $t01344513510._2
342- let $t01351513627 = rewardInfo(pool)
343- let currentRewardPerBlock = $t01351513627._1
344- let rewardUpdateHeight = $t01351513627._2
345- let previousRewardPerBlock = $t01351513627._3
346- let poolRewardUpdateHeight = $t01351513627._4
347- let $t01363213711 = getUserInterestInfo(pool, caller)
348- let userLastInterest = $t01363213711._1
349- let userShareTokensAmount = $t01363213711._2
350- let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, shareAssetId, scaleValue, pmtAmount)
339+ let $t01334413409 = getLastInterestInfo(pool)
340+ let lastInterestHeight = $t01334413409._1
341+ let lastInterest = $t01334413409._2
342+ let $t01341413526 = rewardInfo(pool)
343+ let currentRewardPerBlock = $t01341413526._1
344+ let rewardUpdateHeight = $t01341413526._2
345+ let previousRewardPerBlock = $t01341413526._3
346+ let poolRewardUpdateHeight = $t01341413526._4
347+ let $t01353113615 = getUserInterestInfo(pool, userAddrStr)
348+ let userLastInterest = $t01353113615._1
349+ let userShareTokensAmount = $t01353113615._2
350+ let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, scaleValue, h)
351+ let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
352+ let userNewInterest = currentInterest
353+ $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
354+ }
355+
356+
357+func claimCalcForMigration (pool,userAddrStr,h) = {
358+ let shareAssetId = getShareAssetId(pool)
359+ let scaleValue = calcScaleValue(SWOP, shareAssetId)
360+ let shareTokenLocked = getTotalShareTokenLocked(pool)
361+ let $t01433814403 = getLastInterestInfo(pool)
362+ let lastInterestHeight = $t01433814403._1
363+ let lastInterest = $t01433814403._2
364+ let $t01440814520 = rewardInfo(pool)
365+ let currentRewardPerBlock = $t01440814520._1
366+ let rewardUpdateHeight = $t01440814520._2
367+ let previousRewardPerBlock = $t01440814520._3
368+ let poolRewardUpdateHeight = $t01440814520._4
369+ let $t01452514609 = getUserInterestInfo(pool, userAddrStr)
370+ let userLastInterest = $t01452514609._1
371+ let userShareTokensAmount = $t01452514609._2
372+ let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, scaleValue, h)
351373 let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
352374 let userNewInterest = currentInterest
353375 $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
355377
356378
357379 func calculateProtocolReward (pool) = {
358- let $t01423114296 = getLastInterestInfo(pool)
359- let lastInterestHeight = $t01423114296._1
360- let lastInterest = $t01423114296._2
361- let $t01430114412 = rewardInfo(pool)
362- let currentRewardPerBlock = $t01430114412._1
363- let rewardUpdateHeight = $t01430114412._2
364- let previousRewardPerBlock = $t01430114412._3
365- let poolRewardUpdateHeight = $t01430114412._4
380+ let $t01511315178 = getLastInterestInfo(pool)
381+ let lastInterestHeight = $t01511315178._1
382+ let lastInterest = $t01511315178._2
383+ let $t01518315294 = rewardInfo(pool)
384+ let currentRewardPerBlock = $t01518315294._1
385+ let rewardUpdateHeight = $t01518315294._2
386+ let previousRewardPerBlock = $t01518315294._3
387+ let poolRewardUpdateHeight = $t01518315294._4
366388 let shareTokenLocked = getTotalShareTokenLocked(pool)
367389 if (if ((shareTokenLocked == 0))
368390 then (poolRewardUpdateHeight == 0)
425447 }
426448
427449
428-func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyUserSWOPClaimedAmount)), 0)
450+func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + keyUserSWOPClaimedAmount)), 0)
429451
430452
431453 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
447469 func initPoolShareFarming (pool) = if ((i.caller != this))
448470 then throw("Only the DApp itself can call this function")
449471 else {
450- let $t01739417497 = rewardInfo(pool)
451- let currentReward = $t01739417497._1
452- let rewardUpdateHeight = $t01739417497._2
453- let previousRewardPerBlock = $t01739417497._3
454- let poolRewardUpdateHeight = $t01739417497._4
472+ let $t01826418367 = rewardInfo(pool)
473+ let currentReward = $t01826418367._1
474+ let rewardUpdateHeight = $t01826418367._2
475+ let previousRewardPerBlock = $t01826418367._3
476+ let poolRewardUpdateHeight = $t01826418367._4
455477 [IntegerEntry((pool + keyShareTokensLocked), 0), IntegerEntry((pool + keyLastInterest), 0), IntegerEntry((pool + keyLastInterestHeight), height)]
456478 }
457479
463485 else if (!(isActive))
464486 then throw("DApp is inactive at this moment")
465487 else {
466- let $t01790618026 = claimCalc(pool, adminIncreaseInterestAddress, 0)
467- let userNewInterest = $t01790618026._1
468- let currentInterest = $t01790618026._2
469- let claimAmount = $t01790618026._3
470- let userShareTokensAmount = $t01790618026._4
471- let $t01803118134 = rewardInfo(pool)
472- let currentReward = $t01803118134._1
473- let rewardUpdateHeight = $t01803118134._2
474- let previousRewardPerBlock = $t01803118134._3
475- let poolRewardUpdateHeight = $t01803118134._4
488+ let $t01877618912 = claimCalc(pool, toString(adminIncreaseInterestAddress), height)
489+ let userNewInterest = $t01877618912._1
490+ let currentInterest = $t01877618912._2
491+ let claimAmount = $t01877618912._3
492+ let userShareTokensAmount = $t01877618912._4
493+ let $t01891719020 = rewardInfo(pool)
494+ let currentReward = $t01891719020._1
495+ let rewardUpdateHeight = $t01891719020._2
496+ let previousRewardPerBlock = $t01891719020._3
497+ let poolRewardUpdateHeight = $t01891719020._4
476498 [IntegerEntry((pool + keyLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterestHeight), height)]
477499 }
478500
480502
481503 @Callable(i)
482504 func lockShareTokens (pool) = {
483- let $t01832618401 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
484- let pmtAmount = $t01832618401._1
485- let pmtAssetId = $t01832618401._2
486- let $t01840618479 = getAssetInfo(pmtAssetId)
487- let pmtStrAssetId = $t01840618479._1
488- let pmtAssetName = $t01840618479._2
489- let pmtDecimals = $t01840618479._3
490- let $t01848418592 = claimCalc(pool, i.caller, pmtAmount)
491- let userNewInterest = $t01848418592._1
492- let currentInterest = $t01848418592._2
493- let claimAmount = $t01848418592._3
494- let userShareTokensAmount = $t01848418592._4
505+ let userAddrStr = toString(i.caller)
506+ let $t01925419329 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
507+ let pmtAmount = $t01925419329._1
508+ let pmtAssetId = $t01925419329._2
509+ let $t01933419407 = getAssetInfo(pmtAssetId)
510+ let pmtStrAssetId = $t01933419407._1
511+ let pmtAssetName = $t01933419407._2
512+ let pmtDecimals = $t01933419407._3
513+ let $t01941219528 = claimCalc(pool, toString(i.caller), height)
514+ let userNewInterest = $t01941219528._1
515+ let currentInterest = $t01941219528._2
516+ let claimAmount = $t01941219528._3
517+ let userShareTokensAmount = $t01941219528._4
495518 let userShareAmountNew = (userShareTokensAmount + pmtAmount)
496- let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
519+ let availableFundsNew = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
497520 let totalShareAmount = getTotalShareTokenLocked(pool)
498521 let totalShareAmountNew = (totalShareAmount + pmtAmount)
499- let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
522+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
500523 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
501- let baseEntry = [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew)]
524+ let baseEntry = [IntegerEntry((((pool + "_") + userAddrStr) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + userAddrStr) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + userAddrStr) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + userAddrStr) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry((((pool + "_") + userAddrStr) + keyAvailableSWOP), availableFundsNew)]
502525 if ((0 >= pmtAmount))
503526 then throw("You can't lock token")
504527 else if (!(isActive))
510533 else false)
511534 then {
512535 let harvestPeriod = ((((getHeightFirstHarvest(Address(fromBase58String(pool))) - startHeight) + 1) / periodLength) - 1)
513- let amountOfVoting = split(getStringValue(votingAddress, (((toString(i.caller) + "_") + pool) + "_user_pool_struc")), "_")
536+ let amountOfVoting = split(getStringValue(votingAddress, (((userAddrStr + "_") + pool) + "_user_pool_struc")), "_")
514537 let amountPoolStract = split(getStringValue(votingAddress, (pool + "_pool_struc")), "_")
515- let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((toString(i.caller) + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
538+ let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((userAddrStr + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
516539 let amountPoolActiveVoteStract = split(valueOrElse(getString(votingAddress, (pool + kHarvestPoolActiveVoteStrucVoting)), ""), "_")
517540 let userShareTokenLocked = userShareTokensAmount
518541 let userPoolActiveVote = if ((toString(currPeriod) == amountOfVoting[2]))
521544 let poolActiveVote = if ((toString(currPeriod) == amountPoolStract[2]))
522545 then valueOrElse(parseInt(amountPoolActiveVoteStract[0]), 0)
523546 else valueOrElse(parseInt(amountPoolStract[1]), 0)
524- let accBalance = accountBalance(pmtAssetId)
525- let weirdBehaviour = fraction(99, (accBalance + pmtAmount), 100)
526547 let protocolReward = calculateProtocolReward(pool)
527548 if ((userPoolActiveVote != 0))
528549 then {
535556 else if ((pmtAmount > limitShareToken))
536557 then throw(("You can't share token more than " + toString(limitShareToken)))
537558 else if ((shareToken > 0))
538- then if ((weirdBehaviour > totalShareAmountNew))
559+ then if ((fraction(99, (accountBalance(pmtAssetId) + pmtAmount), 100) > totalShareAmountNew))
539560 then throw("Balance of share-token is greater than totalAmount")
540- else if (if ((totalShareAmount == 0))
541- then (shareToken >= pmtAmount)
542- else false)
561+ else if ((totalShareAmount == 0))
543562 then (baseEntry ++ [ScriptTransfer(wallet, protocolReward, SWOP)])
544563 else if ((shareToken >= pmtAmount))
545564 then baseEntry
556575 @Callable(i)
557576 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = {
558577 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
559- let $t02316123261 = claimCalc(pool, i.caller, 1)
560- let userNewInterest = $t02316123261._1
561- let currentInterest = $t02316123261._2
562- let claimAmount = $t02316123261._3
563- let userShareTokensAmount = $t02316123261._4
578+ let $t02394424060 = claimCalc(pool, toString(i.caller), height)
579+ let userNewInterest = $t02394424060._1
580+ let currentInterest = $t02394424060._2
581+ let claimAmount = $t02394424060._3
582+ let userShareTokensAmount = $t02394424060._4
564583 let userShareAmountNew = (userShareTokensAmount - shareTokensWithdrawAmount)
565- let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
584+ let availableFundsNew = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
566585 let totalShareAmount = getTotalShareTokenLocked(pool)
567586 let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
568- let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
587+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
569588 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
570589 if ((shareTokensWithdrawAmount > userShareTokensAmount))
571590 then throw("Withdraw amount more then user locked amount")
581600
582601
583602 @Callable(i)
603+func egg0 (pool,users) = {
604+ func updateUser (accum,u) = {
605+ let r = invoke(this, "egg1", [pool, u], nil)
606+ if ((r == r))
607+ then (accum :+ BooleanEntry((u + "_migration"), true))
608+ else throw("Strict value is not equal to itself.")
609+ }
610+
611+ let $list2611926150 = users
612+ let $size2611926150 = size($list2611926150)
613+ let $acc02611926150 = nil
614+ if (($size2611926150 == 0))
615+ then $acc02611926150
616+ else {
617+ let $acc12611926150 = updateUser($acc02611926150, $list2611926150[0])
618+ if (($size2611926150 == 1))
619+ then $acc12611926150
620+ else {
621+ let $acc22611926150 = updateUser($acc12611926150, $list2611926150[1])
622+ if (($size2611926150 == 2))
623+ then $acc22611926150
624+ else {
625+ let $acc32611926150 = updateUser($acc22611926150, $list2611926150[2])
626+ if (($size2611926150 == 3))
627+ then $acc32611926150
628+ else {
629+ let $acc42611926150 = updateUser($acc32611926150, $list2611926150[3])
630+ if (($size2611926150 == 4))
631+ then $acc42611926150
632+ else {
633+ let $acc52611926150 = updateUser($acc42611926150, $list2611926150[4])
634+ if (($size2611926150 == 5))
635+ then $acc52611926150
636+ else {
637+ let $acc62611926150 = updateUser($acc52611926150, $list2611926150[5])
638+ if (($size2611926150 == 6))
639+ then $acc62611926150
640+ else {
641+ let $acc72611926150 = updateUser($acc62611926150, $list2611926150[6])
642+ if (($size2611926150 == 7))
643+ then $acc72611926150
644+ else {
645+ let $acc82611926150 = updateUser($acc72611926150, $list2611926150[7])
646+ if (($size2611926150 == 8))
647+ then $acc82611926150
648+ else {
649+ let $acc92611926150 = updateUser($acc82611926150, $list2611926150[8])
650+ if (($size2611926150 == 9))
651+ then $acc92611926150
652+ else {
653+ let $acc102611926150 = updateUser($acc92611926150, $list2611926150[9])
654+ if (($size2611926150 == 10))
655+ then $acc102611926150
656+ else {
657+ let $acc112611926150 = updateUser($acc102611926150, $list2611926150[10])
658+ if (($size2611926150 == 11))
659+ then $acc112611926150
660+ else {
661+ let $acc122611926150 = updateUser($acc112611926150, $list2611926150[11])
662+ if (($size2611926150 == 12))
663+ then $acc122611926150
664+ else {
665+ let $acc132611926150 = updateUser($acc122611926150, $list2611926150[12])
666+ throw("List size exceed 12")
667+ }
668+ }
669+ }
670+ }
671+ }
672+ }
673+ }
674+ }
675+ }
676+ }
677+ }
678+ }
679+ }
680+ }
681+
682+
683+
684+@Callable(i)
685+func egg1 (pool,u) = {
686+ let migrationHeight = 1694115
687+ let shareTokenMultiplyer = 1000
688+ let $t02632326435 = claimCalc(pool, u, migrationHeight)
689+ let userNewInterest = $t02632326435._1
690+ let currentInterest = $t02632326435._2
691+ let claimAmount = $t02632326435._3
692+ let userShareTokensAmount = $t02632326435._4
693+ let availableFundsNew = (userAvailableSWOP(pool, u) + claimAmount)
694+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, u)
695+ let userClaimedAmountNew = (userClaimedAmount + claimAmount)
696+ let userShareTokensAmountNew = (userShareTokensAmount * shareTokenMultiplyer)
697+[IntegerEntry((((pool + "_") + u) + keyUserLastInterest), 0), IntegerEntry((((pool + "_") + u) + keyUserShareTokensLocked), userShareTokensAmountNew), IntegerEntry((((pool + "_") + u) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount)]
698+ }
699+
700+
701+
702+@Callable(i)
584703 func claim (pool) = {
585704 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
586705 let shareTokenLocked = getTotalShareTokenLocked(pool)
587- let $t02526725332 = getLastInterestInfo(pool)
588- let lastInterestHeight = $t02526725332._1
589- let lastInterest = $t02526725332._2
590- let $t02533725449 = rewardInfo(pool)
591- let currentRewardPerBlock = $t02533725449._1
592- let rewardUpdateHeight = $t02533725449._2
593- let previousRewardPerBlock = $t02533725449._3
594- let poolRewardUpdateHeight = $t02533725449._4
595- let $t02545425554 = claimCalc(pool, i.caller, 1)
596- let userNewInterest = $t02545425554._1
597- let currentInterest = $t02545425554._2
598- let claimAmount = $t02545425554._3
599- let userShareTokensAmount = $t02545425554._4
600- let availableFund = (userAvailableSWOP(pool, i.caller) + claimAmount)
601- let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
706+ let $t02742027485 = getLastInterestInfo(pool)
707+ let lastInterestHeight = $t02742027485._1
708+ let lastInterest = $t02742027485._2
709+ let $t02749027602 = rewardInfo(pool)
710+ let currentRewardPerBlock = $t02749027602._1
711+ let rewardUpdateHeight = $t02749027602._2
712+ let previousRewardPerBlock = $t02749027602._3
713+ let poolRewardUpdateHeight = $t02749027602._4
714+ let $t02760727723 = claimCalc(pool, toString(i.caller), height)
715+ let userNewInterest = $t02760727723._1
716+ let currentInterest = $t02760727723._2
717+ let claimAmount = $t02760727723._3
718+ let userShareTokensAmount = $t02760727723._4
719+ let availableFund = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
720+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
602721 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
603722 if ((availableFund == 0))
604723 then throw("You have 0 available SWOP")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let keyShareTokensLocked = "_total_share_tokens_locked"
55
66 let kShareLimit = "share_limit_on_first_harvest"
77
88 let keyActive = "active"
99
1010 let keyCause = "shutdown_cause"
1111
1212 let keyRewardPoolFractionCurrent = "_current_pool_fraction_reward"
1313
1414 let keyRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
1515
1616 let keyHeightPoolFraction = "_pool_reward_update_height"
1717
1818 let keyTotalRewardPerBlockCurrent = "total_reward_per_block_current"
1919
2020 let keyTotalRewardPerBlockPrevious = "total_reward_per_block_previous"
2121
2222 let keyRewardUpdateHeight = "reward_update_height"
2323
2424 let keyLastInterest = "_last_interest"
2525
2626 let keyLastInterestHeight = "_last_interest_height"
2727
2828 let keyUserShareTokensLocked = "_share_tokens_locked"
2929
3030 let keyUserLastInterest = "_last_interest"
3131
3232 let keySWOPid = "SWOP_id"
3333
3434 let keyUserSWOPClaimedAmount = "_SWOP_claimed_amount"
3535
3636 let keyUserSWOPLastClaimedAmount = "_SWOP_last_claimed_amount"
3737
3838 let keyAvailableSWOP = "_available_SWOP"
3939
4040 let keyFarmingStartHeight = "farming_start_height"
4141
4242 let keyAPY = "apy"
4343
4444 let kPreviousTotalVoteSWOP = "previous_total_vote_SWOP"
4545
4646 let keySwopYearEmission = "swop_year_emission"
4747
4848 let keyBalancecpmmA = "A_asset_balance"
4949
5050 let keyBalancecpmmB = "B_asset_balance"
5151
5252 let kHarvestPoolActiveVoteStrucVoting = "_harvest_pool_activeVote_struc"
5353
5454 let kHarvestUserPoolActiveVoteStrucVoting = "_harvest_user_pool_activeVote_struc"
5555
5656 let keyLimitShareFirstHarvest = "share_limit_on_first_harvest"
5757
5858 let keyAssetIdA = "A_asset_id"
5959
6060 let keyAssetIdB = "B_asset_id"
6161
6262 let keyFirstHarvestHeight = "first_harvest_height"
6363
6464 let keyfirstHarvestCpmm = "first_harvest"
6565
6666 let keyTempPrevSum = "sum_reward_previous"
6767
6868 let keyTempCurSum = "sum_reward_current"
6969
7070 let governanceAddress = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
7171
7272 let wallet = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
7373
7474 let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
7575
7676 let adminIncreaseInterestAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
7777
7878 let oneWeekInBlock = 10106
7979
8080 let totalVoteShare = 10000000000
8181
8282 let scaleValue1 = 10
8383
8484 let scaleValue3 = 1000
8585
8686 let scaleValue5 = 100000
8787
8888 let scaleValue6 = 1000000
8989
9090 let scaleValue8 = 100000000
9191
9292 let scaleValue11 = 100000000000
9393
9494 let keyAdminPubKey1 = "admin_pub_1"
9595
9696 let keyAdminPubKey2 = "admin_pub_2"
9797
9898 let keyAdminPubKey3 = "admin_pub_3"
9999
100100 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
101101
102102 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
103103 case string: String =>
104104 fromBase58String(string)
105105 case nothing =>
106106 throw("Admin public key is empty")
107107 }
108108
109109
110110 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
111111
112112 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
113113
114114 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
115115
116116 func strAssetIdA (pool) = getStringValue(pool, keyAssetIdA)
117117
118118
119119 func strAssetIdB (pool) = getStringValue(pool, keyAssetIdB)
120120
121121
122122 func assetIdA (pool) = if ((strAssetIdA(pool) == "WAVES"))
123123 then unit
124124 else fromBase58String(strAssetIdA(pool))
125125
126126
127127 func assetIdB (pool) = if ((strAssetIdB(pool) == "WAVES"))
128128 then unit
129129 else fromBase58String(strAssetIdB(pool))
130130
131131
132132 let kBasePeriod = "base_period"
133133
134134 let kPeriodLength = "period_length"
135135
136136 let kStartHeight = "start_height"
137137
138138 let kFirstHarvestHeight = "first_harvest_height"
139139
140140 let kDurationFullVotePower = "duration_full_vote_power"
141141
142142 let kMinVotePower = "min_vote_power"
143143
144144 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
145145
146146 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
147147
148148 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
149149
150150 let durationFullVotePower = valueOrErrorMessage(getInteger(votingAddress, kDurationFullVotePower), "Empty kDurationFullVotePower")
151151
152152 let minVotePower = valueOrErrorMessage(getInteger(votingAddress, kMinVotePower), "Empty kMinVotePower")
153153
154154 let isActive = getBooleanValue(this, keyActive)
155155
156156 let currPeriod = (basePeriod + ((height - startHeight) / periodLength))
157157
158158 func getLimitToken (pool) = valueOrElse(getIntegerValue(pool, keyLimitShareFirstHarvest), 0)
159159
160160
161161 let APY = getIntegerValue(this, keyAPY)
162162
163163 let SwopYearEmission = getIntegerValue(this, keySwopYearEmission)
164164
165165 func assetNameA (pool) = match assetIdA(pool) {
166166 case id: ByteVector =>
167167 value(assetInfo(id)).name
168168 case waves: Unit =>
169169 "WAVES"
170170 case _ =>
171171 throw("Match error")
172172 }
173173
174174
175175 func assetNameB (pool) = match assetIdB(pool) {
176176 case id: ByteVector =>
177177 value(assetInfo(id)).name
178178 case waves: Unit =>
179179 "WAVES"
180180 case _ =>
181181 throw("Match error")
182182 }
183183
184184
185185 let SWOP = fromBase58String(getStringValue(this, keySWOPid))
186186
187187 func isFirstHarvest (pool) = valueOrElse(getBoolean(pool, keyfirstHarvestCpmm), false)
188188
189189
190190 func getHeightFirstHarvest (pool) = valueOrElse(getInteger(pool, keyFirstHarvestHeight), 0)
191191
192192
193193 func getBalanceA (pool) = valueOrErrorMessage(getInteger(pool, keyBalancecpmmA), ("No data on the key: " + keyBalancecpmmA))
194194
195195
196196 func getBalanceB (pool) = valueOrErrorMessage(getInteger(pool, keyBalancecpmmB), ("No data on the key: " + keyBalancecpmmB))
197197
198198
199199 func getShareLimitToken (pool) = valueOrErrorMessage(getInteger(pool, kShareLimit), ("No data on the key: " + kShareLimit))
200200
201201
202202 func getTotalShareTokenLocked (pool) = valueOrErrorMessage(getInteger(this, (pool + keyShareTokensLocked)), (("No data on the key: " + pool) + keyShareTokensLocked))
203203
204204
205205 func getShareAssetId (pool) = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
206206
207207
208208 func accountBalance (assetId) = match assetId {
209209 case id: ByteVector =>
210210 assetBalance(this, id)
211211 case waves: Unit =>
212212 wavesBalance(this).available
213213 case _ =>
214214 throw("Match error")
215215 }
216216
217217
218218 func getAssetInfo (assetId) = match assetId {
219219 case id: ByteVector =>
220220 let stringId = toBase58String(id)
221221 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
222222 $Tuple3(stringId, info.name, info.decimals)
223223 case waves: Unit =>
224224 $Tuple3("WAVES", "WAVES", 8)
225225 case _ =>
226226 throw("Match error")
227227 }
228228
229229
230230 func calcScaleValue (assetId1,assetId2) = {
231231 let assetId1Decimals = value(assetInfo(assetId1)).decimals
232232 let assetId2Decimals = value(assetInfo(assetId2)).decimals
233233 let scaleDigits = ((assetId2Decimals - assetId1Decimals) + 8)
234- pow(10, 0, scaleDigits, 0, 0, DOWN)
234+ pow(10, 0, scaleDigits, 0, 0, FLOOR)
235235 }
236236
237237
238-func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyAvailableSWOP)), 0)
238+func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + keyAvailableSWOP)), 0)
239239
240240
241241 func rewardInfo (pool) = {
242242 let totalRewardPerBlockCurrent = valueOrErrorMessage(getInteger(governanceAddress, keyTotalRewardPerBlockCurrent), ((("No data on the key: " + keyTotalRewardPerBlockCurrent) + " at address ") + toString(governanceAddress)))
243243 let totalRewardPerBlockPrevious = valueOrErrorMessage(getInteger(governanceAddress, keyTotalRewardPerBlockPrevious), ((("No data on the key: " + keyTotalRewardPerBlockPrevious) + " at address ") + toString(governanceAddress)))
244244 let rewardPoolFractionCurrent = valueOrErrorMessage(getInteger(governanceAddress, (pool + keyRewardPoolFractionCurrent)), (((("No data on the key: " + pool) + keyRewardPoolFractionCurrent) + " at address ") + toString(governanceAddress)))
245245 let rewardUpdateHeight = valueOrErrorMessage(getInteger(governanceAddress, keyRewardUpdateHeight), ((("No data on the key: " + keyRewardUpdateHeight) + " at address ") + toString(governanceAddress)))
246246 let poolRewardUpdateHeight = valueOrElse(getInteger(governanceAddress, (pool + keyHeightPoolFraction)), 0)
247247 let rewardPoolFractionPrevious = valueOrErrorMessage(getInteger(governanceAddress, (pool + keyRewardPoolFractionPrevious)), (((("No data on the key: " + pool) + keyRewardPoolFractionPrevious) + " at address ") + toString(governanceAddress)))
248248 let rewardPoolCurrent = fraction(totalRewardPerBlockCurrent, rewardPoolFractionCurrent, totalVoteShare)
249249 let rewardPoolPrevious = fraction(totalRewardPerBlockPrevious, rewardPoolFractionPrevious, totalVoteShare)
250250 if (if ((rewardPoolCurrent > totalRewardPerBlockCurrent))
251251 then true
252252 else (rewardPoolPrevious > totalRewardPerBlockPrevious))
253253 then throw("rewardPoolCurrent > totalRewardPerBlockCurrent or rewardPoolPrevious > totalRewardPerBlockPrevious")
254254 else $Tuple4(rewardPoolCurrent, rewardUpdateHeight, rewardPoolPrevious, poolRewardUpdateHeight)
255255 }
256256
257257
258258 func getLastInterestInfo (pool) = {
259259 let lastInterest = valueOrErrorMessage(getInteger(this, (pool + keyLastInterest)), (("No data on the key: " + pool) + keyLastInterest))
260260 let lastInterestHeight = valueOrElse(getInteger(this, (pool + keyLastInterestHeight)), height)
261261 $Tuple2(lastInterestHeight, lastInterest)
262262 }
263263
264264
265-func getUserInterestInfo (pool,userAddress) = {
266- let userLastInterest = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserLastInterest))
267- let userShare = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserShareTokensLocked))
265+func getUserInterestInfo (pool,userAddrStr) = {
266+ let userLastInterest = getInteger(this, (((pool + "_") + userAddrStr) + keyUserLastInterest))
267+ let userShare = getInteger(this, (((pool + "_") + userAddrStr) + keyUserShareTokensLocked))
268268 let lastInterest = valueOrErrorMessage(getInteger(this, (pool + keyLastInterest)), (("No data on the key: " + pool) + keyLastInterest))
269269 let userLastInterestValue = match userLastInterest {
270270 case userLastInterest: Int =>
271271 userLastInterest
272272 case _ =>
273273 lastInterest
274274 }
275275 let userShareTokensAmount = match userShare {
276276 case userShare: Int =>
277277 userShare
278278 case _ =>
279279 0
280280 }
281281 $Tuple2(userLastInterestValue, userShareTokensAmount)
282282 }
283283
284284
285-func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,shareAssetId,scaleValue,pmtAmount) = if ((shareTokenLocked == 0))
285+func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue,h) = if ((shareTokenLocked == 0))
286286 then 0
287287 else if ((poolRewardUpdateHeight != 0))
288- then if (if ((rewardUpdateHeight > height))
288+ then if (if ((rewardUpdateHeight > h))
289289 then (rewardUpdateHeight == poolRewardUpdateHeight)
290290 else false)
291291 then {
292- let reward = (previousRewardPerBlock * (height - lastInterestHeight))
292+ let reward = (previousRewardPerBlock * (h - lastInterestHeight))
293293 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
294294 }
295- else if (if ((height > rewardUpdateHeight))
295+ else if (if ((h > rewardUpdateHeight))
296296 then (rewardUpdateHeight != poolRewardUpdateHeight)
297297 else false)
298298 then {
299- let reward = (previousRewardPerBlock * (height - lastInterestHeight))
299+ let reward = (previousRewardPerBlock * (h - lastInterestHeight))
300300 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
301301 }
302- else if (if (if ((height > rewardUpdateHeight))
302+ else if (if (if ((h > rewardUpdateHeight))
303303 then (rewardUpdateHeight == poolRewardUpdateHeight)
304304 else false)
305305 then (lastInterestHeight > rewardUpdateHeight)
306306 else false)
307307 then {
308- let reward = (currentRewardPerBlock * (height - lastInterestHeight))
308+ let reward = (currentRewardPerBlock * (h - lastInterestHeight))
309309 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
310310 }
311311 else {
312312 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
313313 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
314- let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
314+ let reward = (currentRewardPerBlock * (h - rewardUpdateHeight))
315315 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
316316 }
317- else if ((rewardUpdateHeight > height))
317+ else if ((rewardUpdateHeight > h))
318318 then {
319- let reward = (previousRewardPerBlock * (height - lastInterestHeight))
319+ let reward = (previousRewardPerBlock * (h - lastInterestHeight))
320320 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
321321 }
322322 else if ((lastInterestHeight > rewardUpdateHeight))
323323 then {
324- let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
324+ let reward = (currentRewardPerBlock * (h - lastInterestHeight))
325325 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
326326 }
327327 else {
328328 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
329329 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
330- let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
330+ let reward = (currentRewardPerBlock * (h - rewardUpdateHeight))
331331 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
332332 }
333333
334334
335-func claimCalc (pool,caller,pmtAmount) = {
335+func claimCalc (pool,userAddrStr,h) = {
336336 let shareAssetId = getShareAssetId(pool)
337337 let scaleValue = calcScaleValue(SWOP, shareAssetId)
338338 let shareTokenLocked = getTotalShareTokenLocked(pool)
339- let $t01344513510 = getLastInterestInfo(pool)
340- let lastInterestHeight = $t01344513510._1
341- let lastInterest = $t01344513510._2
342- let $t01351513627 = rewardInfo(pool)
343- let currentRewardPerBlock = $t01351513627._1
344- let rewardUpdateHeight = $t01351513627._2
345- let previousRewardPerBlock = $t01351513627._3
346- let poolRewardUpdateHeight = $t01351513627._4
347- let $t01363213711 = getUserInterestInfo(pool, caller)
348- let userLastInterest = $t01363213711._1
349- let userShareTokensAmount = $t01363213711._2
350- let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, shareAssetId, scaleValue, pmtAmount)
339+ let $t01334413409 = getLastInterestInfo(pool)
340+ let lastInterestHeight = $t01334413409._1
341+ let lastInterest = $t01334413409._2
342+ let $t01341413526 = rewardInfo(pool)
343+ let currentRewardPerBlock = $t01341413526._1
344+ let rewardUpdateHeight = $t01341413526._2
345+ let previousRewardPerBlock = $t01341413526._3
346+ let poolRewardUpdateHeight = $t01341413526._4
347+ let $t01353113615 = getUserInterestInfo(pool, userAddrStr)
348+ let userLastInterest = $t01353113615._1
349+ let userShareTokensAmount = $t01353113615._2
350+ let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, scaleValue, h)
351+ let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
352+ let userNewInterest = currentInterest
353+ $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
354+ }
355+
356+
357+func claimCalcForMigration (pool,userAddrStr,h) = {
358+ let shareAssetId = getShareAssetId(pool)
359+ let scaleValue = calcScaleValue(SWOP, shareAssetId)
360+ let shareTokenLocked = getTotalShareTokenLocked(pool)
361+ let $t01433814403 = getLastInterestInfo(pool)
362+ let lastInterestHeight = $t01433814403._1
363+ let lastInterest = $t01433814403._2
364+ let $t01440814520 = rewardInfo(pool)
365+ let currentRewardPerBlock = $t01440814520._1
366+ let rewardUpdateHeight = $t01440814520._2
367+ let previousRewardPerBlock = $t01440814520._3
368+ let poolRewardUpdateHeight = $t01440814520._4
369+ let $t01452514609 = getUserInterestInfo(pool, userAddrStr)
370+ let userLastInterest = $t01452514609._1
371+ let userShareTokensAmount = $t01452514609._2
372+ let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, scaleValue, h)
351373 let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
352374 let userNewInterest = currentInterest
353375 $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
354376 }
355377
356378
357379 func calculateProtocolReward (pool) = {
358- let $t01423114296 = getLastInterestInfo(pool)
359- let lastInterestHeight = $t01423114296._1
360- let lastInterest = $t01423114296._2
361- let $t01430114412 = rewardInfo(pool)
362- let currentRewardPerBlock = $t01430114412._1
363- let rewardUpdateHeight = $t01430114412._2
364- let previousRewardPerBlock = $t01430114412._3
365- let poolRewardUpdateHeight = $t01430114412._4
380+ let $t01511315178 = getLastInterestInfo(pool)
381+ let lastInterestHeight = $t01511315178._1
382+ let lastInterest = $t01511315178._2
383+ let $t01518315294 = rewardInfo(pool)
384+ let currentRewardPerBlock = $t01518315294._1
385+ let rewardUpdateHeight = $t01518315294._2
386+ let previousRewardPerBlock = $t01518315294._3
387+ let poolRewardUpdateHeight = $t01518315294._4
366388 let shareTokenLocked = getTotalShareTokenLocked(pool)
367389 if (if ((shareTokenLocked == 0))
368390 then (poolRewardUpdateHeight == 0)
369391 else false)
370392 then if ((rewardUpdateHeight > height))
371393 then {
372394 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
373395 reward
374396 }
375397 else if ((lastInterestHeight > rewardUpdateHeight))
376398 then {
377399 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
378400 reward
379401 }
380402 else {
381403 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
382404 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
383405 (reward + rewardAfterLastInterestBeforeReawardUpdate)
384406 }
385407 else if (if ((shareTokenLocked == 0))
386408 then (poolRewardUpdateHeight != 0)
387409 else false)
388410 then if (if ((rewardUpdateHeight > height))
389411 then (rewardUpdateHeight == poolRewardUpdateHeight)
390412 else false)
391413 then {
392414 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
393415 reward
394416 }
395417 else if (if ((height > rewardUpdateHeight))
396418 then (rewardUpdateHeight != poolRewardUpdateHeight)
397419 else false)
398420 then {
399421 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
400422 reward
401423 }
402424 else if (if (if ((height > rewardUpdateHeight))
403425 then (rewardUpdateHeight == poolRewardUpdateHeight)
404426 else false)
405427 then (lastInterestHeight > rewardUpdateHeight)
406428 else false)
407429 then {
408430 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
409431 reward
410432 }
411433 else {
412434 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
413435 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
414436 (reward + rewardAfterLastInterestBeforeReawardUpdate)
415437 }
416438 else 0
417439 }
418440
419441
420442 func checkPmtAssetIdCorrect (pool,pmtAssetId) = {
421443 let poolShareAssetId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
422444 if ((pmtAssetId == poolShareAssetId))
423445 then true
424446 else false
425447 }
426448
427449
428-func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyUserSWOPClaimedAmount)), 0)
450+func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + keyUserSWOPClaimedAmount)), 0)
429451
430452
431453 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
432454
433455
434456 @Callable(i)
435457 func init (earlyLP) = if (isDefined(getString(this, keySWOPid)))
436458 then throw("SWOP already initialized")
437459 else {
438460 let initAmount = 100000000000000
439461 let SWOPissue = Issue("SWOP", "SWOP protocol token", initAmount, 8, true)
440462 let SWOPid = calculateAssetId(SWOPissue)
441463 [BooleanEntry(keyActive, true), Issue("SWOP", "SWOP protocol token", initAmount, 8, true), StringEntry(keySWOPid, toBase58String(SWOPid))]
442464 }
443465
444466
445467
446468 @Callable(i)
447469 func initPoolShareFarming (pool) = if ((i.caller != this))
448470 then throw("Only the DApp itself can call this function")
449471 else {
450- let $t01739417497 = rewardInfo(pool)
451- let currentReward = $t01739417497._1
452- let rewardUpdateHeight = $t01739417497._2
453- let previousRewardPerBlock = $t01739417497._3
454- let poolRewardUpdateHeight = $t01739417497._4
472+ let $t01826418367 = rewardInfo(pool)
473+ let currentReward = $t01826418367._1
474+ let rewardUpdateHeight = $t01826418367._2
475+ let previousRewardPerBlock = $t01826418367._3
476+ let poolRewardUpdateHeight = $t01826418367._4
455477 [IntegerEntry((pool + keyShareTokensLocked), 0), IntegerEntry((pool + keyLastInterest), 0), IntegerEntry((pool + keyLastInterestHeight), height)]
456478 }
457479
458480
459481
460482 @Callable(i)
461483 func updatePoolInterest (pool) = if ((i.caller != wallet))
462484 then throw("Only the Admin itself can call this function")
463485 else if (!(isActive))
464486 then throw("DApp is inactive at this moment")
465487 else {
466- let $t01790618026 = claimCalc(pool, adminIncreaseInterestAddress, 0)
467- let userNewInterest = $t01790618026._1
468- let currentInterest = $t01790618026._2
469- let claimAmount = $t01790618026._3
470- let userShareTokensAmount = $t01790618026._4
471- let $t01803118134 = rewardInfo(pool)
472- let currentReward = $t01803118134._1
473- let rewardUpdateHeight = $t01803118134._2
474- let previousRewardPerBlock = $t01803118134._3
475- let poolRewardUpdateHeight = $t01803118134._4
488+ let $t01877618912 = claimCalc(pool, toString(adminIncreaseInterestAddress), height)
489+ let userNewInterest = $t01877618912._1
490+ let currentInterest = $t01877618912._2
491+ let claimAmount = $t01877618912._3
492+ let userShareTokensAmount = $t01877618912._4
493+ let $t01891719020 = rewardInfo(pool)
494+ let currentReward = $t01891719020._1
495+ let rewardUpdateHeight = $t01891719020._2
496+ let previousRewardPerBlock = $t01891719020._3
497+ let poolRewardUpdateHeight = $t01891719020._4
476498 [IntegerEntry((pool + keyLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterestHeight), height)]
477499 }
478500
479501
480502
481503 @Callable(i)
482504 func lockShareTokens (pool) = {
483- let $t01832618401 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
484- let pmtAmount = $t01832618401._1
485- let pmtAssetId = $t01832618401._2
486- let $t01840618479 = getAssetInfo(pmtAssetId)
487- let pmtStrAssetId = $t01840618479._1
488- let pmtAssetName = $t01840618479._2
489- let pmtDecimals = $t01840618479._3
490- let $t01848418592 = claimCalc(pool, i.caller, pmtAmount)
491- let userNewInterest = $t01848418592._1
492- let currentInterest = $t01848418592._2
493- let claimAmount = $t01848418592._3
494- let userShareTokensAmount = $t01848418592._4
505+ let userAddrStr = toString(i.caller)
506+ let $t01925419329 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
507+ let pmtAmount = $t01925419329._1
508+ let pmtAssetId = $t01925419329._2
509+ let $t01933419407 = getAssetInfo(pmtAssetId)
510+ let pmtStrAssetId = $t01933419407._1
511+ let pmtAssetName = $t01933419407._2
512+ let pmtDecimals = $t01933419407._3
513+ let $t01941219528 = claimCalc(pool, toString(i.caller), height)
514+ let userNewInterest = $t01941219528._1
515+ let currentInterest = $t01941219528._2
516+ let claimAmount = $t01941219528._3
517+ let userShareTokensAmount = $t01941219528._4
495518 let userShareAmountNew = (userShareTokensAmount + pmtAmount)
496- let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
519+ let availableFundsNew = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
497520 let totalShareAmount = getTotalShareTokenLocked(pool)
498521 let totalShareAmountNew = (totalShareAmount + pmtAmount)
499- let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
522+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
500523 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
501- let baseEntry = [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew)]
524+ let baseEntry = [IntegerEntry((((pool + "_") + userAddrStr) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + userAddrStr) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + userAddrStr) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + userAddrStr) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry((((pool + "_") + userAddrStr) + keyAvailableSWOP), availableFundsNew)]
502525 if ((0 >= pmtAmount))
503526 then throw("You can't lock token")
504527 else if (!(isActive))
505528 then throw("DApp is inactive at this moment")
506529 else if (!(checkPmtAssetIdCorrect(pool, pmtAssetId)))
507530 then throw("Incorrect pmtAssetId")
508531 else if (if (isFirstHarvest(Address(fromBase58String(pool))))
509532 then (getHeightFirstHarvest(Address(fromBase58String(pool))) > height)
510533 else false)
511534 then {
512535 let harvestPeriod = ((((getHeightFirstHarvest(Address(fromBase58String(pool))) - startHeight) + 1) / periodLength) - 1)
513- let amountOfVoting = split(getStringValue(votingAddress, (((toString(i.caller) + "_") + pool) + "_user_pool_struc")), "_")
536+ let amountOfVoting = split(getStringValue(votingAddress, (((userAddrStr + "_") + pool) + "_user_pool_struc")), "_")
514537 let amountPoolStract = split(getStringValue(votingAddress, (pool + "_pool_struc")), "_")
515- let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((toString(i.caller) + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
538+ let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((userAddrStr + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
516539 let amountPoolActiveVoteStract = split(valueOrElse(getString(votingAddress, (pool + kHarvestPoolActiveVoteStrucVoting)), ""), "_")
517540 let userShareTokenLocked = userShareTokensAmount
518541 let userPoolActiveVote = if ((toString(currPeriod) == amountOfVoting[2]))
519542 then valueOrElse(parseInt(amountActiveVoteUserPoolStract[0]), 0)
520543 else valueOrElse(parseInt(amountOfVoting[1]), 0)
521544 let poolActiveVote = if ((toString(currPeriod) == amountPoolStract[2]))
522545 then valueOrElse(parseInt(amountPoolActiveVoteStract[0]), 0)
523546 else valueOrElse(parseInt(amountPoolStract[1]), 0)
524- let accBalance = accountBalance(pmtAssetId)
525- let weirdBehaviour = fraction(99, (accBalance + pmtAmount), 100)
526547 let protocolReward = calculateProtocolReward(pool)
527548 if ((userPoolActiveVote != 0))
528549 then {
529550 let limitShareToken = getShareLimitToken(addressFromStringValue(pool))
530551 let shareToken = (fraction(limitShareToken, userPoolActiveVote, poolActiveVote) - userShareTokenLocked)
531552 if (if ((size(amountActiveVoteUserPoolStract) > 1))
532553 then (valueOrElse(parseInt(amountActiveVoteUserPoolStract[1]), 0) >= harvestPeriod)
533554 else false)
534555 then throw("You can't share token")
535556 else if ((pmtAmount > limitShareToken))
536557 then throw(("You can't share token more than " + toString(limitShareToken)))
537558 else if ((shareToken > 0))
538- then if ((weirdBehaviour > totalShareAmountNew))
559+ then if ((fraction(99, (accountBalance(pmtAssetId) + pmtAmount), 100) > totalShareAmountNew))
539560 then throw("Balance of share-token is greater than totalAmount")
540- else if (if ((totalShareAmount == 0))
541- then (shareToken >= pmtAmount)
542- else false)
561+ else if ((totalShareAmount == 0))
543562 then (baseEntry ++ [ScriptTransfer(wallet, protocolReward, SWOP)])
544563 else if ((shareToken >= pmtAmount))
545564 then baseEntry
546565 else throw(("Your maximum share token is " + toString(shareToken)))
547566 else throw("You can't share token")
548567 }
549568 else throw("Your amount of token less than 0")
550569 }
551570 else baseEntry
552571 }
553572
554573
555574
556575 @Callable(i)
557576 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = {
558577 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
559- let $t02316123261 = claimCalc(pool, i.caller, 1)
560- let userNewInterest = $t02316123261._1
561- let currentInterest = $t02316123261._2
562- let claimAmount = $t02316123261._3
563- let userShareTokensAmount = $t02316123261._4
578+ let $t02394424060 = claimCalc(pool, toString(i.caller), height)
579+ let userNewInterest = $t02394424060._1
580+ let currentInterest = $t02394424060._2
581+ let claimAmount = $t02394424060._3
582+ let userShareTokensAmount = $t02394424060._4
564583 let userShareAmountNew = (userShareTokensAmount - shareTokensWithdrawAmount)
565- let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
584+ let availableFundsNew = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
566585 let totalShareAmount = getTotalShareTokenLocked(pool)
567586 let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
568- let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
587+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
569588 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
570589 if ((shareTokensWithdrawAmount > userShareTokensAmount))
571590 then throw("Withdraw amount more then user locked amount")
572591 else if (!(isActive))
573592 then throw("DApp is inactive at this moment")
574593 else if ((shareTokensWithdrawAmount > userShareTokensAmount))
575594 then throw("Withdraw amount more then user locked amount")
576595 else if ((fraction(99, (accountBalance(shareTokensId) - shareTokensWithdrawAmount), 100) > totalShareAmountNew))
577596 then throw("Balance of share-token is greater than totalAmount")
578597 else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
579598 }
580599
581600
582601
583602 @Callable(i)
603+func egg0 (pool,users) = {
604+ func updateUser (accum,u) = {
605+ let r = invoke(this, "egg1", [pool, u], nil)
606+ if ((r == r))
607+ then (accum :+ BooleanEntry((u + "_migration"), true))
608+ else throw("Strict value is not equal to itself.")
609+ }
610+
611+ let $list2611926150 = users
612+ let $size2611926150 = size($list2611926150)
613+ let $acc02611926150 = nil
614+ if (($size2611926150 == 0))
615+ then $acc02611926150
616+ else {
617+ let $acc12611926150 = updateUser($acc02611926150, $list2611926150[0])
618+ if (($size2611926150 == 1))
619+ then $acc12611926150
620+ else {
621+ let $acc22611926150 = updateUser($acc12611926150, $list2611926150[1])
622+ if (($size2611926150 == 2))
623+ then $acc22611926150
624+ else {
625+ let $acc32611926150 = updateUser($acc22611926150, $list2611926150[2])
626+ if (($size2611926150 == 3))
627+ then $acc32611926150
628+ else {
629+ let $acc42611926150 = updateUser($acc32611926150, $list2611926150[3])
630+ if (($size2611926150 == 4))
631+ then $acc42611926150
632+ else {
633+ let $acc52611926150 = updateUser($acc42611926150, $list2611926150[4])
634+ if (($size2611926150 == 5))
635+ then $acc52611926150
636+ else {
637+ let $acc62611926150 = updateUser($acc52611926150, $list2611926150[5])
638+ if (($size2611926150 == 6))
639+ then $acc62611926150
640+ else {
641+ let $acc72611926150 = updateUser($acc62611926150, $list2611926150[6])
642+ if (($size2611926150 == 7))
643+ then $acc72611926150
644+ else {
645+ let $acc82611926150 = updateUser($acc72611926150, $list2611926150[7])
646+ if (($size2611926150 == 8))
647+ then $acc82611926150
648+ else {
649+ let $acc92611926150 = updateUser($acc82611926150, $list2611926150[8])
650+ if (($size2611926150 == 9))
651+ then $acc92611926150
652+ else {
653+ let $acc102611926150 = updateUser($acc92611926150, $list2611926150[9])
654+ if (($size2611926150 == 10))
655+ then $acc102611926150
656+ else {
657+ let $acc112611926150 = updateUser($acc102611926150, $list2611926150[10])
658+ if (($size2611926150 == 11))
659+ then $acc112611926150
660+ else {
661+ let $acc122611926150 = updateUser($acc112611926150, $list2611926150[11])
662+ if (($size2611926150 == 12))
663+ then $acc122611926150
664+ else {
665+ let $acc132611926150 = updateUser($acc122611926150, $list2611926150[12])
666+ throw("List size exceed 12")
667+ }
668+ }
669+ }
670+ }
671+ }
672+ }
673+ }
674+ }
675+ }
676+ }
677+ }
678+ }
679+ }
680+ }
681+
682+
683+
684+@Callable(i)
685+func egg1 (pool,u) = {
686+ let migrationHeight = 1694115
687+ let shareTokenMultiplyer = 1000
688+ let $t02632326435 = claimCalc(pool, u, migrationHeight)
689+ let userNewInterest = $t02632326435._1
690+ let currentInterest = $t02632326435._2
691+ let claimAmount = $t02632326435._3
692+ let userShareTokensAmount = $t02632326435._4
693+ let availableFundsNew = (userAvailableSWOP(pool, u) + claimAmount)
694+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, u)
695+ let userClaimedAmountNew = (userClaimedAmount + claimAmount)
696+ let userShareTokensAmountNew = (userShareTokensAmount * shareTokenMultiplyer)
697+[IntegerEntry((((pool + "_") + u) + keyUserLastInterest), 0), IntegerEntry((((pool + "_") + u) + keyUserShareTokensLocked), userShareTokensAmountNew), IntegerEntry((((pool + "_") + u) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount)]
698+ }
699+
700+
701+
702+@Callable(i)
584703 func claim (pool) = {
585704 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
586705 let shareTokenLocked = getTotalShareTokenLocked(pool)
587- let $t02526725332 = getLastInterestInfo(pool)
588- let lastInterestHeight = $t02526725332._1
589- let lastInterest = $t02526725332._2
590- let $t02533725449 = rewardInfo(pool)
591- let currentRewardPerBlock = $t02533725449._1
592- let rewardUpdateHeight = $t02533725449._2
593- let previousRewardPerBlock = $t02533725449._3
594- let poolRewardUpdateHeight = $t02533725449._4
595- let $t02545425554 = claimCalc(pool, i.caller, 1)
596- let userNewInterest = $t02545425554._1
597- let currentInterest = $t02545425554._2
598- let claimAmount = $t02545425554._3
599- let userShareTokensAmount = $t02545425554._4
600- let availableFund = (userAvailableSWOP(pool, i.caller) + claimAmount)
601- let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
706+ let $t02742027485 = getLastInterestInfo(pool)
707+ let lastInterestHeight = $t02742027485._1
708+ let lastInterest = $t02742027485._2
709+ let $t02749027602 = rewardInfo(pool)
710+ let currentRewardPerBlock = $t02749027602._1
711+ let rewardUpdateHeight = $t02749027602._2
712+ let previousRewardPerBlock = $t02749027602._3
713+ let poolRewardUpdateHeight = $t02749027602._4
714+ let $t02760727723 = claimCalc(pool, toString(i.caller), height)
715+ let userNewInterest = $t02760727723._1
716+ let currentInterest = $t02760727723._2
717+ let claimAmount = $t02760727723._3
718+ let userShareTokensAmount = $t02760727723._4
719+ let availableFund = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
720+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
602721 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
603722 if ((availableFund == 0))
604723 then throw("You have 0 available SWOP")
605724 else if (!(isActive))
606725 then throw("DApp is inactive at this moment")
607726 else if ((availableFund == 0))
608727 then throw("You have 0 available SWOP")
609728 else if ((fraction(99, accountBalance(shareTokensId), 100) > shareTokenLocked))
610729 then throw("Balance of share-token is greater than totalAmount")
611730 else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
612731 }
613732
614733
615734
616735 @Callable(i)
617736 func shutdown () = if (!(isActive))
618737 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
619738 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
620739 then throw("Only admin can call this function")
621740 else suspend("Paused by admin")
622741
623742
624743
625744 @Callable(i)
626745 func activate () = if (isActive)
627746 then throw("DApp is already active")
628747 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
629748 then throw("Only admin can call this function")
630749 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
631750
632751
633752 @Verifier(tx)
634753 func verify () = match tx {
635754 case _ =>
636755 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
637756 then 1
638757 else 0
639758 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
640759 then 1
641760 else 0
642761 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
643762 then 1
644763 else 0
645764 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
646765 }
647766

github/deemru/w8io/169f3d6 
124.37 ms