tx · DaQftHthemrU2f9FLRtwTkRAESZoScoYWUkVi3rWbUcY

3Ms4MZrzF79PMzuastKiXyPUGkk7b7d7yBL:  -0.01000000 Waves

2022.01.24 15:27 [1892991] smart account 3Ms4MZrzF79PMzuastKiXyPUGkk7b7d7yBL > SELF 0.00000000 Waves

{ "type": 13, "id": "DaQftHthemrU2f9FLRtwTkRAESZoScoYWUkVi3rWbUcY", "fee": 1000000, "feeAssetId": null, "timestamp": 1643027293026, "version": 2, "chainId": 84, "sender": "3Ms4MZrzF79PMzuastKiXyPUGkk7b7d7yBL", "senderPublicKey": "6FfZuVTpKJrksk6BMCEjXjCra9NdMjMFLrTHBar8Y8mA", "proofs": [ "2tcsY5whP3cTPSrYf6pBByTPJ9x4iMtEbF18Jv5AZPZtREretPiSsa4AUCwW6VLrHRbBpuRjR9GmvF6GXwzJvCxB" ], "script": "base64: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dAUAAAAIZHVyYXRpb24FAAAAAWsFAAAAAWIFAAAAA25pbAEAAAAKU3RhdHNFbnRyeQAAAAQAAAAOdG90YWxMb2NrZWRJbmMAAAALZHVyYXRpb25JbmMAAAAMbG9ja0NvdW50SW5jAAAADXVzZXJzQ291bnRJbmMEAAAAGGxvY2tzRHVyYXRpb25TdW1JbkJsb2NrcwkBAAAADGdldEludE9yWmVybwAAAAEJAQAAACBrZXlTdGF0c0xvY2tzRHVyYXRpb25TdW1JbkJsb2NrcwAAAAAEAAAACmxvY2tzQ291bnQJAQAAAAxnZXRJbnRPclplcm8AAAABCQEAAAASa2V5U3RhdHNMb2Nrc0NvdW50AAAAAAQAAAAKdXNlcnNDb3VudAkBAAAADGdldEludE9yWmVybwAAAAEJAQAAABJrZXlTdGF0c1VzZXJzQ291bnQAAAAABAAAAAt0b3RhbEFtb3VudAkBAAAADGdldEludE9yWmVybwAAAAEJAQAAABdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAACBrZXlTdGF0c0xvY2tzRHVyYXRpb25TdW1JbkJsb2NrcwAAAAAJAABkAAAAAgUAAAAYbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzBQAAAAtkdXJhdGlvbkluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEmtleVN0YXRzTG9ja3NDb3VudAAAAAAJAABkAAAAAgUAAAAKbG9ja3NDb3VudAUAAAAMbG9ja0NvdW50SW5jCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAASa2V5U3RhdHNVc2Vyc0NvdW50AAAAAAkAAGQAAAACBQAAAAp1c2Vyc0NvdW50BQAAAA11c2Vyc0NvdW50SW5jCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAAACQAAZAAAAAIFAAAAC3RvdGFsQW1vdW50BQAAAA50b3RhbExvY2tlZEluYwUAAAADbmlsAQAAAA9Mb2NrUGFyYW1zRW50cnkAAAAHAAAAB3VzZXJOdW0AAAAGYW1vdW50AAAABXN0YXJ0AAAACGR1cmF0aW9uAAAAAWsAAAABYgAAAAZwZXJpb2QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AAAAAQUAAAAHdXNlck51bQUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEFAAAAB3VzZXJOdW0FAAAABXN0YXJ0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAUa2V5TG9ja1BhcmFtRHVyYXRpb24AAAABBQAAAAd1c2VyTnVtBQAAAAhkdXJhdGlvbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADWtleUxvY2tQYXJhbUsAAAABBQAAAAd1c2VyTnVtBQAAAAFrCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAANa2V5TG9ja1BhcmFtQgAAAAEFAAAAB3VzZXJOdW0FAAAAAWIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABVrZXlMb2NrUGFyYW1CeVBlcmlvZEsAAAACBQAAAAd1c2VyTnVtBQAAAAZwZXJpb2QFAAAAAWsJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABVrZXlMb2NrUGFyYW1CeVBlcmlvZEIAAAACBQAAAAd1c2VyTnVtBQAAAAZwZXJpb2QFAAAAAWIFAAAAA25pbAEAAAAPZ2V0UGFyYW1zT3JGYWlsAAAAAAQAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEJAQAAABprZXlOZXV0cmlub0NvbnRyYWN0QWRkcmVzcwAAAAAEAAAADWdOc2J0Q29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABCQEAAAAXa2V5R05zYnRDb250cmFjdEFkZHJlc3MAAAAABAAAAAtib25kQXNzZXRJZAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAMa2V5Qm9uZEFzc2V0AAAAAAQAAAANbWluTG9ja0Ftb3VudAkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAABBrZXlNaW5Mb2NrQW1vdW50AAAAAAQAAAAPbWluTG9ja0R1cmF0aW9uCQEAAAAMZ2V0SW50T3JGYWlsAAAAAQkBAAAAEmtleU1pbkxvY2tEdXJhdGlvbgAAAAAEAAAAD21heExvY2tEdXJhdGlvbgkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAABJrZXlNYXhMb2NrRHVyYXRpb24AAAAABAAAAAtuZXh0VXNlck51bQkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAAA5rZXlOZXh0VXNlck51bQAAAAAJAAUYAAAABgUAAAANZ05zYnRDb250cmFjdAUAAAALYm9uZEFzc2V0SWQFAAAADW1pbkxvY2tBbW91bnQFAAAAD21pbkxvY2tEdXJhdGlvbgUAAAAPbWF4TG9ja0R1cmF0aW9uBQAAAAtuZXh0VXNlck51bQEAAAAMaXNVc2VyRXhpc3RzAAAAAQAAAAt1c2VyQWRkcmVzcwkBAAAACWlzRGVmaW5lZAAAAAEJAAQaAAAAAgUAAAAEdGhpcwkBAAAAEmtleVVzZXIyTnVtTWFwcGluZwAAAAEFAAAAC3VzZXJBZGRyZXNzAQAAABNnZXRVc2VyUGFyYW1zT3JVbml0AAAAAQAAAAt1c2VyQWRkcmVzcwMJAQAAAAxpc1VzZXJFeGlzdHMAAAABBQAAAAt1c2VyQWRkcmVzcwQAAAAHdXNlck51bQkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAABJrZXlVc2VyMk51bU1hcHBpbmcAAAABBQAAAAt1c2VyQWRkcmVzcwkABRgAAAAGBQAAAAd1c2VyTnVtCQEAAAAMZ2V0SW50T3JGYWlsAAAAAQkBAAAAFmtleUxvY2tQYXJhbVVzZXJBbW91bnQAAAABBQAAAAd1c2VyTnVtCQEAAAAMZ2V0SW50T3JGYWlsAAAAAQkBAAAAFmtleUxvY2tQYXJhbVN0YXJ0QmxvY2sAAAABBQAAAAd1c2VyTnVtCQEAAAAMZ2V0SW50T3JGYWlsAAAAAQkBAAAAFGtleUxvY2tQYXJhbUR1cmF0aW9uAAAAAQUAAAAHdXNlck51bQkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAAA1rZXlMb2NrUGFyYW1LAAAAAQUAAAAHdXNlck51bQkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAAA1rZXlMb2NrUGFyYW1CAAAAAQUAAAAHdXNlck51bQUAAAAEdW5pdAEAAAATZ2V0VXNlclBhcmFtc09yRmFpbAAAAAEAAAALdXNlckFkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkBAAAAE2dldFVzZXJQYXJhbXNPclVuaXQAAAABBQAAAAt1c2VyQWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAABVVzZXIgCQAEJQAAAAEFAAAAC3VzZXJBZGRyZXNzAgAAAA8gaXMgbm90IGRlZmluZWQAAAAIAAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAABQAAABduZXV0cmlub0NvbnRyYWN0QWRkcmVzcwAAABRnTnNidENvbnRyYWN0QWRkcmVzcwAAAA1taW5Mb2NrQW1vdW50AAAAD21pbkxvY2tEdXJhdGlvbgAAAA9tYXhMb2NrRHVyYXRpb24EAAAABmNoZWNrcwkABEwAAAACCQEAAAAIdGhpc09ubHkAAAABBQAAAAFpBQAAAANuaWwDCQAAAAAAAAIFAAAABmNoZWNrcwUAAAAGY2hlY2tzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABprZXlOZXV0cmlub0NvbnRyYWN0QWRkcmVzcwAAAAAFAAAAF25ldXRyaW5vQ29udHJhY3RBZGRyZXNzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABdrZXlHTnNidENvbnRyYWN0QWRkcmVzcwAAAAAFAAAAFGdOc2J0Q29udHJhY3RBZGRyZXNzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAQa2V5TWluTG9ja0Ftb3VudAAAAAAFAAAADW1pbkxvY2tBbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABJrZXlNaW5Mb2NrRHVyYXRpb24AAAAABQAAAA9taW5Mb2NrRHVyYXRpb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABJrZXlNYXhMb2NrRHVyYXRpb24AAAAABQAAAA9tYXhMb2NrRHVyYXRpb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA5rZXlOZXh0VXNlck51bQAAAAAAAAAAAAAAAAAFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAEbG9jawAAAAEAAAAIZHVyYXRpb24EAAAAFHBheW1lbnRzUmVxdWlyZWRTaXplAAAAAAAAAAABBAAAAAskdDA3MTU3NzI5OQkBAAAAD2dldFBhcmFtc09yRmFpbAAAAAAEAAAADWdOc2J0Q29udHJhY3QIBQAAAAskdDA3MTU3NzI5OQAAAAJfMQQAAAALYm9uZEFzc2V0SWQIBQAAAAskdDA3MTU3NzI5OQAAAAJfMgQAAAANbWluTG9ja0Ftb3VudAgFAAAACyR0MDcxNTc3Mjk5AAAAAl8zBAAAAA9taW5Mb2NrRHVyYXRpb24IBQAAAAskdDA3MTU3NzI5OQAAAAJfNAQAAAAPbWF4TG9ja0R1cmF0aW9uCAUAAAALJHQwNzE1NzcyOTkAAAACXzUEAAAAC25leHRVc2VyTnVtCAUAAAALJHQwNzE1NzcyOTkAAAACXzYEAAAAEWNoZWNrUGF5bWVudHNTaXplAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwUAAAAUcGF5bWVudHNSZXF1aXJlZFNpemUJAAACAAAAAQIAAAAVSW52YWxpZCBwYXltZW50cyBzaXplBgMJAAAAAAAAAgUAAAARY2hlY2tQYXltZW50c1NpemUFAAAAEWNoZWNrUGF5bWVudHNTaXplBAAAAAdwYXltZW50CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAZhbW91bnQIBQAAAAdwYXltZW50AAAABmFtb3VudAQAAAATaW52YWxpZEFzc2V0TWVzc2FnZQkAASwAAAACCQABLAAAAAICAAAAD0ludmFsaWQgYXNzZXQuIAkAAlgAAAABBQAAAAtib25kQXNzZXRJZAIAAAAMIGlzIGV4cGVjdGVkBAAAAAdhc3Nl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eHRQZXJpb2QJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAANZ05zYnRDb250cmFjdAkBAAAADWtleU5leHRQZXJpb2QAAAAAAAAAAAAAAAAABAAAAAlsb2NrU3RhcnQFAAAABmhlaWdodAQAAAALJHQwOTAzMzkxMTkJAQAAABtnZXRTbG9wZUludGVyY2VwdEZvcm1QYXJhbXMAAAAEBQAAAAZhbW91bnQFAAAACGR1cmF0aW9uBQAAAA9tYXhMb2NrRHVyYXRpb24FAAAACWxvY2tTdGFydAQAAAABawgFAAAACyR0MDkwMzM5MTE5AAAAAl8xBAAAAAFiCAUAAAALJHQwOTAzMzkxMTkAAAACXzIEAAAADm5leHRVc2VyTnVtSW5jAwUAAAAJaXNOZXdVc2VyAAAAAAAAAAABAAAAAAAAAAAACQAETgAAAAIJAAROAAAAAgkABE4AAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOa2V5TmV4dFVzZXJOdW0AAAAACQAAZAAAAAIFAAAAC25leHRVc2VyTnVtBQAAAA5uZXh0VXNlck51bUluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEmtleVVzZXIyTnVtTWFwcGluZwAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAd1c2VyTnVtCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlOdW0yVXNlck1hcHBpbmcAAAABBQAAAAd1c2VyTnVtCQAEJQAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAANuaWwJAQAAAA9Mb2NrUGFyYW1zRW50cnkAAAAHBQAAAAd1c2VyTnVtBQAAAAZhbW91bnQFAAAACWxvY2tTdGFydAUAAAAIZHVyYXRpb24FAAAAAWsFAAAAAWIFAAAACm5leHRQZXJpb2QJAQAAABJIaXN0b3J5UmVjb3JkRW50cnkAAAAIAgAAAARsb2NrBQAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAAGYW1vdW50BQAAAAlsb2NrU3RhcnQFAAAACGR1cmF0aW9uBQAAAAFrBQAAAAFiCQEAAAAKU3RhdHNFbnRyeQAAAAQFAAAABmFtb3VudAUAAAAIZHVyYXRpb24AAAAAAAAAAAEAAAAAAAAAAAEJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADGluY3JlYXNlTG9jawAAAAEAAAANZGVsdGFEdXJhdGlvbgQAAAAPcGF5bWVudHNNYXhTaXplAAAAAAAAAAABBAAAAAZwYXJhbXMJAQAAAA9nZXRQYXJhbXNPckZhaWwAAAAABAAAAAskdDA5NzE3OTgzMAkABRYAAAAECAUAAAAGcGFyYW1zAAAAAl8xCAUAAAAGcGFyYW1zAAAAAl8yCAUAAAAGcGFyYW1zAAAAAl80CAUAAAAGcGFyYW1zAAAAAl81BAAAAA1nTnNidENvbnRyYWN0CAUAAAALJHQwOTcxNzk4MzAAAAACXzEEAAAAC2JvbmRBc3NldElkCAUAAAALJHQwOTcxNzk4MzAAAAACXzIEAAAAD21pbkxvY2tEdXJhdGlvbggFAAAACyR0MDk3MTc5ODMwAAAAAl8zBAAAAA9tYXhMb2NrRHVyYXRpb24IBQAAAAskdDA5NzE3OTgzMAAAAAJfNAQAAAAMcGF5bWVudHNTaXplCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzBAAAABFjaGVja1BheW1lbnRzU2l6ZQMJAABmAAAAAgUAAAAMcGF5bWVudHNTaXplBQAAAA9wYXltZW50c01heFNpemUJAAACAAAAAQIAAAAVSW52YWxpZCBwYXltZW50cyBzaXplBgMJAAAAAAAAAgUAAAARY2hlY2tQYXltZW50c1NpemUFAAAAEWNoZWNrUGF5bWVudHNTaXplBAAAAAwkdDA5OTgzMTA0MjADCQAAAAAAAAIFAAAADHBheW1lbnRzU2l6ZQUAAAAPcGF5bWVudHNNYXhTaXplBAAAAAdwYXltZW50CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAABNpbnZhbGlkQXNzZXRNZXNzYWdlCQABLAAAAAIJAAEsAAAAAgIAAAAPSW52YWxpZCBhc3NldC4gCQACWAAAAAEFAAAAC2JvbmRBc3NldElkAgAAAAwgaXMgZXhwZWN0ZWQEAAAAB2Fzc2V0SWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAATaW52YWxpZEFzc2V0TWVzc2FnZQQAAAAMY2hlY2tBc3NldElkAwkBAAAAAiE9AAAAAgUAAAAHYXNzZXRJZAUAAAALYm9uZEFzc2V0SWQJAAACAAAAAQUAAAATaW52YWxpZEFzc2V0TWVzc2FnZQYDCQAAAAAAAAIFAAAADGNoZWNrQXNzZXRJZAUAAAAMY2hlY2tBc3NldElkCQAFFAAAAAIIBQAAAAdwYXltZW50AAAABmFtb3VudAUAAAAHYXNzZXRJZAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAUUAAAAAgAAAAAAAAAAAAUAAAAEdW5pdAQAAAAGYW1vdW50CAUAAAAMJHQwOTk4MzEwNDIwAAAAAl8xBAAAAAdhc3NldElkCAUAAAAMJHQwOTk4MzEwNDIwAAAAAl8yBAAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAAGY2FsbGVyBAAAAAtjaGVja1NjcmlwdAMJAQAAAAlpc0RlZmluZWQAAAABCQAD8QAAAAEFAAAAC3VzZXJBZGRyZXNzCQAAAgAAAAECAAAAIkFkZHJlc3MgaXMgc2NyaXB0ZWQuIEFjY2VzcyBkZW5pZWQGAwkAAAAAAAACBQAAAAtjaGVja1NjcmlwdAUAAAALY2hlY2tTY3JpcHQEAAAACnVzZXJQYXJhbXMJAQAAABNnZXRVc2VyUGFyYW1zT3JGYWlsAAAAAQUAAAALdXNlckFkZHJlc3MEAAAADSR0MDEwNjMxMTA3NDQJAAUWAAAABAgFAAAACnVzZXJQYXJhbXMAAAACXzEIBQAAAAp1c2VyUGFyYW1zAAAAAl8yCAUAAAAKdXNlclBhcmFtcwAAAAJfMwgFAAAACnVzZXJQYXJhbXMAAAACXzQEAAAAB3VzZXJOdW0IBQAAAA0kdDAxMDYzMTEwNzQ0AAAAAl8xBAAAAApsb2NrQW1vdW50CAUAAAANJHQwMTA2MzExMDc0NAAAAAJfMgQAAAAJbG9ja1N0YXJ0CAUAAAANJHQwMTA2MzExMDc0NAAAAAJfMwQAAAAMbG9ja0R1cmF0aW9uCAUAAAANJHQwMTA2MzExMDc0NAAAAAJfNAQAAAAHbG9ja0VuZAkAAGQAAAACBQAAAAlsb2NrU3RhcnQFAAAADGxvY2tEdXJhdGlvbgQAAAAJbmV3QW1vdW50CQAAZAAAAAIFAAAACmxvY2tBbW91bnQFAAAABmFtb3VudAQAAAAMbmV3TG9ja1N0YXJ0BQAAAAZoZWlnaHQEAAAAD25ld0xvY2tEdXJhdGlvbgkAAGQAAAACBQAAAA1kZWx0YUR1cmF0aW9uCQABlgAAAAEJAARMAAAAAgAAAAAAAAAAAAkABEwAAAACCQAAZQAAAAIFAAAAB2xvY2tFbmQFAAAADG5ld0xvY2tTdGFydAUAAAADbmlsBAAAAA1jaGVja0R1cmF0aW9uCQAETAAAAAIDCQAAZgAAAAIAAAAAAAAAAAAFAAAADWRlbHRhRHVyYXRpb24JAAACAAAAAQIAAAAmSW5jcmVhc2UgaW4gZHVyYXRpb24gaXMgbGVzcyB0aGVuIHplcm8GCQAETAAAAAIDCQAAZgAAAAIFAAAAD21pbkxvY2tEdXJhdGlvbgUAAAAPbmV3TG9ja0R1cmF0aW9uCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABVNaW4gbG9jayBkdXJhdGlvbiBpcyAJAAGkAAAAAQUAAAAPbWluTG9ja0R1cmF0aW9uAgAAAAcgYmxvY2tzBgkABEwAAAACAwkAAGYAAAACBQAAAA9uZXdMb2NrRHVyYXRpb24FAAAAD21heExvY2tEdXJhdGlvbgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAVTWF4IGxvY2sgZHVyYXRpb24gaXMgCQABpAAAAAEFAAAAD21heExvY2tEdXJhdGlvbgIAAAAHIGJsb2NrcwYFAAAAA25pbAMJAAAAAAAAAgUAAAANY2hlY2tEdXJhdGlvbgUAAAANY2hlY2tEdXJhdGlvbgQAAAAKbmV4dFBlcmlvZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAA1nTnNidENvbnRyYWN0CQEAAAANa2V5TmV4dFBlcmlvZAAAAAAAAAAAAAAAAAAEAAAADSR0MDExMzg4MTE0OTMJAQAAABtnZXRTbG9wZUludGVyY2VwdEZvcm1QYXJhbXMAAAAEBQAAAAluZXdBbW91bnQFAAAAD25ld0xvY2tEdXJhdGlvbgUAAAAPbWF4TG9ja0R1cmF0aW9uBQAAAAxuZXdMb2NrU3RhcnQEAAAABGtOZXcIBQAAAA0kdDAxMTM4ODExNDkzAAAAAl8xBAAAAARiTmV3CAUAAAANJHQwMTEzODgxMTQ5MwAAAAJfMgkABE4AAAACCQAETgAAAAIJAQAAAA9Mb2NrUGFyYW1zRW50cnkAAAAHBQAAAAd1c2VyTnVtBQAAAAluZXdBbW91bnQFAAAADG5ld0xvY2tTdGFydAUAAAAPbmV3TG9ja0R1cmF0aW9uBQAAAARrTmV3BQAAAARiTmV3BQAAAApuZXh0UGVyaW9kCQEAAAASSGlzdG9yeVJlY29yZEVudHJ5AAAACAIAAAAMaW5jcmVhc2VMb2NrBQAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAAJbmV3QW1vdW50BQAAAAxuZXdMb2NrU3RhcnQFAAAAD25ld0xvY2tEdXJhdGlvbgUAAAAEa05ldwUAAAAEYk5ldwkBAAAAClN0YXRzRW50cnkAAAAEBQAAAAZhbW91bnQFAAAADWRlbHRhRHVyYXRpb24AAAAAAAAAAAAAAAAAAAAAAAAJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAGdW5sb2NrAAAAAAQAAAALdXNlckFkZHJlc3MIBQAAAAFpAAAABmNhbGxlcgQAAAAGcGFyYW1zCQEAAAAPZ2V0UGFyYW1zT3JGYWlsAAAAAAQAAAANJHQwMTE4NjAxMTkxNwkABRQAAAACCAUAAAAGcGFyYW1zAAAAAl8xCAUAAAAGcGFyYW1zAAAAAl8yBAAAAA1n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", "height": 1892991, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7uHxy7HiGNGjDWurVk8TPCUVvmCLLnpi1cVECXDWNqz1 Next: none Diff:
OldNewDifferences
343343 let $t01296113004 = $Tuple2(userParams._5, userParams._6)
344344 let k = $t01296113004._1
345345 let b = $t01296113004._2
346- let gNsbtAmount = ((k * height) + b)
346+ let gNsbtAmount = (((k * height) + b) / SCALE)
347347 $Tuple2(nil, gNsbtAmount)
348348 }
349349 else $Tuple2(nil, 0)
373373 let userAddress = addressFromStringValue(userAddressStr)
374374 if (isUserExists(userAddress))
375375 then {
376- let $t01382413904 = getUserParamsOrFail(userAddress)
377- let userNum = $t01382413904._1
378- let amount = $t01382413904._2
379- let start = $t01382413904._3
380- let duration = $t01382413904._4
381- let k = $t01382413904._5
382- let b = $t01382413904._6
376+ let $t01383413914 = getUserParamsOrFail(userAddress)
377+ let userNum = $t01383413914._1
378+ let amount = $t01383413914._2
379+ let start = $t01383413914._3
380+ let duration = $t01383413914._4
381+ let k = $t01383413914._5
382+ let b = $t01383413914._6
383383 $Tuple2(nil, [userNum, amount, start, duration, k, b])
384384 }
385385 else $Tuple2(nil, unit)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let revisionNum = ""
55
66 let separator = "__"
77
88 let SCALE = 1000
99
1010 func keyBondAsset () = "bond_asset_id"
1111
1212
1313 func keyNeutrinoContractAddress () = makeString(["%s", "neutrinoContractAddress"], separator)
1414
1515
1616 func keyGNsbtContractAddress () = makeString(["%s", "gNsbtContractAddress"], separator)
1717
1818
1919 func keyMinLockAmount () = makeString(["%s", "minLockAmount"], separator)
2020
2121
2222 func keyMinLockDuration () = makeString(["%s", "minLockDuration"], separator)
2323
2424
2525 func keyMaxLockDuration () = makeString(["%s", "maxLockDuration"], separator)
2626
2727
2828 func keyNextUserNum () = makeString(["%s", "nextUserNum"], separator)
2929
3030
3131 func keyUser2NumMapping (userAddress) = makeString(["%s%s%s", "mapping", "user2num", toString(userAddress)], separator)
3232
3333
3434 func keyNum2UserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], separator)
3535
3636
3737 func keyLockParamUserAmount (userNum) = makeString(["%s%d%s", "paramByUserNum", toString(userNum), "amount"], separator)
3838
3939
4040 func keyLockParamStartBlock (userNum) = makeString(["%s%d%s", "paramByUserNum", toString(userNum), "start"], separator)
4141
4242
4343 func keyLockParamDuration (userNum) = makeString(["%s%d%s", "paramByUserNum", toString(userNum), "duration"], separator)
4444
4545
4646 func keyLockParamK (userNum) = makeString(["%s%d%s", "paramByUserNum", toString(userNum), "k"], separator)
4747
4848
4949 func keyLockParamB (userNum) = makeString(["%s%d%s", "paramByUserNum", toString(userNum), "b"], separator)
5050
5151
5252 func keyLockParamByPeriodK (userNum,period) = makeString(["%s%d%s%d", "paramByPeriod", toString(userNum), "k", toString(period)], separator)
5353
5454
5555 func keyLockParamByPeriodB (userNum,period) = makeString(["%s%d%s%d", "paramByPeriod", toString(userNum), "b", toString(period)], separator)
5656
5757
5858 func keyHistoryRecord (type,userAddress,txId) = makeString(["%s%s%s%s", "history", type, toString(userAddress), toBase58String(txId)], separator)
5959
6060
6161 func keyLockParamTotalAmount () = makeString(["%s%s", "stats", "activeTotalLocked"], separator)
6262
6363
6464 func keyStatsLocksDurationSumInBlocks () = makeString(["%s%s", "stats", "locksDurationSumInBlocks"], separator)
6565
6666
6767 func keyStatsLocksCount () = makeString(["%s%s", "stats", "locksCount"], separator)
6868
6969
7070 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
7171
7272
7373 func keyNextPeriod () = makeString(["%s", "nextPeriod"], separator)
7474
7575
7676 func thisOnly (i) = if ((i.caller != this))
7777 then throw("Permission denied")
7878 else true
7979
8080
8181 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
8282
8383
8484 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
8585
8686
8787 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("Mandatory this." + key) + " is not defined"))
8888
8989
9090 func getStartGNsbtAmount (nsbtAmount,duration,maxDuration) = fraction(nsbtAmount, duration, maxDuration)
9191
9292
9393 func getSlopeInterceptFormParams (amount,duration,maxDuration,startHeight) = {
9494 let endHeight = (startHeight + duration)
9595 let k = -(fraction(amount, SCALE, maxDuration))
9696 let b = (-(k) * endHeight)
9797 $Tuple2(k, b)
9898 }
9999
100100
101101 func formatHistoryRecord (amount,start,duration,k,b) = makeString(["%d%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount), toString(start), toString(duration), toString(k), toString(b)], separator)
102102
103103
104104 func HistoryRecordEntry (type,userAddress,txId,amount,start,duration,k,b) = [StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(amount, start, duration, k, b))]
105105
106106
107107 func StatsEntry (totalLockedInc,durationInc,lockCountInc,usersCountInc) = {
108108 let locksDurationSumInBlocks = getIntOrZero(keyStatsLocksDurationSumInBlocks())
109109 let locksCount = getIntOrZero(keyStatsLocksCount())
110110 let usersCount = getIntOrZero(keyStatsUsersCount())
111111 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
112112 [IntegerEntry(keyStatsLocksDurationSumInBlocks(), (locksDurationSumInBlocks + durationInc)), IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), (totalAmount + totalLockedInc))]
113113 }
114114
115115
116116 func LockParamsEntry (userNum,amount,start,duration,k,b,period) = [IntegerEntry(keyLockParamUserAmount(userNum), amount), IntegerEntry(keyLockParamStartBlock(userNum), start), IntegerEntry(keyLockParamDuration(userNum), duration), IntegerEntry(keyLockParamK(userNum), k), IntegerEntry(keyLockParamB(userNum), b), IntegerEntry(keyLockParamByPeriodK(userNum, period), k), IntegerEntry(keyLockParamByPeriodB(userNum, period), b)]
117117
118118
119119 func getParamsOrFail () = {
120120 let neutrinoContract = addressFromStringValue(getStringOrFail(keyNeutrinoContractAddress()))
121121 let gNsbtContract = addressFromStringValue(getStringOrFail(keyGNsbtContractAddress()))
122122 let bondAssetId = fromBase58String(getStringValue(neutrinoContract, keyBondAsset()))
123123 let minLockAmount = getIntOrFail(keyMinLockAmount())
124124 let minLockDuration = getIntOrFail(keyMinLockDuration())
125125 let maxLockDuration = getIntOrFail(keyMaxLockDuration())
126126 let nextUserNum = getIntOrFail(keyNextUserNum())
127127 $Tuple6(gNsbtContract, bondAssetId, minLockAmount, minLockDuration, maxLockDuration, nextUserNum)
128128 }
129129
130130
131131 func isUserExists (userAddress) = isDefined(getInteger(this, keyUser2NumMapping(userAddress)))
132132
133133
134134 func getUserParamsOrUnit (userAddress) = if (isUserExists(userAddress))
135135 then {
136136 let userNum = getIntOrFail(keyUser2NumMapping(userAddress))
137137 $Tuple6(userNum, getIntOrFail(keyLockParamUserAmount(userNum)), getIntOrFail(keyLockParamStartBlock(userNum)), getIntOrFail(keyLockParamDuration(userNum)), getIntOrFail(keyLockParamK(userNum)), getIntOrFail(keyLockParamB(userNum)))
138138 }
139139 else unit
140140
141141
142142 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + toString(userAddress)) + " is not defined"))
143143
144144
145145 @Callable(i)
146146 func constructor (neutrinoContractAddress,gNsbtContractAddress,minLockAmount,minLockDuration,maxLockDuration) = {
147147 let checks = [thisOnly(i)]
148148 if ((checks == checks))
149149 then [StringEntry(keyNeutrinoContractAddress(), neutrinoContractAddress), StringEntry(keyGNsbtContractAddress(), gNsbtContractAddress), IntegerEntry(keyMinLockAmount(), minLockAmount), IntegerEntry(keyMinLockDuration(), minLockDuration), IntegerEntry(keyMaxLockDuration(), maxLockDuration), IntegerEntry(keyNextUserNum(), 0)]
150150 else throw("Strict value is not equal to itself.")
151151 }
152152
153153
154154
155155 @Callable(i)
156156 func lock (duration) = {
157157 let paymentsRequiredSize = 1
158158 let $t071577299 = getParamsOrFail()
159159 let gNsbtContract = $t071577299._1
160160 let bondAssetId = $t071577299._2
161161 let minLockAmount = $t071577299._3
162162 let minLockDuration = $t071577299._4
163163 let maxLockDuration = $t071577299._5
164164 let nextUserNum = $t071577299._6
165165 let checkPaymentsSize = if ((size(i.payments) != paymentsRequiredSize))
166166 then throw("Invalid payments size")
167167 else true
168168 if ((checkPaymentsSize == checkPaymentsSize))
169169 then {
170170 let payment = i.payments[0]
171171 let amount = payment.amount
172172 let invalidAssetMessage = (("Invalid asset. " + toBase58String(bondAssetId)) + " is expected")
173173 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
174174 let checkAssetId = if ((assetId != bondAssetId))
175175 then throw(invalidAssetMessage)
176176 else true
177177 if ((checkAssetId == checkAssetId))
178178 then {
179179 let userAddress = i.caller
180180 let checkScript = if (isDefined(scriptHash(userAddress)))
181181 then throw("Address is scripted. Access denied")
182182 else true
183183 if ((checkScript == checkScript))
184184 then {
185185 let userParamsOrUnit = getUserParamsOrUnit(userAddress)
186186 let $t079608258 = match userParamsOrUnit {
187187 case params: (Int, Int, Int, Int, Int, Int) =>
188188 $Tuple5(false, params._1, params._2, params._3, params._4)
189189 case _: Unit =>
190190 $Tuple5(true, nextUserNum, 0, unit, unit)
191191 case _ =>
192192 throw("Match error")
193193 }
194194 let isNewUser = $t079608258._1
195195 let userNum = $t079608258._2
196196 let lockAmount = $t079608258._3
197197 let currentStartHeightOrUnit = $t079608258._4
198198 let currentDurationOrUnit = $t079608258._5
199199 let checkAmountAndDuration = [if ((lockAmount > 0))
200200 then {
201201 let isLockExpired = if (!(isNewUser))
202202 then (height > (value(currentStartHeightOrUnit) + value(currentDurationOrUnit)))
203203 else false
204204 throw(("There is an active lock. Consider to use increaseLock" + (if (isLockExpired)
205205 then " or unlock"
206206 else "")))
207207 }
208208 else true, if ((minLockAmount > amount))
209209 then throw(("Min lock amount is " + toString(minLockAmount)))
210210 else true, if ((minLockDuration > duration))
211211 then throw((("Min lock duration is " + toString(minLockDuration)) + " blocks"))
212212 else true, if ((duration > maxLockDuration))
213213 then throw((("Max lock duration is " + toString(maxLockDuration)) + " blocks"))
214214 else true]
215215 if ((checkAmountAndDuration == checkAmountAndDuration))
216216 then {
217217 let nextPeriod = valueOrElse(getInteger(gNsbtContract, keyNextPeriod()), 0)
218218 let lockStart = height
219219 let $t090339119 = getSlopeInterceptFormParams(amount, duration, maxLockDuration, lockStart)
220220 let k = $t090339119._1
221221 let b = $t090339119._2
222222 let nextUserNumInc = if (isNewUser)
223223 then 1
224224 else 0
225225 ((([IntegerEntry(keyNextUserNum(), (nextUserNum + nextUserNumInc)), IntegerEntry(keyUser2NumMapping(userAddress), userNum), StringEntry(keyNum2UserMapping(userNum), toString(userAddress))] ++ LockParamsEntry(userNum, amount, lockStart, duration, k, b, nextPeriod)) ++ HistoryRecordEntry("lock", userAddress, i.transactionId, amount, lockStart, duration, k, b)) ++ StatsEntry(amount, duration, 1, 1))
226226 }
227227 else throw("Strict value is not equal to itself.")
228228 }
229229 else throw("Strict value is not equal to itself.")
230230 }
231231 else throw("Strict value is not equal to itself.")
232232 }
233233 else throw("Strict value is not equal to itself.")
234234 }
235235
236236
237237
238238 @Callable(i)
239239 func increaseLock (deltaDuration) = {
240240 let paymentsMaxSize = 1
241241 let params = getParamsOrFail()
242242 let $t097179830 = $Tuple4(params._1, params._2, params._4, params._5)
243243 let gNsbtContract = $t097179830._1
244244 let bondAssetId = $t097179830._2
245245 let minLockDuration = $t097179830._3
246246 let maxLockDuration = $t097179830._4
247247 let paymentsSize = size(i.payments)
248248 let checkPaymentsSize = if ((paymentsSize > paymentsMaxSize))
249249 then throw("Invalid payments size")
250250 else true
251251 if ((checkPaymentsSize == checkPaymentsSize))
252252 then {
253253 let $t0998310420 = if ((paymentsSize == paymentsMaxSize))
254254 then {
255255 let payment = i.payments[0]
256256 let invalidAssetMessage = (("Invalid asset. " + toBase58String(bondAssetId)) + " is expected")
257257 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
258258 let checkAssetId = if ((assetId != bondAssetId))
259259 then throw(invalidAssetMessage)
260260 else true
261261 if ((checkAssetId == checkAssetId))
262262 then $Tuple2(payment.amount, assetId)
263263 else throw("Strict value is not equal to itself.")
264264 }
265265 else $Tuple2(0, unit)
266266 let amount = $t0998310420._1
267267 let assetId = $t0998310420._2
268268 let userAddress = i.caller
269269 let checkScript = if (isDefined(scriptHash(userAddress)))
270270 then throw("Address is scripted. Access denied")
271271 else true
272272 if ((checkScript == checkScript))
273273 then {
274274 let userParams = getUserParamsOrFail(userAddress)
275275 let $t01063110744 = $Tuple4(userParams._1, userParams._2, userParams._3, userParams._4)
276276 let userNum = $t01063110744._1
277277 let lockAmount = $t01063110744._2
278278 let lockStart = $t01063110744._3
279279 let lockDuration = $t01063110744._4
280280 let lockEnd = (lockStart + lockDuration)
281281 let newAmount = (lockAmount + amount)
282282 let newLockStart = height
283283 let newLockDuration = (deltaDuration + max([0, (lockEnd - newLockStart)]))
284284 let checkDuration = [if ((0 > deltaDuration))
285285 then throw("Increase in duration is less then zero")
286286 else true, if ((minLockDuration > newLockDuration))
287287 then throw((("Min lock duration is " + toString(minLockDuration)) + " blocks"))
288288 else true, if ((newLockDuration > maxLockDuration))
289289 then throw((("Max lock duration is " + toString(maxLockDuration)) + " blocks"))
290290 else true]
291291 if ((checkDuration == checkDuration))
292292 then {
293293 let nextPeriod = valueOrElse(getInteger(gNsbtContract, keyNextPeriod()), 0)
294294 let $t01138811493 = getSlopeInterceptFormParams(newAmount, newLockDuration, maxLockDuration, newLockStart)
295295 let kNew = $t01138811493._1
296296 let bNew = $t01138811493._2
297297 ((LockParamsEntry(userNum, newAmount, newLockStart, newLockDuration, kNew, bNew, nextPeriod) ++ HistoryRecordEntry("increaseLock", userAddress, i.transactionId, newAmount, newLockStart, newLockDuration, kNew, bNew)) ++ StatsEntry(amount, deltaDuration, 0, 0))
298298 }
299299 else throw("Strict value is not equal to itself.")
300300 }
301301 else throw("Strict value is not equal to itself.")
302302 }
303303 else throw("Strict value is not equal to itself.")
304304 }
305305
306306
307307
308308 @Callable(i)
309309 func unlock () = {
310310 let userAddress = i.caller
311311 let params = getParamsOrFail()
312312 let $t01186011917 = $Tuple2(params._1, params._2)
313313 let gNsbtContract = $t01186011917._1
314314 let bondAssetId = $t01186011917._2
315315 let userParams = getUserParamsOrFail(userAddress)
316316 let $t01197312086 = $Tuple4(userParams._1, userParams._2, userParams._3, userParams._4)
317317 let userNum = $t01197312086._1
318318 let lockAmount = $t01197312086._2
319319 let lockStart = $t01197312086._3
320320 let lockDuration = $t01197312086._4
321321 let lockEnd = (lockStart + lockDuration)
322322 let checks = [if ((lockEnd > height))
323323 then throw((("Wait " + toString((lockEnd - height))) + " blocks to unlock"))
324324 else true, if ((0 >= lockAmount))
325325 then throw("Nothing to unlock")
326326 else true]
327327 if ((checks == checks))
328328 then {
329329 let nextPeriod = valueOrElse(getInteger(gNsbtContract, keyNextPeriod()), 0)
330330 (((LockParamsEntry(userNum, 0, lockStart, lockDuration, 0, 0, nextPeriod) ++ HistoryRecordEntry("unlock", userAddress, i.transactionId, lockAmount, lockStart, lockDuration, 0, 0)) ++ StatsEntry(-(lockAmount), 0, 0, -1)) :+ ScriptTransfer(userAddress, lockAmount, bondAssetId))
331331 }
332332 else throw("Strict value is not equal to itself.")
333333 }
334334
335335
336336
337337 @Callable(i)
338338 func gNsbtAmountREADONLY (userAddressStr) = {
339339 let userAddress = addressFromStringValue(userAddressStr)
340340 if (isUserExists(userAddress))
341341 then {
342342 let userParams = getUserParamsOrFail(userAddress)
343343 let $t01296113004 = $Tuple2(userParams._5, userParams._6)
344344 let k = $t01296113004._1
345345 let b = $t01296113004._2
346- let gNsbtAmount = ((k * height) + b)
346+ let gNsbtAmount = (((k * height) + b) / SCALE)
347347 $Tuple2(nil, gNsbtAmount)
348348 }
349349 else $Tuple2(nil, 0)
350350 }
351351
352352
353353
354354 @Callable(i)
355355 func startGNsbtAmountREADONLY (nsbtAmount,duration) = {
356356 let maxDuration = getParamsOrFail()._5
357357 let startAmount = getStartGNsbtAmount(nsbtAmount, duration, maxDuration)
358358 $Tuple2(nil, startAmount)
359359 }
360360
361361
362362
363363 @Callable(i)
364364 func paramsREADONLY () = {
365365 let params = getParamsOrFail()
366366 $Tuple2(nil, [params._3, params._4, params._5])
367367 }
368368
369369
370370
371371 @Callable(i)
372372 func lockParamsREADONLY (userAddressStr) = {
373373 let userAddress = addressFromStringValue(userAddressStr)
374374 if (isUserExists(userAddress))
375375 then {
376- let $t01382413904 = getUserParamsOrFail(userAddress)
377- let userNum = $t01382413904._1
378- let amount = $t01382413904._2
379- let start = $t01382413904._3
380- let duration = $t01382413904._4
381- let k = $t01382413904._5
382- let b = $t01382413904._6
376+ let $t01383413914 = getUserParamsOrFail(userAddress)
377+ let userNum = $t01383413914._1
378+ let amount = $t01383413914._2
379+ let start = $t01383413914._3
380+ let duration = $t01383413914._4
381+ let k = $t01383413914._5
382+ let b = $t01383413914._6
383383 $Tuple2(nil, [userNum, amount, start, duration, k, b])
384384 }
385385 else $Tuple2(nil, unit)
386386 }
387387
388388

github/deemru/w8io/169f3d6 
95.44 ms