tx · J7C9QoaAZamp7GNji2taRbPWqYr9jDBMvX46UYTf7zEW

3N3JDTdERAYLTF92HKPEQ5moNRJkKFJMcei:  -0.01500000 Waves

2024.09.04 16:01 [3268848] smart account 3N3JDTdERAYLTF92HKPEQ5moNRJkKFJMcei > SELF 0.00000000 Waves

{ "type": 13, "id": "J7C9QoaAZamp7GNji2taRbPWqYr9jDBMvX46UYTf7zEW", "fee": 1500000, "feeAssetId": null, "timestamp": 1725454895161, "version": 2, "chainId": 84, "sender": "3N3JDTdERAYLTF92HKPEQ5moNRJkKFJMcei", "senderPublicKey": "3L6GaCUnvwXwfP7bfo3TJmcngf67YoRUYMbkTA177amx", "proofs": [ "5N4zFj3yq3gF3bCn9Fpn25mCGvJ9UuLCYP8otJwhTWrS6UPKUqLGb9o91uN7gcStxgVhCiQTAJ49wUTpsx7AqwXQ" ], "script": "base64:AAIFAAAAAAAAAFoIAhIHCgUICAgIARIFCgMCAgESBQoDCAgBEgQKAgIIEgUKAwICAhIICgYCCAECAgISBAoCCAgSAwoBCBIDCgEIEgMKAQgSABIAEgQKAgIBEgMKAQESBAoCAgQAAAArAAAAAA9rZXlBc3NldEFkZHJlc3MCAAAAA19hYQAAAAAMa2V5QXNzZXRUeXBlAgAAAANfYXQAAAAAEWtleUFzc2V0UHJlY2lzaW9uAgAAAANfYXAAAAAADmtleUFzc2V0TWluRmVlAgAAAARfYW1mAAAAABBrZXlBc3NldElzQWN0aXZlAgAAAARfYWlhAAAAABBrZXlCYXNlRmVlUmF0ZUJQAgAAAARfYmZyAAAAAAxrZXlWYWxpZGF0b3ICAAAAAl92AAAAAA9rZXlGZWVDb2xsZWN0b3ICAAAAA19mYwAAAAAPa2V5VW5sb2NrU2lnbmVyAgAAAANfdXMAAAAAC2tleUlzQWN0aXZlAgAAAANfaWEAAAAACmtleU1hbmFnZXICAAAAAl9tAAAAAA5CUklER0VfTUFOQUdFUgIAAAAOQlJJREdFX01BTkFHRVIAAAAADUFTU0VUX01BTkFHRVICAAAADUFTU0VUX01BTkFHRVIAAAAADFNUT1BfTUFOQUdFUgIAAAAMU1RPUF9NQU5BR0VSAAAAABliYXNlQXNzZXRTb3VyY2VBbmRBZGRyZXNzAQAAACRXQVZFV0FWRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2Jhc2VBc3NldElkAQAAACBXQVZFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKY2hhaW5XYXZlcwEAAAAEV0FWRQAAAAACQlAAAAAAAAAAJxAAAAAAD3N5c3RlbVByZWNpc2lvbgAAAAAAAAAACQAAAAAPZXJyVW5hdXRob3JpemVkAgAAAAx1bmF1dGhvcml6ZWQAAAAAEGVyclVuaW5pdGlhbGl6ZWQCAAAADXVuaW5pdGlhbGl6ZWQAAAAADmVyckluaXRpYWxpemVkAgAAAAtpbml0aWFsaXplZAAAAAAQZXJyQWxyZWFkeUV4aXN0cwIAAAAGZXhpc3RzAAAAAAxlcnJOb3RFeGlzdHMCAAAACm5vdCBleGlzdHMAAAAAEGVyckludmFsaWRWYWx1ZXMCAAAADmludmFsaWQgdmFsdWVzAAAAABBlcnJOb3RPbmVQYXltZW50AgAAAA9ub3Qgb25lIHBheW1lbnQAAAAAEGVyckFzc2V0Tm90Rm91bmQCAAAAD2Fzc2V0IG5vdCBmb3VuZAAAAAATZXJyTm90RW5vdWdoQmFsYW5jZQIAAAASbm90IGVub3VnaCBiYWxhbmNlAAAAAA5lcnJCaWdQb3dWYWx1ZQIAAAARcG93IHZhbHVlIHRvbyBiaWcAAAAAEWVyckJyaWRnZURpc2FibGVkAgAAABJicmlkZ2UgaXMgZGlzYWJsZWQAAAAAEGVyckFzc2V0RGlzYWJsZWQCAAAAEWFzc2V0IGlzIGRpc2FibGVkAAAAABhlcnJXcm9uZ0Rlc3RpbmF0aW9uQ2hhaW4CAAAAF3dyb25nIGRlc3RpbmF0aW9uIGNoYWluAAAAAAh0eXBlQmFzZQAAAAAAAAAAAAAAAAAKdHlwZU5hdGl2ZQAAAAAAAAAAAQAAAAALdHlwZVdyYXBwZWQAAAAAAAAAAAIBAAAAFWFzc2VydENhbGxlcklzTWFuYWdlcgAAAAIAAAABaQAAAAttYW5hZ2VyVHlwZQQAAAAHJG1hdGNoMAkABCEAAAABCQABLAAAAAIFAAAAC21hbmFnZXJUeXBlBQAAAAprZXlNYW5hZ2VyAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAlhdXRob3JpdHkFAAAAByRtYXRjaDADCQEAAAACIT0AAAACBQAAAAlhdXRob3JpdHkICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMJAAACAAAAAQUAAAAPZXJyVW5hdXRob3JpemVkBQAAAAR1bml0CQAAAgAAAAEFAAAAEGVyclVuaW5pdGlhbGl6ZWQBAAAAFmFzc2VydENhbGxlcklzQ29udHJhY3QAAAABAAAAAWkDCQEAAAACIT0AAAACCAUAAAAEdGhpcwAAAAVieXRlcwgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwkAAAIAAAABBQAAAA9lcnJVbmF1dGhvcml6ZWQFAAAABHVuaXQBAAAAFGFzc2VydEJyaWRnZUlzQWN0aXZlAAAAAAMJAQAAAAEhAAAAAQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABCAAAAABBQAA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AAAAC0JpbmFyeUVudHJ5AAAAAgkAASwAAAACBQAAAA5CUklER0VfTUFOQUdFUgUAAAAKa2V5TWFuYWdlcggJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAABWFkbWluAAAABWJ5dGVzCQAETAAAAAIJAQAAAAtCaW5hcnlFbnRyeQAAAAIFAAAADGtleVZhbGlkYXRvcggJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAEHZhbGlkYXRvckFkZHJlc3MAAAAFYnl0ZXMJAARMAAAAAgkBAAAAC0JpbmFyeUVudHJ5AAAAAgUAAAAPa2V5RmVlQ29sbGVjdG9yCAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAMZmVlQ29sbGVjdG9yAAAABWJ5dGVzCQAETAAAAAIJAQAAAAtCaW5hcnlFbnRyeQAAAAIFAAAAD2tleVVubG9ja1NpZ25lcggJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAADHVubG9ja1NpZ25lcgAAAAVieXRlcwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQa2V5QmFzZUZlZVJhdGVCUAUAAAANYmFzZUZlZVJhdGVCUAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAALa2V5SXNBY3RpdmUGBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACGFkZEFzc2V0AAAAAwAAABVhc3NldFNvdXJjZUFuZEFkZHJlc3MAAAAHYXNzZXRJZAAAAAZtaW5GZWUEAAAAC2NhbGxlckNoZWNrCQEAAAAVYXNzZXJ0Q2FsbGVySXNNYW5hZ2VyAAAAAgUAAAABaQUAAAANQVNTRVRfTUFOQUdFUgMJAAAAAAAAAgUAAAALY2FsbGVyQ2hlY2sFAAAAC2NhbGxlckNoZWNrBAAAAAskdDA0NDczNDg3MwMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAALYmFzZUFzc2V0SWQDCQEAAAACIT0AAAACBQAAABVhc3NldFNvdXJjZUFuZEFkZHJlc3MFAAAAGWJhc2VBc3NldFNvdXJjZUFuZEFkZHJlc3MJAAACAAAAAQUAAAAQZXJySW52YWxpZFZhbHVlcwkABRQAAAACBQAAAAh0eXBlQmFzZQAAAAAAAAAACAQAAAAFYXNzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAdhc3NldElkBQAAABBlcnJBc3NldE5vdEZvdW5kBAAAAAR0eXBlAwkAAAAAAAACCAUAAAAFYXNzZXQAAAAGaXNzdWVyBQAAAAR0aGlzBQAAAAt0eXBlV3JhcHBlZAUAAAAKdHlwZU5hdGl2ZQkABRQAAAACBQAAAAR0eXBlCAUAAAAFYXNzZXQAAAAIZGVjaW1hbHMEAAAABHR5cGUIBQAAAAskdDA0NDczNDg3MwAAAAJfMQQAAAAJcHJlY2lzaW9uCAUAAAALJHQwNDQ3MzQ4NzMAAAACXzIEAAAACmFzc2V0SWRTdHIJAAJaAAAAAQUAAAAHYXNzZXRJZAQAAAAQa2V5U291cmNlQWRkcmVzcwkAASwAAAACCQACWgAAAAEFAAAAFWFzc2V0U291cmNlQW5kQWRkcmVzcwUAAAAPa2V5QXNzZXRBZGRyZXNzBAAAABBrZXlOYXRpdmVBZGRyZXNzCQABLAAAAAIFAAAACmFzc2V0SWRTdHIFAAAAD2tleUFzc2V0QWRkcmVzcwMDCQEAAAAJaXNEZWZpbmVkAAAAAQkABCEAAAABBQAAABBrZXlTb3VyY2VBZGRyZXNzBgkBAAAACWlzRGVmaW5lZAAAAAEJAAQhAAAAAQUAAAAQa2V5TmF0aXZlQWRkcmVzcwkAAAIAAAABBQAAABBlcnJBbHJlYWR5RXhpc3RzCQAETAAAAAIJAQAAAAtCaW5hcnlFbnRyeQAAAAIFAAAAEGtleVNvdXJjZUFkZHJlc3MFAAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAAC0JpbmFyeUVudHJ5AAAAAgUAAAAQa2V5TmF0aXZlQWRkcmVzcwUAAAAVYXNzZXRTb3VyY2VBbmRBZGRyZXNzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAACmFzc2V0SWRTdHIFAAAADGtleUFzc2V0VHlwZQUAAAAEdHlwZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAAphc3NldElkU3RyBQAAABFrZXlBc3NldFByZWNpc2lvbgUAAAAJcHJlY2lzaW9uCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAACmFzc2V0SWRTdHIFAAAADmtleUFzc2V0TWluRmVlBQAAAAZtaW5GZWUJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIJAAEsAAAAAgUAAAAKYXNzZXRJZFN0cgUAAAAQa2V5QXNzZXRJc0FjdGl2ZQYFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAFaXNzdWUAAAADAAAABG5hbWUAAAALZGVzY3JpcHRpb24AAAAJcHJlY2lzaW9uBAAAAAtjYWxsZXJDaGVjawkBAAAAFWFzc2VydENhbGxlcklzTWFuYWdlcgAAAAIFAAAAAWkFAAAADUFTU0VUX01BTkFHRVIDCQAAAAAAAAIFAAAAC2NhbGxlckNoZWNrBQAAAAtjYWxsZXJDaGVjawkABEwAAAACCQAEQgAAAAUFAAAABG5hbWUFAAAAC2Rlc2NyaXB0aW9uAAAAAAAAAAAABQAAAAlwcmVjaXNpb24GBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAC3JlbW92ZUFzc2V0AAAAAgAAABVhc3NldFNvdXJjZUFuZEFkZHJlc3MAAAAMbmV3QXV0aG9yaXR5BAAAAAtjYWxsZXJDaGVjawkBAAAAFWFzc2VydENhbGxlcklzTWFuYWdlcgAAAAIFAAAAAWkFAAAADUFTU0VUX01BTkFHRVIDCQAAAAAAAAIFAAAAC2NhbGxlckNoZWNrBQAAAAtjYWxsZXJDaGVjawQAAAAQa2V5U291cmNlQWRkcmVzcwkAASwAAAACCQACWgAAAAEFAAAAFWFzc2V0U291cmNlQW5kQWRkcmVzcwUAAAAPa2V5QXNzZXRBZGRyZXNzBAAAAAdhc3NldElkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQhAAAAAQUAAAAQa2V5U291cmNlQWRkcmVzcwUAAAAMZXJyTm90RXhpc3RzBAAAAAphc3NldElkU3RyCQACWgAAAAEFAAAAB2Fzc2V0SWQEAAAABHR5cGUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB8AAAABCQABLAAAAAIFAAAACmFzc2V0SWRTdHIFAAAADGtleUFzc2V0VHlwZQUAAAAMZXJyTm90RXhpc3RzBAAAAAdhY3Rpb25zAwkAAAAAAAACBQAAAAR0eXBlBQAAAAh0eXBlQmFzZQQAAAAHYmFsYW5jZQkAA+8AAAABBQAAAAR0aGlzAwkAAGYAAAACCAUAAAAHYmFsYW5jZQAAAAlhdmFpbGFibGUAAAAAAAAAAAAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAMbmV3QXV0aG9yaXR5CAUAAAAHYmFsYW5jZQAAAAlhdmFpbGFibGUFAAAABHVuaXQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAR0eXBlBQAAAAp0eXBlTmF0aXZlBAAAAAdiYWxhbmNlCQAD8AAAAAIFAAAABHRoaXMFAAAAB2Fzc2V0SWQDCQAAZgAAAAIFAAAAB2JhbGFuY2UAAAAAAAAAAAAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAMbmV3QXV0aG9yaXR5BQAAAAdiYWxhbmNlBQAAAAdhc3NldElkBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAEdHlwZQUAAAALdHlwZVdyYXBwZWQFAAAAA25pbAkAAAIAAAABBQAAABBlcnJJbnZhbGlkVmFsdWVzCQAETgAAAAIFAAAAB2FjdGlvbnMJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAQa2V5U291cmNlQWRkcmVzcwkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQABLAAAAAIFAAAACmFzc2V0SWRTdHIFAAAAD2tleUFzc2V0QWRkcmVzcwkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQABLAAAAAIFAAAACmFzc2V0SWRTdHIFAAAADGtleUFzc2V0VHlwZQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQABLAAAAAIFAAAACmFzc2V0SWRTdHIFAAAAEWtleUFzc2V0UHJlY2lzaW9uCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAAEsAAAAAgUAAAAKYXNzZXRJZFN0cgUAAAAOa2V5QXNzZXRNaW5GZWUJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkAASwAAAACBQAAAAphc3NldElkU3RyBQAAABBrZXlBc3NldElzQWN0aXZlBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAABGxvY2sAAAADAAAABmxvY2tJZAAAAAlyZWNpcGllbnQAAAALZGVzdGluYXRpb24EAAAAC2JpcmRnZUNoZWNrCQEAAAAUYXNzZXJ0QnJpZGdlSXNBY3RpdmUAAAAAAwkAAAAAAAACBQAAAAtiaXJkZ2VDaGVjawUAAAALYmlyZGdlQ2hlY2sDCQAAAAAAAAIFAAAAC2Rlc3RpbmF0aW9uBQAAAApjaGFpbldhdmVzCQAAAgAAAAEFAAAAGGVycldyb25nRGVzdGluYXRpb25DaGFpbgMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQUAAAAQZXJyTm90T25lUGF5bWVudAQAAAAHYXNzZXRJZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAUAAAALYmFzZUFzc2V0SWQEAAAACmFzc2V0SWRTdHIJAAJaAAAAAQUAAAAHYXNzZXRJZAQAAAAKYXNzZXRDaGVjawkBAAAAE2Fzc2VydEFzc2V0SXNBY3RpdmUAAAABBQAAAAphc3NldElkU3RyAwkAAAAAAAACBQAAAAphc3NldENoZWNrBQAAAAphc3NldENoZWNrBAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAQAAAAQdmFsaWRhdG9yQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEIQAAAAEFAAAADGtleVZhbGlkYXRvcgUAAAAQZXJyVW5pbml0aWFsaXplZAQAAAADZmVlCQEAAAAGZ2V0RmVlAAAAAgUAAAAGYW1vdW50BQAAAAphc3NldElkU3RyBAAAABBhbW91bnRXaXRob3V0RmVlCQAAZQAAAAIFAAAABmFtb3VudAUAAAADZmVlAwkAAGcAAAACAAAAAAAAAAAABQAAABBhbW91bnRXaXRob3V0RmVlCQAAAgAAAAEFAAAAE2Vyck5vdEVub3VnaEJhbGFuY2UEAAAAFWFzc2V0U291cmNlQW5kQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEIQAAAAEJAAEsAAAAAgUAAAAKYXNzZXRJZFN0cgUAAAAPa2V5QXNzZXRBZGRyZXNzBQAAABBlcnJBc3NldE5vdEZvdW5kBAAAAAR0eXBlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQfAAAAAQkAASwAAAACBQAAAAphc3NldElkU3RyBQAAAAxrZXlBc3NldFR5cGUFAAAAEGVyckFzc2V0Tm90Rm91bmQEAAAACXByZWNpc2lvbgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHwAAAAEJAAEsAAAAAgUAAAAKYXNzZXRJZFN0cgUAAAARa2V5QXNzZXRQcmVjaXNpb24FAAAAEGVyckFzc2V0Tm90Rm91bmQEAAAADGZlZUNvbGxlY3RvcgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEIQAAAAEFAAAAD2tleUZlZUNvbGxlY3RvcgUAAAAQZXJyVW5pbml0aWFsaXplZAQAAAAKY3JlYXRlTG9jawkAA/wAAAAECQEAAAAHQWRkcmVzcwAAAAEFAAAAEHZhbGlkYXRvckFkZHJlc3MCAAAACmNyZWF0ZUxvY2sJAARMAAAAAgUAAAAGbG9ja0lkCQAETAAAAAIFAAAACXJlY2lwaWVudAkABEwAAAACCQEAAAARdG9TeXN0ZW1QcmVjaXNpb24AAAACBQAAABBhbW91bnRXaXRob3V0RmVlBQAAAAlwcmVjaXNpb24JAARMAAAAAgUAAAALZGVzdGluYXRpb24JAARMAAAAAgUAAAAVYXNzZXRTb3VyY2VBbmRBZGRyZXNzBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAKY3JlYXRlTG9jawUAAAAKY3JlYXRlTG9jawMJAAAAAAAAAgUAAAAEdHlwZQUAAAAIdHlwZUJhc2UJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAB0FkZHJlc3MAAAABBQAAAAxmZWVDb2xsZWN0b3IFAAAAA2ZlZQUAAAAEdW5pdAUAAAADbmlsAwkAAAAAAAACBQAAAAR0eXBlBQAAAAp0eXBlTmF0aXZlCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAAAdBZGRyZXNzAAAAAQUAAAAMZmVlQ29sbGVjdG9yBQAAAANmZWUFAAAAB2Fzc2V0SWQFAAAAA25pbAMJAAAAAAAAAgUAAAAEdHlwZQUAAAALdHlwZVdyYXBwZWQJAARMAAAAAgkBAAAABEJ1cm4AAAACBQAAAAdhc3NldElkBQAAABBhbW91bnRXaXRob3V0RmVlCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAAAdBZGRyZXNzAAAAAQUAAAAMZmVlQ29sbGVjdG9yBQAAAANmZWUFAAAAB2Fzc2V0SWQFAAAAA25pbAkAAAIAAAABBQAAABBlcnJJbnZhbGlkVmFsdWVzCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAABnVubG9jawAAAAYAAAAGbG9ja0lkAAAACXJlY2lwaWVudAAAAAZhbW91bnQAAAAKbG9ja1NvdXJjZQAAABVhc3NldFNvdXJjZUFuZEFkZHJlc3MAAAAJc2lnbmF0dXJlBAAAAAtiaXJkZ2VDaGVjawkBAAAAFGFzc2VydEJyaWRnZUlzQWN0aXZlAAAAAAMJAAAAAAAAAgUAAAALYmlyZGdlQ2hlY2sFAAAAC2JpcmRnZUNoZWNrBAAAAAdhc3NldElkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQhAAAAAQkAASwAAAACCQACWgAAAAEFAAAAFWFzc2V0U291cmNlQW5kQWRkcmVzcwUAAAAPa2V5QXNzZXRBZGRyZXNzBQAAABBlcnJBc3NldE5vdEZvdW5kBAAAAAphc3NldElkU3RyCQACWgAAAAEFAAAAB2Fzc2V0SWQEAAAABHR5cGUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB8AAAABCQABLAAAAAIFAAAACmFzc2V0SWRTdHIFAAAADGtleUFzc2V0VHlwZQUAAAAQZXJyQXNzZXROb3RGb3VuZAQAAAAJcHJlY2lzaW9uCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQfAAAAAQkAASwAAAACBQAAAAphc3NldElkU3RyBQAAABFrZXlBc3NldFByZWNpc2lvbgUAAAAQZXJyQXNzZXROb3RGb3VuZAQAAAAQdmFsaWRhdG9yQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEIQAAAAEFAAAADGtleVZhbGlkYXRvcgUAAAAQZXJyVW5pbml0aWFsaXplZAQAAAAMdW5sb2NrU2lnbmVyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQhAAAAAQUAAAAPa2V5VW5sb2NrU2lnbmVyBQAAABBlcnJVbmluaXRpYWxpemVkBAAAAAxmZWVDb2xsZWN0b3IJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCEAAAABBQAAAA9rZXlGZWVDb2xsZWN0b3IFAAAAEGVyclVuaW5pdGlhbGl6ZWQEAAAADGNyZWF0ZVVubG9jawkAA/wAAAAECQEAAAAHQWRkcmVzcwAAAAEFAAAAEHZhbGlkYXRvckFkZHJlc3MCAAAADGNyZWF0ZVVubG9jawkABEwAAAACBQAAAAZsb2NrSWQJAARMAAAAAggJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAACXJlY2lwaWVudAAAAAVieXRlcwkABEwAAAACBQAAAAZhbW91bnQJAARMAAAAAgUAAAAKbG9ja1NvdXJjZQkABEwAAAACBQAAABVhc3NldFNvdXJjZUFuZEFkZHJlc3MJAARMAAAAAgUAAAAJc2lnbmF0dXJlBQAAAANuaWwFAAAAA25pbAMJAAAAAAAA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AAEsAAAAAgUAAAALbWFuYWdlclR5cGUFAAAACmtleU1hbmFnZXIICQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAdtYW5hZ2VyAAAABWJ5dGVzBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAD3NldEZlZUNvbGxlY3RvcgAAAAEAAAAMZmVlQ29sbGVjdG9yBAAAAAtjYWxsZXJDaGVjawkBAAAAFWFzc2VydENhbGxlcklzTWFuYWdlcgAAAAIFAAAAAWkFAAAADkJSSURHRV9NQU5BR0VSAwkAAAAAAAACBQAAAAtjYWxsZXJDaGVjawUAAAALY2FsbGVyQ2hlY2sJAARMAAAAAgkBAAAAC0JpbmFyeUVudHJ5AAAAAgUAAAAPa2V5RmVlQ29sbGVjdG9yCAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAMZmVlQ29sbGVjdG9yAAAABWJ5dGVzBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADHNldFZhbGlkYXRvcgAAAAEAAAAJdmFsaWRhdG9yBAAAAAtjYWxsZXJDaGVjawkBAAAAFWFzc2VydENhbGxlcklzTWFuYWdlcgAAAAIFAAAAAWkFAAAADkJSSURHRV9NQU5BR0VSAwkAAAAAAAACBQAAAAtjYWxsZXJDaGVjawUAAAALY2FsbGVyQ2hlY2sJAARMAAAAAgkBAAAAC0JpbmFyeUVudHJ5AAAAAgUAAAAMa2V5VmFsaWRhdG9yCAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAJdmFsaWRhdG9yAAAABWJ5dGVzBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAD3NldFVubG9ja1NpZ25lcgAAAAEAAAAMdW5sb2NrU2lnbmVyBAAAAAtjYWxsZXJDaGVjawkBAAAAFWFzc2VydENhbGxlcklzTWFuYWdlcgAAAAIFAAAAAWkFAAAADkJSSURHRV9NQU5BR0VSAwkAAAAAAAACBQAAAAtjYWxsZXJDaGVjawUAAAALY2FsbGVyQ2hlY2sJAARMAAAAAgkBAAAAC0JpbmFyeUVudHJ5AAAAAgUAAAAPa2V5VW5sb2NrU2lnbmVyCAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAMdW5sb2NrU2lnbmVyAAAABWJ5dGVzBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAC3N0YXJ0QnJpZGdlAAAAAAQAAAALY2FsbGVyQ2hlY2sJAQAAABVhc3NlcnRDYWxsZXJJc01hbmFnZXIAAAACBQAAAAFpBQAAAA5CUklER0VfTUFOQUdFUgMJAAAAAAAAAgUAAAALY2FsbGVyQ2hlY2sFAAAAC2NhbGxlckNoZWNrCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAtrZXlJc0FjdGl2ZQYFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAKc3RvcEJyaWRnZQAAAAAEAAAAC2NhbGxlckNoZWNrCQEAAAAVYXNzZXJ0Q2FsbGVySXNNYW5hZ2VyAAAAAgUAAAABaQUAAAAMU1RPUF9NQU5BR0VSAwkAAAAAAAACBQAAAAtjYWxsZXJDaGVjawUAAAALY2FsbGVyQ2hlY2sJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAAC2tleUlzQWN0aXZlBwUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAlzZXRNaW5GZWUAAAACAAAAB2Fzc2V0SWQAAAAGbWluRmVlBAAAAAtjYWxsZXJDaGVjawkBAAAAFWFzc2VydENhbGxlcklzTWFuYWdlcgAAAAIFAAAAAWkFAAAADUFTU0VUX01BTkFHRVIDCQAAAAAAAAIFAAAAC2NhbGxlckNoZWNrBQAAAAtjYWxsZXJDaGVjawQAAAAKYXNzZXRJZFN0cgkAAloAAAABBQAAAAdhc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAACmFzc2V0SWRTdHIFAAAADmtleUFzc2V0TWluRmVlBQAAAAZtaW5GZWUFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAOc2V0QmFzZUZlZVJhdGUAAAABAAAADWJhc2VGZWVSYXRlQlAEAAAAC2NhbGxlckNoZWNrCQEAAAAVYXNzZXJ0Q2FsbGVySXNNYW5hZ2VyAAAAAgUAAAABaQUAAAANQVNTRVRfTUFOQUdFUgMJAAAAAAAAAgUAAAALY2FsbGVyQ2hlY2sFAAAAC2NhbGxlckNoZWNrCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABBrZXlCYXNlRmVlUmF0ZUJQBQAAAA1iYXNlRmVlUmF0ZUJQBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADXNldEFzc2V0U3RhdGUAAAACAAAAB2Fzc2V0SWQAAAAFc3RhdGUEAAAAC2NhbGxlckNoZWNrCQEAAAAVYXNzZXJ0Q2FsbGVySXNNYW5hZ2VyAAAAAgUAAAABaQUAAAANQVNTRVRfTUFOQUdFUgMJAAAAAAAAAgUAAAALY2FsbGVyQ2hlY2sFAAAAC2NhbGxlckNoZWNrBAAAAAphc3NldElkU3RyCQACWgAAAAEFAAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIJAAEsAAAAAgUAAAAKYXNzZXRJZFN0cgUAAAAQa2V5QXNzZXRJc0FjdGl2ZQUAAAAFc3RhdGUFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAAAo+WyDw==", "height": 3268848, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4mp7PK6JbT4CZwbF5CPSmfDdcUQ4YR8YafcCHsbNNTwy Next: none Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let keyLockRecipient = "_lr"
4+let keyAssetAddress = "_aa"
55
6-let keyLockAmount = "_la"
6+let keyAssetType = "_at"
77
8-let keyLockDestination = "_ld"
8+let keyAssetPrecision = "_ap"
99
10-let keyLockAssetSource = "_las"
10+let keyAssetMinFee = "_amf"
1111
12-let keyVersion = "_v"
12+let keyAssetIsActive = "_aia"
1313
14-let keyBridge = "_b"
14+let keyBaseFeeRateBP = "_bfr"
1515
16-let keyOracle = "_o"
16+let keyValidator = "_v"
1717
18-let keyAdmin = "_a"
18+let keyFeeCollector = "_fc"
1919
20-let keyUnlock = "_u"
20+let keyUnlockSigner = "_us"
21+
22+let keyIsActive = "_ia"
23+
24+let keyManager = "_m"
25+
26+let BRIDGE_MANAGER = "BRIDGE_MANAGER"
27+
28+let ASSET_MANAGER = "ASSET_MANAGER"
29+
30+let STOP_MANAGER = "STOP_MANAGER"
31+
32+let baseAssetSourceAndAddress = base58'fRpRFUxiLXbzAaAT3sfi1oTFa8n4X8b9FUaQHyT5MkdXYpGZV'
33+
34+let baseAssetId = base58'6scFjhFGDfpmYySMKQ9vDbZuH8aMRWsUQJAHXzm1FsJo'
35+
36+let chainWaves = base58'3EMsPJ'
37+
38+let BP = 10000
39+
40+let systemPrecision = 9
2141
2242 let errUnauthorized = "unauthorized"
2343
2444 let errUninitialized = "uninitialized"
2545
26-let errInvalidSignature = "invalid signature"
46+let errInitialized = "initialized"
2747
28-let errAlreadyClaimed = "claimed"
48+let errAlreadyExists = "exists"
2949
30-let errAlreadyLocked = "locked"
50+let errNotExists = "not exists"
3151
32-let errInvalidLockId = "invalid lockId"
52+let errInvalidValues = "invalid values"
3353
34-let chainWaves = "V0FWRQ=="
54+let errNotOnePayment = "not one payment"
3555
36-func assertCaller (i,key) = match getBinary(key) {
56+let errAssetNotFound = "asset not found"
57+
58+let errNotEnoughBalance = "not enough balance"
59+
60+let errBigPowValue = "pow value too big"
61+
62+let errBridgeDisabled = "bridge is disabled"
63+
64+let errAssetDisabled = "asset is disabled"
65+
66+let errWrongDestinationChain = "wrong destination chain"
67+
68+let typeBase = 0
69+
70+let typeNative = 1
71+
72+let typeWrapped = 2
73+
74+func assertCallerIsManager (i,managerType) = match getBinary((managerType + keyManager)) {
3775 case authority: ByteVector =>
3876 if ((authority != i.caller.bytes))
3977 then throw(errUnauthorized)
4886 else unit
4987
5088
51-func assertCallerIsBridge (i) = assertCaller(i, keyBridge)
89+func assertBridgeIsActive () = if (!(valueOrElse(getBoolean(keyIsActive), false)))
90+ then throw(errBridgeDisabled)
91+ else unit
5292
5393
54-func assertCallerIsAdmin (i) = assertCaller(i, keyAdmin)
94+func assertAssetIsActive (assetIdStr) = match getBoolean((assetIdStr + keyAssetIsActive)) {
95+ case isActive: Boolean =>
96+ if (isActive)
97+ then unit
98+ else throw(errAssetDisabled)
99+ case _ =>
100+ throw(errAssetNotFound)
101+}
55102
56103
57-func assertValidLockId (lockId) = {
58- let version = valueOrErrorMessage(getBinary(keyVersion), errUninitialized)
59- if (if ((size(lockId) != 16))
60- then true
61- else (take(lockId, 1) != version))
62- then throw(errInvalidLockId)
63- else unit
104+func getFee (amount,assetIdStr) = {
105+ let baseFeeRateBP = valueOrErrorMessage(getInteger(keyBaseFeeRateBP), errUninitialized)
106+ let minFee = valueOrErrorMessage(getInteger((assetIdStr + keyAssetMinFee)), errAssetNotFound)
107+ let fee = fraction(amount, baseFeeRateBP, BP)
108+ if ((minFee > fee))
109+ then minFee
110+ else fee
64111 }
65112
66113
67-func assertLockNotExists (lockRecipientKey) = match getBinary(lockRecipientKey) {
68- case t: ByteVector =>
69- throw(errAlreadyLocked)
70- case _ =>
71- unit
72-}
114+func pow10 (value,power) = {
115+ let absPow = if ((0 > power))
116+ then -(power)
117+ else power
118+ let powerValue = if ((absPow == 0))
119+ then 1
120+ else if ((absPow == 1))
121+ then 10
122+ else if ((absPow == 2))
123+ then 100
124+ else if ((absPow == 3))
125+ then 1000
126+ else if ((absPow == 4))
127+ then 10000
128+ else if ((absPow == 5))
129+ then 100000
130+ else if ((absPow == 6))
131+ then 1000000
132+ else if ((absPow == 7))
133+ then 10000000
134+ else if ((absPow == 8))
135+ then 100000000
136+ else if ((absPow == 9))
137+ then 1000000000
138+ else throw(errBigPowValue)
139+ if ((0 > power))
140+ then (value / powerValue)
141+ else (value * powerValue)
142+ }
143+
144+
145+func toSystemPrecision (amount,precision) = pow10(amount, (systemPrecision - precision))
146+
147+
148+func fromSystemPrecision (amount,precision) = pow10(amount, (precision - systemPrecision))
73149
74150
75151 @Callable(i)
76-func init (admin,version,bridge,oracle) = {
152+func init (admin,validatorAddress,feeCollector,unlockSigner,baseFeeRateBP) = {
77153 let callerCheck = assertCallerIsContract(i)
78154 if ((callerCheck == callerCheck))
79- then if (isDefined(getBinary(keyAdmin)))
80- then throw(errUnauthorized)
81- else [BinaryEntry(keyVersion, version), BinaryEntry(keyBridge, addressFromStringValue(bridge).bytes), BinaryEntry(keyOracle, oracle), BinaryEntry(keyAdmin, addressFromStringValue(admin).bytes)]
155+ then if (isDefined(getBinary((BRIDGE_MANAGER + keyManager))))
156+ then throw(errInitialized)
157+ else [BinaryEntry((BRIDGE_MANAGER + keyManager), addressFromStringValue(admin).bytes), BinaryEntry(keyValidator, addressFromStringValue(validatorAddress).bytes), BinaryEntry(keyFeeCollector, addressFromStringValue(feeCollector).bytes), BinaryEntry(keyUnlockSigner, addressFromStringValue(unlockSigner).bytes), IntegerEntry(keyBaseFeeRateBP, baseFeeRateBP), BooleanEntry(keyIsActive, true)]
82158 else throw("Strict value is not equal to itself.")
83159 }
84160
85161
86162
87163 @Callable(i)
88-func createUnlock (lockId,recipient,amount,lockSource,tokenSourceAndAddress,signature) = {
89- let checkLockId = assertValidLockId(lockId)
90- if ((checkLockId == checkLockId))
164+func addAsset (assetSourceAndAddress,assetId,minFee) = {
165+ let callerCheck = assertCallerIsManager(i, ASSET_MANAGER)
166+ if ((callerCheck == callerCheck))
91167 then {
92- let checkCaller = assertCallerIsBridge(i)
93- if ((checkCaller == checkCaller))
168+ let $t044734873 = if ((assetId == baseAssetId))
169+ then if ((assetSourceAndAddress != baseAssetSourceAndAddress))
170+ then throw(errInvalidValues)
171+ else $Tuple2(typeBase, 8)
172+ else {
173+ let asset = valueOrErrorMessage(assetInfo(assetId), errAssetNotFound)
174+ let type = if ((asset.issuer == this))
175+ then typeWrapped
176+ else typeNative
177+ $Tuple2(type, asset.decimals)
178+ }
179+ let type = $t044734873._1
180+ let precision = $t044734873._2
181+ let assetIdStr = toBase64String(assetId)
182+ let keySourceAddress = (toBase64String(assetSourceAndAddress) + keyAssetAddress)
183+ let keyNativeAddress = (assetIdStr + keyAssetAddress)
184+ if (if (isDefined(getBinary(keySourceAddress)))
185+ then true
186+ else isDefined(getBinary(keyNativeAddress)))
187+ then throw(errAlreadyExists)
188+ else [BinaryEntry(keySourceAddress, assetId), BinaryEntry(keyNativeAddress, assetSourceAndAddress), IntegerEntry((assetIdStr + keyAssetType), type), IntegerEntry((assetIdStr + keyAssetPrecision), precision), IntegerEntry((assetIdStr + keyAssetMinFee), minFee), BooleanEntry((assetIdStr + keyAssetIsActive), true)]
189+ }
190+ else throw("Strict value is not equal to itself.")
191+ }
192+
193+
194+
195+@Callable(i)
196+func issue (name,description,precision) = {
197+ let callerCheck = assertCallerIsManager(i, ASSET_MANAGER)
198+ if ((callerCheck == callerCheck))
199+ then [Issue(name, description, 0, precision, true)]
200+ else throw("Strict value is not equal to itself.")
201+ }
202+
203+
204+
205+@Callable(i)
206+func removeAsset (assetSourceAndAddress,newAuthority) = {
207+ let callerCheck = assertCallerIsManager(i, ASSET_MANAGER)
208+ if ((callerCheck == callerCheck))
209+ then {
210+ let keySourceAddress = (toBase64String(assetSourceAndAddress) + keyAssetAddress)
211+ let assetId = valueOrErrorMessage(getBinary(keySourceAddress), errNotExists)
212+ let assetIdStr = toBase64String(assetId)
213+ let type = valueOrErrorMessage(getInteger((assetIdStr + keyAssetType)), errNotExists)
214+ let actions = if ((type == typeBase))
94215 then {
95- let lockIdStr = toBase64String(lockId)
96- let lockSourceStr = toBase64String(lockSource)
97- let unlockKey = (((lockSourceStr + "_") + lockIdStr) + keyUnlock)
98- if (isDefined(getBoolean(unlockKey)))
99- then throw(errAlreadyClaimed)
216+ let balance = wavesBalance(this)
217+ if ((balance.available > 0))
218+ then [ScriptTransfer(addressFromStringValue(newAuthority), balance.available, unit)]
219+ else nil
220+ }
221+ else if ((type == typeNative))
222+ then {
223+ let balance = assetBalance(this, assetId)
224+ if ((balance > 0))
225+ then [ScriptTransfer(addressFromStringValue(newAuthority), balance, assetId)]
226+ else nil
227+ }
228+ else if ((type == typeWrapped))
229+ then nil
230+ else throw(errInvalidValues)
231+ (actions ++ [DeleteEntry(keySourceAddress), DeleteEntry((assetIdStr + keyAssetAddress)), DeleteEntry((assetIdStr + keyAssetType)), DeleteEntry((assetIdStr + keyAssetPrecision)), DeleteEntry((assetIdStr + keyAssetMinFee)), DeleteEntry((assetIdStr + keyAssetIsActive))])
232+ }
233+ else throw("Strict value is not equal to itself.")
234+ }
235+
236+
237+
238+@Callable(i)
239+func lock (lockId,recipient,destination) = {
240+ let birdgeCheck = assertBridgeIsActive()
241+ if ((birdgeCheck == birdgeCheck))
242+ then if ((destination == chainWaves))
243+ then throw(errWrongDestinationChain)
244+ else if ((size(i.payments) != 1))
245+ then throw(errNotOnePayment)
246+ else {
247+ let assetId = valueOrElse(i.payments[0].assetId, baseAssetId)
248+ let assetIdStr = toBase64String(assetId)
249+ let assetCheck = assertAssetIsActive(assetIdStr)
250+ if ((assetCheck == assetCheck))
251+ then {
252+ let amount = i.payments[0].amount
253+ let validatorAddress = valueOrErrorMessage(getBinary(keyValidator), errUninitialized)
254+ let fee = getFee(amount, assetIdStr)
255+ let amountWithoutFee = (amount - fee)
256+ if ((0 >= amountWithoutFee))
257+ then throw(errNotEnoughBalance)
258+ else {
259+ let assetSourceAndAddress = valueOrErrorMessage(getBinary((assetIdStr + keyAssetAddress)), errAssetNotFound)
260+ let type = valueOrErrorMessage(getInteger((assetIdStr + keyAssetType)), errAssetNotFound)
261+ let precision = valueOrErrorMessage(getInteger((assetIdStr + keyAssetPrecision)), errAssetNotFound)
262+ let feeCollector = valueOrErrorMessage(getBinary(keyFeeCollector), errUninitialized)
263+ let createLock = invoke(Address(validatorAddress), "createLock", [lockId, recipient, toSystemPrecision(amountWithoutFee, precision), destination, assetSourceAndAddress], nil)
264+ if ((createLock == createLock))
265+ then if ((type == typeBase))
266+ then [ScriptTransfer(Address(feeCollector), fee, unit)]
267+ else if ((type == typeNative))
268+ then [ScriptTransfer(Address(feeCollector), fee, assetId)]
269+ else if ((type == typeWrapped))
270+ then [Burn(assetId, amountWithoutFee), ScriptTransfer(Address(feeCollector), fee, assetId)]
271+ else throw(errInvalidValues)
272+ else throw("Strict value is not equal to itself.")
273+ }
274+ }
275+ else throw("Strict value is not equal to itself.")
276+ }
277+ else throw("Strict value is not equal to itself.")
278+ }
279+
280+
281+
282+@Callable(i)
283+func unlock (lockId,recipient,amount,lockSource,assetSourceAndAddress,signature) = {
284+ let birdgeCheck = assertBridgeIsActive()
285+ if ((birdgeCheck == birdgeCheck))
286+ then {
287+ let assetId = valueOrErrorMessage(getBinary((toBase64String(assetSourceAndAddress) + keyAssetAddress)), errAssetNotFound)
288+ let assetIdStr = toBase64String(assetId)
289+ let type = valueOrErrorMessage(getInteger((assetIdStr + keyAssetType)), errAssetNotFound)
290+ let precision = valueOrErrorMessage(getInteger((assetIdStr + keyAssetPrecision)), errAssetNotFound)
291+ let validatorAddress = valueOrErrorMessage(getBinary(keyValidator), errUninitialized)
292+ let unlockSigner = valueOrErrorMessage(getBinary(keyUnlockSigner), errUninitialized)
293+ let feeCollector = valueOrErrorMessage(getBinary(keyFeeCollector), errUninitialized)
294+ let createUnlock = invoke(Address(validatorAddress), "createUnlock", [lockId, addressFromStringValue(recipient).bytes, amount, lockSource, assetSourceAndAddress, signature], nil)
295+ if ((createUnlock == createUnlock))
296+ then {
297+ let isValid = match createUnlock {
298+ case v: Boolean =>
299+ v
300+ case _ =>
301+ false
302+ }
303+ if (!(isValid))
304+ then throw(errInvalidValues)
100305 else {
101- let message = makeString([lockIdStr, toBase64String(recipient), toString(amount), lockSourceStr, toBase64String(tokenSourceAndAddress), chainWaves], "_")
102- let hash = keccak256(toBytes(message))
103- let recoveredKey = ecrecover(hash, signature)
104- if ((recoveredKey != getBinaryValue(keyOracle)))
105- then throw(errInvalidSignature)
106- else $Tuple2([BooleanEntry(unlockKey, true)], true)
306+ let fee = if ((unlockSigner == i.caller.bytes))
307+ then valueOrErrorMessage(getInteger((assetIdStr + keyAssetMinFee)), errAssetNotFound)
308+ else 0
309+ let amountToSend = fromSystemPrecision(amount, precision)
310+ let amountToSendWithoutFee = (amountToSend - fee)
311+ if ((0 >= amountToSendWithoutFee))
312+ then throw(errNotEnoughBalance)
313+ else if ((type == typeBase))
314+ then ([ScriptTransfer(addressFromStringValue(recipient), amountToSendWithoutFee, unit)] ++ (if ((fee > 0))
315+ then [ScriptTransfer(Address(feeCollector), fee, unit)]
316+ else nil))
317+ else if ((type == typeNative))
318+ then ([ScriptTransfer(addressFromStringValue(recipient), amountToSendWithoutFee, assetId)] ++ (if ((fee > 0))
319+ then [ScriptTransfer(Address(feeCollector), fee, assetId)]
320+ else nil))
321+ else if ((type == typeWrapped))
322+ then ([Reissue(assetId, amountToSend, true), ScriptTransfer(addressFromStringValue(recipient), amountToSendWithoutFee, assetId)] ++ (if ((fee > 0))
323+ then [ScriptTransfer(Address(feeCollector), fee, assetId)]
324+ else nil))
325+ else throw(errInvalidValues)
107326 }
108327 }
109328 else throw("Strict value is not equal to itself.")
114333
115334
116335 @Callable(i)
117-func createLock (lockId,recipient,amount,lockDestination,assetSourceAndAddress) = {
118- let lockIdStr = toBase64String(lockId)
119- let lockRecipientKey = (lockIdStr + keyLockRecipient)
120- let checkCaller = assertCallerIsBridge(i)
121- if ((checkCaller == checkCaller))
336+func setManager (managerType,manager) = {
337+ let callerCheck = assertCallerIsManager(i, BRIDGE_MANAGER)
338+ if ((callerCheck == callerCheck))
339+ then [BinaryEntry((managerType + keyManager), addressFromStringValue(manager).bytes)]
340+ else throw("Strict value is not equal to itself.")
341+ }
342+
343+
344+
345+@Callable(i)
346+func setFeeCollector (feeCollector) = {
347+ let callerCheck = assertCallerIsManager(i, BRIDGE_MANAGER)
348+ if ((callerCheck == callerCheck))
349+ then [BinaryEntry(keyFeeCollector, addressFromStringValue(feeCollector).bytes)]
350+ else throw("Strict value is not equal to itself.")
351+ }
352+
353+
354+
355+@Callable(i)
356+func setValidator (validator) = {
357+ let callerCheck = assertCallerIsManager(i, BRIDGE_MANAGER)
358+ if ((callerCheck == callerCheck))
359+ then [BinaryEntry(keyValidator, addressFromStringValue(validator).bytes)]
360+ else throw("Strict value is not equal to itself.")
361+ }
362+
363+
364+
365+@Callable(i)
366+func setUnlockSigner (unlockSigner) = {
367+ let callerCheck = assertCallerIsManager(i, BRIDGE_MANAGER)
368+ if ((callerCheck == callerCheck))
369+ then [BinaryEntry(keyUnlockSigner, addressFromStringValue(unlockSigner).bytes)]
370+ else throw("Strict value is not equal to itself.")
371+ }
372+
373+
374+
375+@Callable(i)
376+func startBridge () = {
377+ let callerCheck = assertCallerIsManager(i, BRIDGE_MANAGER)
378+ if ((callerCheck == callerCheck))
379+ then [BooleanEntry(keyIsActive, true)]
380+ else throw("Strict value is not equal to itself.")
381+ }
382+
383+
384+
385+@Callable(i)
386+func stopBridge () = {
387+ let callerCheck = assertCallerIsManager(i, STOP_MANAGER)
388+ if ((callerCheck == callerCheck))
389+ then [BooleanEntry(keyIsActive, false)]
390+ else throw("Strict value is not equal to itself.")
391+ }
392+
393+
394+
395+@Callable(i)
396+func setMinFee (assetId,minFee) = {
397+ let callerCheck = assertCallerIsManager(i, ASSET_MANAGER)
398+ if ((callerCheck == callerCheck))
122399 then {
123- let checkLockId = assertValidLockId(lockId)
124- if ((checkLockId == checkLockId))
125- then {
126- let checkLock = assertLockNotExists(lockRecipientKey)
127- if ((checkLock == checkLock))
128- then [BinaryEntry((lockIdStr + keyLockRecipient), recipient), IntegerEntry((lockIdStr + keyLockAmount), amount), BinaryEntry((lockIdStr + keyLockDestination), lockDestination), BinaryEntry((lockIdStr + keyLockAssetSource), assetSourceAndAddress)]
129- else throw("Strict value is not equal to itself.")
130- }
131- else throw("Strict value is not equal to itself.")
400+ let assetIdStr = toBase64String(assetId)
401+[IntegerEntry((assetIdStr + keyAssetMinFee), minFee)]
132402 }
133403 else throw("Strict value is not equal to itself.")
134404 }
136406
137407
138408 @Callable(i)
139-func setAdmin (newAdmin) = {
140- let checkCaller = assertCallerIsAdmin(i)
141- if ((checkCaller == checkCaller))
142- then [BinaryEntry(keyAdmin, addressFromStringValue(newAdmin).bytes)]
409+func setBaseFeeRate (baseFeeRateBP) = {
410+ let callerCheck = assertCallerIsManager(i, ASSET_MANAGER)
411+ if ((callerCheck == callerCheck))
412+ then [IntegerEntry(keyBaseFeeRateBP, baseFeeRateBP)]
143413 else throw("Strict value is not equal to itself.")
144414 }
145415
146416
147417
148418 @Callable(i)
149-func setOracle (newOracle) = {
150- let checkCaller = assertCallerIsAdmin(i)
151- if ((checkCaller == checkCaller))
152- then [BinaryEntry(keyOracle, newOracle)]
153- else throw("Strict value is not equal to itself.")
154- }
155-
156-
157-
158-@Callable(i)
159-func setBridge (newBridge) = {
160- let checkCaller = assertCallerIsAdmin(i)
161- if ((checkCaller == checkCaller))
162- then [BinaryEntry(keyBridge, addressFromStringValue(newBridge).bytes)]
419+func setAssetState (assetId,state) = {
420+ let callerCheck = assertCallerIsManager(i, ASSET_MANAGER)
421+ if ((callerCheck == callerCheck))
422+ then {
423+ let assetIdStr = toBase64String(assetId)
424+[BooleanEntry((assetIdStr + keyAssetIsActive), state)]
425+ }
163426 else throw("Strict value is not equal to itself.")
164427 }
165428
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let keyLockRecipient = "_lr"
4+let keyAssetAddress = "_aa"
55
6-let keyLockAmount = "_la"
6+let keyAssetType = "_at"
77
8-let keyLockDestination = "_ld"
8+let keyAssetPrecision = "_ap"
99
10-let keyLockAssetSource = "_las"
10+let keyAssetMinFee = "_amf"
1111
12-let keyVersion = "_v"
12+let keyAssetIsActive = "_aia"
1313
14-let keyBridge = "_b"
14+let keyBaseFeeRateBP = "_bfr"
1515
16-let keyOracle = "_o"
16+let keyValidator = "_v"
1717
18-let keyAdmin = "_a"
18+let keyFeeCollector = "_fc"
1919
20-let keyUnlock = "_u"
20+let keyUnlockSigner = "_us"
21+
22+let keyIsActive = "_ia"
23+
24+let keyManager = "_m"
25+
26+let BRIDGE_MANAGER = "BRIDGE_MANAGER"
27+
28+let ASSET_MANAGER = "ASSET_MANAGER"
29+
30+let STOP_MANAGER = "STOP_MANAGER"
31+
32+let baseAssetSourceAndAddress = base58'fRpRFUxiLXbzAaAT3sfi1oTFa8n4X8b9FUaQHyT5MkdXYpGZV'
33+
34+let baseAssetId = base58'6scFjhFGDfpmYySMKQ9vDbZuH8aMRWsUQJAHXzm1FsJo'
35+
36+let chainWaves = base58'3EMsPJ'
37+
38+let BP = 10000
39+
40+let systemPrecision = 9
2141
2242 let errUnauthorized = "unauthorized"
2343
2444 let errUninitialized = "uninitialized"
2545
26-let errInvalidSignature = "invalid signature"
46+let errInitialized = "initialized"
2747
28-let errAlreadyClaimed = "claimed"
48+let errAlreadyExists = "exists"
2949
30-let errAlreadyLocked = "locked"
50+let errNotExists = "not exists"
3151
32-let errInvalidLockId = "invalid lockId"
52+let errInvalidValues = "invalid values"
3353
34-let chainWaves = "V0FWRQ=="
54+let errNotOnePayment = "not one payment"
3555
36-func assertCaller (i,key) = match getBinary(key) {
56+let errAssetNotFound = "asset not found"
57+
58+let errNotEnoughBalance = "not enough balance"
59+
60+let errBigPowValue = "pow value too big"
61+
62+let errBridgeDisabled = "bridge is disabled"
63+
64+let errAssetDisabled = "asset is disabled"
65+
66+let errWrongDestinationChain = "wrong destination chain"
67+
68+let typeBase = 0
69+
70+let typeNative = 1
71+
72+let typeWrapped = 2
73+
74+func assertCallerIsManager (i,managerType) = match getBinary((managerType + keyManager)) {
3775 case authority: ByteVector =>
3876 if ((authority != i.caller.bytes))
3977 then throw(errUnauthorized)
4078 else unit
4179 case _ =>
4280 throw(errUninitialized)
4381 }
4482
4583
4684 func assertCallerIsContract (i) = if ((this.bytes != i.caller.bytes))
4785 then throw(errUnauthorized)
4886 else unit
4987
5088
51-func assertCallerIsBridge (i) = assertCaller(i, keyBridge)
89+func assertBridgeIsActive () = if (!(valueOrElse(getBoolean(keyIsActive), false)))
90+ then throw(errBridgeDisabled)
91+ else unit
5292
5393
54-func assertCallerIsAdmin (i) = assertCaller(i, keyAdmin)
94+func assertAssetIsActive (assetIdStr) = match getBoolean((assetIdStr + keyAssetIsActive)) {
95+ case isActive: Boolean =>
96+ if (isActive)
97+ then unit
98+ else throw(errAssetDisabled)
99+ case _ =>
100+ throw(errAssetNotFound)
101+}
55102
56103
57-func assertValidLockId (lockId) = {
58- let version = valueOrErrorMessage(getBinary(keyVersion), errUninitialized)
59- if (if ((size(lockId) != 16))
60- then true
61- else (take(lockId, 1) != version))
62- then throw(errInvalidLockId)
63- else unit
104+func getFee (amount,assetIdStr) = {
105+ let baseFeeRateBP = valueOrErrorMessage(getInteger(keyBaseFeeRateBP), errUninitialized)
106+ let minFee = valueOrErrorMessage(getInteger((assetIdStr + keyAssetMinFee)), errAssetNotFound)
107+ let fee = fraction(amount, baseFeeRateBP, BP)
108+ if ((minFee > fee))
109+ then minFee
110+ else fee
64111 }
65112
66113
67-func assertLockNotExists (lockRecipientKey) = match getBinary(lockRecipientKey) {
68- case t: ByteVector =>
69- throw(errAlreadyLocked)
70- case _ =>
71- unit
72-}
114+func pow10 (value,power) = {
115+ let absPow = if ((0 > power))
116+ then -(power)
117+ else power
118+ let powerValue = if ((absPow == 0))
119+ then 1
120+ else if ((absPow == 1))
121+ then 10
122+ else if ((absPow == 2))
123+ then 100
124+ else if ((absPow == 3))
125+ then 1000
126+ else if ((absPow == 4))
127+ then 10000
128+ else if ((absPow == 5))
129+ then 100000
130+ else if ((absPow == 6))
131+ then 1000000
132+ else if ((absPow == 7))
133+ then 10000000
134+ else if ((absPow == 8))
135+ then 100000000
136+ else if ((absPow == 9))
137+ then 1000000000
138+ else throw(errBigPowValue)
139+ if ((0 > power))
140+ then (value / powerValue)
141+ else (value * powerValue)
142+ }
143+
144+
145+func toSystemPrecision (amount,precision) = pow10(amount, (systemPrecision - precision))
146+
147+
148+func fromSystemPrecision (amount,precision) = pow10(amount, (precision - systemPrecision))
73149
74150
75151 @Callable(i)
76-func init (admin,version,bridge,oracle) = {
152+func init (admin,validatorAddress,feeCollector,unlockSigner,baseFeeRateBP) = {
77153 let callerCheck = assertCallerIsContract(i)
78154 if ((callerCheck == callerCheck))
79- then if (isDefined(getBinary(keyAdmin)))
80- then throw(errUnauthorized)
81- else [BinaryEntry(keyVersion, version), BinaryEntry(keyBridge, addressFromStringValue(bridge).bytes), BinaryEntry(keyOracle, oracle), BinaryEntry(keyAdmin, addressFromStringValue(admin).bytes)]
155+ then if (isDefined(getBinary((BRIDGE_MANAGER + keyManager))))
156+ then throw(errInitialized)
157+ else [BinaryEntry((BRIDGE_MANAGER + keyManager), addressFromStringValue(admin).bytes), BinaryEntry(keyValidator, addressFromStringValue(validatorAddress).bytes), BinaryEntry(keyFeeCollector, addressFromStringValue(feeCollector).bytes), BinaryEntry(keyUnlockSigner, addressFromStringValue(unlockSigner).bytes), IntegerEntry(keyBaseFeeRateBP, baseFeeRateBP), BooleanEntry(keyIsActive, true)]
82158 else throw("Strict value is not equal to itself.")
83159 }
84160
85161
86162
87163 @Callable(i)
88-func createUnlock (lockId,recipient,amount,lockSource,tokenSourceAndAddress,signature) = {
89- let checkLockId = assertValidLockId(lockId)
90- if ((checkLockId == checkLockId))
164+func addAsset (assetSourceAndAddress,assetId,minFee) = {
165+ let callerCheck = assertCallerIsManager(i, ASSET_MANAGER)
166+ if ((callerCheck == callerCheck))
91167 then {
92- let checkCaller = assertCallerIsBridge(i)
93- if ((checkCaller == checkCaller))
168+ let $t044734873 = if ((assetId == baseAssetId))
169+ then if ((assetSourceAndAddress != baseAssetSourceAndAddress))
170+ then throw(errInvalidValues)
171+ else $Tuple2(typeBase, 8)
172+ else {
173+ let asset = valueOrErrorMessage(assetInfo(assetId), errAssetNotFound)
174+ let type = if ((asset.issuer == this))
175+ then typeWrapped
176+ else typeNative
177+ $Tuple2(type, asset.decimals)
178+ }
179+ let type = $t044734873._1
180+ let precision = $t044734873._2
181+ let assetIdStr = toBase64String(assetId)
182+ let keySourceAddress = (toBase64String(assetSourceAndAddress) + keyAssetAddress)
183+ let keyNativeAddress = (assetIdStr + keyAssetAddress)
184+ if (if (isDefined(getBinary(keySourceAddress)))
185+ then true
186+ else isDefined(getBinary(keyNativeAddress)))
187+ then throw(errAlreadyExists)
188+ else [BinaryEntry(keySourceAddress, assetId), BinaryEntry(keyNativeAddress, assetSourceAndAddress), IntegerEntry((assetIdStr + keyAssetType), type), IntegerEntry((assetIdStr + keyAssetPrecision), precision), IntegerEntry((assetIdStr + keyAssetMinFee), minFee), BooleanEntry((assetIdStr + keyAssetIsActive), true)]
189+ }
190+ else throw("Strict value is not equal to itself.")
191+ }
192+
193+
194+
195+@Callable(i)
196+func issue (name,description,precision) = {
197+ let callerCheck = assertCallerIsManager(i, ASSET_MANAGER)
198+ if ((callerCheck == callerCheck))
199+ then [Issue(name, description, 0, precision, true)]
200+ else throw("Strict value is not equal to itself.")
201+ }
202+
203+
204+
205+@Callable(i)
206+func removeAsset (assetSourceAndAddress,newAuthority) = {
207+ let callerCheck = assertCallerIsManager(i, ASSET_MANAGER)
208+ if ((callerCheck == callerCheck))
209+ then {
210+ let keySourceAddress = (toBase64String(assetSourceAndAddress) + keyAssetAddress)
211+ let assetId = valueOrErrorMessage(getBinary(keySourceAddress), errNotExists)
212+ let assetIdStr = toBase64String(assetId)
213+ let type = valueOrErrorMessage(getInteger((assetIdStr + keyAssetType)), errNotExists)
214+ let actions = if ((type == typeBase))
94215 then {
95- let lockIdStr = toBase64String(lockId)
96- let lockSourceStr = toBase64String(lockSource)
97- let unlockKey = (((lockSourceStr + "_") + lockIdStr) + keyUnlock)
98- if (isDefined(getBoolean(unlockKey)))
99- then throw(errAlreadyClaimed)
216+ let balance = wavesBalance(this)
217+ if ((balance.available > 0))
218+ then [ScriptTransfer(addressFromStringValue(newAuthority), balance.available, unit)]
219+ else nil
220+ }
221+ else if ((type == typeNative))
222+ then {
223+ let balance = assetBalance(this, assetId)
224+ if ((balance > 0))
225+ then [ScriptTransfer(addressFromStringValue(newAuthority), balance, assetId)]
226+ else nil
227+ }
228+ else if ((type == typeWrapped))
229+ then nil
230+ else throw(errInvalidValues)
231+ (actions ++ [DeleteEntry(keySourceAddress), DeleteEntry((assetIdStr + keyAssetAddress)), DeleteEntry((assetIdStr + keyAssetType)), DeleteEntry((assetIdStr + keyAssetPrecision)), DeleteEntry((assetIdStr + keyAssetMinFee)), DeleteEntry((assetIdStr + keyAssetIsActive))])
232+ }
233+ else throw("Strict value is not equal to itself.")
234+ }
235+
236+
237+
238+@Callable(i)
239+func lock (lockId,recipient,destination) = {
240+ let birdgeCheck = assertBridgeIsActive()
241+ if ((birdgeCheck == birdgeCheck))
242+ then if ((destination == chainWaves))
243+ then throw(errWrongDestinationChain)
244+ else if ((size(i.payments) != 1))
245+ then throw(errNotOnePayment)
246+ else {
247+ let assetId = valueOrElse(i.payments[0].assetId, baseAssetId)
248+ let assetIdStr = toBase64String(assetId)
249+ let assetCheck = assertAssetIsActive(assetIdStr)
250+ if ((assetCheck == assetCheck))
251+ then {
252+ let amount = i.payments[0].amount
253+ let validatorAddress = valueOrErrorMessage(getBinary(keyValidator), errUninitialized)
254+ let fee = getFee(amount, assetIdStr)
255+ let amountWithoutFee = (amount - fee)
256+ if ((0 >= amountWithoutFee))
257+ then throw(errNotEnoughBalance)
258+ else {
259+ let assetSourceAndAddress = valueOrErrorMessage(getBinary((assetIdStr + keyAssetAddress)), errAssetNotFound)
260+ let type = valueOrErrorMessage(getInteger((assetIdStr + keyAssetType)), errAssetNotFound)
261+ let precision = valueOrErrorMessage(getInteger((assetIdStr + keyAssetPrecision)), errAssetNotFound)
262+ let feeCollector = valueOrErrorMessage(getBinary(keyFeeCollector), errUninitialized)
263+ let createLock = invoke(Address(validatorAddress), "createLock", [lockId, recipient, toSystemPrecision(amountWithoutFee, precision), destination, assetSourceAndAddress], nil)
264+ if ((createLock == createLock))
265+ then if ((type == typeBase))
266+ then [ScriptTransfer(Address(feeCollector), fee, unit)]
267+ else if ((type == typeNative))
268+ then [ScriptTransfer(Address(feeCollector), fee, assetId)]
269+ else if ((type == typeWrapped))
270+ then [Burn(assetId, amountWithoutFee), ScriptTransfer(Address(feeCollector), fee, assetId)]
271+ else throw(errInvalidValues)
272+ else throw("Strict value is not equal to itself.")
273+ }
274+ }
275+ else throw("Strict value is not equal to itself.")
276+ }
277+ else throw("Strict value is not equal to itself.")
278+ }
279+
280+
281+
282+@Callable(i)
283+func unlock (lockId,recipient,amount,lockSource,assetSourceAndAddress,signature) = {
284+ let birdgeCheck = assertBridgeIsActive()
285+ if ((birdgeCheck == birdgeCheck))
286+ then {
287+ let assetId = valueOrErrorMessage(getBinary((toBase64String(assetSourceAndAddress) + keyAssetAddress)), errAssetNotFound)
288+ let assetIdStr = toBase64String(assetId)
289+ let type = valueOrErrorMessage(getInteger((assetIdStr + keyAssetType)), errAssetNotFound)
290+ let precision = valueOrErrorMessage(getInteger((assetIdStr + keyAssetPrecision)), errAssetNotFound)
291+ let validatorAddress = valueOrErrorMessage(getBinary(keyValidator), errUninitialized)
292+ let unlockSigner = valueOrErrorMessage(getBinary(keyUnlockSigner), errUninitialized)
293+ let feeCollector = valueOrErrorMessage(getBinary(keyFeeCollector), errUninitialized)
294+ let createUnlock = invoke(Address(validatorAddress), "createUnlock", [lockId, addressFromStringValue(recipient).bytes, amount, lockSource, assetSourceAndAddress, signature], nil)
295+ if ((createUnlock == createUnlock))
296+ then {
297+ let isValid = match createUnlock {
298+ case v: Boolean =>
299+ v
300+ case _ =>
301+ false
302+ }
303+ if (!(isValid))
304+ then throw(errInvalidValues)
100305 else {
101- let message = makeString([lockIdStr, toBase64String(recipient), toString(amount), lockSourceStr, toBase64String(tokenSourceAndAddress), chainWaves], "_")
102- let hash = keccak256(toBytes(message))
103- let recoveredKey = ecrecover(hash, signature)
104- if ((recoveredKey != getBinaryValue(keyOracle)))
105- then throw(errInvalidSignature)
106- else $Tuple2([BooleanEntry(unlockKey, true)], true)
306+ let fee = if ((unlockSigner == i.caller.bytes))
307+ then valueOrErrorMessage(getInteger((assetIdStr + keyAssetMinFee)), errAssetNotFound)
308+ else 0
309+ let amountToSend = fromSystemPrecision(amount, precision)
310+ let amountToSendWithoutFee = (amountToSend - fee)
311+ if ((0 >= amountToSendWithoutFee))
312+ then throw(errNotEnoughBalance)
313+ else if ((type == typeBase))
314+ then ([ScriptTransfer(addressFromStringValue(recipient), amountToSendWithoutFee, unit)] ++ (if ((fee > 0))
315+ then [ScriptTransfer(Address(feeCollector), fee, unit)]
316+ else nil))
317+ else if ((type == typeNative))
318+ then ([ScriptTransfer(addressFromStringValue(recipient), amountToSendWithoutFee, assetId)] ++ (if ((fee > 0))
319+ then [ScriptTransfer(Address(feeCollector), fee, assetId)]
320+ else nil))
321+ else if ((type == typeWrapped))
322+ then ([Reissue(assetId, amountToSend, true), ScriptTransfer(addressFromStringValue(recipient), amountToSendWithoutFee, assetId)] ++ (if ((fee > 0))
323+ then [ScriptTransfer(Address(feeCollector), fee, assetId)]
324+ else nil))
325+ else throw(errInvalidValues)
107326 }
108327 }
109328 else throw("Strict value is not equal to itself.")
110329 }
111330 else throw("Strict value is not equal to itself.")
112331 }
113332
114333
115334
116335 @Callable(i)
117-func createLock (lockId,recipient,amount,lockDestination,assetSourceAndAddress) = {
118- let lockIdStr = toBase64String(lockId)
119- let lockRecipientKey = (lockIdStr + keyLockRecipient)
120- let checkCaller = assertCallerIsBridge(i)
121- if ((checkCaller == checkCaller))
336+func setManager (managerType,manager) = {
337+ let callerCheck = assertCallerIsManager(i, BRIDGE_MANAGER)
338+ if ((callerCheck == callerCheck))
339+ then [BinaryEntry((managerType + keyManager), addressFromStringValue(manager).bytes)]
340+ else throw("Strict value is not equal to itself.")
341+ }
342+
343+
344+
345+@Callable(i)
346+func setFeeCollector (feeCollector) = {
347+ let callerCheck = assertCallerIsManager(i, BRIDGE_MANAGER)
348+ if ((callerCheck == callerCheck))
349+ then [BinaryEntry(keyFeeCollector, addressFromStringValue(feeCollector).bytes)]
350+ else throw("Strict value is not equal to itself.")
351+ }
352+
353+
354+
355+@Callable(i)
356+func setValidator (validator) = {
357+ let callerCheck = assertCallerIsManager(i, BRIDGE_MANAGER)
358+ if ((callerCheck == callerCheck))
359+ then [BinaryEntry(keyValidator, addressFromStringValue(validator).bytes)]
360+ else throw("Strict value is not equal to itself.")
361+ }
362+
363+
364+
365+@Callable(i)
366+func setUnlockSigner (unlockSigner) = {
367+ let callerCheck = assertCallerIsManager(i, BRIDGE_MANAGER)
368+ if ((callerCheck == callerCheck))
369+ then [BinaryEntry(keyUnlockSigner, addressFromStringValue(unlockSigner).bytes)]
370+ else throw("Strict value is not equal to itself.")
371+ }
372+
373+
374+
375+@Callable(i)
376+func startBridge () = {
377+ let callerCheck = assertCallerIsManager(i, BRIDGE_MANAGER)
378+ if ((callerCheck == callerCheck))
379+ then [BooleanEntry(keyIsActive, true)]
380+ else throw("Strict value is not equal to itself.")
381+ }
382+
383+
384+
385+@Callable(i)
386+func stopBridge () = {
387+ let callerCheck = assertCallerIsManager(i, STOP_MANAGER)
388+ if ((callerCheck == callerCheck))
389+ then [BooleanEntry(keyIsActive, false)]
390+ else throw("Strict value is not equal to itself.")
391+ }
392+
393+
394+
395+@Callable(i)
396+func setMinFee (assetId,minFee) = {
397+ let callerCheck = assertCallerIsManager(i, ASSET_MANAGER)
398+ if ((callerCheck == callerCheck))
122399 then {
123- let checkLockId = assertValidLockId(lockId)
124- if ((checkLockId == checkLockId))
125- then {
126- let checkLock = assertLockNotExists(lockRecipientKey)
127- if ((checkLock == checkLock))
128- then [BinaryEntry((lockIdStr + keyLockRecipient), recipient), IntegerEntry((lockIdStr + keyLockAmount), amount), BinaryEntry((lockIdStr + keyLockDestination), lockDestination), BinaryEntry((lockIdStr + keyLockAssetSource), assetSourceAndAddress)]
129- else throw("Strict value is not equal to itself.")
130- }
131- else throw("Strict value is not equal to itself.")
400+ let assetIdStr = toBase64String(assetId)
401+[IntegerEntry((assetIdStr + keyAssetMinFee), minFee)]
132402 }
133403 else throw("Strict value is not equal to itself.")
134404 }
135405
136406
137407
138408 @Callable(i)
139-func setAdmin (newAdmin) = {
140- let checkCaller = assertCallerIsAdmin(i)
141- if ((checkCaller == checkCaller))
142- then [BinaryEntry(keyAdmin, addressFromStringValue(newAdmin).bytes)]
409+func setBaseFeeRate (baseFeeRateBP) = {
410+ let callerCheck = assertCallerIsManager(i, ASSET_MANAGER)
411+ if ((callerCheck == callerCheck))
412+ then [IntegerEntry(keyBaseFeeRateBP, baseFeeRateBP)]
143413 else throw("Strict value is not equal to itself.")
144414 }
145415
146416
147417
148418 @Callable(i)
149-func setOracle (newOracle) = {
150- let checkCaller = assertCallerIsAdmin(i)
151- if ((checkCaller == checkCaller))
152- then [BinaryEntry(keyOracle, newOracle)]
153- else throw("Strict value is not equal to itself.")
154- }
155-
156-
157-
158-@Callable(i)
159-func setBridge (newBridge) = {
160- let checkCaller = assertCallerIsAdmin(i)
161- if ((checkCaller == checkCaller))
162- then [BinaryEntry(keyBridge, addressFromStringValue(newBridge).bytes)]
419+func setAssetState (assetId,state) = {
420+ let callerCheck = assertCallerIsManager(i, ASSET_MANAGER)
421+ if ((callerCheck == callerCheck))
422+ then {
423+ let assetIdStr = toBase64String(assetId)
424+[BooleanEntry((assetIdStr + keyAssetIsActive), state)]
425+ }
163426 else throw("Strict value is not equal to itself.")
164427 }
165428
166429

github/deemru/w8io/03bedc9 
44.74 ms