tx · FtsnacRqpiawrdHdKnq21M7nDFskb7CVNJJHorTJhvhh

3N4r7DNT8t9WqaQWr8or1Hakm4AJfVDk6mS:  -0.01400000 Waves

2023.11.10 15:26 [2837248] smart account 3N4r7DNT8t9WqaQWr8or1Hakm4AJfVDk6mS > SELF 0.00000000 Waves

{ "type": 13, "id": "FtsnacRqpiawrdHdKnq21M7nDFskb7CVNJJHorTJhvhh", "fee": 1400000, "feeAssetId": null, "timestamp": 1699619165975, "version": 2, "chainId": 84, "sender": "3N4r7DNT8t9WqaQWr8or1Hakm4AJfVDk6mS", "senderPublicKey": "CMMtdSwXAf6tvNvyJDrdC5VGmRkcXU5CqmsapxKNPhLu", "proofs": [ "317VMpdXj6rpgQuhNvCJnzZjoMcqtTEWrHYX1fUT9vDWgoMm2vA5oZBVczbBQQc4Yhhh9x7iFoAWf1SLa3oi6bEs" ], "script": "base64:BgI0CAISBgoECAgBARIAEgASBAoCCAgSAwoBCBIDCgEIEgMKAQESAwoBARIAEgMKAQESAwoBCBkAA1NFUAICX18AB2ZlZVJhbmsAkE4ACXd4QXNzZXRJZAEgem0CwypAHTesH/u7a8MttNFWRQzQ3dvWhSiS4BwdmuMACnNidEFzc2V0SWQBIO2+dVxOfGjKfZY/biORRp55f/QR5jvt+01UQdyJuXLZAA13YXZlc0V4Y2hhbmdlARoBV7Pm5lUYEWmw5DMPiFFDpJyu1tVLA0sRWAAVY2xhaW1XeFJld2FyZENvbnRyYWN0ARoBV6al3Fpb40hngYwQyvTFWQUu9rO8ZhsXzQAQaXNDb25zdHJ1Y3RlZEtleQIOaXNfY29uc3RydWN0ZWQAD2FkbWluQWRkcmVzc0tleQINYWRtaW5fYWRkcmVzcwAOc2JXeEFzc2V0SWRLZXkCDnNiX3d4X2Fzc2V0X2lkAApscFBvb2xzS2V5AghscF9wb29scwAXYWRkaXRpb25hbFJld2FyZFBvb2xLZXkCFmFkZGl0aW9uYWxfcmV3YXJkX3Bvb2wAGmFkZGl0aW9uYWxSZXdhcmRQb29sRmVlS2V5AhphZGRpdGlvbmFsX3Jld2FyZF9wb29sX2ZlZQAPc2J0U3Rha2VQb29sS2V5Ag5zYnRfc3Rha2VfcG9vbAASc2J0U3Rha2VQb29sRmVlS2V5AhJzYnRfc3Rha2VfcG9vbF9mZWUAG3NidFN0YWtlUG9vbFRvdGFsQ2xhaW1lZEtleQIcc2J0X3N0YWtlX3Bvb2xfdG90YWxfY2xhaW1lZAAQdG90YWxXWExvY2tlZEtleQIPdG90YWxfd3hfbG9ja2VkABlpbml0aWFsU0JUVG9rZW5zQW1vdW50S2V5Ahlpbml0aWFsX1NCVF90b2tlbnNfYW1vdW50ACZiYXNlU0JUVG9rZW5BbW91bnRGb3JPbmVSZXdhcmRUb2tlbktleQIqYmFzZV9TQlRfdG9rZW5fYW1vdW50X2Zvcl9vbmVfcmV3YXJkX3Rva2VuAQlhc1BheW1lbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIPQXR0YWNoZWRQYXltZW50BAFwBQckbWF0Y2gwBQFwCQACAQIhZmFpbCB0byBjYXN0IGludG8gQXR0YWNoZWRQYXltZW50AQxhc0J5dGVWZWN0b3IBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBcAUHJG1hdGNoMAUBcAkAAgECHGZhaWwgdG8gY2FzdCBpbnRvIEJ5dGVWZWN0b3IBBWFzSW50AQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgNJbnQEBnZhbEludAUHJG1hdGNoMAUGdmFsSW50CQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQ9hc0FkZHJlc3NTdHJpbmcBB2FkZHJlc3MEByRtYXRjaDAJAKYIAQUHYWRkcmVzcwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwCQClCAEFAWEJAAIBAiBmYWlsIHRvIGNhc3QgaW50byBBZGRyZXNzIFN0cmluZwEfY2FsY3VsYXRlQ3VycmVudFJld2FyZFNCVEFtb3VudAEQcmV3YXJkVG9rZW5Db3VudAQjYmFzZVNCVFRva2VuQW1vdW50Rm9yT25lUmV3YXJkVG9rZW4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFJmJhc2VTQlRUb2tlbkFtb3VudEZvck9uZVJld2FyZFRva2VuS2V5BBZpbml0aWFsU0JUVG9rZW5zQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBRlpbml0aWFsU0JUVG9rZW5zQW1vdW50S2V5BBdjdXJyZW50U0JUVG9rZW5zQmFsYW5jZQkA8AcCBQR0aGlzBQpzYnRBc3NldElkAwkAAAIFF2N1cnJlbnRTQlRUb2tlbnNCYWxhbmNlAAAAAAQmY3VycmVudFNCVFRva2VuQW1vdW50Rm9yT25lUmV3YXJkVG9rZW4JAGsDBSNiYXNlU0JUVG9rZW5BbW91bnRGb3JPbmVSZXdhcmRUb2tlbgUXY3VycmVudFNCVFRva2Vuc0JhbGFuY2UFFmluaXRpYWxTQlRUb2tlbnNBbW91bnQECWFtb3VudFNCVAkAaAIFEHJld2FyZFRva2VuQ291bnQFJmN1cnJlbnRTQlRUb2tlbkFtb3VudEZvck9uZVJld2FyZFRva2VuAwkAZgIFCWFtb3VudFNCVAUXY3VycmVudFNCVFRva2Vuc0JhbGFuY2UFF2N1cnJlbnRTQlRUb2tlbnNCYWxhbmNlBQlhbW91bnRTQlQBEGlzQXV0aG9yaXplZFBvb2wBBHBvb2wEC2NoZWNrZWRQb29sCQEPYXNBZGRyZXNzU3RyaW5nAQUEcG9vbAQHbHBQb29scwkBEUBleHRyTmF0aXZlKDEwNTgpAQUKbHBQb29sc0tleQkBCGNvbnRhaW5zAgUHbHBQb29scwULY2hlY2tlZFBvb2wBC2dldFBvb2xEYXRhAQRwb29sAwkBASEBCQEQaXNBdXRob3JpemVkUG9vbAEFBHBvb2wJAAIBAhNOb3QgYXV0aG9yaXplZCBwb29sBAtwb29sTHBUb2tlbgkBEUBleHRyTmF0aXZlKDEwNTMpAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAIFdG9rZW4EGHdhdmVzRXhjaGFuZ2VQb29sQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUEcG9vbAkAlAoCBQtwb29sTHBUb2tlbgUYd2F2ZXNFeGNoYW5nZVBvb2xBZGRyZXNzCwFpAQtjb25zdHJ1Y3RvcgQMYWRtaW5BZGRyZXNzDHNidFN0YWtlUG9vbBZpbml0aWFsU0JUVG9rZW5zQW1vdW50GnNidFRva2Vuc0Zvck9uZVJld2FyZFRva2VuAwkBCWlzRGVmaW5lZAEJAKAIAQUQaXNDb25zdHJ1Y3RlZEtleQkAAgECIkNvbnN0cnVjdG9yIGNhbiBiZSBjYWxsZWQgb25lIHRpbWUEBHNiV3gJAMMIBwIIdGVzdFNiV1gCAAAAAAgGBQR1bml0AAAEB2Fzc2V0SWQJALgIAQUEc2JXeAkAzAgCBQRzYld4CQDMCAIJAQtTdHJpbmdFbnRyeQIFDnNiV3hBc3NldElkS2V5CQDYBAEFB2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUPYWRtaW5BZGRyZXNzS2V5CQEPYXNBZGRyZXNzU3RyaW5nAQUMYWRtaW5BZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIFD3NidFN0YWtlUG9vbEtleQkBD2FzQWRkcmVzc1N0cmluZwEFDHNidFN0YWtlUG9vbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSc2J0U3Rha2VQb29sRmVlS2V5APgKCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRtzYnRTdGFrZVBvb2xUb3RhbENsYWltZWRLZXkAAAkAzAgCCQELU3RyaW5nRW50cnkCBQpscFBvb2xzS2V5AgAJAMwIAgkBC1N0cmluZ0VudHJ5AgUXYWRkaXRpb25hbFJld2FyZFBvb2xLZXkCAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUaYWRkaXRpb25hbFJld2FyZFBvb2xGZWVLZXkA2AQJAMwIAgkBDEJvb2xlYW5FbnRyeQIFEGlzQ29uc3RydWN0ZWRLZXkGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRB0b3RhbFdYTG9ja2VkS2V5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFGWluaXRpYWxTQlRUb2tlbnNBbW91bnRLZXkFFmluaXRpYWxTQlRUb2tlbnNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFJmJhc2VTQlRUb2tlbkFtb3VudEZvck9uZVJld2FyZFRva2VuS2V5BRpzYnRUb2tlbnNGb3JPbmVSZXdhcmRUb2tlbgUDbmlsAWkBCG1pbnRTYld4AAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECFE9uZSBQYXltZW50IGV4cGVjdGVkBAdwYXltZW50CQEJYXNQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQIBQdwYXltZW50BmFtb3VudAMDCQECIT0CCAUHcGF5bWVudAdhc3NldElkBQl3eEFzc2V0SWQGCQBnAgAABQZhbW91bnQJAAIBAhhXcm9uZyBBc3NldCBpZCBvciBhbW91bnQEDXRvdGFsV1hMb2NrZWQJARFAZXh0ck5hdGl2ZSgxMDU1KQEFEHRvdGFsV1hMb2NrZWRLZXkEC3NiV3hBc3NldElkCQERQGV4dHJOYXRpdmUoMTA1OCkBBQ5zYld4QXNzZXRJZEtleQQRd2F2ZXNFeGNoYW5nZUluZm8JAPwHBAkBB0FkZHJlc3MBBQ13YXZlc0V4Y2hhbmdlAhd1c2VyTWF4RHVyYXRpb25SRUFET05MWQUDbmlsBQNuaWwDCQAAAgURd2F2ZXNFeGNoYW5nZUluZm8FEXdhdmVzRXhjaGFuZ2VJbmZvBAckbWF0Y2gwBRF3YXZlc0V4Y2hhbmdlSW5mbwMJAAECBQckbWF0Y2gwAg0oU3RyaW5nLCBJbnQpBAV0dXBsZQUHJG1hdGNoMAQMZnVuY3Rpb25OYW1lCAUFdHVwbGUCXzEED21heExvY2tEdXJhdGlvbggFBXR1cGxlAl8yBAZyZXN1bHQJAPwHBAkBB0FkZHJlc3MBBQ13YXZlc0V4Y2hhbmdlBQxmdW5jdGlvbk5hbWUJAMwIAgUPbWF4TG9ja0R1cmF0aW9uBQNuaWwJAMwIAgUHcGF5bWVudAUDbmlsAwkAAAIFBnJlc3VsdAUGcmVzdWx0BARzYld4CQDZBAEFC3NiV3hBc3NldElkCQDMCAIJAQdSZWlzc3VlAwUEc2JXeAUGYW1vdW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEICAUBaQZjYWxsZXIFYnl0ZXMFBmFtb3VudAUEc2JXeAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQdG90YWxXWExvY2tlZEtleQkAZAIFDXRvdGFsV1hMb2NrZWQFBmFtb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIYRkFUQUw6IEluY29uc2lzdGVudCBkYXRhCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFWNsYWltV3hTdGFraW5nUmV3YXJkcwAEE2N1cnJlbnRXeE9uQ29udHJhY3QJAPAHAgUEdGhpcwUJd3hBc3NldElkAwkAAAIFE2N1cnJlbnRXeE9uQ29udHJhY3QFE2N1cnJlbnRXeE9uQ29udHJhY3QEC2NsYWltUmVzdWx0CQD8BwQJAQdBZGRyZXNzAQUVY2xhaW1XeFJld2FyZENvbnRyYWN0AgtjbGFpbVJld2FyZAUDbmlsBQNuaWwDCQAAAgULY2xhaW1SZXN1bHQFC2NsYWltUmVzdWx0BA9uZXdXeE9uQ29udHJhY3QJAPAHAgUEdGhpcwUJd3hBc3NldElkBAdjbGFpbWVkCQBlAgUPbmV3V3hPbkNvbnRyYWN0BRNjdXJyZW50V3hPbkNvbnRyYWN0AwkAAAIFB2NsYWltZWQAAAkAAgECEE5vdGhpbmcgdG8gY2xhaW0EGHNidFN0YWtlUG9vbFRvdGFsQ2xhaW1lZAkBEUBleHRyTmF0aXZlKDEwNTUpAQUbc2J0U3Rha2VQb29sVG90YWxDbGFpbWVkS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRtzYnRTdGFrZVBvb2xUb3RhbENsYWltZWRLZXkJAGQCBRhzYnRTdGFrZVBvb2xUb3RhbENsYWltZWQFB2NsYWltZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUPc2J0U3Rha2VQb29sS2V5BQdjbGFpbWVkBQl3eEFzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdhZGRQb29sAgdhZGRyZXNzGHdhdmVzRXhjaGFuZ2VQb29sQWRkcmVzcwMJAQIhPQIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkBEUBleHRyTmF0aXZlKDEwNTgpAQUPYWRtaW5BZGRyZXNzS2V5CQACAQIhT25seSBBZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uBAdscFBvb2xzCQERQGV4dHJOYXRpdmUoMTA1OCkBBQpscFBvb2xzS2V5AwkBEGlzQXV0aG9yaXplZFBvb2wBBQdhZGRyZXNzCQACAQISUG9vbCBhbHJlYWR5IGFkZGVkBAhuZXdQb29scwMJAAACCQCxAgEFB2xwUG9vbHMAAAUHYWRkcmVzcwkArAICCQCsAgIFB2xwUG9vbHMFA1NFUAUHYWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCBQpscFBvb2xzS2V5BQhuZXdQb29scwkAzAgCCQELU3RyaW5nRW50cnkCCQEPYXNBZGRyZXNzU3RyaW5nAQUHYWRkcmVzcwkBD2FzQWRkcmVzc1N0cmluZwEFGHdhdmVzRXhjaGFuZ2VQb29sQWRkcmVzcwUDbmlsAWkBCnJlbW92ZVBvb2wBB2FkZHJlc3MDCQECIT0CCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMJARFAZXh0ck5hdGl2ZSgxMDU4KQEFD2FkbWluQWRkcmVzc0tleQkAAgECIU9ubHkgQWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgQHbHBQb29scwkBEUBleHRyTmF0aXZlKDEwNTgpAQUKbHBQb29sc0tleQMJAQEhAQkBEGlzQXV0aG9yaXplZFBvb2wBBQdhZGRyZXNzCQACAQIOUG9vbCBub3QgZm91bmQECnBvb2xzQXJyYXkJALwJAgUHbHBQb29scwUDU0VQBAlwb29sSW5kZXgJAQVhc0ludAEJAM8IAgUKcG9vbHNBcnJheQUHYWRkcmVzcwQIbmV3UG9vbHMJALoJAgkA0QgCBQpwb29sc0FycmF5BQlwb29sSW5kZXgFA1NFUAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIFCmxwUG9vbHNLZXkFCG5ld1Bvb2xzCQDMCAIJAQtEZWxldGVFbnRyeQEFB2FkZHJlc3MFA25pbAMJAAACCQERQGV4dHJOYXRpdmUoMTA1OCkBBRdhZGRpdGlvbmFsUmV3YXJkUG9vbEtleQUHYWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCBRdhZGRpdGlvbmFsUmV3YXJkUG9vbEtleQIABQNuaWwFA25pbAFpARhzZXRBZGRpdGlvbmFsUmV3YXJkc1Bvb2wBB2FkZHJlc3MDCQECIT0CCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMJARFAZXh0ck5hdGl2ZSgxMDU4KQEFD2FkbWluQWRkcmVzc0tleQkAAgECIU9ubHkgQWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAQEhAQkBEGlzQXV0aG9yaXplZFBvb2wBBQdhZGRyZXNzCQACAQI7T25seSBhdXRob3JpemVkIHBvb2wgY2FuIGJlIGFkZGVkIGFzIGFkZGl0aW9uYWwgcmV3YXJkIHBvb2wJAMwIAgkBC1N0cmluZ0VudHJ5AgUXYWRkaXRpb25hbFJld2FyZFBvb2xLZXkFB2FkZHJlc3MFA25pbAFpARtzZXRBZGRpdGlvbmFsUmV3YXJkc1Bvb2xGZWUBA2ZlZQMJAQIhPQIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkBEUBleHRyTmF0aXZlKDEwNTgpAQUPYWRtaW5BZGRyZXNzS2V5CQACAQIhT25seSBBZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAwkAZgIFA2ZlZQDQDwkAAgECHEZlZSBjYW4ndCBiZSBiaWdnZXIgdGhhbiAyMCUDCQBmAgAABQNmZWUJAAIBAhVGZWUgY2FuJ3QgYmUgbmVnYXRpdmUJAMwIAgkBDEludGVnZXJFbnRyeQIFGmFkZGl0aW9uYWxSZXdhcmRQb29sRmVlS2V5BQNmZWUFA25pbAFpAQ1zZXRTYnRQb29sRmVlAQNmZWUDCQECIT0CCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMJARFAZXh0ck5hdGl2ZSgxMDU4KQEFD2FkbWluQWRkcmVzc0tleQkAAgECIU9ubHkgQWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAGYCBQNmZWUA0A8JAAIBAhxGZWUgY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gMjAlAwkAZgIAAAUDZmVlCQACAQIVRmVlIGNhbid0IGJlIG5lZ2F0aXZlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJzYnRTdGFrZVBvb2xGZWVLZXkFA2ZlZQUDbmlsAWkBDHN0YWtlUG9vbExwcwADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhRPbmUgUGF5bWVudCBleHBlY3RlZAQIcG9vbERhdGEJAQtnZXRQb29sRGF0YQEJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQLcG9vbExwVG9rZW4IBQhwb29sRGF0YQJfMQQYd2F2ZXNFeGNoYW5nZVBvb2xBZGRyZXNzCAUIcG9vbERhdGECXzIEB3BheW1lbnQJAQlhc1BheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAADAwkBAiE9AggFB3BheW1lbnQHYXNzZXRJZAkA2QQBBQtwb29sTHBUb2tlbgYJAGcCAAAIBQdwYXltZW50BmFtb3VudAkAAgECG1dyb25nIExQIEFzc2V0IGlkIG9yIGFtb3VudAQGcmVzdWx0CQD8BwQFGHdhdmVzRXhjaGFuZ2VQb29sQWRkcmVzcwIFc3Rha2UFA25pbAkAzAgCBQdwYXltZW50BQNuaWwDCQAAAgUGcmVzdWx0BQZyZXN1bHQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ93aXRoZHJhd1Bvb2xMcHMBBmFtb3VudAQIcG9vbERhdGEJAQtnZXRQb29sRGF0YQEJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQLcG9vbExwVG9rZW4IBQhwb29sRGF0YQJfMQQYd2F2ZXNFeGNoYW5nZVBvb2xBZGRyZXNzCAUIcG9vbERhdGECXzIEBnJlc3VsdAkA/AcEBRh3YXZlc0V4Y2hhbmdlUG9vbEFkZHJlc3MCB3Vuc3Rha2UJAMwIAgULcG9vbExwVG9rZW4JAMwIAgUGYW1vdW50BQNuaWwFA25pbAMJAAACBQZyZXN1bHQFBnJlc3VsdAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEICAUBaQZjYWxsZXIFYnl0ZXMFBmFtb3VudAkA2QQBBQtwb29sTHBUb2tlbgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGNsYWltUG9vbFJld2FyZHMBBHBvb2wEC3Bvb2xBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBAhwb29sRGF0YQkBC2dldFBvb2xEYXRhAQUEcG9vbAQLcG9vbExwVG9rZW4IBQhwb29sRGF0YQJfMQQYd2F2ZXNFeGNoYW5nZVBvb2xBZGRyZXNzCAUIcG9vbERhdGECXzIEE2N1cnJlbnRXWE9uQ29udHJhY3QJAPAHAgUEdGhpcwUJd3hBc3NldElkAwkAAAIFE2N1cnJlbnRXWE9uQ29udHJhY3QFE2N1cnJlbnRXWE9uQ29udHJhY3QEC2NsYWltUmVzdWx0CQD8BwQFGHdhdmVzRXhjaGFuZ2VQb29sQWRkcmVzcwIHY2xhaW1XWAkAzAgCBQtwb29sTHBUb2tlbgUDbmlsBQNuaWwDCQAAAgULY2xhaW1SZXN1bHQFC2NsYWltUmVzdWx0BA9uZXdXWE9uQ29udHJhY3QJAPAHAgUEdGhpcwUJd3hBc3NldElkBAdjbGFpbWVkCQBlAgUPbmV3V1hPbkNvbnRyYWN0BRNjdXJyZW50V1hPbkNvbnRyYWN0AwkAAAIFB2NsYWltZWQAAAkAAgECEE5vdGhpbmcgdG8gY2xhaW0ED3NidFJld2FyZEFtb3VudAkBH2NhbGN1bGF0ZUN1cnJlbnRSZXdhcmRTQlRBbW91bnQBBQdjbGFpbWVkBBBzYnRSZXdhcmRBY3Rpb25zAwkAAAIFD3NidFJld2FyZEFtb3VudAAABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULcG9vbEFkZHJlc3MFD3NidFJld2FyZEFtb3VudAUKc2J0QXNzZXRJZAUDbmlsBAxzYnRTdGFrZVBvb2wJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEFD3NidFN0YWtlUG9vbEtleQQPc2J0U3Rha2VQb29sRmVlCQERQGV4dHJOYXRpdmUoMTA1NSkBBRJzYnRTdGFrZVBvb2xGZWVLZXkEGHNidFN0YWtlUG9vbFRvdGFsQ2xhaW1lZAkBEUBleHRyTmF0aXZlKDEwNTUpAQUbc2J0U3Rha2VQb29sVG90YWxDbGFpbWVkS2V5BBJzYnRTdGFrZVBvb2xBbW91bnQJAG4EBQdjbGFpbWVkBQ9zYnRTdGFrZVBvb2xGZWUFB2ZlZVJhbmsFBkhBTEZVUAQTc2J0U3Rha2VQb29sQWN0aW9ucwMJAAACBRJzYnRTdGFrZVBvb2xBbW91bnQAAAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDHNidFN0YWtlUG9vbAUSc2J0U3Rha2VQb29sQW1vdW50BQl3eEFzc2V0SWQFA25pbAQUYWRkaXRpb25hbFJld2FyZFBvb2wJARFAZXh0ck5hdGl2ZSgxMDU4KQEFF2FkZGl0aW9uYWxSZXdhcmRQb29sS2V5BBhhZGRpdGlvbmFsUmV3YXJkUG9vbEZyZWUJARFAZXh0ck5hdGl2ZSgxMDU1KQEFGmFkZGl0aW9uYWxSZXdhcmRQb29sRmVlS2V5BBphZGRpdGlvbmFsUmV3YXJkUG9vbEFtb3VudAMJAAACCQCxAgEFFGFkZGl0aW9uYWxSZXdhcmRQb29sAAAAAAMJAQIhPQIFFGFkZGl0aW9uYWxSZXdhcmRQb29sBQRwb29sCQBuBAUHY2xhaW1lZAUYYWRkaXRpb25hbFJld2FyZFBvb2xGcmVlBQdmZWVSYW5rBQZIQUxGVVAAAAQcYWRkaXRpb25hbFJld2FyZHNQb29sQWN0aW9ucwMJAAACBRphZGRpdGlvbmFsUmV3YXJkUG9vbEFtb3VudAAABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUUYWRkaXRpb25hbFJld2FyZFBvb2wFGmFkZGl0aW9uYWxSZXdhcmRQb29sQW1vdW50BQl3eEFzc2V0SWQFA25pbAQLcG9vbENsYWltZWQJAGUCCQBlAgUHY2xhaW1lZAUSc2J0U3Rha2VQb29sQW1vdW50BRphZGRpdGlvbmFsUmV3YXJkUG9vbEFtb3VudAkAzggCCQDOCAIJAM4IAgUQc2J0UmV3YXJkQWN0aW9ucwUTc2J0U3Rha2VQb29sQWN0aW9ucwUcYWRkaXRpb25hbFJld2FyZHNQb29sQWN0aW9ucwkAzAgCCQEMSW50ZWdlckVudHJ5AgUbc2J0U3Rha2VQb29sVG90YWxDbGFpbWVkS2V5CQBkAgUYc2J0U3Rha2VQb29sVG90YWxDbGFpbWVkBRJzYnRTdGFrZVBvb2xBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULcG9vbEFkZHJlc3MFC3Bvb2xDbGFpbWVkBQl3eEFzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAuDLcb", "height": 2837248, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6mqZzafti4HwK2FEpzoXkeGy9Ud7cmXLNqrG86w17ha3 Next: Bzvnm4nKsAVRrZoVedajFDmDqyc7h9zTRweYdJe4CrK4 Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let totalTokensAmount = 500000000000000
4+let SEP = "__"
55
6-let baseTokenCountForOneRewardToken = 10000000
6+let feeRank = 10000
77
8-let MULT8 = 100000000
8+let wxAssetId = base58'9Eu9de5GPPgLzY16bevCaxF4rFr4jA9wqyTfqcjksU82'
99
10-let currentTokensGivedKey = "current_tokens_gived"
10+let sbtAssetId = base58'H144sePa8bNCDFTzZNkUnk6QMz387T2ruKPMQ5DJ3DyS'
1111
12-func calculateKoeff (currentTokensGived) = if ((currentTokensGived == 0))
13- then MULT8
14- else (MULT8 - fraction(currentTokensGived, MULT8, totalTokensAmount))
12+let wavesExchange = base58'3PJL8Hn8LACaSBWLQ3UVhctA5cTQLBFwBAP'
13+
14+let claimWxRewardContract = base58'3PH83bJCZraJoEzFefz4p8UXZD9YazNnj1n'
15+
16+let isConstructedKey = "is_constructed"
17+
18+let adminAddressKey = "admin_address"
19+
20+let sbWxAssetIdKey = "sb_wx_asset_id"
21+
22+let lpPoolsKey = "lp_pools"
23+
24+let additionalRewardPoolKey = "additional_reward_pool"
25+
26+let additionalRewardPoolFeeKey = "additional_reward_pool_fee"
27+
28+let sbtStakePoolKey = "sbt_stake_pool"
29+
30+let sbtStakePoolFeeKey = "sbt_stake_pool_fee"
31+
32+let sbtStakePoolTotalClaimedKey = "sbt_stake_pool_total_claimed"
33+
34+let totalWXLockedKey = "total_wx_locked"
35+
36+let initialSBTTokensAmountKey = "initial_SBT_tokens_amount"
37+
38+let baseSBTTokenAmountForOneRewardTokenKey = "base_SBT_token_amount_for_one_reward_token"
39+
40+func asPayment (v) = match v {
41+ case p: AttachedPayment =>
42+ p
43+ case _ =>
44+ throw("fail to cast into AttachedPayment")
45+}
1546
1647
17-func calculateSBTAmount (rewardTokenCount,currentSbtTokensGived) = {
18- let sbtPerOneRewardToken = fraction(baseTokenCountForOneRewardToken, calculateKoeff(currentSbtTokensGived), MULT8)
19- fraction(sbtPerOneRewardToken, rewardTokenCount, MULT8)
48+func asByteVector (v) = match v {
49+ case p: ByteVector =>
50+ p
51+ case _ =>
52+ throw("fail to cast into ByteVector")
53+}
54+
55+
56+func asInt (val) = match val {
57+ case valInt: Int =>
58+ valInt
59+ case _ =>
60+ throw("fail to cast into Int")
61+}
62+
63+
64+func asAddressString (address) = match addressFromString(address) {
65+ case a: Address =>
66+ toString(a)
67+ case _ =>
68+ throw("fail to cast into Address String")
69+}
70+
71+
72+func calculateCurrentRewardSBTAmount (rewardTokenCount) = {
73+ let baseSBTTokenAmountForOneRewardToken = getIntegerValue(this, baseSBTTokenAmountForOneRewardTokenKey)
74+ let initialSBTTokensAmount = getIntegerValue(this, initialSBTTokensAmountKey)
75+ let currentSBTTokensBalance = assetBalance(this, sbtAssetId)
76+ if ((currentSBTTokensBalance == 0))
77+ then 0
78+ else {
79+ let currentSBTTokenAmountForOneRewardToken = fraction(baseSBTTokenAmountForOneRewardToken, currentSBTTokensBalance, initialSBTTokensAmount)
80+ let amountSBT = (rewardTokenCount * currentSBTTokenAmountForOneRewardToken)
81+ if ((amountSBT > currentSBTTokensBalance))
82+ then currentSBTTokensBalance
83+ else amountSBT
84+ }
2085 }
2186
2287
23-@Callable(i)
24-func calculate (rewardTokenCount,currentSbtTokensGived) = [IntegerEntry("result", calculateSBTAmount(rewardTokenCount, currentSbtTokensGived))]
88+func isAuthorizedPool (pool) = {
89+ let checkedPool = asAddressString(pool)
90+ let lpPools = getStringValue(lpPoolsKey)
91+ contains(lpPools, checkedPool)
92+ }
2593
2694
27-@Verifier(tx)
28-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
95+func getPoolData (pool) = if (!(isAuthorizedPool(pool)))
96+ then throw("Not authorized pool")
97+ else {
98+ let poolLpToken = getStringValue(addressFromStringValue(pool), "token")
99+ let wavesExchangePoolAddress = addressFromStringValue(getStringValue(pool))
100+ $Tuple2(poolLpToken, wavesExchangePoolAddress)
101+ }
102+
103+
104+@Callable(i)
105+func constructor (adminAddress,sbtStakePool,initialSBTTokensAmount,sbtTokensForOneRewardToken) = if (isDefined(getBoolean(isConstructedKey)))
106+ then throw("Constructor can be called one time")
107+ else {
108+ let sbWx = Issue("testSbWX", "", 0, 8, true, unit, 0)
109+ let assetId = calculateAssetId(sbWx)
110+[sbWx, StringEntry(sbWxAssetIdKey, toBase58String(assetId)), StringEntry(adminAddressKey, asAddressString(adminAddress)), StringEntry(sbtStakePoolKey, asAddressString(sbtStakePool)), IntegerEntry(sbtStakePoolFeeKey, 1400), IntegerEntry(sbtStakePoolTotalClaimedKey, 0), StringEntry(lpPoolsKey, ""), StringEntry(additionalRewardPoolKey, ""), IntegerEntry(additionalRewardPoolFeeKey, 600), BooleanEntry(isConstructedKey, true), IntegerEntry(totalWXLockedKey, 0), IntegerEntry(initialSBTTokensAmountKey, initialSBTTokensAmount), IntegerEntry(baseSBTTokenAmountForOneRewardTokenKey, sbtTokensForOneRewardToken)]
111+ }
112+
113+
114+
115+@Callable(i)
116+func mintSbWx () = if ((size(i.payments) != 1))
117+ then throw("One Payment expected")
118+ else {
119+ let payment = asPayment(i.payments[0])
120+ let amount = payment.amount
121+ if (if ((payment.assetId != wxAssetId))
122+ then true
123+ else (0 >= amount))
124+ then throw("Wrong Asset id or amount")
125+ else {
126+ let totalWXLocked = getIntegerValue(totalWXLockedKey)
127+ let sbWxAssetId = getStringValue(sbWxAssetIdKey)
128+ let wavesExchangeInfo = invoke(Address(wavesExchange), "userMaxDurationREADONLY", nil, nil)
129+ if ((wavesExchangeInfo == wavesExchangeInfo))
130+ then match wavesExchangeInfo {
131+ case tuple: (String, Int) =>
132+ let functionName = tuple._1
133+ let maxLockDuration = tuple._2
134+ let result = invoke(Address(wavesExchange), functionName, [maxLockDuration], [payment])
135+ if ((result == result))
136+ then {
137+ let sbWx = fromBase58String(sbWxAssetId)
138+[Reissue(sbWx, amount, true), ScriptTransfer(Address(i.caller.bytes), amount, sbWx), IntegerEntry(totalWXLockedKey, (totalWXLocked + amount))]
139+ }
140+ else throw("Strict value is not equal to itself.")
141+ case _ =>
142+ throw("FATAL: Inconsistent data")
143+ }
144+ else throw("Strict value is not equal to itself.")
145+ }
146+ }
147+
148+
149+
150+@Callable(i)
151+func claimWxStakingRewards () = {
152+ let currentWxOnContract = assetBalance(this, wxAssetId)
153+ if ((currentWxOnContract == currentWxOnContract))
154+ then {
155+ let claimResult = invoke(Address(claimWxRewardContract), "claimReward", nil, nil)
156+ if ((claimResult == claimResult))
157+ then {
158+ let newWxOnContract = assetBalance(this, wxAssetId)
159+ let claimed = (newWxOnContract - currentWxOnContract)
160+ if ((claimed == 0))
161+ then throw("Nothing to claim")
162+ else {
163+ let sbtStakePoolTotalClaimed = getIntegerValue(sbtStakePoolTotalClaimedKey)
164+[IntegerEntry(sbtStakePoolTotalClaimedKey, (sbtStakePoolTotalClaimed + claimed)), ScriptTransfer(addressFromStringValue(getStringValue(sbtStakePoolKey)), claimed, wxAssetId)]
165+ }
166+ }
167+ else throw("Strict value is not equal to itself.")
168+ }
169+ else throw("Strict value is not equal to itself.")
170+ }
171+
172+
173+
174+@Callable(i)
175+func addPool (address,wavesExchangePoolAddress) = if ((toBase58String(i.caller.bytes) != getStringValue(adminAddressKey)))
176+ then throw("Only Admin can call this function")
177+ else {
178+ let lpPools = getStringValue(lpPoolsKey)
179+ if (isAuthorizedPool(address))
180+ then throw("Pool already added")
181+ else {
182+ let newPools = if ((size(lpPools) == 0))
183+ then address
184+ else ((lpPools + SEP) + address)
185+[StringEntry(lpPoolsKey, newPools), StringEntry(asAddressString(address), asAddressString(wavesExchangePoolAddress))]
186+ }
187+ }
188+
189+
190+
191+@Callable(i)
192+func removePool (address) = if ((toBase58String(i.caller.bytes) != getStringValue(adminAddressKey)))
193+ then throw("Only Admin can call this function")
194+ else {
195+ let lpPools = getStringValue(lpPoolsKey)
196+ if (!(isAuthorizedPool(address)))
197+ then throw("Pool not found")
198+ else {
199+ let poolsArray = split_4C(lpPools, SEP)
200+ let poolIndex = asInt(indexOf(poolsArray, address))
201+ let newPools = makeString_2C(removeByIndex(poolsArray, poolIndex), SEP)
202+ ([StringEntry(lpPoolsKey, newPools), DeleteEntry(address)] ++ (if ((getStringValue(additionalRewardPoolKey) == address))
203+ then [StringEntry(additionalRewardPoolKey, "")]
204+ else nil))
205+ }
206+ }
207+
208+
209+
210+@Callable(i)
211+func setAdditionalRewardsPool (address) = if ((toBase58String(i.caller.bytes) != getStringValue(adminAddressKey)))
212+ then throw("Only Admin can call this function")
213+ else if (!(isAuthorizedPool(address)))
214+ then throw("Only authorized pool can be added as additional reward pool")
215+ else [StringEntry(additionalRewardPoolKey, address)]
216+
217+
218+
219+@Callable(i)
220+func setAdditionalRewardsPoolFee (fee) = if ((toBase58String(i.caller.bytes) != getStringValue(adminAddressKey)))
221+ then throw("Only Admin can call this function")
222+ else if ((fee > 2000))
223+ then throw("Fee can't be bigger than 20%")
224+ else if ((0 > fee))
225+ then throw("Fee can't be negative")
226+ else [IntegerEntry(additionalRewardPoolFeeKey, fee)]
227+
228+
229+
230+@Callable(i)
231+func setSbtPoolFee (fee) = if ((toBase58String(i.caller.bytes) != getStringValue(adminAddressKey)))
232+ then throw("Only Admin can call this function")
233+ else if ((fee > 2000))
234+ then throw("Fee can't be bigger than 20%")
235+ else if ((0 > fee))
236+ then throw("Fee can't be negative")
237+ else [IntegerEntry(sbtStakePoolFeeKey, fee)]
238+
239+
240+
241+@Callable(i)
242+func stakePoolLps () = if ((size(i.payments) != 1))
243+ then throw("One Payment expected")
244+ else {
245+ let poolData = getPoolData(toBase58String(i.caller.bytes))
246+ let poolLpToken = poolData._1
247+ let wavesExchangePoolAddress = poolData._2
248+ let payment = asPayment(i.payments[0])
249+ if (if ((payment.assetId != fromBase58String(poolLpToken)))
250+ then true
251+ else (0 >= payment.amount))
252+ then throw("Wrong LP Asset id or amount")
253+ else {
254+ let result = invoke(wavesExchangePoolAddress, "stake", nil, [payment])
255+ if ((result == result))
256+ then nil
257+ else throw("Strict value is not equal to itself.")
258+ }
259+ }
260+
261+
262+
263+@Callable(i)
264+func withdrawPoolLps (amount) = {
265+ let poolData = getPoolData(toBase58String(i.caller.bytes))
266+ let poolLpToken = poolData._1
267+ let wavesExchangePoolAddress = poolData._2
268+ let result = invoke(wavesExchangePoolAddress, "unstake", [poolLpToken, amount], nil)
269+ if ((result == result))
270+ then [ScriptTransfer(Address(i.caller.bytes), amount, fromBase58String(poolLpToken))]
271+ else throw("Strict value is not equal to itself.")
272+ }
273+
274+
275+
276+@Callable(i)
277+func claimPoolRewards (pool) = {
278+ let poolAddress = addressFromStringValue(pool)
279+ let poolData = getPoolData(pool)
280+ let poolLpToken = poolData._1
281+ let wavesExchangePoolAddress = poolData._2
282+ let currentWXOnContract = assetBalance(this, wxAssetId)
283+ if ((currentWXOnContract == currentWXOnContract))
284+ then {
285+ let claimResult = invoke(wavesExchangePoolAddress, "claimWX", [poolLpToken], nil)
286+ if ((claimResult == claimResult))
287+ then {
288+ let newWXOnContract = assetBalance(this, wxAssetId)
289+ let claimed = (newWXOnContract - currentWXOnContract)
290+ if ((claimed == 0))
291+ then throw("Nothing to claim")
292+ else {
293+ let sbtRewardAmount = calculateCurrentRewardSBTAmount(claimed)
294+ let sbtRewardActions = if ((sbtRewardAmount == 0))
295+ then nil
296+ else [ScriptTransfer(poolAddress, sbtRewardAmount, sbtAssetId)]
297+ let sbtStakePool = addressFromStringValue(getStringValue(sbtStakePoolKey))
298+ let sbtStakePoolFee = getIntegerValue(sbtStakePoolFeeKey)
299+ let sbtStakePoolTotalClaimed = getIntegerValue(sbtStakePoolTotalClaimedKey)
300+ let sbtStakePoolAmount = fraction(claimed, sbtStakePoolFee, feeRank, HALFUP)
301+ let sbtStakePoolActions = if ((sbtStakePoolAmount == 0))
302+ then nil
303+ else [ScriptTransfer(sbtStakePool, sbtStakePoolAmount, wxAssetId)]
304+ let additionalRewardPool = getStringValue(additionalRewardPoolKey)
305+ let additionalRewardPoolFree = getIntegerValue(additionalRewardPoolFeeKey)
306+ let additionalRewardPoolAmount = if ((size(additionalRewardPool) == 0))
307+ then 0
308+ else if ((additionalRewardPool != pool))
309+ then fraction(claimed, additionalRewardPoolFree, feeRank, HALFUP)
310+ else 0
311+ let additionalRewardsPoolActions = if ((additionalRewardPoolAmount == 0))
312+ then nil
313+ else [ScriptTransfer(addressFromStringValue(additionalRewardPool), additionalRewardPoolAmount, wxAssetId)]
314+ let poolClaimed = ((claimed - sbtStakePoolAmount) - additionalRewardPoolAmount)
315+ (((sbtRewardActions ++ sbtStakePoolActions) ++ additionalRewardsPoolActions) ++ [IntegerEntry(sbtStakePoolTotalClaimedKey, (sbtStakePoolTotalClaimed + sbtStakePoolAmount)), ScriptTransfer(poolAddress, poolClaimed, wxAssetId)])
316+ }
317+ }
318+ else throw("Strict value is not equal to itself.")
319+ }
320+ else throw("Strict value is not equal to itself.")
321+ }
322+
29323

github/deemru/w8io/873ac7e 
30.18 ms