tx · EVWMpF8k1zCAFsSpYSVSPX5GeCi5n3UCiBeuc62qepDN

3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h:  -0.01000000 Waves

2023.04.04 10:13 [2519514] smart account 3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h > SELF 0.00000000 Waves

{ "type": 13, "id": "EVWMpF8k1zCAFsSpYSVSPX5GeCi5n3UCiBeuc62qepDN", "fee": 1000000, "feeAssetId": null, "timestamp": 1680592458949, "version": 2, "chainId": 84, "sender": "3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h", "senderPublicKey": "3z8Q6Zu3KppVmn6fJJvrLc1Wo3krVHSvfaNcerm82md2", "proofs": [ "LvJnfqzvhA9v7vEaLMLsP29Lr3bkug4AnmJ5U6o8m3E3559Ckj6toNz9ifoxUDm3XuVPzuhyQpMboTXYZ9WPMTL" ], "script": "base64:BgIJCAISABIDCgEBEgADU0VQAgJfXwAMY29udHJhY3RGaWxlAg5yZWJhbGFuY2UucmlkZQARa2V5RmFjdG9yeUFkZHJlc3MCCyVzX19mYWN0b3J5ARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgIRYWRkaXRpb25hbEJhbGFuY2UJAMwIAgUHYXNzZXRJZAUDbmlsBQNTRVABHGtleUludGVybmFsQWRkaXRpb25hbEJhbGFuY2UBB2Fzc2V0SWQJALkJAgkAzAgCAgQlcyVzCQDMCAICGWludGVybmFsQWRkaXRpb25hbEJhbGFuY2UJAMwIAgUHYXNzZXRJZAUDbmlsBQNTRVABFmtleVN0YWtpbmdBc3NldEJhbGFuY2UBB2Fzc2V0SWQJALkJAgkAzAgCAgQlcyVzCQDMCAICE3N0YWtpbmdBc3NldEJhbGFuY2UJAMwIAgUHYXNzZXRJZAUDbmlsBQNTRVABFGdldEFkZGl0aW9uYWxCYWxhbmNlAQdhc3NldElkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEFB2Fzc2V0SWQAAAEcZ2V0SW50ZXJuYWxBZGRpdGlvbmFsQmFsYW5jZQEHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEca2V5SW50ZXJuYWxBZGRpdGlvbmFsQmFsYW5jZQEFB2Fzc2V0SWQAAAEWZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZQEHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEFB2Fzc2V0SWQAAAEKdGhyb3dFcnJvcgEIZXJyb3JNc2cJAAIBCQCsAgIJAKwCAgUMY29udHJhY3RGaWxlAgI6IAUIZXJyb3JNc2cBDHBhcnNlQXNzZXRJZAEFaW5wdXQDCQAAAgUFaW5wdXQCBVdBVkVTBQR1bml0CQDZBAEFBWlucHV0AQdnZXRSYXRlAQVwcm94eQQDaW52CQD8BwQFBXByb3h5AgdnZXRSYXRlBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgQHJG1hdGNoMAUDaW52AwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkBDXBhcnNlSW50VmFsdWUBBQFzCQEKdGhyb3dFcnJvcgECF2dldFJhdGUoKSByZXR1cm5lZCB6ZXJvCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARNnZXRMZWFzZVByb3h5Q29uZmlnAQdhc3NldElkBAdmYWN0b3J5CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCiCAEFEWtleUZhY3RvcnlBZGRyZXNzAgAED215QWRkcmVzc1N0cmluZwkApQgBBQR0aGlzCQD8BwQFB2ZhY3RvcnkCGmdldFBvb2xMZWFzZUNvbmZpZ1JFQURPTkxZCQDMCAIFD215QWRkcmVzc1N0cmluZwkAzAgCBQdhc3NldElkBQNuaWwFA25pbAEHZGVwb3NpdAQHYXNzZXRJZAZhbW91bnQOc3Rha2luZ0Fzc2V0SWQFcHJveHkEGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQkBFGdldEFkZGl0aW9uYWxCYWxhbmNlAQUHYXNzZXRJZAMJAAACBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQQgY3VycmVudEludGVybmFsQWRkaXRpb25hbEJhbGFuY2UJARxnZXRJbnRlcm5hbEFkZGl0aW9uYWxCYWxhbmNlAQUHYXNzZXRJZAMJAAACBSBjdXJyZW50SW50ZXJuYWxBZGRpdGlvbmFsQmFsYW5jZQUgY3VycmVudEludGVybmFsQWRkaXRpb25hbEJhbGFuY2UEGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlCQEWZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZQEFDnN0YWtpbmdBc3NldElkAwkAAAIFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQQFYXNzZXQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAMJAGYCBQZhbW91bnQAAAQNZGVwb3NpdEludm9rZQkA/AcEBQVwcm94eQIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQVhc3NldAUGYW1vdW50BQNuaWwDCQAAAgUNZGVwb3NpdEludm9rZQUNZGVwb3NpdEludm9rZQQHJG1hdGNoMAUNZGVwb3NpdEludm9rZQMJAAECBQckbWF0Y2gwAgNJbnQEFHJlY2VpdmVkU3Rha2luZ0Fzc2V0BQckbWF0Y2gwBBxuZXdJbnRlcm5hbEFkZGl0aW9uYWxCYWxhbmNlCQBkAgUgY3VycmVudEludGVybmFsQWRkaXRpb25hbEJhbGFuY2UFBmFtb3VudAQWbmV3U3Rha2luZ0Fzc2V0QmFsYW5jZQkAZAIFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBRRyZWNlaXZlZFN0YWtpbmdBc3NldAQRYWRkaXRpb25hbEJhbGFuY2UJAGUCBRxuZXdJbnRlcm5hbEFkZGl0aW9uYWxCYWxhbmNlCQEWZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZQEFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARxrZXlJbnRlcm5hbEFkZGl0aW9uYWxCYWxhbmNlAQUHYXNzZXRJZAUcbmV3SW50ZXJuYWxBZGRpdGlvbmFsQmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleVN0YWtpbmdBc3NldEJhbGFuY2UBBQ5zdGFraW5nQXNzZXRJZAUWbmV3U3Rha2luZ0Fzc2V0QmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleUFkZGl0aW9uYWxCYWxhbmNlAQUHYXNzZXRJZAURYWRkaXRpb25hbEJhbGFuY2UFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCHdpdGhkcmF3Bgdhc3NldElkBmFtb3VudA5zdGFraW5nQXNzZXRJZAVwcm94eQxwcm94eVJhdGVNdWwNcHJvZml0QWRkcmVzcwQYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlCQEUZ2V0QWRkaXRpb25hbEJhbGFuY2UBBQdhc3NldElkAwkAAAIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBBpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQkBFmdldFN0YWtpbmdBc3NldEJhbGFuY2UBBQ5zdGFraW5nQXNzZXRJZAMJAAACBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UEEGN1cnJlbnRQcm94eVJhdGUJAQdnZXRSYXRlAQUFcHJveHkDCQAAAgUQY3VycmVudFByb3h5UmF0ZQUQY3VycmVudFByb3h5UmF0ZQQHb2xkUmF0ZQkAawMFDHByb3h5UmF0ZU11bAUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQQMc3Rha2luZ0Fzc2V0CQEMcGFyc2VBc3NldElkAQUOc3Rha2luZ0Fzc2V0SWQEFG9sZFNlbmRTdGFraW5nQW1vdW50CQBrAwUMcHJveHlSYXRlTXVsBQZhbW91bnQFB29sZFJhdGUEFnNlbmRTdGFraW5nQXNzZXRBbW91bnQJAGsDBQxwcm94eVJhdGVNdWwFBmFtb3VudAUQY3VycmVudFByb3h5UmF0ZQQMcHJvZml0QW1vdW50CQCWAwEJAMwIAgAACQDMCAIJAGUCBRRvbGRTZW5kU3Rha2luZ0Ftb3VudAUWc2VuZFN0YWtpbmdBc3NldEFtb3VudAUDbmlsAwkAZgIFFnNlbmRTdGFraW5nQXNzZXRBbW91bnQAAAQOd2l0aGRyYXdJbnZva2UJAPwHBAUFcHJveHkCCHdpdGhkcmF3BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHN0YWtpbmdBc3NldAUWc2VuZFN0YWtpbmdBc3NldEFtb3VudAUDbmlsAwkAAAIFDndpdGhkcmF3SW52b2tlBQ53aXRoZHJhd0ludm9rZQQHJG1hdGNoMAUOd2l0aGRyYXdJbnZva2UDCQABAgUHJG1hdGNoMAIDSW50BA5yZWNlaXZlZEFzc2V0cwUHJG1hdGNoMAQUbmV3QWRkaXRpb25hbEJhbGFuY2UJAGUCBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UFDnJlY2VpdmVkQXNzZXRzBBZuZXdTdGFraW5nQXNzZXRCYWxhbmNlCQBlAgkAZQIFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBRZzZW5kU3Rha2luZ0Fzc2V0QW1vdW50BQxwcm9maXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEFB2Fzc2V0SWQFFG5ld0FkZGl0aW9uYWxCYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEFDnN0YWtpbmdBc3NldElkBRZuZXdTdGFraW5nQXNzZXRCYWxhbmNlBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARFyZWJhbGFuY2VJbnRlcm5hbAcLdGFyZ2V0UmF0aW8HYXNzZXRJZA5zdGFraW5nQXNzZXRJZAptaW5CYWxhbmNlBXByb3h5DHByb3h5UmF0ZU11bA1wcm9maXRBZGRyZXNzBBhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UJARRnZXRBZGRpdGlvbmFsQmFsYW5jZQEFB2Fzc2V0SWQDCQAAAgUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UEGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlCQEWZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZQEFDnN0YWtpbmdBc3NldElkAwkAAAIFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQQQYXZhaWxhYmxlQmFsYW5jZQMJAAACBQdhc3NldElkAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQdhc3NldElkAwkAAAIFEGF2YWlsYWJsZUJhbGFuY2UFEGF2YWlsYWJsZUJhbGFuY2UEDHdob2xlQmFsYW5jZQkAlgMBCQDMCAIAAAkAzAgCCQBlAgkAZAIFEGF2YWlsYWJsZUJhbGFuY2UFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUKbWluQmFsYW5jZQUDbmlsBBd0YXJnZXRBZGRpdGlvbmFsQmFsYW5jZQkAawMFC3RhcmdldFJhdGlvBQx3aG9sZUJhbGFuY2UAZAQEZGlmZgkAZQIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUXdGFyZ2V0QWRkaXRpb25hbEJhbGFuY2UDCQAAAgUEZGlmZgAABQNuaWwDCQBmAgAABQRkaWZmBA9zZW5kQXNzZXRBbW91bnQJAQEtAQUEZGlmZgkBB2RlcG9zaXQEBQdhc3NldElkBQ9zZW5kQXNzZXRBbW91bnQFDnN0YWtpbmdBc3NldElkBQVwcm94eQQOZ2V0QXNzZXRBbW91bnQFBGRpZmYJAQh3aXRoZHJhdwYFB2Fzc2V0SWQFDmdldEFzc2V0QW1vdW50BQ5zdGFraW5nQXNzZXRJZAUFcHJveHkFDHByb3h5UmF0ZU11bAUNcHJvZml0QWRkcmVzcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEOcmViYWxhbmNlQXNzZXQBB2Fzc2V0SWQEByRtYXRjaDAJARNnZXRMZWFzZVByb3h5Q29uZmlnAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAjAoQm9vbGVhbiwgSW50LCBJbnQsIFN0cmluZywgU3RyaW5nLCBJbnQsIFN0cmluZykEAWEFByRtYXRjaDAECyR0MDUyNTY1MzY1BQFhBAppc0xlYXNhYmxlCAULJHQwNTI1NjUzNjUCXzEEC2xlYXNlZFJhdGlvCAULJHQwNTI1NjUzNjUCXzIECm1pbkJhbGFuY2UIBQskdDA1MjU2NTM2NQJfMwQMcHJveHlBZGRyZXNzCAULJHQwNTI1NjUzNjUCXzQEDHByb3h5QXNzZXRJZAgFCyR0MDUyNTY1MzY1Al81BAxwcm94eVJhdGVNdWwIBQskdDA1MjU2NTM2NQJfNgQUc3Rha2luZ1Byb2ZpdEFkZHJlc3MIBQskdDA1MjU2NTM2NQJfNwMFCmlzTGVhc2FibGUJARFyZWJhbGFuY2VJbnRlcm5hbAcFC2xlYXNlZFJhdGlvBQdhc3NldElkBQxwcm94eUFzc2V0SWQFCm1pbkJhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDHByb3h5QWRkcmVzcwUMcHJveHlSYXRlTXVsCQERQGV4dHJOYXRpdmUoMTA2MikBBRRzdGFraW5nUHJvZml0QWRkcmVzcwUDbmlsCQEKdGhyb3dFcnJvcgEJAKwCAgkArAICAgFbBQdhc3NldElkAhFdIFJlYmFsYW5jZSBlcnJvcgEPcmViYWxhbmNlQXNzZXQyAgdhc3NldElkBXJhdGlvBAckbWF0Y2gwCQETZ2V0TGVhc2VQcm94eUNvbmZpZwEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIwKEJvb2xlYW4sIEludCwgSW50LCBTdHJpbmcsIFN0cmluZywgSW50LCBTdHJpbmcpBAFhBQckbWF0Y2gwBAskdDA1ODQxNTk1MAUBYQQKaXNMZWFzYWJsZQgFCyR0MDU4NDE1OTUwAl8xBAtsZWFzZWRSYXRpbwgFCyR0MDU4NDE1OTUwAl8yBAptaW5CYWxhbmNlCAULJHQwNTg0MTU5NTACXzMEDHByb3h5QWRkcmVzcwgFCyR0MDU4NDE1OTUwAl80BAxwcm94eUFzc2V0SWQIBQskdDA1ODQxNTk1MAJfNQQMcHJveHlSYXRlTXVsCAULJHQwNTg0MTU5NTACXzYEFHN0YWtpbmdQcm9maXRBZGRyZXNzCAULJHQwNTg0MTU5NTACXzcDBQppc0xlYXNhYmxlCQERcmViYWxhbmNlSW50ZXJuYWwHBQVyYXRpbwUHYXNzZXRJZAUMcHJveHlBc3NldElkBQptaW5CYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA2MikBBQxwcm94eUFkZHJlc3MFDHByb3h5UmF0ZU11bAkBEUBleHRyTmF0aXZlKDEwNjIpAQUUc3Rha2luZ1Byb2ZpdEFkZHJlc3MFA25pbAkBCnRocm93RXJyb3IBCQCsAgIJAKwCAgIBWwUHYXNzZXRJZAIRXSBSZWJhbGFuY2UgZXJyb3ICAWkBCXJlYmFsYW5jZQAJAQ5yZWJhbGFuY2VBc3NldAECBVdBVkVTAWkBCnJlYmFsYW5jZTIBBXJhdGlvCQEPcmViYWxhbmNlQXNzZXQyAgIFV0FWRVMFBXJhdGlvANN8QHQ=", "height": 2519514, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GctJ3TsQsEVdWkAXm937qNffDjiqwhJPuXKd1N9vyGes Next: ATWBUALNB8NX7CB4WWbq32im7GoaRPNNJPrsrXm78aHG Diff:
OldNewDifferences
2626
2727
2828 func throwError (errorMsg) = throw(((contractFile + ": ") + errorMsg))
29+
30+
31+func parseAssetId (input) = if ((input == "WAVES"))
32+ then unit
33+ else fromBase58String(input)
2934
3035
3136 func getRate (proxy) = {
6974 case receivedStakingAsset: Int =>
7075 let newInternalAdditionalBalance = (currentInternalAdditionalBalance + amount)
7176 let newStakingAssetBalance = (currentStakingAssetBalance + receivedStakingAsset)
72- let additionalBalance = (newInternalAdditionalBalance - newStakingAssetBalance)
77+ let additionalBalance = (newInternalAdditionalBalance - getStakingAssetBalance(assetId))
7378 [IntegerEntry(keyInternalAdditionalBalance(assetId), newInternalAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance), IntegerEntry(keyAdditionalBalance(assetId), additionalBalance)]
7479 case _ =>
7580 nil
8691 }
8792
8893
89-func withdraw (assetId,amount,stakingAssetId,proxy,proxyRateMul) = {
94+func withdraw (assetId,amount,stakingAssetId,proxy,proxyRateMul,profitAddress) = {
9095 let currentAdditionalBalance = getAdditionalBalance(assetId)
9196 if ((currentAdditionalBalance == currentAdditionalBalance))
9297 then {
96101 let currentProxyRate = getRate(proxy)
97102 if ((currentProxyRate == currentProxyRate))
98103 then {
104+ let oldRate = fraction(proxyRateMul, currentAdditionalBalance, currentStakingAssetBalance)
105+ let stakingAsset = parseAssetId(stakingAssetId)
106+ let oldSendStakingAmount = fraction(proxyRateMul, amount, oldRate)
99107 let sendStakingAssetAmount = fraction(proxyRateMul, amount, currentProxyRate)
108+ let profitAmount = max([0, (oldSendStakingAmount - sendStakingAssetAmount)])
100109 if ((sendStakingAssetAmount > 0))
101110 then {
102- let withdrawInvoke = invoke(proxy, "withdraw", nil, [AttachedPayment(fromBase58String(stakingAssetId), sendStakingAssetAmount)])
111+ let withdrawInvoke = invoke(proxy, "withdraw", nil, [AttachedPayment(stakingAsset, sendStakingAssetAmount)])
103112 if ((withdrawInvoke == withdrawInvoke))
104113 then match withdrawInvoke {
105114 case receivedAssets: Int =>
106115 let newAdditionalBalance = (currentAdditionalBalance - receivedAssets)
107- let newSWavesBalance = (currentStakingAssetBalance - sendStakingAssetAmount)
108-[IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newSWavesBalance)]
116+ let newStakingAssetBalance = ((currentStakingAssetBalance - sendStakingAssetAmount) - profitAmount)
117+[IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance)]
109118 case _ =>
110119 nil
111120 }
121130 }
122131
123132
124-func rebalanceInternal (targetRatio,assetId,stakingAssetId,minBalance,proxy,proxyRateMul) = {
133+func rebalanceInternal (targetRatio,assetId,stakingAssetId,minBalance,proxy,proxyRateMul,profitAddress) = {
125134 let currentAdditionalBalance = getAdditionalBalance(assetId)
126135 if ((currentAdditionalBalance == currentAdditionalBalance))
127136 then {
145154 }
146155 else {
147156 let getAssetAmount = diff
148- withdraw(assetId, getAssetAmount, stakingAssetId, proxy, proxyRateMul)
157+ withdraw(assetId, getAssetAmount, stakingAssetId, proxy, proxyRateMul, profitAddress)
149158 }
150159 }
151160 else throw("Strict value is not equal to itself.")
158167
159168 func rebalanceAsset (assetId) = match getLeaseProxyConfig(assetId) {
160169 case a: (Boolean, Int, Int, String, String, Int, String) =>
161- let $t048894998 = a
162- let isLeasable = $t048894998._1
163- let leasedRatio = $t048894998._2
164- let minBalance = $t048894998._3
165- let proxyAddress = $t048894998._4
166- let proxyAssetId = $t048894998._5
167- let proxyRateMul = $t048894998._6
168- let stakingProfitAddress = $t048894998._7
170+ let $t052565365 = a
171+ let isLeasable = $t052565365._1
172+ let leasedRatio = $t052565365._2
173+ let minBalance = $t052565365._3
174+ let proxyAddress = $t052565365._4
175+ let proxyAssetId = $t052565365._5
176+ let proxyRateMul = $t052565365._6
177+ let stakingProfitAddress = $t052565365._7
169178 if (isLeasable)
170- then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul)
179+ then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
180+ else nil
181+ case _ =>
182+ throwError((("[" + assetId) + "] Rebalance error"))
183+}
184+
185+
186+func rebalanceAsset2 (assetId,ratio) = match getLeaseProxyConfig(assetId) {
187+ case a: (Boolean, Int, Int, String, String, Int, String) =>
188+ let $t058415950 = a
189+ let isLeasable = $t058415950._1
190+ let leasedRatio = $t058415950._2
191+ let minBalance = $t058415950._3
192+ let proxyAddress = $t058415950._4
193+ let proxyAssetId = $t058415950._5
194+ let proxyRateMul = $t058415950._6
195+ let stakingProfitAddress = $t058415950._7
196+ if (isLeasable)
197+ then rebalanceInternal(ratio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
171198 else nil
172199 case _ =>
173200 throwError((("[" + assetId) + "] Rebalance error"))
178205 func rebalance () = rebalanceAsset("WAVES")
179206
180207
208+
209+@Callable(i)
210+func rebalance2 (ratio) = rebalanceAsset2("WAVES", ratio)
211+
212+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let contractFile = "rebalance.ride"
77
88 let keyFactoryAddress = "%s__factory"
99
1010 func keyAdditionalBalance (assetId) = makeString(["%s%s", "additionalBalance", assetId], SEP)
1111
1212
1313 func keyInternalAdditionalBalance (assetId) = makeString(["%s%s", "internalAdditionalBalance", assetId], SEP)
1414
1515
1616 func keyStakingAssetBalance (assetId) = makeString(["%s%s", "stakingAssetBalance", assetId], SEP)
1717
1818
1919 func getAdditionalBalance (assetId) = valueOrElse(getInteger(this, keyAdditionalBalance(assetId)), 0)
2020
2121
2222 func getInternalAdditionalBalance (assetId) = valueOrElse(getInteger(this, keyInternalAdditionalBalance(assetId)), 0)
2323
2424
2525 func getStakingAssetBalance (assetId) = valueOrElse(getInteger(this, keyStakingAssetBalance(assetId)), 0)
2626
2727
2828 func throwError (errorMsg) = throw(((contractFile + ": ") + errorMsg))
29+
30+
31+func parseAssetId (input) = if ((input == "WAVES"))
32+ then unit
33+ else fromBase58String(input)
2934
3035
3136 func getRate (proxy) = {
3237 let inv = invoke(proxy, "getRate", nil, nil)
3338 if ((inv == inv))
3439 then match inv {
3540 case s: String =>
3641 parseIntValue(s)
3742 case _ =>
3843 throwError("getRate() returned zero")
3944 }
4045 else throw("Strict value is not equal to itself.")
4146 }
4247
4348
4449 func getLeaseProxyConfig (assetId) = {
4550 let factory = addressFromStringValue(valueOrElse(getString(keyFactoryAddress), ""))
4651 let myAddressString = toString(this)
4752 invoke(factory, "getPoolLeaseConfigREADONLY", [myAddressString, assetId], nil)
4853 }
4954
5055
5156 func deposit (assetId,amount,stakingAssetId,proxy) = {
5257 let currentAdditionalBalance = getAdditionalBalance(assetId)
5358 if ((currentAdditionalBalance == currentAdditionalBalance))
5459 then {
5560 let currentInternalAdditionalBalance = getInternalAdditionalBalance(assetId)
5661 if ((currentInternalAdditionalBalance == currentInternalAdditionalBalance))
5762 then {
5863 let currentStakingAssetBalance = getStakingAssetBalance(stakingAssetId)
5964 if ((currentStakingAssetBalance == currentStakingAssetBalance))
6065 then {
6166 let asset = if ((assetId == "WAVES"))
6267 then unit
6368 else fromBase58String(assetId)
6469 if ((amount > 0))
6570 then {
6671 let depositInvoke = invoke(proxy, "deposit", nil, [AttachedPayment(asset, amount)])
6772 if ((depositInvoke == depositInvoke))
6873 then match depositInvoke {
6974 case receivedStakingAsset: Int =>
7075 let newInternalAdditionalBalance = (currentInternalAdditionalBalance + amount)
7176 let newStakingAssetBalance = (currentStakingAssetBalance + receivedStakingAsset)
72- let additionalBalance = (newInternalAdditionalBalance - newStakingAssetBalance)
77+ let additionalBalance = (newInternalAdditionalBalance - getStakingAssetBalance(assetId))
7378 [IntegerEntry(keyInternalAdditionalBalance(assetId), newInternalAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance), IntegerEntry(keyAdditionalBalance(assetId), additionalBalance)]
7479 case _ =>
7580 nil
7681 }
7782 else throw("Strict value is not equal to itself.")
7883 }
7984 else nil
8085 }
8186 else throw("Strict value is not equal to itself.")
8287 }
8388 else throw("Strict value is not equal to itself.")
8489 }
8590 else throw("Strict value is not equal to itself.")
8691 }
8792
8893
89-func withdraw (assetId,amount,stakingAssetId,proxy,proxyRateMul) = {
94+func withdraw (assetId,amount,stakingAssetId,proxy,proxyRateMul,profitAddress) = {
9095 let currentAdditionalBalance = getAdditionalBalance(assetId)
9196 if ((currentAdditionalBalance == currentAdditionalBalance))
9297 then {
9398 let currentStakingAssetBalance = getStakingAssetBalance(stakingAssetId)
9499 if ((currentStakingAssetBalance == currentStakingAssetBalance))
95100 then {
96101 let currentProxyRate = getRate(proxy)
97102 if ((currentProxyRate == currentProxyRate))
98103 then {
104+ let oldRate = fraction(proxyRateMul, currentAdditionalBalance, currentStakingAssetBalance)
105+ let stakingAsset = parseAssetId(stakingAssetId)
106+ let oldSendStakingAmount = fraction(proxyRateMul, amount, oldRate)
99107 let sendStakingAssetAmount = fraction(proxyRateMul, amount, currentProxyRate)
108+ let profitAmount = max([0, (oldSendStakingAmount - sendStakingAssetAmount)])
100109 if ((sendStakingAssetAmount > 0))
101110 then {
102- let withdrawInvoke = invoke(proxy, "withdraw", nil, [AttachedPayment(fromBase58String(stakingAssetId), sendStakingAssetAmount)])
111+ let withdrawInvoke = invoke(proxy, "withdraw", nil, [AttachedPayment(stakingAsset, sendStakingAssetAmount)])
103112 if ((withdrawInvoke == withdrawInvoke))
104113 then match withdrawInvoke {
105114 case receivedAssets: Int =>
106115 let newAdditionalBalance = (currentAdditionalBalance - receivedAssets)
107- let newSWavesBalance = (currentStakingAssetBalance - sendStakingAssetAmount)
108-[IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newSWavesBalance)]
116+ let newStakingAssetBalance = ((currentStakingAssetBalance - sendStakingAssetAmount) - profitAmount)
117+[IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance)]
109118 case _ =>
110119 nil
111120 }
112121 else throw("Strict value is not equal to itself.")
113122 }
114123 else nil
115124 }
116125 else throw("Strict value is not equal to itself.")
117126 }
118127 else throw("Strict value is not equal to itself.")
119128 }
120129 else throw("Strict value is not equal to itself.")
121130 }
122131
123132
124-func rebalanceInternal (targetRatio,assetId,stakingAssetId,minBalance,proxy,proxyRateMul) = {
133+func rebalanceInternal (targetRatio,assetId,stakingAssetId,minBalance,proxy,proxyRateMul,profitAddress) = {
125134 let currentAdditionalBalance = getAdditionalBalance(assetId)
126135 if ((currentAdditionalBalance == currentAdditionalBalance))
127136 then {
128137 let currentStakingAssetBalance = getStakingAssetBalance(stakingAssetId)
129138 if ((currentStakingAssetBalance == currentStakingAssetBalance))
130139 then {
131140 let availableBalance = if ((assetId == "WAVES"))
132141 then wavesBalance(this).available
133142 else assetBalance(this, fromBase58String(assetId))
134143 if ((availableBalance == availableBalance))
135144 then {
136145 let wholeBalance = max([0, ((availableBalance + currentAdditionalBalance) - minBalance)])
137146 let targetAdditionalBalance = fraction(targetRatio, wholeBalance, 100)
138147 let diff = (currentAdditionalBalance - targetAdditionalBalance)
139148 if ((diff == 0))
140149 then nil
141150 else if ((0 > diff))
142151 then {
143152 let sendAssetAmount = -(diff)
144153 deposit(assetId, sendAssetAmount, stakingAssetId, proxy)
145154 }
146155 else {
147156 let getAssetAmount = diff
148- withdraw(assetId, getAssetAmount, stakingAssetId, proxy, proxyRateMul)
157+ withdraw(assetId, getAssetAmount, stakingAssetId, proxy, proxyRateMul, profitAddress)
149158 }
150159 }
151160 else throw("Strict value is not equal to itself.")
152161 }
153162 else throw("Strict value is not equal to itself.")
154163 }
155164 else throw("Strict value is not equal to itself.")
156165 }
157166
158167
159168 func rebalanceAsset (assetId) = match getLeaseProxyConfig(assetId) {
160169 case a: (Boolean, Int, Int, String, String, Int, String) =>
161- let $t048894998 = a
162- let isLeasable = $t048894998._1
163- let leasedRatio = $t048894998._2
164- let minBalance = $t048894998._3
165- let proxyAddress = $t048894998._4
166- let proxyAssetId = $t048894998._5
167- let proxyRateMul = $t048894998._6
168- let stakingProfitAddress = $t048894998._7
170+ let $t052565365 = a
171+ let isLeasable = $t052565365._1
172+ let leasedRatio = $t052565365._2
173+ let minBalance = $t052565365._3
174+ let proxyAddress = $t052565365._4
175+ let proxyAssetId = $t052565365._5
176+ let proxyRateMul = $t052565365._6
177+ let stakingProfitAddress = $t052565365._7
169178 if (isLeasable)
170- then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul)
179+ then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
180+ else nil
181+ case _ =>
182+ throwError((("[" + assetId) + "] Rebalance error"))
183+}
184+
185+
186+func rebalanceAsset2 (assetId,ratio) = match getLeaseProxyConfig(assetId) {
187+ case a: (Boolean, Int, Int, String, String, Int, String) =>
188+ let $t058415950 = a
189+ let isLeasable = $t058415950._1
190+ let leasedRatio = $t058415950._2
191+ let minBalance = $t058415950._3
192+ let proxyAddress = $t058415950._4
193+ let proxyAssetId = $t058415950._5
194+ let proxyRateMul = $t058415950._6
195+ let stakingProfitAddress = $t058415950._7
196+ if (isLeasable)
197+ then rebalanceInternal(ratio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
171198 else nil
172199 case _ =>
173200 throwError((("[" + assetId) + "] Rebalance error"))
174201 }
175202
176203
177204 @Callable(i)
178205 func rebalance () = rebalanceAsset("WAVES")
179206
180207
208+
209+@Callable(i)
210+func rebalance2 (ratio) = rebalanceAsset2("WAVES", ratio)
211+
212+

github/deemru/w8io/873ac7e 
46.65 ms