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:
Old | New | Differences | |
---|---|---|---|
1 | - | {-# STDLIB_VERSION | |
1 | + | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let | |
4 | + | let SEP = "__" | |
5 | 5 | ||
6 | - | let | |
6 | + | let feeRank = 10000 | |
7 | 7 | ||
8 | - | let | |
8 | + | let wxAssetId = base58'9Eu9de5GPPgLzY16bevCaxF4rFr4jA9wqyTfqcjksU82' | |
9 | 9 | ||
10 | - | let | |
10 | + | let sbtAssetId = base58'H144sePa8bNCDFTzZNkUnk6QMz387T2ruKPMQ5DJ3DyS' | |
11 | 11 | ||
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 | + | } | |
15 | 46 | ||
16 | 47 | ||
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 | + | } | |
20 | 85 | } | |
21 | 86 | ||
22 | 87 | ||
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 | + | } | |
25 | 93 | ||
26 | 94 | ||
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 | + | ||
29 | 323 |
github/deemru/w8io/873ac7e 30.18 ms ◑![]()