tx · Gf39iabP8yoqyttfs5PvoCcLoBd3ZRM8858swzxzf97

3P6hFm3EUvfWWXhpxjM8koGKhqhpdwGkVfA:  -0.02700000 Waves

2023.03.29 14:58 [3576818] smart account 3P6hFm3EUvfWWXhpxjM8koGKhqhpdwGkVfA > SELF 0.00000000 Waves

{ "type": 13, "id": "Gf39iabP8yoqyttfs5PvoCcLoBd3ZRM8858swzxzf97", "fee": 2700000, "feeAssetId": null, "timestamp": 1680091082964, "version": 2, "chainId": 87, "sender": "3P6hFm3EUvfWWXhpxjM8koGKhqhpdwGkVfA", "senderPublicKey": "FoV2xENrro8pyQKotEYiz8dw3jKzhMqqLcRnxfaiaAQu", "proofs": [ "5hDN9EWkvoEMYvoc3Z5HN56pssDLdpeyZzJ7agoTQb9YVkkwnW8mgEkjjGVK1DDzYtm2AaoNANPJQp5wyeUwK7wb" ], "script": "base64:AAIFAAAAAAAAACYIAhIJCgcRGBgYAQEYEgkKBxgYEREYARgSBQoDCAEYEgUKAwgIAQAAACEBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAxDYW4ndCByZWFkICcFAAAAA2tleQIAAAANJyBhdCBhZGRyZXNzIAkABCUAAAABBQAAAAdhZGRyZXNzAQAAABFnZXRJbnRlZ2VyT3JUaHJvdwAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADENhbid0IHJlYWQgJwUAAAADa2V5AgAAAA0nIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAAB2FkZHJlc3MBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABAAAADG1heWJlQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEFAAAADG1heWJlQWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAGkNhbid0IHBhcnNlIGFkZHJlc3MgZnJvbSAnBQAAAAxtYXliZUFkZHJlc3MCAAAAAScBAAAAEXBhcnNlSW50T3JEZWZhdWx0AAAAAgAAAAhtYXliZUludAAAAAdkZWZhdWx0CQEAAAALdmFsdWVPckVsc2UAAAACCQAEtgAAAAEFAAAACG1heWJlSW50BQAAAAdkZWZhdWx0AQAAAA9wYXJzZUludE9yVGhyb3cAAAABAAAACG1heWJlSW50CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAS2AAAAAQUAAAAIbWF5YmVJbnQJAAEsAAAAAgkAASwAAAACAgAAABpDYW4ndCBwYXJzZSBpbnRlZ2VyIGZyb20gJwUAAAAIbWF5YmVJbnQCAAAAAScBAAAACmdldEFzc2V0SWQAAAABAAAABWFzc2V0AwkAAAAAAAACBQAAAAVhc3NldAIAAAAFV0FWRVMFAAAABHVuaXQJAAJZAAAAAQUAAAAFYXNzZXQAAAAACWNvbGxlY3RvcgkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAACWNvbGxlY3RvcgAAAAAHZmVlUmF0ZQkBAAAAEWdldEludGVnZXJPclRocm93AAAAAgUAAAAEdGhpcwIAAAAIZmVlLXJhdGUAAAAACWZlZUdyYWRlcwkABLUAAAACCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAACmZlZS1ncmFkZXMCAAAAAl9fAAAAAAxzd29wZmlPcmFjbGUJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAAZvcmFjbGUAAAAADXN3b3BmaVJvdXRpbmcJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAxzd29wZmlPcmFjbGUCAAAAD3JvdXRpbmdfYWRkcmVzcwEAAAAMaXNTd29wZmlQb29sAAAAAQAAAAdhZGRyZXNzCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAxzd29wZmlPcmFjbGUJAAEsAAAAAgIAAAAFcG9vbF8FAAAAB2FkZHJlc3MAAAAACXd4RmFjdG9yeQkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAACnd4LWZhY3RvcnkAAAAABnd4U3dhcAkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAACXd4RmFjdG9yeQIAAAAQJXNfX3N3YXBDb250cmFjdAEAAAAIaXNXeFBvb2wAAAABAAAAB2FkZHJlc3MJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAACXd4RmFjdG9yeQkAASwAAAACCQABLAAAAAICAAAACCVzJXMlc19fBQAAAAdhZGRyZXNzAgAAACNfX21hcHBpbmdzX19wb29sQ29udHJhY3QyUG9vbEFzc2V0cwAAAAANcHV6emxlUm91dGluZwkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAADnB1enpsZS1yb3V0aW5nAAAAABRwdXp6bGVSZXdhcmRBc3NldFN0cgkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAABNwdXp6bGUtcmV3YXJkLXRva2VuAAAAABNwdXp6bGVSZXdhcmRBc3NldElkCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAAFHB1enpsZVJld2FyZEFzc2V0U3RyAAAAAAxwdXp6bGVSZWZLZXkCAAAABmtlZXBlcgAAAAALcGVyY2VudFJhdGUJAQAAABFnZXRJbnRlZ2VyT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAADHBlcmNlbnQtcmF0ZQEAAAAPYXNzZXRJZFRvU3RyaW5nAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAVhc3NldAUAAAAHJG1hdGNoMAkAAlgAAAABBQAAAAVhc3NldAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDACAAAABVdBVkVTCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAApnZXRCYWxhbmNlAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAVhc3NldAUAAAAHJG1hdGNoMAkAA/AAAAACBQAAAAR0aGlzBQAAAAVhc3NldAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDAICQAD7wAAAAEFAAAABHRoaXMAAAAJYXZhaWxhYmxlCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAABNnZXRCYWxhbmNlQnlBZGRyZXNzAAAAAgAAAAdhZGRyZXNzAAAAB2Fzc2V0SWQEAAAAByRtYXRjaDAF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bHQAAAACCQABkQAAAAIFAAAACWFyZ3VtZW50cwAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMcmVmZXJyZXJOYW1lCQABkQAAAAIFAAAACWFyZ3VtZW50cwAAAAAAAAAAAQkABRQAAAACBQAAAAhkZWFkbGluZQUAAAAMcmVmZXJyZXJOYW1lAQAAABZ2YWxpZGF0ZUJsb2NrVGltZXN0YW1wAAAAAQAAAAhkZWFkbGluZQMDCQAAZgAAAAIFAAAACGRlYWRsaW5lAAAAAAAAAAAACQAAZgAAAAIIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAAhkZWFkbGluZQcJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAfVGhpcyBzd2FwIGV4cGlyZWQgYXQgdGltZXN0YW1wIAkAAaQAAAABBQAAAAhkZWFkbGluZQIAAAALLiBDdXJyZW50OiAJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAGAQAAAAZkb1N3YXAAAAAFAAAABHBvb2wAAAAHcGF5bWVudAAAAA1hc3NldFJlY2VpdmVkAAAAEmVzdEFtb3VudFRvUmVjZWl2ZQAAABFzbGlwcGFnZVRvbGVyYW5jZQQAAAALcG9vbEFkZHJlc3MJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQUAAAAEcG9vbAQAAAAMdmVyc2lvbk1ham9yCQEAAAAPcGFyc2VJbnRPclRocm93AAAAAQkAAZEAAAACCQAEtQAAAAIJAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgUAAAALcG9vbEFkZHJlc3MCAAAAB3ZlcnNpb24CAAAAAS4AAAAAAAAAAAAEAAAAD2Fzc2V0UmVjZWl2ZWRJZAkBAAAACmdldEFzc2V0SWQAAAABBQAAAA1hc3NldFJlY2VpdmVkBAAAAAskdDA0NDY3NjMyOQMJAABmAAAAAgAAAAAAAAAAAAUAAAASZXN0QW1vdW50VG9SZWNlaXZlCQAAAgAAAAECAAAAI2VzdEFtb3VudFRvUmVjZWl2ZSBtdXN0IGJlIHBvc2l0aXZlAwkBAAAADGlzU3dvcGZpUG9vbAAAAAEFAAAABHBvb2wEAAAACnBvb2xBc3NldEEJAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgUAAAALcG9vbEFkZHJlc3MCAAAACkFfYXNzZXRfaWQEAAAACnBvb2xBc3NldEIJAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgUAAAALcG9vbEFkZHJlc3MCAAAACkJfYXNzZXRfaWQEAAAADHBvb2xBc3NldElkQQkBAAAACmdldEFzc2V0SWQAAAABBQAAAApwb29sQXNzZXRBBAAAAAxwb29sQXNzZXRJZEIJAQAAAApnZXRBc3NldElkAAAAAQUAAAAKcG9vbEFzc2V0QgQAAAALJHQwNDg2NTUyMDkDAwkAAAAAAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAAxwb29sQXNzZXRJZEEJAAAAAAAAAgUAAAAPYXNzZXRSZWNlaXZlZElkBQAAAAxwb29sQXNzZXRJZEIHCQAFFAAAAAIFAAAADHBvb2xBc3NldElkQQUAAAAMcG9vbEFzc2V0SWRCAwMJAAAAAAAAAgUAAAAPYXNzZXRSZWNlaXZlZElkBQAAAAxwb29sQXNzZXRJZEEJAAAAAAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAAMcG9vbEFzc2V0SWRCBwkABRQAAAACBQAAAAxwb29sQXNzZXRJZEIFAAAADHBvb2xBc3NldElkQQkAAAIAAAABAgAAABdVbnN1cHBvcnRlZCBhc3NldHMgcGFpcgQAAAAHYXNzZXRJbggFAAAACyR0MDQ4NjU1MjA5AAAAAl8xBAAAAAhhc3NldE91dAgFAAAACyR0MDQ4NjU1MjA5AAAAAl8yAwkAAAAAAAACBQAAAAx2ZXJzaW9uTWFqb3IAAAAAAAAAAAEJAAUVAAAAAwUAAAALcG9vbEFkZHJlc3MCAAAADGNhbGxGdW5jdGlvbgkABEwAAAACAgAAAAhleGNoYW5nZQkABEwAAAACCQAETAAAAAICAAAAATEFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAx2ZXJzaW9uTWFqb3IAAAAAAAAAAAIDCQAAZwAAAAIAAAAAAAAAAAAFAAAAEmVzdEFtb3VudFRvUmVjZWl2ZQkAAAIAAAABAgAAACNlc3RBbW91bnRUb1JlY2VpdmUgbXVzdCBiZSBwb3NpdGl2ZQQAAAAJbWluQW1vdW50CQAAZQAAAAIFAAAAEmVzdEFtb3VudFRvUmVjZWl2ZQkAAGsAAAADBQAAABJlc3RBbW91bnRUb1JlY2VpdmUFAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAAAAAAAPoCQAFFQAAAAMFAAAAC3Bvb2xBZGRyZXNzAgAAAAhleGNoYW5nZQkABEwAAAACBQAAABJlc3RBbW91bnRUb1JlY2VpdmUJAARMAAAAAgMJAABmAAAAAgUAAAAJbWluQW1vdW50AAAAAAAAAAAABQAAAAltaW5BbW91bnQAAAAAAAAAAAEFAAAAA25pbAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAWVW5rbm93biBwb29sIHZlcnNpb24gJwkAAaQAAAABBQAAAAx2ZXJzaW9uTWFqb3ICAAAAFicsIGJ1dCAxIG9yIDIgZXhwZWN0ZWQDCQEAAAAIaXNXeFBvb2wAAAABBQAAAARwb29sCQAFFQAAAAMFAAAABnd4U3dhcAIAAAAEc3dhcAkABEwAAAACAAAAAAAAAAABCQAETAAAAAIFAAAADWFzc2V0UmVjZWl2ZWQJAARMAAAAAgkABCUAAAABBQAAAAR0aGlzBQAAAANuaWwJAAUVAAAAAwUAAAALcG9vbEFkZHJlc3MCAAAABHN3YXAJAARMAAAAAgUAAAANYXNzZXRSZWNlaXZlZAkABEwAAAACAAAAAAAAAAAABQAAAANuaWwEAAAABGRBcHAIBQAAAAskdDA0NDY3NjMyOQAAAAJfMQQAAAAIZnVuY3Rpb24IBQAAAAskdDA0NDY3NjMyOQAAAAJfMgQAAAAEYXJncwgFAAAACyR0MDQ0Njc2MzI5AAAAAl8zBAAAAA1iYWxhbmNlQmVmb3JlCQEAAAAKZ2V0QmFsYW5jZQAAAAEFAAAAD2Fzc2V0UmVjZWl2ZWRJZAMJAAAAAAAAAgUAAAANYmFsYW5jZUJlZm9yZQUAAAANYmFsYW5jZUJlZm9yZQQAAAAGcmVzdWx0CQAD/AAAAAQFAAAABGRBcHAFAAAACGZ1bmN0aW9uBQAAAARhcmdzCQAETAAAAAIFAAAAB3BheW1lbnQFAAAAA25pbAMJAAAAAAAAAgUAAAAGcmVzdWx0BQAAAAZyZXN1bHQEAAAACHJlY2VpdmVkCQAAZQAAAAIJAQAAAApnZXRCYWxhbmNlAAAAAQUAAAAPYXNzZXRSZWNlaXZlZElkBQAAAA1iYWxhbmNlQmVmb3JlAwkAAAAAAAACBQAAAAhyZWNlaXZlZAUAAAAIcmVjZWl2ZWQDCQAAZwAAAAIAAAAAAAAAAAAFAAAACHJlY2VpdmVkCQAAAgAAAAECAAAAKlJlY2VpdmVkIGFtb3VudCBmcm9tIHBvb2wgbXVzdCBiZSBwb3NpdGl2ZQUAAAAIcmVjZWl2ZWQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAAAAD3N3YXBTaW5nbGVSb3V0ZQAAAAUAAAADaW52AAAACWFkZHJlc3NlcwAAAA9hc3NldHNUb1JlY2VpdmUAAAALZXN0UmVjZWl2ZWQAAAARc2xpcHBhZ2VUb2xlcmFuY2UEAAAAA3BtdAMJAAAAAAAAAgkAAZAAAAABCAUAAAADaW52AAAACHBheW1lbnRzAAAAAAAAAAABCQABkQAAAAIIBQAAAANpbnYAAAAIcGF5bWVudHMAAAAAAAAAAAAJAAACAAAAAQIAAAAXU2luZ2xlIHBheW1lbnQgcmVxdWlyZWQKAQAAAAhmb2xkU3dhcAAAAAIAAAAQcHJldmlvdXNSZWNlaXZlZAAAAAVpbmRleAMJAABnAAAAAgUAAAAFaW5kZXgJAAGQAAAAAQUAAAAJYWRkcmVzc2VzBQAAABBwcmV2aW91c1JlY2VpdmVkBAAAAA1hc3NldFJlY2VpdmVkCQABkQAAAAIFAAAAD2Fzc2V0c1RvUmVjZWl2ZQUAAAAFaW5kZXgEAAAAD2Fzc2V0UmVjZWl2ZWRJZAkBAAAACmdldEFzc2V0SWQAAAABBQAAAA1hc3NldFJlY2VpdmVkBAAAAAckbWF0Y2gwCQEAAAAGZG9Td2FwAAAABQkAAZEAAAACBQAAAAlhZGRyZXNzZXMFAAAABWluZGV4BQAAABBwcmV2aW91c1JlY2VpdmVkBQAAAA1hc3NldFJlY2VpdmVkCQABkQAAAAIFAAAAC2VzdFJlY2VpdmVkBQAAAAVpbmRleAUA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b3JSZXdhcmQJAABlAAAAAgUAAAADZmVlBQAAAA5yZWZlcnJlclJld2FyZAQAAAAJdHJhbnNmZXJzCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAANpbnYAAAAGY2FsbGVyBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAHYXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAljb2xsZWN0b3IFAAAAD2NvbGxlY3RvclJld2FyZAUAAAAHYXNzZXRJZAUAAAADbmlsAwkAAGYAAAACBQAAAAttaW5SZWNlaXZlZAUAAAAOYW1vdW50TWludXNGZWUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMU3dhcCByZXN1bHQgCQABpAAAAAEFAAAADmFtb3VudE1pbnVzRmVlAgAAABcgaXMgbGVzcyB0aGVuIGV4cGVjdGVkIAkAAaQAAAABBQAAAAttaW5SZWNlaXZlZAMJAAAAAAAAAgUAAAAOcmVmZXJyZXJSZXdhcmQAAAAAAAAAAAAFAAAACXRyYW5zZmVycwkABE0AAAACBQAAAAl0cmFuc2ZlcnMJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAD3JlZmVycmVyQWRkcmVzcwUAAAAOcmVmZXJyZXJSZXdhcmQFAAAAB2Fzc2V0SWQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAA2ludgEAAAAKc3dvcGZpU3dhcAAAAAcAAAAKZXhjaGFuZ2VycwAAAA5leGNoYW5nZXJzVHlwZQAAAAVhcmdzMQAAAAVhcmdzMgAAABFyb3V0aW5nQXNzZXRzS2V5cwAAABJtaW5BbW91bnRUb1JlY2VpdmUAAAAHb3B0aW9ucwQAAAANJHQwMTQ3MDIxNDc1NgkBAAAADmdldFN3YXBPcHRpb25zAAAAAQUAAAAHb3B0aW9ucwQAAAAIZGVhZGxpbmUIBQAAAA0kdDAxNDcwMjE0NzU2AAAAAl8xBAAAAAxyZWZlcnJlck5hbWUIBQAAAA0kdDAxNDcwMjE0NzU2AAAAAl8yBAAAABBpc1ZhbGlkVGltZXN0YW1wCQEAAAAWdmFsaWRhdGVCbG9ja1RpbWVzdGFtcAAAAAEFAAAACGRlYWRsaW5lAwkAAAAAAAACBQAAABBpc1ZhbGlkVGltZXN0YW1wBQAAABBpc1ZhbGlkVGltZXN0YW1wBAAAAA0kdDAxNDgyNDE0OTA0CQEAAAAWZ2V0UmVmZXJyZXJEYXRhT3JUaHJvdwAAAAEFAAAADHJlZmVycmVyTmFtZQMJAAAAAAAAAgUAAAANJHQwMTQ4MjQxNDkwNAUAAAANJHQwMTQ4MjQxNDkwNAQAAAAPcmVmZXJyZXJQZXJjZW50CAUAAAANJHQwMTQ4MjQxNDkwNAAAAAJfMgQAAAAPcmVmZXJyZXJBZGRyZXNzCAUAAAANJHQwMTQ4MjQxNDkwNAAAAAJfMQQAAAAGcmVzdWx0CQEAAAAOd3JhcFN3b3BmaVN3YXAAAAAHBQAAAANpbnYFAAAACmV4Y2hhbmdlcnMFAAAADmV4Y2hhbmdlcnNUeXBlBQAAAAVhcmdzMQUAAAAFYXJnczIFAAAAEXJvdXRpbmdBc3NldHNLZXlzBQAAABJtaW5BbW91bnRUb1JlY2VpdmUDCQAAAAAAAAIFAAAABnJlc3VsdAUAAAAGcmVzdWx0AwkAAGYAAAACBQAAAA9yZWZlcnJlclBlcmNlbnQAAAAAAAAAAAAEAAAADWxhc3RFeGNoYW5nZXIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQABkQAAAAIFAAAACmV4Y2hhbmdlcnMJAABlAAAAAgkAAZAAAAABBQAAAApleGNoYW5nZXJzAAAAAAAAAAABAgAAAClDYW4ndCBwYXJzZSBsYXN0IGV4Y2hhbmdlciBzd29wZmkgYWRkcmVzcwQAAAAObGFzdEFzc2V0SWRLZXkJAAEsAAAAAgkAAZEAAAACCQAEtQAAAAIJAAGRAAAAAgUAAAARcm91dGluZ0Fzc2V0c0tleXMJAABlAAAAAgkAAZAAAAABBQAAABFyb3V0aW5nQXNzZXRzS2V5cwAAAAAAAAAAAQIAAAABXwAAAAAAAAAAAAIAAAAJX2Fzc2V0X2lkBAAAAAphc3NldEZpbmFsCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANbGFzdEV4Y2hhbmdlcgUAAAAObGFzdEFzc2V0SWRLZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAFkNhbid0IHJlYWQgcGFyYW1ldGVyICcFAAAADmxhc3RBc3NldElkS2V5AgAAABAnIGZvciBleGNoYW5nZXIgCQAEJQAAAAEFAAAADWxhc3RFeGNoYW5nZXIEAAAAB2Fzc2V0SWQJAQAAAApnZXRBc3NldElkAAAAAQUAAAAKYXNzZXRGaW5hbAQAAAAMY29sbGVjdG9yRmVlCAkAAZEAAAACBQAAAAZyZXN1bHQAAAAAAAAAAAEAAAAGYW1vdW50BAAAAA5yZWZlcnJlclJld2FyZAkAAGsAAAADBQAAAAxjb2xsZWN0b3JGZWUFAAAAD3JlZmVycmVyUGVyY2VudAAAAAAAAAAAZAkABEwAAAACCQABkQAAAAIFAAAABnJlc3VsdAAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAljb2xsZWN0b3IJAABlAAAAAgUAAAAMY29sbGVjdG9yRmVlBQAAAA5yZWZlcnJlclJld2FyZAUAAAAHYXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA9yZWZlcnJlckFkZHJlc3MFAAAADnJlZmVycmVyUmV3YXJkBQAAAAdhc3NldElkBQAAAANuaWwFAAAABnJlc3VsdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAANpbnYBAAAACnB1enpsZVN3YXAAAAADAAAACXJvdXRlc1N0cgAAAAxtaW5Ub1JlY2VpdmUAAAAHb3B0aW9ucwQAAAANJHQwMTU5NzQxNjAyOAkBAAAADmdldFN3YXBPcHRpb25zAAAAAQUAAAAHb3B0aW9ucwQAAAAIZGVhZGxpbmUIBQAAAA0kdDAxNTk3NDE2MDI4AAAAAl8xBAAAAAxyZWZlcnJlck5hbWUIBQAAAA0kdDAxNTk3NDE2MDI4AAAAAl8yBAAAABBpc1ZhbGlkVGltZXN0YW1wCQEAAAAWdmFsaWRhdGVCbG9ja1RpbWVzdGFtcAAAAAEFAAAACGRlYWRsaW5lAwkAAAAAAAACBQAAABBpc1ZhbGlkVGltZXN0YW1wBQAAABBpc1ZhbGlkVGltZXN0YW1wBAAAAA0kdDAxNjA5NjE2MTc2CQEAAAAWZ2V0UmVmZXJyZXJEYXRhT3JUaHJvdwAAAAEFAAAADHJlZmVycmVyTmFtZQMJAAAAAAAAAgUAAAANJHQwMTYwOTYxNjE3NgUAAAANJHQwMTYwOTYxNjE3NgQAAAAPcmVmZXJyZXJQZXJjZW50CAUAAAANJHQwMTYwOTYxNjE3NgAAAAJfMgQAAAAPcmVmZXJyZXJBZGRyZXNzCAUAAAANJHQwMTYwOTYxNjE3NgAAAAJfMQMJAAAAAAAAAgkAATEAAAABBQAAAAlyb3V0ZXNTdHIAAAAAAAAAAAAJAAACAAAAAQIAAAAPSW52YWxpZCByb3V0aW5nAwkAAGcAAAACAAAAAAAAAAAABQAAAAxtaW5Ub1JlY2VpdmUJAAACAAAAAQIAAAAYU3VtIHRvIHJlY2VpdmUgaXMgdG8gbG93BAAAAA1iYWxhbmNlQmVmb3JlCQEAAAATZ2V0QmFsYW5jZUJ5QWRkcmVzcwAAAAIFAAAACWNvbGxlY3RvcgUAAAATcHV6emxlUmV3YXJkQXNzZXRJZAMJAAAAAAAAAgUAAAANYmFsYW5jZUJlZm9yZQUAAAANYmFsYW5jZUJlZm9yZQQAAAAGcmVzdWx0CQEAAAAOd3JhcFB1enpsZVN3YXAAAAADBQAAAANpbnYFAAAACXJvdXRlc1N0cgUAAAAMbWluVG9SZWNlaXZlAwkAAAAAAAACBQAAAAZyZXN1bHQFAAAABnJlc3VsdAMJAABmAAAAAgUAAAAPcmVmZXJyZXJQZXJjZW50AAAAAAAAAAAABAAAAAxhc3NldElkRmluYWwJAAGRAAAAAgkABLUAAAACBQAAAAlyb3V0ZXNTdHICAAAA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", "height": 3576818, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FajWM2wrFEJmNMFhsAgkX8BX8Tq5uAccTCwSVZy8a5PJ Next: J9jxt49CXT7T8J6hksEbZUsHbGyVyzBEuBjdiwjUc9Vk Diff:
OldNewDifferences
2424 let collector = parseAddressOrThrow(getStringOrThrow(this, "collector"))
2525
2626 let feeRate = getIntegerOrThrow(this, "fee-rate")
27+
28+let feeGrades = split(getStringOrThrow(this, "fee-grades"), "__")
2729
2830 let swopfiOracle = parseAddressOrThrow(getStringOrThrow(this, "oracle"))
2931
7981 }
8082
8183
82-func deductFee (amount) = {
83- let fee = fraction(amount, 1, feeRate)
84+func feeRatio (splits) = if ((splits > size(feeGrades)))
85+ then parseIntOrThrow(feeGrades[(size(feeGrades) - 1)])
86+ else parseIntOrThrow(feeGrades[(splits - 1)])
87+
88+
89+func deductFee (amount,ratio) = {
90+ let fee = fraction(amount, 1, ratio)
8491 $Tuple2((amount - fee), fee)
8592 }
8693
135142 let poolAddress = parseAddressOrThrow(pool)
136143 let versionMajor = parseIntOrThrow(split(getStringOrThrow(poolAddress, "version"), ".")[0])
137144 let assetReceivedId = getAssetId(assetReceived)
138- let $t042056067 = if ((0 > estAmountToReceive))
145+ let $t044676329 = if ((0 > estAmountToReceive))
139146 then throw("estAmountToReceive must be positive")
140147 else if (isSwopfiPool(pool))
141148 then {
143150 let poolAssetB = getStringOrThrow(poolAddress, "B_asset_id")
144151 let poolAssetIdA = getAssetId(poolAssetA)
145152 let poolAssetIdB = getAssetId(poolAssetB)
146- let $t046034947 = if (if ((payment.assetId == poolAssetIdA))
153+ let $t048655209 = if (if ((payment.assetId == poolAssetIdA))
147154 then (assetReceivedId == poolAssetIdB)
148155 else false)
149156 then $Tuple2(poolAssetIdA, poolAssetIdB)
152159 else false)
153160 then $Tuple2(poolAssetIdB, poolAssetIdA)
154161 else throw("Unsupported assets pair")
155- let assetIn = $t046034947._1
156- let assetOut = $t046034947._2
162+ let assetIn = $t048655209._1
163+ let assetOut = $t048655209._2
157164 if ((versionMajor == 1))
158165 then $Tuple3(poolAddress, "callFunction", ["exchange", ["1"]])
159166 else if ((versionMajor == 2))
170177 else if (isWxPool(pool))
171178 then $Tuple3(wxSwap, "swap", [1, assetReceived, toString(this)])
172179 else $Tuple3(poolAddress, "swap", [assetReceived, 0])
173- let dApp = $t042056067._1
174- let function = $t042056067._2
175- let args = $t042056067._3
180+ let dApp = $t044676329._1
181+ let function = $t044676329._2
182+ let args = $t044676329._3
176183 let balanceBefore = getBalance(assetReceivedId)
177184 if ((balanceBefore == balanceBefore))
178185 then {
192199 }
193200
194201
195-func swapSingleRoute (inv,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = {
202+func swapSingleRoute (inv,addresses,assetsToReceive,estReceived,slippageTolerance) = {
196203 let pmt = if ((size(inv.payments) == 1))
197204 then inv.payments[0]
198205 else throw("Single payment required")
231238 }
232239
233240
234-func swapMultipleRoutes (inv,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = {
241+func swapMultipleRoutes (inv,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance) = {
235242 let pmt = if ((size(inv.payments) == 1))
236243 then inv.payments[0]
237244 else throw("Single payment required")
257264
258265 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
259266 }
260- let result = swapSingleRoute(splitInv, splitAddresses, splitAssets, splitEstReceived, slippageTolerance, minReceived)
267+ let result = swapSingleRoute(splitInv, splitAddresses, splitAssets, splitEstReceived, slippageTolerance)
261268 if ((result == result))
262269 then (splitResults :+ result)
263270 else throw("Strict value is not equal to itself.")
296303 if ((balanceAfter == balanceAfter))
297304 then {
298305 let delta = (balanceAfter - balanceBefore)
299- let $t01056310608 = deductFee(delta)
300- let resultAfterFee = $t01056310608._1
301- let fee = $t01056310608._2
306+ let $t01075210804 = deductFee(delta, feeRate)
307+ let resultAfterFee = $t01075210804._1
308+ let fee = $t01075210804._2
302309 if ((0 >= delta))
303310 then throw((("Swap result " + toString(delta)) + " must be positive"))
304311 else if ((minAmountToReceive > resultAfterFee))
346353 let pmt = if ((size(inv.payments) == 1))
347354 then inv.payments[0]
348355 else throw("Single payment required")
349- let $t01198512039 = getSwapOptions(options)
350- let deadline = $t01198512039._1
351- let referrerName = $t01198512039._2
356+ let $t01218112235 = getSwapOptions(options)
357+ let deadline = $t01218112235._1
358+ let referrerName = $t01218112235._2
352359 let isValidTimestamp = validateBlockTimestamp(deadline)
353360 if ((isValidTimestamp == isValidTimestamp))
354361 then {
355- let $t01210712187 = getReferrerDataOrThrow(referrerName)
356- if (($t01210712187 == $t01210712187))
362+ let $t01230312383 = getReferrerDataOrThrow(referrerName)
363+ if (($t01230312383 == $t01230312383))
357364 then {
358- let referrerPercent = $t01210712187._2
359- let referrerAddress = $t01210712187._1
360- let validAddresses = if (if ((1 > size(addresses)))
365+ let referrerPercent = $t01230312383._2
366+ let referrerAddress = $t01230312383._1
367+ let splits = if (if (if ((size(amountsIn) != size(addresses)))
361368 then true
362- else (size(addresses) > 3))
363- then throw("Supported swap of 1 to 3 splits")
364- else addresses
365- let validSlippageTolerance = if (if ((0 > slippageTolerance))
369+ else (size(addresses) != size(assetsToReceive)))
366370 then true
367- else (slippageTolerance > 1000))
368- then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
369- else slippageTolerance
370- func sumIn (accum,next) = (accum + next)
371+ else (size(assetsToReceive) != size(estReceived)))
372+ then throw("Swap arguments must be the same size")
373+ else if (if ((1 > size(amountsIn)))
374+ then true
375+ else (size(amountsIn) > 3))
376+ then throw("Supported swap of 1 to 3 splits")
377+ else size(amountsIn)
378+ if ((splits == splits))
379+ then {
380+ let validSlippageTolerance = if (if ((0 > slippageTolerance))
381+ then true
382+ else (slippageTolerance > 1000))
383+ then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
384+ else slippageTolerance
385+ func sumIn (accum,next) = (accum + next)
371386
372- let totalAmountIn = {
373- let $l = amountsIn
374- let $s = size($l)
375- let $acc0 = 0
376- func $f0_1 ($a,$i) = if (($i >= $s))
377- then $a
378- else sumIn($a, $l[$i])
379-
380- func $f0_2 ($a,$i) = if (($i >= $s))
381- then $a
382- else throw("List size exceeds 3")
383-
384- $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
385- }
386- let amountsOut = if ((pmt.amount != totalAmountIn))
387- then throw(((("Total amount after split " + toString(totalAmountIn)) + " is not equal original payment amount ") + toString(pmt.amount)))
388- else swapMultipleRoutes(inv, amountsIn, validAddresses, assetsToReceive, estReceived, validSlippageTolerance, minReceived)
389- if ((amountsOut == amountsOut))
390- then {
391- func sumOut (total,next) = (total + next.amount)
392-
393- let totalAmountOut = {
394- let $l = amountsOut
387+ let totalAmountIn = {
388+ let $l = amountsIn
395389 let $s = size($l)
396390 let $acc0 = 0
397- func $f1_1 ($a,$i) = if (($i >= $s))
391+ func $f0_1 ($a,$i) = if (($i >= $s))
398392 then $a
399- else sumOut($a, $l[$i])
393+ else sumIn($a, $l[$i])
400394
401- func $f1_2 ($a,$i) = if (($i >= $s))
395+ func $f0_2 ($a,$i) = if (($i >= $s))
402396 then $a
403397 else throw("List size exceeds 3")
404398
405- $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
399+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
406400 }
407- let assetId = amountsOut[0].assetId
408- let $t01341413468 = deductFee(totalAmountOut)
409- let amountMinusFee = $t01341413468._1
410- let fee = $t01341413468._2
411- let referrerReward = fraction(fee, referrerPercent, 100)
412- let collectorReward = (fee - referrerReward)
413- let transfers = [ScriptTransfer(inv.caller, amountMinusFee, assetId), ScriptTransfer(collector, collectorReward, assetId)]
414- if ((minReceived > amountMinusFee))
415- then throw(((("Swap result " + toString(amountMinusFee)) + " is less then expected ") + toString(minReceived)))
416- else if ((referrerReward == 0))
417- then transfers
418- else (transfers :+ ScriptTransfer(referrerAddress, referrerReward, assetId))
401+ let amountsOut = if ((pmt.amount != totalAmountIn))
402+ then throw(((("Total amount after split " + toString(totalAmountIn)) + " is not equal original payment amount ") + toString(pmt.amount)))
403+ else swapMultipleRoutes(inv, amountsIn, addresses, assetsToReceive, estReceived, validSlippageTolerance)
404+ if ((amountsOut == amountsOut))
405+ then {
406+ func sumOut (total,next) = (total + next.amount)
407+
408+ let totalAmountOut = {
409+ let $l = amountsOut
410+ let $s = size($l)
411+ let $acc0 = 0
412+ func $f1_1 ($a,$i) = if (($i >= $s))
413+ then $a
414+ else sumOut($a, $l[$i])
415+
416+ func $f1_2 ($a,$i) = if (($i >= $s))
417+ then $a
418+ else throw("List size exceeds 3")
419+
420+ $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
421+ }
422+ let assetId = amountsOut[0].assetId
423+ let $t01383313903 = deductFee(totalAmountOut, feeRatio(splits))
424+ let amountMinusFee = $t01383313903._1
425+ let fee = $t01383313903._2
426+ let referrerReward = fraction(fee, referrerPercent, 100)
427+ let collectorReward = (fee - referrerReward)
428+ let transfers = [ScriptTransfer(inv.caller, amountMinusFee, assetId), ScriptTransfer(collector, collectorReward, assetId)]
429+ if ((minReceived > amountMinusFee))
430+ then throw(((("Swap result " + toString(amountMinusFee)) + " is less then expected ") + toString(minReceived)))
431+ else if ((referrerReward == 0))
432+ then transfers
433+ else (transfers :+ ScriptTransfer(referrerAddress, referrerReward, assetId))
434+ }
435+ else throw("Strict value is not equal to itself.")
419436 }
420437 else throw("Strict value is not equal to itself.")
421438 }
428445
429446 @Callable(inv)
430447 func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
431- let $t01426714321 = getSwapOptions(options)
432- let deadline = $t01426714321._1
433- let referrerName = $t01426714321._2
448+ let $t01470214756 = getSwapOptions(options)
449+ let deadline = $t01470214756._1
450+ let referrerName = $t01470214756._2
434451 let isValidTimestamp = validateBlockTimestamp(deadline)
435452 if ((isValidTimestamp == isValidTimestamp))
436453 then {
437- let $t01438914469 = getReferrerDataOrThrow(referrerName)
438- if (($t01438914469 == $t01438914469))
454+ let $t01482414904 = getReferrerDataOrThrow(referrerName)
455+ if (($t01482414904 == $t01482414904))
439456 then {
440- let referrerPercent = $t01438914469._2
441- let referrerAddress = $t01438914469._1
457+ let referrerPercent = $t01482414904._2
458+ let referrerAddress = $t01482414904._1
442459 let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
443460 if ((result == result))
444461 then if ((referrerPercent > 0))
463480
464481 @Callable(inv)
465482 func puzzleSwap (routesStr,minToReceive,options) = {
466- let $t01553915593 = getSwapOptions(options)
467- let deadline = $t01553915593._1
468- let referrerName = $t01553915593._2
483+ let $t01597416028 = getSwapOptions(options)
484+ let deadline = $t01597416028._1
485+ let referrerName = $t01597416028._2
469486 let isValidTimestamp = validateBlockTimestamp(deadline)
470487 if ((isValidTimestamp == isValidTimestamp))
471488 then {
472- let $t01566115741 = getReferrerDataOrThrow(referrerName)
473- if (($t01566115741 == $t01566115741))
489+ let $t01609616176 = getReferrerDataOrThrow(referrerName)
490+ if (($t01609616176 == $t01609616176))
474491 then {
475- let referrerPercent = $t01566115741._2
476- let referrerAddress = $t01566115741._1
492+ let referrerPercent = $t01609616176._2
493+ let referrerAddress = $t01609616176._1
477494 if ((size(routesStr) == 0))
478495 then throw("Invalid routing")
479496 else if ((0 >= minToReceive))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getStringOrThrow (address,key) = valueOrErrorMessage(getString(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
55
66
77 func getIntegerOrThrow (address,key) = valueOrErrorMessage(getInteger(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
88
99
1010 func parseAddressOrThrow (maybeAddress) = valueOrErrorMessage(addressFromString(maybeAddress), (("Can't parse address from '" + maybeAddress) + "'"))
1111
1212
1313 func parseIntOrDefault (maybeInt,default) = valueOrElse(parseInt(maybeInt), default)
1414
1515
1616 func parseIntOrThrow (maybeInt) = valueOrErrorMessage(parseInt(maybeInt), (("Can't parse integer from '" + maybeInt) + "'"))
1717
1818
1919 func getAssetId (asset) = if ((asset == "WAVES"))
2020 then unit
2121 else fromBase58String(asset)
2222
2323
2424 let collector = parseAddressOrThrow(getStringOrThrow(this, "collector"))
2525
2626 let feeRate = getIntegerOrThrow(this, "fee-rate")
27+
28+let feeGrades = split(getStringOrThrow(this, "fee-grades"), "__")
2729
2830 let swopfiOracle = parseAddressOrThrow(getStringOrThrow(this, "oracle"))
2931
3032 let swopfiRouting = parseAddressOrThrow(getStringOrThrow(swopfiOracle, "routing_address"))
3133
3234 func isSwopfiPool (address) = isDefined(getString(swopfiOracle, ("pool_" + address)))
3335
3436
3537 let wxFactory = parseAddressOrThrow(getStringOrThrow(this, "wx-factory"))
3638
3739 let wxSwap = parseAddressOrThrow(getStringOrThrow(wxFactory, "%s__swapContract"))
3840
3941 func isWxPool (address) = isDefined(getString(wxFactory, (("%s%s%s__" + address) + "__mappings__poolContract2PoolAssets")))
4042
4143
4244 let puzzleRouting = parseAddressOrThrow(getStringOrThrow(this, "puzzle-routing"))
4345
4446 let puzzleRewardAssetStr = getStringOrThrow(this, "puzzle-reward-token")
4547
4648 let puzzleRewardAssetId = getAssetId(puzzleRewardAssetStr)
4749
4850 let puzzleRefKey = "keeper"
4951
5052 let percentRate = getIntegerOrThrow(this, "percent-rate")
5153
5254 func assetIdToString (assetId) = match assetId {
5355 case asset: ByteVector =>
5456 toBase58String(asset)
5557 case waves: Unit =>
5658 "WAVES"
5759 case _ =>
5860 throw("Match error")
5961 }
6062
6163
6264 func getBalance (assetId) = match assetId {
6365 case asset: ByteVector =>
6466 assetBalance(this, asset)
6567 case waves: Unit =>
6668 wavesBalance(this).available
6769 case _ =>
6870 throw("Match error")
6971 }
7072
7173
7274 func getBalanceByAddress (address,assetId) = match assetId {
7375 case asset: ByteVector =>
7476 assetBalance(address, asset)
7577 case waves: Unit =>
7678 wavesBalance(address).available
7779 case _ =>
7880 throw("Match error")
7981 }
8082
8183
82-func deductFee (amount) = {
83- let fee = fraction(amount, 1, feeRate)
84+func feeRatio (splits) = if ((splits > size(feeGrades)))
85+ then parseIntOrThrow(feeGrades[(size(feeGrades) - 1)])
86+ else parseIntOrThrow(feeGrades[(splits - 1)])
87+
88+
89+func deductFee (amount,ratio) = {
90+ let fee = fraction(amount, 1, ratio)
8491 $Tuple2((amount - fee), fee)
8592 }
8693
8794
8895 func getReferrerDataOrThrow (referrerName) = if ((size(referrerName) == 0))
8996 then $Tuple2(collector, 0)
9097 else {
9198 let refAddress = parseAddressOrThrow(valueOrErrorMessage(getString(this, (("referrer-" + referrerName) + "-address")), (("referrer with name " + referrerName) + " not found")))
9299 let refPercent = valueOrElse(getInteger(this, (("referrer-" + referrerName) + "-percent")), percentRate)
93100 if (if ((0 > refPercent))
94101 then true
95102 else (refPercent > 100))
96103 then throw("Incorrect percent rate")
97104 else $Tuple2(refAddress, refPercent)
98105 }
99106
100107
101108 func getSwapOptions (options) = {
102109 func foldArguments (acc,index) = if ((index >= size(options)))
103110 then (acc :+ "")
104111 else (acc :+ options[index])
105112
106113 let indices = [0, 1]
107114 let arguments = {
108115 let $l = indices
109116 let $s = size($l)
110117 let $acc0 = nil
111118 func $f0_1 ($a,$i) = if (($i >= $s))
112119 then $a
113120 else foldArguments($a, $l[$i])
114121
115122 func $f0_2 ($a,$i) = if (($i >= $s))
116123 then $a
117124 else throw("List size exceeds 2")
118125
119126 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
120127 }
121128 let deadline = parseIntOrDefault(arguments[0], 0)
122129 let referrerName = arguments[1]
123130 $Tuple2(deadline, referrerName)
124131 }
125132
126133
127134 func validateBlockTimestamp (deadline) = if (if ((deadline > 0))
128135 then (lastBlock.timestamp > deadline)
129136 else false)
130137 then throw(((("This swap expired at timestamp " + toString(deadline)) + ". Current: ") + toString(lastBlock.timestamp)))
131138 else true
132139
133140
134141 func doSwap (pool,payment,assetReceived,estAmountToReceive,slippageTolerance) = {
135142 let poolAddress = parseAddressOrThrow(pool)
136143 let versionMajor = parseIntOrThrow(split(getStringOrThrow(poolAddress, "version"), ".")[0])
137144 let assetReceivedId = getAssetId(assetReceived)
138- let $t042056067 = if ((0 > estAmountToReceive))
145+ let $t044676329 = if ((0 > estAmountToReceive))
139146 then throw("estAmountToReceive must be positive")
140147 else if (isSwopfiPool(pool))
141148 then {
142149 let poolAssetA = getStringOrThrow(poolAddress, "A_asset_id")
143150 let poolAssetB = getStringOrThrow(poolAddress, "B_asset_id")
144151 let poolAssetIdA = getAssetId(poolAssetA)
145152 let poolAssetIdB = getAssetId(poolAssetB)
146- let $t046034947 = if (if ((payment.assetId == poolAssetIdA))
153+ let $t048655209 = if (if ((payment.assetId == poolAssetIdA))
147154 then (assetReceivedId == poolAssetIdB)
148155 else false)
149156 then $Tuple2(poolAssetIdA, poolAssetIdB)
150157 else if (if ((assetReceivedId == poolAssetIdA))
151158 then (payment.assetId == poolAssetIdB)
152159 else false)
153160 then $Tuple2(poolAssetIdB, poolAssetIdA)
154161 else throw("Unsupported assets pair")
155- let assetIn = $t046034947._1
156- let assetOut = $t046034947._2
162+ let assetIn = $t048655209._1
163+ let assetOut = $t048655209._2
157164 if ((versionMajor == 1))
158165 then $Tuple3(poolAddress, "callFunction", ["exchange", ["1"]])
159166 else if ((versionMajor == 2))
160167 then if ((0 >= estAmountToReceive))
161168 then throw("estAmountToReceive must be positive")
162169 else {
163170 let minAmount = (estAmountToReceive - fraction(estAmountToReceive, slippageTolerance, 1000))
164171 $Tuple3(poolAddress, "exchange", [estAmountToReceive, if ((minAmount > 0))
165172 then minAmount
166173 else 1])
167174 }
168175 else throw((("Unknown pool version '" + toString(versionMajor)) + "', but 1 or 2 expected"))
169176 }
170177 else if (isWxPool(pool))
171178 then $Tuple3(wxSwap, "swap", [1, assetReceived, toString(this)])
172179 else $Tuple3(poolAddress, "swap", [assetReceived, 0])
173- let dApp = $t042056067._1
174- let function = $t042056067._2
175- let args = $t042056067._3
180+ let dApp = $t044676329._1
181+ let function = $t044676329._2
182+ let args = $t044676329._3
176183 let balanceBefore = getBalance(assetReceivedId)
177184 if ((balanceBefore == balanceBefore))
178185 then {
179186 let result = invoke(dApp, function, args, [payment])
180187 if ((result == result))
181188 then {
182189 let received = (getBalance(assetReceivedId) - balanceBefore)
183190 if ((received == received))
184191 then if ((0 >= received))
185192 then throw("Received amount from pool must be positive")
186193 else received
187194 else throw("Strict value is not equal to itself.")
188195 }
189196 else throw("Strict value is not equal to itself.")
190197 }
191198 else throw("Strict value is not equal to itself.")
192199 }
193200
194201
195-func swapSingleRoute (inv,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = {
202+func swapSingleRoute (inv,addresses,assetsToReceive,estReceived,slippageTolerance) = {
196203 let pmt = if ((size(inv.payments) == 1))
197204 then inv.payments[0]
198205 else throw("Single payment required")
199206 func foldSwap (previousReceived,index) = if ((index >= size(addresses)))
200207 then previousReceived
201208 else {
202209 let assetReceived = assetsToReceive[index]
203210 let assetReceivedId = getAssetId(assetReceived)
204211 match doSwap(addresses[index], previousReceived, assetReceived, estReceived[index], slippageTolerance) {
205212 case income: Int =>
206213 AttachedPayment(assetReceivedId, income)
207214 case _ =>
208215 throw("Can't handle swap result")
209216 }
210217 }
211218
212219 let received = if ((size(addresses) > 0))
213220 then {
214221 let $l = [0, 1, 2, 3, 4]
215222 let $s = size($l)
216223 let $acc0 = pmt
217224 func $f0_1 ($a,$i) = if (($i >= $s))
218225 then $a
219226 else foldSwap($a, $l[$i])
220227
221228 func $f0_2 ($a,$i) = if (($i >= $s))
222229 then $a
223230 else throw("List size exceeds 5")
224231
225232 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
226233 }
227234 else throw("Path cannot be empty")
228235 if ((0 >= received.amount))
229236 then throw((("Swap result " + toString(received.amount)) + " must be positive"))
230237 else received
231238 }
232239
233240
234-func swapMultipleRoutes (inv,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = {
241+func swapMultipleRoutes (inv,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance) = {
235242 let pmt = if ((size(inv.payments) == 1))
236243 then inv.payments[0]
237244 else throw("Single payment required")
238245 func foldSplit (splitResults,index) = if ((index >= size(addresses)))
239246 then splitResults
240247 else {
241248 let splitInv = Invocation([AttachedPayment(pmt.assetId, amountsIn[index])], inv.caller, inv.callerPublicKey, inv.transactionId, inv.fee, inv.feeAssetId, inv.originCaller, inv.originCallerPublicKey)
242249 let splitAddresses = split(addresses[index], "_")
243250 let splitAssets = split(assetsToReceive[index], "_")
244251 func mapIntOrThrow (result,maybeInt) = (result :+ parseIntOrThrow(maybeInt))
245252
246253 let splitEstReceived = {
247254 let $l = split(estReceived[index], "_")
248255 let $s = size($l)
249256 let $acc0 = nil
250257 func $f0_1 ($a,$i) = if (($i >= $s))
251258 then $a
252259 else mapIntOrThrow($a, $l[$i])
253260
254261 func $f0_2 ($a,$i) = if (($i >= $s))
255262 then $a
256263 else throw("List size exceeds 5")
257264
258265 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
259266 }
260- let result = swapSingleRoute(splitInv, splitAddresses, splitAssets, splitEstReceived, slippageTolerance, minReceived)
267+ let result = swapSingleRoute(splitInv, splitAddresses, splitAssets, splitEstReceived, slippageTolerance)
261268 if ((result == result))
262269 then (splitResults :+ result)
263270 else throw("Strict value is not equal to itself.")
264271 }
265272
266273 let $l = [0, 1, 2]
267274 let $s = size($l)
268275 let $acc0 = nil
269276 func $f0_1 ($a,$i) = if (($i >= $s))
270277 then $a
271278 else foldSplit($a, $l[$i])
272279
273280 func $f0_2 ($a,$i) = if (($i >= $s))
274281 then $a
275282 else throw("List size exceeds 3")
276283
277284 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
278285 }
279286
280287
281288 func wrapSwopfiSwap (inv,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = {
282289 let pmt = if ((size(inv.payments) == 1))
283290 then inv.payments[0]
284291 else throw("Single payment required")
285292 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
286293 let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
287294 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
288295 let assetFinalId = getAssetId(assetFinal)
289296 let balanceBefore = getBalance(assetFinalId)
290297 if ((balanceBefore == balanceBefore))
291298 then {
292299 let result = invoke(swopfiRouting, "routingTrade", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive], [pmt])
293300 if ((result == result))
294301 then {
295302 let balanceAfter = getBalance(assetFinalId)
296303 if ((balanceAfter == balanceAfter))
297304 then {
298305 let delta = (balanceAfter - balanceBefore)
299- let $t01056310608 = deductFee(delta)
300- let resultAfterFee = $t01056310608._1
301- let fee = $t01056310608._2
306+ let $t01075210804 = deductFee(delta, feeRate)
307+ let resultAfterFee = $t01075210804._1
308+ let fee = $t01075210804._2
302309 if ((0 >= delta))
303310 then throw((("Swap result " + toString(delta)) + " must be positive"))
304311 else if ((minAmountToReceive > resultAfterFee))
305312 then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minAmountToReceive)))
306313 else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)]
307314 }
308315 else throw("Strict value is not equal to itself.")
309316 }
310317 else throw("Strict value is not equal to itself.")
311318 }
312319 else throw("Strict value is not equal to itself.")
313320 }
314321
315322
316323 func wrapPuzzleSwap (inv,routesStr,minToReceive) = {
317324 let pmt = if ((size(inv.payments) == 1))
318325 then inv.payments[0]
319326 else throw("Single payment required")
320327 let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
321328 let assetId = getAssetId(assetIdFinal)
322329 let balanceBefore = getBalance(assetId)
323330 if ((balanceBefore == balanceBefore))
324331 then {
325332 let result = invoke(puzzleRouting, "swapWithReferral", [routesStr, minToReceive, puzzleRefKey], [pmt])
326333 if ((result == result))
327334 then {
328335 let balanceAfter = getBalance(assetId)
329336 if ((balanceAfter == balanceAfter))
330337 then {
331338 let deltaProxy = (balanceAfter - balanceBefore)
332339 if ((deltaProxy == deltaProxy))
333340 then [ScriptTransfer(inv.caller, deltaProxy, assetId)]
334341 else throw("Strict value is not equal to itself.")
335342 }
336343 else throw("Strict value is not equal to itself.")
337344 }
338345 else throw("Strict value is not equal to itself.")
339346 }
340347 else throw("Strict value is not equal to itself.")
341348 }
342349
343350
344351 @Callable(inv)
345352 func swap (amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
346353 let pmt = if ((size(inv.payments) == 1))
347354 then inv.payments[0]
348355 else throw("Single payment required")
349- let $t01198512039 = getSwapOptions(options)
350- let deadline = $t01198512039._1
351- let referrerName = $t01198512039._2
356+ let $t01218112235 = getSwapOptions(options)
357+ let deadline = $t01218112235._1
358+ let referrerName = $t01218112235._2
352359 let isValidTimestamp = validateBlockTimestamp(deadline)
353360 if ((isValidTimestamp == isValidTimestamp))
354361 then {
355- let $t01210712187 = getReferrerDataOrThrow(referrerName)
356- if (($t01210712187 == $t01210712187))
362+ let $t01230312383 = getReferrerDataOrThrow(referrerName)
363+ if (($t01230312383 == $t01230312383))
357364 then {
358- let referrerPercent = $t01210712187._2
359- let referrerAddress = $t01210712187._1
360- let validAddresses = if (if ((1 > size(addresses)))
365+ let referrerPercent = $t01230312383._2
366+ let referrerAddress = $t01230312383._1
367+ let splits = if (if (if ((size(amountsIn) != size(addresses)))
361368 then true
362- else (size(addresses) > 3))
363- then throw("Supported swap of 1 to 3 splits")
364- else addresses
365- let validSlippageTolerance = if (if ((0 > slippageTolerance))
369+ else (size(addresses) != size(assetsToReceive)))
366370 then true
367- else (slippageTolerance > 1000))
368- then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
369- else slippageTolerance
370- func sumIn (accum,next) = (accum + next)
371+ else (size(assetsToReceive) != size(estReceived)))
372+ then throw("Swap arguments must be the same size")
373+ else if (if ((1 > size(amountsIn)))
374+ then true
375+ else (size(amountsIn) > 3))
376+ then throw("Supported swap of 1 to 3 splits")
377+ else size(amountsIn)
378+ if ((splits == splits))
379+ then {
380+ let validSlippageTolerance = if (if ((0 > slippageTolerance))
381+ then true
382+ else (slippageTolerance > 1000))
383+ then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
384+ else slippageTolerance
385+ func sumIn (accum,next) = (accum + next)
371386
372- let totalAmountIn = {
373- let $l = amountsIn
374- let $s = size($l)
375- let $acc0 = 0
376- func $f0_1 ($a,$i) = if (($i >= $s))
377- then $a
378- else sumIn($a, $l[$i])
379-
380- func $f0_2 ($a,$i) = if (($i >= $s))
381- then $a
382- else throw("List size exceeds 3")
383-
384- $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
385- }
386- let amountsOut = if ((pmt.amount != totalAmountIn))
387- then throw(((("Total amount after split " + toString(totalAmountIn)) + " is not equal original payment amount ") + toString(pmt.amount)))
388- else swapMultipleRoutes(inv, amountsIn, validAddresses, assetsToReceive, estReceived, validSlippageTolerance, minReceived)
389- if ((amountsOut == amountsOut))
390- then {
391- func sumOut (total,next) = (total + next.amount)
392-
393- let totalAmountOut = {
394- let $l = amountsOut
387+ let totalAmountIn = {
388+ let $l = amountsIn
395389 let $s = size($l)
396390 let $acc0 = 0
397- func $f1_1 ($a,$i) = if (($i >= $s))
391+ func $f0_1 ($a,$i) = if (($i >= $s))
398392 then $a
399- else sumOut($a, $l[$i])
393+ else sumIn($a, $l[$i])
400394
401- func $f1_2 ($a,$i) = if (($i >= $s))
395+ func $f0_2 ($a,$i) = if (($i >= $s))
402396 then $a
403397 else throw("List size exceeds 3")
404398
405- $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
399+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
406400 }
407- let assetId = amountsOut[0].assetId
408- let $t01341413468 = deductFee(totalAmountOut)
409- let amountMinusFee = $t01341413468._1
410- let fee = $t01341413468._2
411- let referrerReward = fraction(fee, referrerPercent, 100)
412- let collectorReward = (fee - referrerReward)
413- let transfers = [ScriptTransfer(inv.caller, amountMinusFee, assetId), ScriptTransfer(collector, collectorReward, assetId)]
414- if ((minReceived > amountMinusFee))
415- then throw(((("Swap result " + toString(amountMinusFee)) + " is less then expected ") + toString(minReceived)))
416- else if ((referrerReward == 0))
417- then transfers
418- else (transfers :+ ScriptTransfer(referrerAddress, referrerReward, assetId))
401+ let amountsOut = if ((pmt.amount != totalAmountIn))
402+ then throw(((("Total amount after split " + toString(totalAmountIn)) + " is not equal original payment amount ") + toString(pmt.amount)))
403+ else swapMultipleRoutes(inv, amountsIn, addresses, assetsToReceive, estReceived, validSlippageTolerance)
404+ if ((amountsOut == amountsOut))
405+ then {
406+ func sumOut (total,next) = (total + next.amount)
407+
408+ let totalAmountOut = {
409+ let $l = amountsOut
410+ let $s = size($l)
411+ let $acc0 = 0
412+ func $f1_1 ($a,$i) = if (($i >= $s))
413+ then $a
414+ else sumOut($a, $l[$i])
415+
416+ func $f1_2 ($a,$i) = if (($i >= $s))
417+ then $a
418+ else throw("List size exceeds 3")
419+
420+ $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
421+ }
422+ let assetId = amountsOut[0].assetId
423+ let $t01383313903 = deductFee(totalAmountOut, feeRatio(splits))
424+ let amountMinusFee = $t01383313903._1
425+ let fee = $t01383313903._2
426+ let referrerReward = fraction(fee, referrerPercent, 100)
427+ let collectorReward = (fee - referrerReward)
428+ let transfers = [ScriptTransfer(inv.caller, amountMinusFee, assetId), ScriptTransfer(collector, collectorReward, assetId)]
429+ if ((minReceived > amountMinusFee))
430+ then throw(((("Swap result " + toString(amountMinusFee)) + " is less then expected ") + toString(minReceived)))
431+ else if ((referrerReward == 0))
432+ then transfers
433+ else (transfers :+ ScriptTransfer(referrerAddress, referrerReward, assetId))
434+ }
435+ else throw("Strict value is not equal to itself.")
419436 }
420437 else throw("Strict value is not equal to itself.")
421438 }
422439 else throw("Strict value is not equal to itself.")
423440 }
424441 else throw("Strict value is not equal to itself.")
425442 }
426443
427444
428445
429446 @Callable(inv)
430447 func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
431- let $t01426714321 = getSwapOptions(options)
432- let deadline = $t01426714321._1
433- let referrerName = $t01426714321._2
448+ let $t01470214756 = getSwapOptions(options)
449+ let deadline = $t01470214756._1
450+ let referrerName = $t01470214756._2
434451 let isValidTimestamp = validateBlockTimestamp(deadline)
435452 if ((isValidTimestamp == isValidTimestamp))
436453 then {
437- let $t01438914469 = getReferrerDataOrThrow(referrerName)
438- if (($t01438914469 == $t01438914469))
454+ let $t01482414904 = getReferrerDataOrThrow(referrerName)
455+ if (($t01482414904 == $t01482414904))
439456 then {
440- let referrerPercent = $t01438914469._2
441- let referrerAddress = $t01438914469._1
457+ let referrerPercent = $t01482414904._2
458+ let referrerAddress = $t01482414904._1
442459 let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
443460 if ((result == result))
444461 then if ((referrerPercent > 0))
445462 then {
446463 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
447464 let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
448465 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
449466 let assetId = getAssetId(assetFinal)
450467 let collectorFee = result[1].amount
451468 let referrerReward = fraction(collectorFee, referrerPercent, 100)
452469 [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
453470 }
454471 else result
455472 else throw("Strict value is not equal to itself.")
456473 }
457474 else throw("Strict value is not equal to itself.")
458475 }
459476 else throw("Strict value is not equal to itself.")
460477 }
461478
462479
463480
464481 @Callable(inv)
465482 func puzzleSwap (routesStr,minToReceive,options) = {
466- let $t01553915593 = getSwapOptions(options)
467- let deadline = $t01553915593._1
468- let referrerName = $t01553915593._2
483+ let $t01597416028 = getSwapOptions(options)
484+ let deadline = $t01597416028._1
485+ let referrerName = $t01597416028._2
469486 let isValidTimestamp = validateBlockTimestamp(deadline)
470487 if ((isValidTimestamp == isValidTimestamp))
471488 then {
472- let $t01566115741 = getReferrerDataOrThrow(referrerName)
473- if (($t01566115741 == $t01566115741))
489+ let $t01609616176 = getReferrerDataOrThrow(referrerName)
490+ if (($t01609616176 == $t01609616176))
474491 then {
475- let referrerPercent = $t01566115741._2
476- let referrerAddress = $t01566115741._1
492+ let referrerPercent = $t01609616176._2
493+ let referrerAddress = $t01609616176._1
477494 if ((size(routesStr) == 0))
478495 then throw("Invalid routing")
479496 else if ((0 >= minToReceive))
480497 then throw("Sum to receive is to low")
481498 else {
482499 let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
483500 if ((balanceBefore == balanceBefore))
484501 then {
485502 let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
486503 if ((result == result))
487504 then if ((referrerPercent > 0))
488505 then {
489506 let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
490507 let assetId = getAssetId(assetIdFinal)
491508 let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
492509 if ((balanceAfter == balanceAfter))
493510 then {
494511 let delta = (balanceAfter - balanceBefore)
495512 if ((delta == delta))
496513 then {
497514 let reward = fraction(delta, referrerPercent, 100)
498515 let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
499516 if ((res == res))
500517 then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
501518 else throw("Strict value is not equal to itself.")
502519 }
503520 else throw("Strict value is not equal to itself.")
504521 }
505522 else throw("Strict value is not equal to itself.")
506523 }
507524 else result
508525 else throw("Strict value is not equal to itself.")
509526 }
510527 else throw("Strict value is not equal to itself.")
511528 }
512529 }
513530 else throw("Strict value is not equal to itself.")
514531 }
515532 else throw("Strict value is not equal to itself.")
516533 }
517534
518535
519536
520537 @Callable(inv)
521538 func addReferrer (referrerName,refererAddress,percent) = {
522539 let address = parseAddressOrThrow(refererAddress)
523540 if (if ((0 > percent))
524541 then true
525542 else (percent > 100))
526543 then throw("Incorrect percent rate")
527544 else if ((size(referrerName) == 0))
528545 then throw("Referrer name invalid")
529546 else if (!(containsElement([this, collector], inv.caller)))
530547 then throw("only self calls or by collector are allowed")
531548 else [StringEntry((("referrer-" + referrerName) + "-address"), refererAddress), IntegerEntry((("referrer-" + referrerName) + "-percent"), percent)]
532549 }
533550
534551
535552 @Verifier(tx)
536553 func verify () = {
537554 let maybeOracle = addressFromString(valueOrElse(getString(this, "Oracle"), ""))
538555 let maybeAdminKeys = if (isDefined(maybeOracle))
539556 then getString(value(maybeOracle), "AdminKeys")
540557 else unit
541558 match maybeAdminKeys {
542559 case adminKeysStr: String =>
543560 let adminKeys = {
544561 let stringKeys = split(adminKeysStr, ",")
545562 [fromBase58String(stringKeys[0]), fromBase58String(stringKeys[1]), fromBase58String(stringKeys[2])]
546563 }
547564 func verifyByAllKeys (proof) = if (sigVerify(tx.bodyBytes, proof, adminKeys[0]))
548565 then 1
549566 else if (sigVerify(tx.bodyBytes, proof, adminKeys[1]))
550567 then 10
551568 else if (sigVerify(tx.bodyBytes, proof, adminKeys[2]))
552569 then 100
553570 else 0
554571
555572 containsElement([110, 101, 11], (verifyByAllKeys(tx.proofs[0]) + verifyByAllKeys(tx.proofs[1])))
556573 case _ =>
557574 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
558575 }
559576 }
560577

github/deemru/w8io/3ef1775 
93.44 ms