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