tx · GDTPtt3d2tK8zGC9QiCdh1wkh9ZpreoWp2ywPnwcma4E

3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h:  -0.01000000 Waves

2024.02.05 12:43 [2962805] smart account 3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h > SELF 0.00000000 Waves

{ "type": 13, "id": "GDTPtt3d2tK8zGC9QiCdh1wkh9ZpreoWp2ywPnwcma4E", "fee": 1000000, "feeAssetId": null, "timestamp": 1707126195470, "version": 2, "chainId": 84, "sender": "3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h", "senderPublicKey": "3z8Q6Zu3KppVmn6fJJvrLc1Wo3krVHSvfaNcerm82md2", "proofs": [ "551YQ5jyYzdJkdjha6dYgMxCWtaMEmBWesuA7vrkTfSBswK1ggFKSdSUxvck2jMxgQhFxMmmbSiLNcRp5Ljrr8yc" ], "script": "base64:BgIiCAISAwoBARIDCgEIEgQKAggIEgMKAQgSBAoCCAESAwoBASEADGNvbnRyYWN0RmlsZQIRbDJtcF9sZWFzaW5nLnJpZGUAA1NFUAICX18ABnNjYWxlOACAwtcvAQh0aHJvd0VycgEDbXNnCQACAQkArAICCQCsAgIFDGNvbnRyYWN0RmlsZQICOiAFA21zZwAKa2V5QXNzZXRJZAkAuQkCCQDMCAICAiVzCQDMCAICB2Fzc2V0SWQFA25pbAUDU0VQABFrZXlQZXJpb2RPZmZzZXRJZAkAuQkCCQDMCAICAiVzCQDMCAICCG9mZnNldElkBQNuaWwFA1NFUAAVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0CQC5CQIJAMwIAgICJXMJAMwIAgIMb2Zmc2V0SGVpZ2h0BQNuaWwFA1NFUAAPa2V5UGVyaW9kTGVuZ3RoCQC5CQIJAMwIAgICJXMJAMwIAgIMcGVyaW9kTGVuZ3RoBQNuaWwFA1NFUAAOcGVyaW9kT2Zmc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa2V5UGVyaW9kT2Zmc2V0SWQAAAAMcGVyaW9kTGVuZ3RoCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFD2tleVBlcmlvZExlbmd0aACQTgAScGVyaW9kT2Zmc2V0SGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFWtleVBlcmlvZE9mZnNldEhlaWdodAD///////////8BAA9jdXJyZW50UGVyaW9kSWQDCQBmAgUGaGVpZ2h0BRJwZXJpb2RPZmZzZXRIZWlnaHQJAGQCCQBpAgkAZQIFBmhlaWdodAUScGVyaW9kT2Zmc2V0SGVpZ2h0BQxwZXJpb2RMZW5ndGgFDnBlcmlvZE9mZnNldElkBQ5wZXJpb2RPZmZzZXRJZAESa2V5TGVhc2luZ05vZGVEYXRhAQtub2RlQWRkcmVzcwkAuQkCCQDMCAICAiVzCQDMCAICC2xlYXNpbmdOb2RlCQDMCAIFC25vZGVBZGRyZXNzBQNuaWwFA1NFUAEWa2V5VXNlckxlYXNpbmdOb2RlTGlzdAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICE3VzZXJMZWFzaW5nTm9kZUxpc3QJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARZrZXlVc2VyTGVhc2luZ05vZGVEYXRhAgt1c2VyQWRkcmVzcwtub2RlQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgITdXNlckxlYXNpbmdOb2RlRGF0YQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQtub2RlQWRkcmVzcwUDbmlsBQNTRVABD2tleVVzZXJCYWxhbmNlcwELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICDHVzZXJCYWxhbmNlcwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVAADWFzc2V0SWRTdHJpbmcJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUKa2V5QXNzZXRJZAIFV0FWRVMADGFzc2V0SWRCeXRlcwMJAAACBQ1hc3NldElkU3RyaW5nAgVXQVZFUwUEdW5pdAkA2QQBBQ1hc3NldElkU3RyaW5nAQ5pc1ZhbGlkQWRkcmVzcwEHYWRkcmVzcwQHJG1hdGNoMAkApggBBQdhZGRyZXNzAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGBwETZ2V0TGVhc2luZ05vZGVFbnRyeQILbm9kZUFkZHJlc3MLdG90YWxMZWFzZWQEC3ZhbHVlU3RyaW5nCQC5CQIJAMwIAgICJWQJAMwIAgkApAMBBQt0b3RhbExlYXNlZAUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIJARJrZXlMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldExlYXNpbmdOb2RlRGF0YQELbm9kZUFkZHJlc3MEFGxlYXNpbmdEYXRhU3RyaW5nUmF3CQCdCAIFBHRoaXMJARJrZXlMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwQHJG1hdGNoMAUUbGVhc2luZ0RhdGFTdHJpbmdSYXcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAJkcwUHJG1hdGNoMAQIZGF0YUxpc3QJALUJAgUCZHMFA1NFUAQLdG90YWxMZWFzZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAABBQt0b3RhbExlYXNlZAAAARNnZXRVc2VyTGVhc2luZ0VudHJ5Awtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcw90b3RhbFVzZXJMZWFzZWQEC3ZhbHVlU3RyaW5nCQC5CQIJAMwIAgICJWQJAMwIAgkApAMBBQ90b3RhbFVzZXJMZWFzZWQFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldFVzZXJMZWFzaW5nRGF0YQILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MEFGxlYXNpbmdEYXRhU3RyaW5nUmF3CQCdCAIFBHRoaXMJARZrZXlVc2VyTGVhc2luZ05vZGVEYXRhAgULdXNlckFkZHJlc3MFC25vZGVBZGRyZXNzBAckbWF0Y2gwBRRsZWFzaW5nRGF0YVN0cmluZ1JhdwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmRzBQckbWF0Y2gwBAhkYXRhTGlzdAkAtQkCBQJkcwUDU0VQBAt0b3RhbExlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAEFC3RvdGFsTGVhc2VkAAABFGdldFVzZXJCYWxhbmNlc0VudHJ5BQt1c2VyQWRkcmVzcwhwZXJpb2RJZAZsZWFzZWQIdG9VbmxvY2sHdG9DbGFpbQQLdmFsdWVTdHJpbmcJALkJAgkAzAgCAgglZCVkJWQlZAkAzAgCCQCkAwEFCHBlcmlvZElkCQDMCAIJAKQDAQUGbGVhc2VkCQDMCAIJAKQDAQUIdG9VbmxvY2sJAMwIAgkApAMBBQd0b0NsYWltBQNuaWwFA1NFUAkBC1N0cmluZ0VudHJ5AgkBD2tleVVzZXJCYWxhbmNlcwEFC3VzZXJBZGRyZXNzBQt2YWx1ZVN0cmluZwEPZ2V0VXNlckJhbGFuY2VzAQt1c2VyQWRkcmVzcwQUbGVhc2luZ0RhdGFTdHJpbmdSYXcJAJ0IAgUEdGhpcwkBD2tleVVzZXJCYWxhbmNlcwEFC3VzZXJBZGRyZXNzBAckbWF0Y2gwBRRsZWFzaW5nRGF0YVN0cmluZ1JhdwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmRzBQckbWF0Y2gwBAhkYXRhTGlzdAkAtQkCBQJkcwUDU0VQBAhwZXJpb2RJZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAEEBmxlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAIECHRvVW5sb2NrCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAwQHdG9DbGFpbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAQDCQBmAgkAZQIFD2N1cnJlbnRQZXJpb2RJZAUIcGVyaW9kSWQAAAkAlgoEBQhwZXJpb2RJZAUGbGVhc2VkAAAJAGQCBQd0b0NsYWltBQh0b1VubG9jawkAlgoEBQhwZXJpb2RJZAUGbGVhc2VkBQh0b1VubG9jawUHdG9DbGFpbQkAlgoEAAAAAAAAAAABFmdldFVzZXJMZWFzaW5nTm9kZUxpc3QBC3VzZXJBZGRyZXNzBBRsZWFzaW5nRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQEWa2V5VXNlckxlYXNpbmdOb2RlTGlzdAEFC3VzZXJBZGRyZXNzBAckbWF0Y2gwBRRsZWFzaW5nRGF0YVN0cmluZ1JhdwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmRzBQckbWF0Y2gwBAhkYXRhTGlzdAkAvQkCBQJkcwUDU0VQBQhkYXRhTGlzdAUDbmlsARRnZXRVc2VyTm9kZUxpc3RFbnRyeQILdXNlckFkZHJlc3MIbm9kZUxpc3QDCQAAAgkAkAMBBQhub2RlTGlzdAAACQELRGVsZXRlRW50cnkBCQEWa2V5VXNlckxlYXNpbmdOb2RlTGlzdAEFC3VzZXJBZGRyZXNzCQELU3RyaW5nRW50cnkCCQEWa2V5VXNlckxlYXNpbmdOb2RlTGlzdAEFC3VzZXJBZGRyZXNzCQC7CQIFCG5vZGVMaXN0BQNTRVABEWFkZE5vZGVUb05vZGVMaXN0Agt1c2VyQWRkcmVzcwtub2RlQWRkcmVzcwQIbm9kZUxpc3QJARZnZXRVc2VyTGVhc2luZ05vZGVMaXN0AQULdXNlckFkZHJlc3MDCQEPY29udGFpbnNFbGVtZW50AgUIbm9kZUxpc3QFC25vZGVBZGRyZXNzBQhub2RlTGlzdAkAzQgCBQhub2RlTGlzdAULbm9kZUFkZHJlc3MBFnJlbW92ZU5vZGVGcm9tTm9kZUxpc3QCC3VzZXJBZGRyZXNzC25vZGVBZGRyZXNzBAhub2RlTGlzdAkBFmdldFVzZXJMZWFzaW5nTm9kZUxpc3QBBQt1c2VyQWRkcmVzcwQHJG1hdGNoMAkAzwgCBQhub2RlTGlzdAULbm9kZUFkZHJlc3MDCQABAgUHJG1hdGNoMAIDSW50BAVpbmRleAUHJG1hdGNoMAkA0QgCBQhub2RlTGlzdAUFaW5kZXgFCG5vZGVMaXN0AQ9nZXRTdGFrZUFjdGlvbnMDC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzAWkEBmNoZWNrcwkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQh0aHJvd0VycgECIHBheW1lbnQgc2l6ZSBzaG91bGQgYmUgZXhhY3RseSAxCQDMCAIDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQxhc3NldElkQnl0ZXMGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIacGF5bWVudCBhc3NldElkIHNob3VsZCBiZToJAMwIAgUNYXNzZXRJZFN0cmluZwUDbmlsAgEgCQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQtub2RlQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhpub2RlIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQtub2RlQWRkcmVzcwUDbmlsAgEgCQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQt1c2VyQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhp1c2VyIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsAgEgBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEEXVzZXJMZWFzaW5nQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQPdG90YWxOb2RlTGVhc2VkCQESZ2V0TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEDW5ld1RvdGFsTGVhc2UJAGQCBQ90b3RhbE5vZGVMZWFzZWQFEXVzZXJMZWFzaW5nQW1vdW50BA91c2VyVG90YWxMZWFzZWQJARJnZXRVc2VyTGVhc2luZ0RhdGECBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MEEW5ld1VzZXJUb3RhbExlYXNlCQBkAgUPdXNlclRvdGFsTGVhc2VkBRF1c2VyTGVhc2luZ0Ftb3VudAQLJHQwNTgyMjU4OTQJAQ9nZXRVc2VyQmFsYW5jZXMBBQt1c2VyQWRkcmVzcwQIcGVyaW9kSWQIBQskdDA1ODIyNTg5NAJfMQQGbGVhc2VkCAULJHQwNTgyMjU4OTQCXzIECHRvVW5sb2NrCAULJHQwNTgyMjU4OTQCXzMEB3RvQ2xhaW0IBQskdDA1ODIyNTg5NAJfNAQJbmV3TGVhc2VkCQBkAgUGbGVhc2VkBRF1c2VyTGVhc2luZ0Ftb3VudAkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQIFC25vZGVBZGRyZXNzBQ1uZXdUb3RhbExlYXNlCQDMCAIJARNnZXRVc2VyTGVhc2luZ0VudHJ5AwULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyVG90YWxMZWFzZQkAzAgCCQEUZ2V0VXNlckJhbGFuY2VzRW50cnkFBQt1c2VyQWRkcmVzcwUPY3VycmVudFBlcmlvZElkBQluZXdMZWFzZWQFCHRvVW5sb2NrBQd0b0NsYWltCQDMCAIJARRnZXRVc2VyTm9kZUxpc3RFbnRyeQIFC3VzZXJBZGRyZXNzCQERYWRkTm9kZVRvTm9kZUxpc3QCBQt1c2VyQWRkcmVzcwULbm9kZUFkZHJlc3MFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERZ2V0VW5zdGFrZUFjdGlvbnMDC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzDXVuc3Rha2VBbW91bnQED3RvdGFsTm9kZUxlYXNlZAkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBA91c2VyVG90YWxMZWFzZWQJARJnZXRVc2VyTGVhc2luZ0RhdGECBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MEBmNoZWNrcwkAzAgCAwkAZgIFDXVuc3Rha2VBbW91bnQAAAYJAQh0aHJvd0VycgECJ3Vuc3Rha2UgYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAZwIFD3VzZXJUb3RhbExlYXNlZAUNdW5zdGFrZUFtb3VudAYJAQh0aHJvd0VycgECOXVuc3Rha2UgYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHVzZXIgc3Rha2VkIGFtb3VudAkAzAgCAwkAZwIFD3RvdGFsTm9kZUxlYXNlZAUNdW5zdGFrZUFtb3VudAYJAQh0aHJvd0VycgECOXVuc3Rha2UgYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIG5vZGUgc3Rha2VkIGFtb3VudAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULbm9kZUFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIabm9kZSBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULbm9kZUFkZHJlc3MFA25pbAIBIAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIadXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULdXNlckFkZHJlc3MFA25pbAIBIAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA1uZXdUb3RhbExlYXNlCQBlAgUPdG90YWxOb2RlTGVhc2VkBQ11bnN0YWtlQW1vdW50BBFuZXdVc2VyVG90YWxMZWFzZQkAZQIFD3VzZXJUb3RhbExlYXNlZAUNdW5zdGFrZUFtb3VudAQLJHQwNzE3NzcyNDkJAQ9nZXRVc2VyQmFsYW5jZXMBBQt1c2VyQWRkcmVzcwQIcGVyaW9kSWQIBQskdDA3MTc3NzI0OQJfMQQGbGVhc2VkCAULJHQwNzE3NzcyNDkCXzIECHRvVW5sb2NrCAULJHQwNzE3NzcyNDkCXzMEB3RvQ2xhaW0IBQskdDA3MTc3NzI0OQJfNAQJbmV3TGVhc2VkCQBlAgUGbGVhc2VkBQ11bnN0YWtlQW1vdW50BAtuZXdUb1VubG9jawkAZAIFCHRvVW5sb2NrBQ11bnN0YWtlQW1vdW50BBFyZW1vdmVOb2RlQWN0aW9ucwMJAAACBRFuZXdVc2VyVG90YWxMZWFzZQAACQDMCAIJARRnZXRVc2VyTm9kZUxpc3RFbnRyeQIFC3VzZXJBZGRyZXNzCQEWcmVtb3ZlTm9kZUZyb21Ob2RlTGlzdAIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwUDbmlsBQNuaWwJAM4IAgkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQIFC25vZGVBZGRyZXNzBQ1uZXdUb3RhbExlYXNlCQDMCAIJARNnZXRVc2VyTGVhc2luZ0VudHJ5AwULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyVG90YWxMZWFzZQkAzAgCCQEUZ2V0VXNlckJhbGFuY2VzRW50cnkFBQt1c2VyQWRkcmVzcwUPY3VycmVudFBlcmlvZElkBQluZXdMZWFzZWQFC25ld1RvVW5sb2NrBQd0b0NsYWltBQNuaWwFEXJlbW92ZU5vZGVBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARdnZXRDbGFpbVVubG9ja2VkQWN0aW9ucwILdXNlckFkZHJlc3MLY2xhaW1BbW91bnQECyR0MDc4NTA3OTIyCQEPZ2V0VXNlckJhbGFuY2VzAQULdXNlckFkZHJlc3MECHBlcmlvZElkCAULJHQwNzg1MDc5MjICXzEEBmxlYXNlZAgFCyR0MDc4NTA3OTIyAl8yBAh0b1VubG9jawgFCyR0MDc4NTA3OTIyAl8zBAd0b0NsYWltCAULJHQwNzg1MDc5MjICXzQEBmNoZWNrcwkAzAgCAwkAZgIFC2NsYWltQW1vdW50AAAGCQEIdGhyb3dFcnIBAiVjbGFpbSBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIDCQBnAgUHdG9DbGFpbQULY2xhaW1BbW91bnQGCQEIdGhyb3dFcnIBAjRjbGFpbSBhbW91bnQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgdW5sb2NrZWQgYW1vdW50CQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQt1c2VyQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhp1c2VyIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsAgEgBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MECm5ld1RvQ2xhaW0JAGUCBQd0b0NsYWltBQtjbGFpbUFtb3VudAkAzAgCCQEUZ2V0VXNlckJhbGFuY2VzRW50cnkFBQt1c2VyQWRkcmVzcwUPY3VycmVudFBlcmlvZElkBQZsZWFzZWQFCHRvVW5sb2NrBQpuZXdUb0NsYWltBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BHGdldFNldE5ld1BlcmlvZExlbmd0aEFjdGlvbnMBD25ld1BlcmlvZExlbmd0aAQFY2hlY2sJAMwIAgMJAGYCBQ9uZXdQZXJpb2RMZW5ndGgAAAYJAQh0aHJvd0VycgECJnBlcmlvZCBsZW5ndGggc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlQZXJpb2RMZW5ndGgFD25ld1BlcmlvZExlbmd0aAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0BQZoZWlnaHQFA25pbAQRbmV3UGVyaW9kT2Zmc2V0SWQJAGQCBQ9jdXJyZW50UGVyaW9kSWQAAQQPbmV3T2Zmc2V0SGVpZ2h0CQBkAgkAaAIFDHBlcmlvZExlbmd0aAkAZQIFEW5ld1BlcmlvZE9mZnNldElkBQ5wZXJpb2RPZmZzZXRJZAUScGVyaW9kT2Zmc2V0SGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrZXlQZXJpb2RPZmZzZXRJZAURbmV3UGVyaW9kT2Zmc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVBlcmlvZE9mZnNldEhlaWdodAUPbmV3T2Zmc2V0SGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlQZXJpb2RMZW5ndGgFD25ld1BlcmlvZExlbmd0aAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBgFpARJzZXROZXdQZXJpb2RMZW5ndGgBD25ld1BlcmlvZExlbmd0aAkBHGdldFNldE5ld1BlcmlvZExlbmd0aEFjdGlvbnMBBQ9uZXdQZXJpb2RMZW5ndGgBaQELZ2V0VXNlckRhdGEBC3VzZXJBZGRyZXNzBAskdDA5MzA0OTM3NgkBD2dldFVzZXJCYWxhbmNlcwEFC3VzZXJBZGRyZXNzBAhwZXJpb2RJZAgFCyR0MDkzMDQ5Mzc2Al8xBAZsZWFzZWQIBQskdDA5MzA0OTM3NgJfMgQIdG9VbmxvY2sIBQskdDA5MzA0OTM3NgJfMwQHdG9DbGFpbQgFCyR0MDkzMDQ5Mzc2Al80BAhub2RlTGlzdAkBFmdldFVzZXJMZWFzaW5nTm9kZUxpc3QBBQt1c2VyQWRkcmVzcwkAlAoCBQNuaWwJAJcKBQUPY3VycmVudFBlcmlvZElkBQZsZWFzZWQFCHRvVW5sb2NrBQd0b0NsYWltBQhub2RlTGlzdAFpAQhzdGFrZUZvcgILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MJAQ9nZXRTdGFrZUFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFAWkBaQEFc3Rha2UBC25vZGVBZGRyZXNzBAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJAQ9nZXRTdGFrZUFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFAWkBaQEHdW5zdGFrZQILbm9kZUFkZHJlc3MGYW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARFnZXRVbnN0YWtlQWN0aW9ucwMFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwUGYW1vdW50AWkBBWNsYWltAQZhbW91bnQEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBF2dldENsYWltVW5sb2NrZWRBY3Rpb25zAgULdXNlckFkZHJlc3MFBmFtb3VudACnQgEy", "height": 2962805, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7rMbGGt5aktHCTVDbvEGLwVXvDVt1K95jzwkRHdgF59N Next: 78ZRJE5SEf8VWZnkdFEczDQBQYeuQZeDpWDhh6cQ7dG1 Diff:
OldNewDifferences
2222
2323 let periodLength = valueOrElse(getInteger(this, keyPeriodLength), 10000)
2424
25-let periodOffsetHeight = valueOrElse(getIntegerValue(this, keyPeriodOffsetHeight), -1)
25+let periodOffsetHeight = valueOrElse(getInteger(this, keyPeriodOffsetHeight), -1)
2626
2727 let currentPeriodId = if ((height > periodOffsetHeight))
2828 then (((height - periodOffsetHeight) / periodLength) + periodOffsetId)
169169 let newTotalLease = (totalNodeLeased + userLeasingAmount)
170170 let userTotalLeased = getUserLeasingData(nodeAddress, userAddress)
171171 let newUserTotalLease = (userTotalLeased + userLeasingAmount)
172- let $t058275899 = getUserBalances(userAddress)
173- let periodId = $t058275899._1
174- let leased = $t058275899._2
175- let toUnlock = $t058275899._3
176- let toClaim = $t058275899._4
172+ let $t058225894 = getUserBalances(userAddress)
173+ let periodId = $t058225894._1
174+ let leased = $t058225894._2
175+ let toUnlock = $t058225894._3
176+ let toClaim = $t058225894._4
177177 let newLeased = (leased + userLeasingAmount)
178178 [getLeasingNodeEntry(nodeAddress, newTotalLease), getUserLeasingEntry(nodeAddress, userAddress, newUserTotalLease), getUserBalancesEntry(userAddress, currentPeriodId, newLeased, toUnlock, toClaim), getUserNodeListEntry(userAddress, addNodeToNodeList(userAddress, nodeAddress))]
179179 }
199199 then {
200200 let newTotalLease = (totalNodeLeased - unstakeAmount)
201201 let newUserTotalLease = (userTotalLeased - unstakeAmount)
202- let $t071827254 = getUserBalances(userAddress)
203- let periodId = $t071827254._1
204- let leased = $t071827254._2
205- let toUnlock = $t071827254._3
206- let toClaim = $t071827254._4
202+ let $t071777249 = getUserBalances(userAddress)
203+ let periodId = $t071777249._1
204+ let leased = $t071777249._2
205+ let toUnlock = $t071777249._3
206+ let toClaim = $t071777249._4
207207 let newLeased = (leased - unstakeAmount)
208208 let newToUnlock = (toUnlock + unstakeAmount)
209209 let removeNodeActions = if ((newUserTotalLease == 0))
216216
217217
218218 func getClaimUnlockedActions (userAddress,claimAmount) = {
219- let $t078557927 = getUserBalances(userAddress)
220- let periodId = $t078557927._1
221- let leased = $t078557927._2
222- let toUnlock = $t078557927._3
223- let toClaim = $t078557927._4
219+ let $t078507922 = getUserBalances(userAddress)
220+ let periodId = $t078507922._1
221+ let leased = $t078507922._2
222+ let toUnlock = $t078507922._3
223+ let toClaim = $t078507922._4
224224 let checks = [if ((claimAmount > 0))
225225 then true
226226 else throwErr("claim amount should be greater than 0"), if ((toClaim >= claimAmount))
260260
261261 @Callable(i)
262262 func getUserData (userAddress) = {
263- let $t093099381 = getUserBalances(userAddress)
264- let periodId = $t093099381._1
265- let leased = $t093099381._2
266- let toUnlock = $t093099381._3
267- let toClaim = $t093099381._4
263+ let $t093049376 = getUserBalances(userAddress)
264+ let periodId = $t093049376._1
265+ let leased = $t093049376._2
266+ let toUnlock = $t093049376._3
267+ let toClaim = $t093049376._4
268268 let nodeList = getUserLeasingNodeList(userAddress)
269269 $Tuple2(nil, $Tuple5(currentPeriodId, leased, toUnlock, toClaim, nodeList))
270270 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let contractFile = "l2mp_leasing.ride"
55
66 let SEP = "__"
77
88 let scale8 = 100000000
99
1010 func throwErr (msg) = throw(((contractFile + ": ") + msg))
1111
1212
1313 let keyAssetId = makeString(["%s", "assetId"], SEP)
1414
1515 let keyPeriodOffsetId = makeString(["%s", "offsetId"], SEP)
1616
1717 let keyPeriodOffsetHeight = makeString(["%s", "offsetHeight"], SEP)
1818
1919 let keyPeriodLength = makeString(["%s", "periodLength"], SEP)
2020
2121 let periodOffsetId = valueOrElse(getInteger(this, keyPeriodOffsetId), 0)
2222
2323 let periodLength = valueOrElse(getInteger(this, keyPeriodLength), 10000)
2424
25-let periodOffsetHeight = valueOrElse(getIntegerValue(this, keyPeriodOffsetHeight), -1)
25+let periodOffsetHeight = valueOrElse(getInteger(this, keyPeriodOffsetHeight), -1)
2626
2727 let currentPeriodId = if ((height > periodOffsetHeight))
2828 then (((height - periodOffsetHeight) / periodLength) + periodOffsetId)
2929 else periodOffsetId
3030
3131 func keyLeasingNodeData (nodeAddress) = makeString(["%s", "leasingNode", nodeAddress], SEP)
3232
3333
3434 func keyUserLeasingNodeList (userAddress) = makeString(["%s%s", "userLeasingNodeList", userAddress], SEP)
3535
3636
3737 func keyUserLeasingNodeData (userAddress,nodeAddress) = makeString(["%s%s", "userLeasingNodeData", userAddress, nodeAddress], SEP)
3838
3939
4040 func keyUserBalances (userAddress) = makeString(["%s%s", "userBalances", userAddress], SEP)
4141
4242
4343 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
4444
4545 let assetIdBytes = if ((assetIdString == "WAVES"))
4646 then unit
4747 else fromBase58String(assetIdString)
4848
4949 func isValidAddress (address) = match addressFromString(address) {
5050 case a: Address =>
5151 true
5252 case _ =>
5353 false
5454 }
5555
5656
5757 func getLeasingNodeEntry (nodeAddress,totalLeased) = {
5858 let valueString = makeString(["%d", toString(totalLeased)], SEP)
5959 StringEntry(keyLeasingNodeData(nodeAddress), valueString)
6060 }
6161
6262
6363 func getLeasingNodeData (nodeAddress) = {
6464 let leasingDataStringRaw = getString(this, keyLeasingNodeData(nodeAddress))
6565 match leasingDataStringRaw {
6666 case ds: String =>
6767 let dataList = split(ds, SEP)
6868 let totalLeased = parseIntValue(dataList[1])
6969 totalLeased
7070 case _ =>
7171 0
7272 }
7373 }
7474
7575
7676 func getUserLeasingEntry (nodeAddress,userAddress,totalUserLeased) = {
7777 let valueString = makeString(["%d", toString(totalUserLeased)], SEP)
7878 StringEntry(keyUserLeasingNodeData(userAddress, nodeAddress), valueString)
7979 }
8080
8181
8282 func getUserLeasingData (nodeAddress,userAddress) = {
8383 let leasingDataStringRaw = getString(this, keyUserLeasingNodeData(userAddress, nodeAddress))
8484 match leasingDataStringRaw {
8585 case ds: String =>
8686 let dataList = split(ds, SEP)
8787 let totalLeased = parseIntValue(dataList[1])
8888 totalLeased
8989 case _ =>
9090 0
9191 }
9292 }
9393
9494
9595 func getUserBalancesEntry (userAddress,periodId,leased,toUnlock,toClaim) = {
9696 let valueString = makeString(["%d%d%d%d", toString(periodId), toString(leased), toString(toUnlock), toString(toClaim)], SEP)
9797 StringEntry(keyUserBalances(userAddress), valueString)
9898 }
9999
100100
101101 func getUserBalances (userAddress) = {
102102 let leasingDataStringRaw = getString(this, keyUserBalances(userAddress))
103103 match leasingDataStringRaw {
104104 case ds: String =>
105105 let dataList = split(ds, SEP)
106106 let periodId = parseIntValue(dataList[1])
107107 let leased = parseIntValue(dataList[2])
108108 let toUnlock = parseIntValue(dataList[3])
109109 let toClaim = parseIntValue(dataList[4])
110110 if (((currentPeriodId - periodId) > 0))
111111 then $Tuple4(periodId, leased, 0, (toClaim + toUnlock))
112112 else $Tuple4(periodId, leased, toUnlock, toClaim)
113113 case _ =>
114114 $Tuple4(0, 0, 0, 0)
115115 }
116116 }
117117
118118
119119 func getUserLeasingNodeList (userAddress) = {
120120 let leasingDataStringRaw = getString(this, keyUserLeasingNodeList(userAddress))
121121 match leasingDataStringRaw {
122122 case ds: String =>
123123 let dataList = split_51C(ds, SEP)
124124 dataList
125125 case _ =>
126126 nil
127127 }
128128 }
129129
130130
131131 func getUserNodeListEntry (userAddress,nodeList) = if ((size(nodeList) == 0))
132132 then DeleteEntry(keyUserLeasingNodeList(userAddress))
133133 else StringEntry(keyUserLeasingNodeList(userAddress), makeString_11C(nodeList, SEP))
134134
135135
136136 func addNodeToNodeList (userAddress,nodeAddress) = {
137137 let nodeList = getUserLeasingNodeList(userAddress)
138138 if (containsElement(nodeList, nodeAddress))
139139 then nodeList
140140 else (nodeList :+ nodeAddress)
141141 }
142142
143143
144144 func removeNodeFromNodeList (userAddress,nodeAddress) = {
145145 let nodeList = getUserLeasingNodeList(userAddress)
146146 match indexOf(nodeList, nodeAddress) {
147147 case index: Int =>
148148 removeByIndex(nodeList, index)
149149 case _ =>
150150 nodeList
151151 }
152152 }
153153
154154
155155 func getStakeActions (nodeAddress,userAddress,i) = {
156156 let checks = [if ((size(i.payments) == 1))
157157 then true
158158 else throwErr("payment size should be exactly 1"), if ((i.payments[0].assetId == assetIdBytes))
159159 then true
160160 else throwErr(makeString(["payment assetId should be:", assetIdString], " ")), if (isValidAddress(nodeAddress))
161161 then true
162162 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
163163 then true
164164 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
165165 if ((checks == checks))
166166 then {
167167 let userLeasingAmount = i.payments[0].amount
168168 let totalNodeLeased = getLeasingNodeData(nodeAddress)
169169 let newTotalLease = (totalNodeLeased + userLeasingAmount)
170170 let userTotalLeased = getUserLeasingData(nodeAddress, userAddress)
171171 let newUserTotalLease = (userTotalLeased + userLeasingAmount)
172- let $t058275899 = getUserBalances(userAddress)
173- let periodId = $t058275899._1
174- let leased = $t058275899._2
175- let toUnlock = $t058275899._3
176- let toClaim = $t058275899._4
172+ let $t058225894 = getUserBalances(userAddress)
173+ let periodId = $t058225894._1
174+ let leased = $t058225894._2
175+ let toUnlock = $t058225894._3
176+ let toClaim = $t058225894._4
177177 let newLeased = (leased + userLeasingAmount)
178178 [getLeasingNodeEntry(nodeAddress, newTotalLease), getUserLeasingEntry(nodeAddress, userAddress, newUserTotalLease), getUserBalancesEntry(userAddress, currentPeriodId, newLeased, toUnlock, toClaim), getUserNodeListEntry(userAddress, addNodeToNodeList(userAddress, nodeAddress))]
179179 }
180180 else throw("Strict value is not equal to itself.")
181181 }
182182
183183
184184 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
185185 let totalNodeLeased = getLeasingNodeData(nodeAddress)
186186 let userTotalLeased = getUserLeasingData(nodeAddress, userAddress)
187187 let checks = [if ((unstakeAmount > 0))
188188 then true
189189 else throwErr("unstake amount should be greater than 0"), if ((userTotalLeased >= unstakeAmount))
190190 then true
191191 else throwErr("unstake amount should be less or equal user staked amount"), if ((totalNodeLeased >= unstakeAmount))
192192 then true
193193 else throwErr("unstake amount should be less or equal node staked amount"), if (isValidAddress(nodeAddress))
194194 then true
195195 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
196196 then true
197197 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
198198 if ((checks == checks))
199199 then {
200200 let newTotalLease = (totalNodeLeased - unstakeAmount)
201201 let newUserTotalLease = (userTotalLeased - unstakeAmount)
202- let $t071827254 = getUserBalances(userAddress)
203- let periodId = $t071827254._1
204- let leased = $t071827254._2
205- let toUnlock = $t071827254._3
206- let toClaim = $t071827254._4
202+ let $t071777249 = getUserBalances(userAddress)
203+ let periodId = $t071777249._1
204+ let leased = $t071777249._2
205+ let toUnlock = $t071777249._3
206+ let toClaim = $t071777249._4
207207 let newLeased = (leased - unstakeAmount)
208208 let newToUnlock = (toUnlock + unstakeAmount)
209209 let removeNodeActions = if ((newUserTotalLease == 0))
210210 then [getUserNodeListEntry(userAddress, removeNodeFromNodeList(userAddress, nodeAddress))]
211211 else nil
212212 ([getLeasingNodeEntry(nodeAddress, newTotalLease), getUserLeasingEntry(nodeAddress, userAddress, newUserTotalLease), getUserBalancesEntry(userAddress, currentPeriodId, newLeased, newToUnlock, toClaim)] ++ removeNodeActions)
213213 }
214214 else throw("Strict value is not equal to itself.")
215215 }
216216
217217
218218 func getClaimUnlockedActions (userAddress,claimAmount) = {
219- let $t078557927 = getUserBalances(userAddress)
220- let periodId = $t078557927._1
221- let leased = $t078557927._2
222- let toUnlock = $t078557927._3
223- let toClaim = $t078557927._4
219+ let $t078507922 = getUserBalances(userAddress)
220+ let periodId = $t078507922._1
221+ let leased = $t078507922._2
222+ let toUnlock = $t078507922._3
223+ let toClaim = $t078507922._4
224224 let checks = [if ((claimAmount > 0))
225225 then true
226226 else throwErr("claim amount should be greater than 0"), if ((toClaim >= claimAmount))
227227 then true
228228 else throwErr("claim amount should be less or equal unlocked amount"), if (isValidAddress(userAddress))
229229 then true
230230 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
231231 if ((checks == checks))
232232 then {
233233 let newToClaim = (toClaim - claimAmount)
234234 [getUserBalancesEntry(userAddress, currentPeriodId, leased, toUnlock, newToClaim)]
235235 }
236236 else throw("Strict value is not equal to itself.")
237237 }
238238
239239
240240 func getSetNewPeriodLengthActions (newPeriodLength) = {
241241 let check = [if ((newPeriodLength > 0))
242242 then true
243243 else throwErr("period length should be greater than 0")]
244244 if ((check == check))
245245 then if ((periodOffsetHeight == -1))
246246 then [IntegerEntry(keyPeriodLength, newPeriodLength), IntegerEntry(keyPeriodOffsetHeight, height)]
247247 else {
248248 let newPeriodOffsetId = (currentPeriodId + 1)
249249 let newOffsetHeight = ((periodLength * (newPeriodOffsetId - periodOffsetId)) + periodOffsetHeight)
250250 [IntegerEntry(keyPeriodOffsetId, newPeriodOffsetId), IntegerEntry(keyPeriodOffsetHeight, newOffsetHeight), IntegerEntry(keyPeriodLength, newPeriodLength)]
251251 }
252252 else throw("Strict value is not equal to itself.")
253253 }
254254
255255
256256 @Callable(i)
257257 func setNewPeriodLength (newPeriodLength) = getSetNewPeriodLengthActions(newPeriodLength)
258258
259259
260260
261261 @Callable(i)
262262 func getUserData (userAddress) = {
263- let $t093099381 = getUserBalances(userAddress)
264- let periodId = $t093099381._1
265- let leased = $t093099381._2
266- let toUnlock = $t093099381._3
267- let toClaim = $t093099381._4
263+ let $t093049376 = getUserBalances(userAddress)
264+ let periodId = $t093049376._1
265+ let leased = $t093049376._2
266+ let toUnlock = $t093049376._3
267+ let toClaim = $t093049376._4
268268 let nodeList = getUserLeasingNodeList(userAddress)
269269 $Tuple2(nil, $Tuple5(currentPeriodId, leased, toUnlock, toClaim, nodeList))
270270 }
271271
272272
273273
274274 @Callable(i)
275275 func stakeFor (nodeAddress,userAddress) = getStakeActions(nodeAddress, userAddress, i)
276276
277277
278278
279279 @Callable(i)
280280 func stake (nodeAddress) = {
281281 let userAddress = toString(i.caller)
282282 getStakeActions(nodeAddress, userAddress, i)
283283 }
284284
285285
286286
287287 @Callable(i)
288288 func unstake (nodeAddress,amount) = {
289289 let userAddress = toString(i.caller)
290290 getUnstakeActions(nodeAddress, userAddress, amount)
291291 }
292292
293293
294294
295295 @Callable(i)
296296 func claim (amount) = {
297297 let userAddress = toString(i.caller)
298298 getClaimUnlockedActions(userAddress, amount)
299299 }
300300
301301

github/deemru/w8io/873ac7e 
40.83 ms