tx · 6rpW3iAPADEmDjPxBeg5amRvsd9gFuXx14xU911FYo4D 3PQV9AUMU36fdDYMmMZw6urSYG3BuMahQuk: -0.02700000 Waves 2022.09.13 09:41 [3292489] smart account 3PQV9AUMU36fdDYMmMZw6urSYG3BuMahQuk > SELF 0.00000000 Waves
{ "type": 13, "id": "6rpW3iAPADEmDjPxBeg5amRvsd9gFuXx14xU911FYo4D", "fee": 2700000, "feeAssetId": null, "timestamp": 1663051279423, "version": 2, "chainId": 87, "sender": "3PQV9AUMU36fdDYMmMZw6urSYG3BuMahQuk", "senderPublicKey": "8bMNZV1S5S2hfim2ZPy5hsSdC1AHBwPHUEXPBhdEF2Mk", "proofs": [ "5swXb8zJzwj4XqiYeyXeumZxpcLSCTBpZEB4a4UgJNAzD9eZU2BFtkNdNRMv8r1WVDfGACcFMsRphvrGpihDMbxg" ], "script": "base64:BgIwCAISABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAMAAKdXNkdFVzZG5MUAEgeKe/TORdN+2VIdfWflWy/q4Ef+gR/VrWL/1DGC+Wt8AADXVzZHRVc2RuTFBUQ0kBIBG6tC/qJMhI0cdjddgUOO1bmK5/To9FHcuj/RydMcYtAAh3eFVzZG5MUAEg0E+9UXQSGV1axWsKa7YHwYv2IAlKZCQciL72xq5U62gAC3d4VXNkbkxQVENJASDddUGqOmEiUy/NVjAevMO+tQmtTIa9lFOcEqHuPqPe+AAKdXNkY1VzZG5MUAEgA2kB/BsKmAqIzY/+EVmFhSaRMrNakvwm6Uhd05/eXHYADXVzZGNVc2RuTFBUQ0kBIPYCN93Tn++GRS9cI0cPlV/ROm2hK8KntJtUQQdS9W7GAAp1c2RjVXNkdExQASDG+KR0G1ZIVhCfkH7CM/Qxa4sESiwr/ZlLh/WFm3zkjAANdXNkY1VzZHRMUFRDSQEgAsaFfARLM8fi74dnh1L7VYL9s9+EI7agWsU13c9XSv4ADHB1enpsZVVzZG5MUAEgwzPGdM4jqqQi30kk5cSZa3gEsHdWgnT/uNEdSo0c0Z4AD3B1enpsZVVzZG5MUFRDSQEgvJT6zwcHAR1Xf2NHmqYN/fUF18bEe85zWm98KZKIR7UACm5zYnRVc2RuTFABIInE99XWShUNg3nT3abBvgxU04OeMx+XVP9DG3gXQxsuAA1uc2J0VXNkbkxQVENJASAoMV2i3pPLh7OoDl5CN06fo5Z0c5jxSbBacYujFiJ74wAJYnRjVXNkbkxQASBvnTGD7115O9yfbwnrrkfye1q7Q6w30uxRGWcrdhJZFAAMYnRjVXNkbkxQVENJASDcKb+1ZgRJVjLpTs28rEytAj8sbl/K1IhRJ2pystFysgAKZW5ub1VzZG5MUAEg+WL1H0qKE/YqGIUF9urWuk8SlptfMTDJlbqjiaU5hIoADWVubm9Vc2RuTFBUQ0kBID0pHPS701PG5Luu4DGhzVAAjQHakCyJLhBHhzfA2N8kAAt3YXZlc1VzZG5MUAEgXedtbkamxzmxtK4hQ1NqaJeqmQ+fWxX6vGpRDRxJGSAADndhdmVzVXNkbkxQVENJASDFcDo6U75MAThdBep88ScKUJh65v5zXYdqcbf7jCLYqQAJbHRjVXNkbkxQASCpA1AbZJnKzVyLuP7eAqYUv62+8B5hgZ72o/YA4yrO2QAMbHRjVXNkbkxQVENJASD3xkByilFq2uREcks7rpMAtqAxjenWLXmKfLMyH6M4lQAJaXNTdG9wcGVkBwAJa2V5U3Rha2VkAglTVEFLRURfTFAAC2tleUNvbXBvdW5kAg1Gcm9tX0NvbXBvdW5kABFrZXl3eFVzZG5Db21wb3VuZAIQV1hfVVNETl9jb21wb3VuZAAJa2V5V1hVU0ROAgdXWF9VU0ROABNrZXlVc2RjVXNkbkNvbXBvdW5kAhJVU0RDX1VTRE5fY29tcG91bmQAC2tleVVTRENVU0ROAglVU0RDX1VTRE4AE2tleVVzZGNVc2R0Q29tcG91bmQCElVTRENfVVNEVF9jb21wb3VuZAALa2V5VVNEQ1VTRFQCCVVTRENfVVNEVAAVa2V5UHV6emxlVXNkbkNvbXBvdW5kAhRQVVpaTEVfVVNETl9jb21wb3VuZAANa2V5UFVaWkxFVVNETgILUFVaWkxFX1VTRE4AE2tleU5zYnRVc2RuQ29tcG91bmQCEk5TQlRfVVNETl9jb21wb3VuZAALa2V5TlNCVFVTRE4CCU5TQlRfVVNETgAKa2V5QlRDVVNETgIIQlRDX1VTRE4AEmtleUJ0Y1VzZG5Db21wb3VuZAIRQlRDX1VTRE5fQ29tcG91bmQAC2tleUVOTk9VU0ROAglFTk5PX1VTRE4AE2tleUVubm9Vc2RuQ29tcG91bmQCEkVOTk9fVVNETl9Db21wb3VuZAAMa2V5V0FWRVNVU0ROAgpXQVZFU19VU0ROABRrZXlXYXZlc1VzZG5Db21wb3VuZAITV0FWRVNfVVNETl9Db21wb3VuZAAKa2V5TFRDVVNETgIITFRDX1VTRE4AEmtleUx0Y1VzZG5Db21wb3VuZAIRTFRDX1VTRE5fQ29tcG91bmQABHd4SWQBIJMBHKupx24lV85mnnG2vapr+DzoWAsq7tmgTrs83BSxAA5rZXlTcG9uc29yc2hpcAITU3BvbnNvcnNoaXBfaW5fbG9jawADZGVmAIDC1y8AB2ZlZVBlcmMAgMivoCUAAnR3ARoBV04EqfVyjN7n+dJSSt24a1NFjHqnmjh9nAAGb3JhY2xlARoBVzWtH6QdsRVtUfPPQcg6qbN4lGqDirxviQEMY2hlY2tBZGRyZXNzAQZjYWxsZXIDCQECIT0CBQZjYWxsZXIFBm9yYWNsZQcGFwFpAQ9kZXBvc2l0V3hVc2RuTFAABANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQJcG10QW1vdW50CAUDcG10BmFtb3VudAMJAQIhPQIIBQNwbXQHYXNzZXRJZAUId3hVc2RuTFAJAAIBAhthdHRhY2ggV1hVU0ROTFAgdG9rZW5zIG9ubHkDBQlpc1N0b3BwZWQJAAIBAhlzbWFydCBjb250cmFjdCBpcyBvbiBsb2NrBAh0a1N0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQlrZXlXWFVTRE4AAAQLdG90YWxJc3N1ZWQEByRtYXRjaDAJAOwHAQULd3hVc2RuTFBUQ0kDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIcXVhbnRpdHkJAAIBAhBDYW4ndCBmaW5kIGFzc2V0BANvbmUJAGsDBQt0b3RhbElzc3VlZACAwtcvBQh0a1N0YWtlZAQHdG9Jc3N1ZQkAawMFCXBtdEFtb3VudAUDb25lAIDC1y8EC3VwZGF0ZVN0YXRlCQEMSW50ZWdlckVudHJ5AgUJa2V5V1hVU0ROCQBkAgUIdGtTdGFrZWQFCXBtdEFtb3VudAQHTFBzdGFrZQkA/AcECQEHQWRkcmVzcwEBGgFX6zvnfm4FGMKRpJgWF+Fm10UnIO4lSVaoAgVzdGFrZQUDbmlsCQDMCAIFA3BtdAUDbmlsAwkAAAIFB0xQc3Rha2UFB0xQc3Rha2UEB0xQSXNzdWUJAQdSZWlzc3VlAwULd3hVc2RuTFBUQ0kFB3RvSXNzdWUGBAh0cmFuc2ZlcgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQd0b0lzc3VlBQt3eFVzZG5MUFRDSQkAzAgCBQdMUElzc3VlCQDMCAIFCHRyYW5zZmVyCQDMCAIFC3VwZGF0ZVN0YXRlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERZGVwb3NpdFVzZHRVc2RuTFAABANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQJcG10QW1vdW50CAUDcG10BmFtb3VudAMJAQIhPQIIBQNwbXQHYXNzZXRJZAUKdXNkdFVzZG5MUAkAAgECHWF0dGFjaCBVU0RUVVNETkxQIHRva2VucyBvbmx5AwUJaXNTdG9wcGVkCQACAQIZc21hcnQgY29udHJhY3QgaXMgb24gbG9jawQIdGtTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUJa2V5U3Rha2VkAAAEC3RvdGFsSXNzdWVkBAckbWF0Y2gwCQDsBwEFDXVzZHRVc2RuTFBUQ0kDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIcXVhbnRpdHkJAAIBAhBDYW4ndCBmaW5kIGFzc2V0BAxmcm9tQ29tcG91bmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULa2V5Q29tcG91bmQAAAQGZm9yT25lCQBrAwULdG90YWxJc3N1ZWQAgMLXLwUIdGtTdGFrZWQEB3RvSXNzdWUJAGsDBQlwbXRBbW91bnQFBmZvck9uZQCAwtcvBAt1cGRhdGVTdGF0ZQkBDEludGVnZXJFbnRyeQIFCWtleVN0YWtlZAkAZAIFCHRrU3Rha2VkBQlwbXRBbW91bnQEB0xQc3Rha2UJAPwHBAkBB0FkZHJlc3MBARoBV+s7535uBRjCkaSYFhfhZtdFJyDuJUlWqAIFc3Rha2UFA25pbAkAzAgCBQNwbXQFA25pbAMJAAACBQdMUHN0YWtlBQdMUHN0YWtlBAdMUElzc3VlCQEHUmVpc3N1ZQMFDXVzZHRVc2RuTFBUQ0kFB3RvSXNzdWUGBAh0cmFuc2ZlcgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQd0b0lzc3VlBQ11c2R0VXNkbkxQVENJCQDMCAIFB0xQSXNzdWUJAMwIAgUIdHJhbnNmZXIJAMwIAgULdXBkYXRlU3RhdGUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFkZXBvc2l0VXNkY1VzZG5MUAAEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAlwbXRBbW91bnQIBQNwbXQGYW1vdW50AwkBAiE9AggFA3BtdAdhc3NldElkBQp1c2RjVXNkbkxQCQACAQIdYXR0YWNoIFVTRENVU0ROTFAgdG9rZW5zIG9ubHkDBQlpc1N0b3BwZWQJAAIBAhlzbWFydCBjb250cmFjdCBpcyBvbiBsb2NrBAh0a1N0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtrZXlVU0RDVVNETgAABAt0b3RhbElzc3VlZAQHJG1hdGNoMAkA7AcBBQ11c2RjVXNkbkxQVENJAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAgFBWFzc2V0CHF1YW50aXR5CQACAQIQQ2FuJ3QgZmluZCBhc3NldAQMZnJvbUNvbXBvdW5kCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFE2tleVVzZGNVc2RuQ29tcG91bmQAAAQGZm9yT25lCQBrAwULdG90YWxJc3N1ZWQAgMLXLwUIdGtTdGFrZWQEB3RvSXNzdWUJAGsDBQlwbXRBbW91bnQFBmZvck9uZQCAwtcvBAt1cGRhdGVTdGF0ZQkBDEludGVnZXJFbnRyeQIFC2tleVVTRENVU0ROCQBkAgUIdGtTdGFrZWQFCXBtdEFtb3VudAQHTFBzdGFrZQkA/AcECQEHQWRkcmVzcwEBGgFX6zvnfm4FGMKRpJgWF+Fm10UnIO4lSVaoAgVzdGFrZQUDbmlsCQDMCAIFA3BtdAUDbmlsAwkAAAIFB0xQc3Rha2UFB0xQc3Rha2UEB0xQSXNzdWUJAQdSZWlzc3VlAwUNdXNkY1VzZG5MUFRDSQUHdG9Jc3N1ZQYECHRyYW5zZmVyCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB3RvSXNzdWUFDXVzZGNVc2RuTFBUQ0kJAMwIAgUHTFBJc3N1ZQkAzAgCBQh0cmFuc2ZlcgkAzAgCBQt1cGRhdGVTdGF0ZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWRlcG9zaXRVc2RjVXNkdExQAAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAECXBtdEFtb3VudAgFA3BtdAZhbW91bnQDCQECIT0CCAUDcG10B2Fzc2V0SWQFCnVzZGNVc2R0TFAJAAIBAh1hdHRhY2ggVVNEQ1VTRFRMUCB0b2tlbnMgb25seQMFCWlzU3RvcHBlZAkAAgECGXNtYXJ0IGNvbnRyYWN0IGlzIG9uIGxvY2sECHRrU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tleVVTRENVU0RUAAAEC3RvdGFsSXNzdWVkBAckbWF0Y2gwCQDsBwEFDXVzZGNVc2R0TFBUQ0kDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIcXVhbnRpdHkJAAIBAhBDYW4ndCBmaW5kIGFzc2V0BAxmcm9tQ29tcG91bmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUTa2V5VXNkY1VzZHRDb21wb3VuZAAABAZmb3JPbmUJAGsDBQt0b3RhbElzc3VlZACAwtcvBQh0a1N0YWtlZAQHdG9Jc3N1ZQkAawMFCXBtdEFtb3VudAUGZm9yT25lAIDC1y8EC3VwZGF0ZVN0YXRlCQEMSW50ZWdlckVudHJ5AgULa2V5VVNEQ1VTRFQJAGQCBQh0a1N0YWtlZAUJcG10QW1vdW50BAdMUHN0YWtlCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCBXN0YWtlBQNuaWwJAMwIAgUDcG10BQNuaWwDCQAAAgUHTFBzdGFrZQUHTFBzdGFrZQQHTFBJc3N1ZQkBB1JlaXNzdWUDBQ11c2RjVXNkdExQVENJBQd0b0lzc3VlBgQIdHJhbnNmZXIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUHdG9Jc3N1ZQUNdXNkY1VzZHRMUFRDSQkAzAgCBQdMUElzc3VlCQDMCAIFCHRyYW5zZmVyCQDMCAIFC3VwZGF0ZVN0YXRlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETZGVwb3NpdFB1enpsZVVzZG5MUAAEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAlwbXRBbW91bnQIBQNwbXQGYW1vdW50AwkBAiE9AggFA3BtdAdhc3NldElkBQxwdXp6bGVVc2RuTFAJAAIBAh9hdHRhY2ggUFVaWkxFVURTTkxQIHRva2VucyBvbmx5AwUJaXNTdG9wcGVkCQACAQIZc21hcnQgY29udHJhY3QgaXMgb24gbG9jawQIdGtTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUNa2V5UFVaWkxFVVNETgAABAt0b3RhbElzc3VlZAQHJG1hdGNoMAkA7AcBBQ9wdXp6bGVVc2RuTFBUQ0kDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIcXVhbnRpdHkJAAIBAhBDYW4ndCBmaW5kIGFzc2V0BAxmcm9tQ29tcG91bmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVa2V5UHV6emxlVXNkbkNvbXBvdW5kAAAEBmZvck9uZQkAawMFC3RvdGFsSXNzdWVkAIDC1y8FCHRrU3Rha2VkBAd0b0lzc3VlCQBrAwUJcG10QW1vdW50BQZmb3JPbmUAgMLXLwQLdXBkYXRlU3RhdGUJAQxJbnRlZ2VyRW50cnkCBQ1rZXlQVVpaTEVVU0ROCQBkAgUIdGtTdGFrZWQFCXBtdEFtb3VudAQHTFBzdGFrZQkA/AcECQEHQWRkcmVzcwEBGgFX6zvnfm4FGMKRpJgWF+Fm10UnIO4lSVaoAgVzdGFrZQUDbmlsCQDMCAIFA3BtdAUDbmlsAwkAAAIFB0xQc3Rha2UFB0xQc3Rha2UEB0xQSXNzdWUJAQdSZWlzc3VlAwUPcHV6emxlVXNkbkxQVENJBQd0b0lzc3VlBgQIdHJhbnNmZXIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUHdG9Jc3N1ZQUPcHV6emxlVXNkbkxQVENJCQDMCAIFB0xQSXNzdWUJAMwIAgUIdHJhbnNmZXIJAMwIAgULdXBkYXRlU3RhdGUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFkZXBvc2l0TnNidFVzZG5MUAAEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAlwbXRBbW91bnQIBQNwbXQGYW1vdW50AwkBAiE9AggFA3BtdAdhc3NldElkBQpuc2J0VXNkbkxQCQACAQIdYXR0YWNoIE5TQlRVU0ROTFAgdG9rZW5zIG9ubHkDBQlpc1N0b3BwZWQJAAIBAhlzbWFydCBjb250cmFjdCBpcyBvbiBsb2NrBAh0a1N0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtrZXlOU0JUVVNETgAABAt0b3RhbElzc3VlZAQHJG1hdGNoMAkA7AcBBQ1uc2J0VXNkbkxQVENJAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAgFBWFzc2V0CHF1YW50aXR5CQACAQIQQ2FuJ3QgZmluZCBhc3NldAQDb25lCQBrAwULdG90YWxJc3N1ZWQAgMLXLwUIdGtTdGFrZWQEB3RvSXNzdWUJAGsDBQlwbXRBbW91bnQFA29uZQCAwtcvBAt1cGRhdGVTdGF0ZQkBDEludGVnZXJFbnRyeQIFC2tleU5TQlRVU0ROCQBkAgUIdGtTdGFrZWQFCXBtdEFtb3VudAQHTFBzdGFrZQkA/AcECQEHQWRkcmVzcwEBGgFX6zvnfm4FGMKRpJgWF+Fm10UnIO4lSVaoAgVzdGFrZQUDbmlsCQDMCAIFA3BtdAUDbmlsAwkAAAIFB0xQc3Rha2UFB0xQc3Rha2UEB0xQSXNzdWUJAQdSZWlzc3VlAwUNbnNidFVzZG5MUFRDSQUHdG9Jc3N1ZQYECHRyYW5zZmVyCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB3RvSXNzdWUFDW5zYnRVc2RuTFBUQ0kJAMwIAgUHTFBJc3N1ZQkAzAgCBQh0cmFuc2ZlcgkAzAgCBQt1cGRhdGVTdGF0ZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGRlcG9zaXRCdGNVc2RuTFAABANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQJcG10QW1vdW50CAUDcG10BmFtb3VudAMJAQIhPQIIBQNwbXQHYXNzZXRJZAUJYnRjVXNkbkxQCQACAQIcYXR0YWNoIEJUQ1VTRE5MUCB0b2tlbnMgb25seQMFCWlzU3RvcHBlZAkAAgECGXNtYXJ0IGNvbnRyYWN0IGlzIG9uIGxvY2sECHRrU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFCmtleUJUQ1VTRE4AAAQLdG90YWxJc3N1ZWQEByRtYXRjaDAJAOwHAQUMYnRjVXNkbkxQVENJAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAgFBWFzc2V0CHF1YW50aXR5CQACAQIQQ2FuJ3QgZmluZCBhc3NldAQGZm9yT25lCQBrAwULdG90YWxJc3N1ZWQAgMLXLwUIdGtTdGFrZWQEB3RvSXNzdWUJAGsDBQlwbXRBbW91bnQFBmZvck9uZQCAwtcvBAt1cGRhdGVTdGF0ZQkBDEludGVnZXJFbnRyeQIFCmtleUJUQ1VTRE4JAGQCBQh0a1N0YWtlZAUJcG10QW1vdW50BAdMUHN0YWtlCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCBXN0YWtlBQNuaWwJAMwIAgUDcG10BQNuaWwDCQAAAgUHTFBzdGFrZQUHTFBzdGFrZQQHTFBJc3N1ZQkBB1JlaXNzdWUDBQxidGNVc2RuTFBUQ0kFB3RvSXNzdWUGBAh0cmFuc2ZlcgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQd0b0lzc3VlBQxidGNVc2RuTFBUQ0kJAMwIAgUHTFBJc3N1ZQkAzAgCBQh0cmFuc2ZlcgkAzAgCBQt1cGRhdGVTdGF0ZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWRlcG9zaXRFbm5vVXNkbkxQAAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAECXBtdEFtb3VudAgFA3BtdAZhbW91bnQDCQECIT0CCAUDcG10B2Fzc2V0SWQFCmVubm9Vc2RuTFAJAAIBAh1hdHRhY2ggRU5OT1VTRE5MUCB0b2tlbnMgb25seQMFCWlzU3RvcHBlZAkAAgECGXNtYXJ0IGNvbnRyYWN0IGlzIG9uIGxvY2sECHRrU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tleUVOTk9VU0ROAAAEC3RvdGFsSXNzdWVkBAckbWF0Y2gwCQDsBwEFDWVubm9Vc2RuTFBUQ0kDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIcXVhbnRpdHkJAAIBAhBDYW4ndCBmaW5kIGFzc2V0BANvbmUJAGsDBQt0b3RhbElzc3VlZACAwtcvBQh0a1N0YWtlZAQHdG9Jc3N1ZQkAawMFCXBtdEFtb3VudAUDb25lAIDC1y8EC3VwZGF0ZVN0YXRlCQEMSW50ZWdlckVudHJ5AgULa2V5RU5OT1VTRE4JAGQCBQh0a1N0YWtlZAUJcG10QW1vdW50BAdMUHN0YWtlCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCBXN0YWtlBQNuaWwJAMwIAgUDcG10BQNuaWwDCQAAAgUHTFBzdGFrZQUHTFBzdGFrZQQHTFBJc3N1ZQkBB1JlaXNzdWUDBQ1lbm5vVXNkbkxQVENJBQd0b0lzc3VlBgQIdHJhbnNmZXIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUHdG9Jc3N1ZQUNZW5ub1VzZG5MUFRDSQkAzAgCBQdMUElzc3VlCQDMCAIFCHRyYW5zZmVyCQDMCAIFC3VwZGF0ZVN0YXRlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESZGVwb3NpdFdhdmVzVXNkbkxQAAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAECXBtdEFtb3VudAgFA3BtdAZhbW91bnQDCQECIT0CCAUDcG10B2Fzc2V0SWQFC3dhdmVzVXNkbkxQCQACAQIeYXR0YWNoIFdBVkVTVVNETkxQIHRva2VucyBvbmx5AwUJaXNTdG9wcGVkCQACAQIZc21hcnQgY29udHJhY3QgaXMgb24gbG9jawQIdGtTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUMa2V5V0FWRVNVU0ROAAAEC3RvdGFsSXNzdWVkBAckbWF0Y2gwCQDsBwEFDndhdmVzVXNkbkxQVENJAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAgFBWFzc2V0CHF1YW50aXR5CQACAQIQQ2FuJ3QgZmluZCBhc3NldAQDb25lCQBrAwULdG90YWxJc3N1ZWQAgMLXLwUIdGtTdGFrZWQEB3RvSXNzdWUJAGsDBQlwbXRBbW91bnQFA29uZQCAwtcvBAt1cGRhdGVTdGF0ZQkBDEludGVnZXJFbnRyeQIFDGtleVdBVkVTVVNETgkAZAIFCHRrU3Rha2VkBQlwbXRBbW91bnQEB0xQc3Rha2UJAPwHBAkBB0FkZHJlc3MBARoBV+s7535uBRjCkaSYFhfhZtdFJyDuJUlWqAIFc3Rha2UFA25pbAkAzAgCBQNwbXQFA25pbAMJAAACBQdMUHN0YWtlBQdMUHN0YWtlBAdMUElzc3VlCQEHUmVpc3N1ZQMFDndhdmVzVXNkbkxQVENJBQd0b0lzc3VlBgQIdHJhbnNmZXIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUHdG9Jc3N1ZQUOd2F2ZXNVc2RuTFBUQ0kJAMwIAgUHTFBJc3N1ZQkAzAgCBQh0cmFuc2ZlcgkAzAgCBQt1cGRhdGVTdGF0ZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGRlcG9zaXRMdGNVc2RuTFAABANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQJcG10QW1vdW50CAUDcG10BmFtb3VudAMJAQIhPQIIBQNwbXQHYXNzZXRJZAUJbHRjVXNkbkxQCQACAQIcYXR0YWNoIExUQ1VTRE5MUCB0b2tlbnMgb25seQMFCWlzU3RvcHBlZAkAAgECGXNtYXJ0IGNvbnRyYWN0IGlzIG9uIGxvY2sECHRrU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFCmtleUxUQ1VTRE4AAAQLdG90YWxJc3N1ZWQEByRtYXRjaDAJAOwHAQUMbHRjVXNkbkxQVENJAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAgFBWFzc2V0CHF1YW50aXR5CQACAQIQQ2FuJ3QgZmluZCBhc3NldAQDb25lCQBrAwULdG90YWxJc3N1ZWQAgMLXLwUIdGtTdGFrZWQEB3RvSXNzdWUJAGsDBQlwbXRBbW91bnQFA29uZQCAwtcvBAt1cGRhdGVTdGF0ZQkBDEludGVnZXJFbnRyeQIFCmtleUxUQ1VTRE4JAGQCBQh0a1N0YWtlZAUJcG10QW1vdW50BAdMUHN0YWtlCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCBXN0YWtlBQNuaWwJAMwIAgUDcG10BQNuaWwDCQAAAgUHTFBzdGFrZQUHTFBzdGFrZQQHTFBJc3N1ZQkBB1JlaXNzdWUDBQxsdGNVc2RuTFBUQ0kFB3RvSXNzdWUGBAh0cmFuc2ZlcgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQd0b0lzc3VlBQxsdGNVc2RuTFBUQ0kJAMwIAgUHTFBJc3N1ZQkAzAgCBQh0cmFuc2ZlcgkAzAgCBQt1cGRhdGVTdGF0ZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3AAQHcGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAJhbQgFB3BheW1lbnQGYW1vdW50BAJpZAgFB3BheW1lbnQHYXNzZXRJZAMFCWlzU3RvcHBlZAkAAgECGXNtYXJ0IGNvbnRyYWN0IGlzIG9uIGxvY2sDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAgsxIHBtbnQgZXhwZAMJAAACBQJpZAUNdXNkdFVzZG5MUFRDSQQJVENJQW1vdW50BAckbWF0Y2gwCQDsBwEFDXVzZHRVc2RuTFBUQ0kDCQABAgUHJG1hdGNoMAIFQXNzZXQEAXEFByRtYXRjaDAIBQFxCHF1YW50aXR5AAAEDnVzZG5Vc2R0U3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFCWtleVN0YWtlZAAABAxmb3JTaW5nbGVUQ0kJAGsDBQ51c2RuVXNkdFN0YWtlZAUDZGVmBQlUQ0lBbW91bnQEEHVzZG5McFRvV2l0aGRyYXcJAGsDBQxmb3JTaW5nbGVUQ0kFAmFtBQNkZWYEA2ZlZQkAawMFEHVzZG5McFRvV2l0aGRyYXcFA2RlZgUHZmVlUGVyYwQRdW5zdGFrZVVzZHRVc2RuTFAJAPwHBAkBB0FkZHJlc3MBARoBV+s7535uBRjCkaSYFhfhZtdFJyDuJUlWqAIHdW5zdGFrZQkAzAgCAiw5N3pIRnAxQzNjQjdxZnZ4OFh2NWYycldwOW5VU0c1VW5BYW1mUGNXNnR4ZgkAzAgCBRB1c2RuTHBUb1dpdGhkcmF3BQNuaWwFA25pbAMJAAACBRF1bnN0YWtlVXNkdFVzZG5MUAURdW5zdGFrZVVzZHRVc2RuTFAEEXVzZG5McGZlZVRyYW5zZmVyCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEFAnR3BQNmZWUFCnVzZHRVc2RuTFAECHRyYW5zZmVyCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBRB1c2RuTHBUb1dpdGhkcmF3BQNmZWUFCnVzZHRVc2RuTFAEEnVwZGF0ZVVzZG5McFN0YWtlZAkBDEludGVnZXJFbnRyeQIFCWtleVN0YWtlZAkAZQIFDnVzZG5Vc2R0U3Rha2VkBRB1c2RuTHBUb1dpdGhkcmF3BANicm4JAQRCdXJuAgUNdXNkdFVzZG5MUFRDSQUCYW0JAMwIAgURdXNkbkxwZmVlVHJhbnNmZXIJAMwIAgUIdHJhbnNmZXIJAMwIAgUSdXBkYXRlVXNkbkxwU3Rha2VkCQDMCAIFA2JybgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFAmlkBQt3eFVzZG5MUFRDSQQHd3hUY2lBbQQHJG1hdGNoMAkA7AcBBQt3eFVzZG5MUFRDSQMJAAECBQckbWF0Y2gwAgVBc3NldAQBcQUHJG1hdGNoMAgFAXEIcXVhbnRpdHkAAAQMd3hVc2RuU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFCWtleVdYVVNETgAABApzaW5nbGVXWExQCQBrAwUMd3hVc2RuU3Rha2VkBQNkZWYFB3d4VGNpQW0EDnd4THBUb1dpdGhkcmF3CQBrAwUKc2luZ2xlV1hMUAUCYW0FA2RlZgQDZmVlCQBrAwUOd3hMcFRvV2l0aGRyYXcFA2RlZgUHZmVlUGVyYwQPdW5zdGFrZVd4VXNkbkxQCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCB3Vuc3Rha2UJAMwIAgIsRjJBS2tBNTEzazV5SEVKa0xzVTZ2V3hDWVlrODExR3BqTGh3RXYyV0d3WjkJAMwIAgUOd3hMcFRvV2l0aGRyYXcFA25pbAUDbmlsAwkAAAIFD3Vuc3Rha2VXeFVzZG5MUAUPdW5zdGFrZVd4VXNkbkxQBA93eExwRmVlVHJhbnNmZXIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUCdHcFA2ZlZQUId3hVc2RuTFAEDHd4THBUcmFuc2ZlcgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUOd3hMcFRvV2l0aGRyYXcFA2ZlZQUId3hVc2RuTFAEEHVwZGF0ZVd4THBTdGFrZWQJAQxJbnRlZ2VyRW50cnkCBQlrZXlXWFVTRE4JAGUCBQx3eFVzZG5TdGFrZWQFDnd4THBUb1dpdGhkcmF3BAtidXJuV3hMcFRjaQkBBEJ1cm4CBQt3eFVzZG5MUFRDSQUCYW0JAMwIAgUPd3hMcEZlZVRyYW5zZmVyCQDMCAIFDHd4THBUcmFuc2ZlcgkAzAgCBRB1cGRhdGVXeExwU3Rha2VkCQDMCAIFC2J1cm5XeExwVGNpBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUCaWQFDXVzZGNVc2RuTFBUQ0kEC3VzZGNVc2RuVENJBAckbWF0Y2gwCQDsBwEFDXVzZGNVc2RuTFBUQ0kDCQABAgUHJG1hdGNoMAIFQXNzZXQEAXEFByRtYXRjaDAIBQFxCHF1YW50aXR5AAAEDnVzZGNVc2RuU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tleVVTRENVU0ROAAAEDHNpbmdsZVVzZGNMUAkAawMFDnVzZGNVc2RuU3Rha2VkBQNkZWYFC3VzZGNVc2RuVENJBBR1c2RjVXNkbkxwVG9XaXRoZHJhdwkAawMFDHNpbmdsZVVzZGNMUAUCYW0FA2RlZgQDZmVlCQBrAwUUdXNkY1VzZG5McFRvV2l0aGRyYXcFA2RlZgUHZmVlUGVyYwQRdW5zdGFrZVVzZGNVc2RuTFAJAPwHBAkBB0FkZHJlc3MBARoBV+s7535uBRjCkaSYFhfhZtdFJyDuJUlWqAIHdW5zdGFrZQkAzAgCAitFSzZON1MzOHhidEJUM1N4QXFvR2RETENpWDZyb2pYNkcxNjlDblN5dUU1CQDMCAIFFHVzZGNVc2RuTHBUb1dpdGhkcmF3BQNuaWwFA25pbAMJAAACBRF1bnN0YWtlVXNkY1VzZG5MUAURdW5zdGFrZVVzZGNVc2RuTFAEDXVzZGNVc2RuTFBGZWUJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUCdHcFA2ZlZQUKdXNkY1VzZG5MUAQQdXNkY1VzZG5UcmFuc2ZlcgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUUdXNkY1VzZG5McFRvV2l0aGRyYXcFA2ZlZQUKdXNkY1VzZG5MUAQWdXBkYXRlVXNkY1VzZG5McFN0YWtlZAkBDEludGVnZXJFbnRyeQIFC2tleVVTRENVU0ROCQBlAgUOdXNkY1VzZG5TdGFrZWQFFHVzZGNVc2RuTHBUb1dpdGhkcmF3BBFidXJuVXNkY1VzZG5McFRjaQkBBEJ1cm4CBQ11c2RjVXNkbkxQVENJBQJhbQkAzAgCBQ11c2RjVXNkbkxQRmVlCQDMCAIFEHVzZGNVc2RuVHJhbnNmZXIJAMwIAgUWdXBkYXRlVXNkY1VzZG5McFN0YWtlZAkAzAgCBRFidXJuVXNkY1VzZG5McFRjaQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFAmlkBQ11c2RjVXNkdExQVENJBAt1c2RjVXNkdFRjaQQHJG1hdGNoMAkA7AcBBQ11c2RjVXNkdExQVENJAwkAAQIFByRtYXRjaDACBUFzc2V0BAFxBQckbWF0Y2gwCAUBcQhxdWFudGl0eQAABA51c2RjVXNkdFN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtrZXlVU0RDVVNEVAAABA5zaW5nbGVVc2RjVXNkdAkAawMFDnVzZGNVc2R0U3Rha2VkBQNkZWYFC3VzZGNVc2R0VGNpBBR1c2RjVXNkdExwVG9XaXRoZHJhdwkAawMFDnNpbmdsZVVzZGNVc2R0BQJhbQUDZGVmBANmZWUJAGsDBRR1c2RjVXNkdExwVG9XaXRoZHJhdwUDZGVmBQdmZWVQZXJjBBF1bnN0YWtlVXNkY1VzZHRMUAkA/AcECQEHQWRkcmVzcwEBGgFX6zvnfm4FGMKRpJgWF+Fm10UnIO4lSVaoAgd1bnN0YWtlCQDMCAICLEVQaGRFZm1RYU5jSHl2RG1SR2huTGhnY0p0S1oyYTRrM1pCbUtXdEFFV3lICQDMCAIFFHVzZGNVc2R0THBUb1dpdGhkcmF3BQNuaWwFA25pbAMJAAACBRF1bnN0YWtlVXNkY1VzZHRMUAURdW5zdGFrZVVzZGNVc2R0TFAEDXVzZGNVc2R0TFBGZWUJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUCdHcFA2ZlZQUKdXNkY1VzZHRMUAQQdXNkY1VzZHRUcmFuc2ZlcgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUUdXNkY1VzZHRMcFRvV2l0aGRyYXcFA2ZlZQUKdXNkY1VzZHRMUAQWdXBkYXRlVXNkY1VzZHRMcFN0YWtlZAkBDEludGVnZXJFbnRyeQIFC2tleVVTRENVU0RUCQBlAgUOdXNkY1VzZHRTdGFrZWQFFHVzZGNVc2R0THBUb1dpdGhkcmF3BBFidXJuVXNkY1VzZHRMcFRjaQkBBEJ1cm4CBQ11c2RjVXNkdExQVENJBQJhbQkAzAgCBQ11c2RjVXNkdExQRmVlCQDMCAIFEHVzZGNVc2R0VHJhbnNmZXIJAMwIAgUWdXBkYXRlVXNkY1VzZHRMcFN0YWtlZAkAzAgCBRFidXJuVXNkY1VzZHRMcFRjaQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFAmlkBQ9wdXp6bGVVc2RuTFBUQ0kEDXB1enpsZVVzZG5UY2kEByRtYXRjaDAJAOwHAQUPcHV6emxlVXNkbkxQVENJAwkAAQIFByRtYXRjaDACBUFzc2V0BAFxBQckbWF0Y2gwCAUBcQhxdWFudGl0eQAABA5wdXp6bGVMUFN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ1rZXlQVVpaTEVVU0ROAAAEEHNpbmdsZVB1enpsZVVzZG4JAGsDBQ5wdXp6bGVMUFN0YWtlZAUDZGVmBQ1wdXp6bGVVc2RuVGNpBBJwdXp6bGVVc2RuV2l0aGRyYXcJAGsDBRBzaW5nbGVQdXp6bGVVc2RuBQJhbQUDZGVmBANmZWUJAGsDBRJwdXp6bGVVc2RuV2l0aGRyYXcFA2RlZgUHZmVlUGVyYwQTdW5zdGFrZVB1enpsZVVzZG5MUAkA/AcECQEHQWRkcmVzcwEBGgFX6zvnfm4FGMKRpJgWF+Fm10UnIO4lSVaoAgd1bnN0YWtlCQDMCAICLEU4ekh1MzNHZmNOeUdMeXBYNzdnWmlVWGZ2dVpRZWFZbWlFZnN5N1ZZTndQCQDMCAIFEnB1enpsZVVzZG5XaXRoZHJhdwUDbmlsBQNuaWwDCQAAAgUTdW5zdGFrZVB1enpsZVVzZG5MUAUTdW5zdGFrZVB1enpsZVVzZG5MUAQPcHV6emxlVXNkbkxQRmVlCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEFAnR3BQNmZWUFDHB1enpsZVVzZG5MUAQScHV6emxlVXNkblRyYW5zZmVyCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBRJwdXp6bGVVc2RuV2l0aGRyYXcFA2ZlZQUMcHV6emxlVXNkbkxQBBh1cGRhdGVQdXp6bGVVc2RuTHBTdGFrZWQJAQxJbnRlZ2VyRW50cnkCBQ1rZXlQVVpaTEVVU0ROCQBlAgUOcHV6emxlTFBTdGFrZWQFEnB1enpsZVVzZG5XaXRoZHJhdwQNYnVyblB1enpsZVRDSQkBBEJ1cm4CBQ9wdXp6bGVVc2RuTFBUQ0kFAmFtCQDMCAIFD3B1enpsZVVzZG5MUEZlZQkAzAgCBRJwdXp6bGVVc2RuVHJhbnNmZXIJAMwIAgUYdXBkYXRlUHV6emxlVXNkbkxwU3Rha2VkCQDMCAIFDWJ1cm5QdXp6bGVUQ0kFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQJpZAUMYnRjVXNkbkxQVENJBApidGNVc2RuVENJBAckbWF0Y2gwCQDsBwEFD3B1enpsZVVzZG5MUFRDSQMJAAECBQckbWF0Y2gwAgVBc3NldAQBcQUHJG1hdGNoMAgFAXEIcXVhbnRpdHkAAAQNYnRjVXNkblN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQprZXlCVENVU0ROAAAEDXNpbmdsZUJ0Y1VzZG4JAGsDBQ1idGNVc2RuU3Rha2VkBQNkZWYFCmJ0Y1VzZG5UQ0kED2J0Y1VzZG5XaXRoZHJhdwkAawMFDXNpbmdsZUJ0Y1VzZG4FAmFtBQNkZWYEA2ZlZQkAawMFD2J0Y1VzZG5XaXRoZHJhdwUDZGVmBQdmZWVQZXJjBA51bnN0YWtlQnRjVXNkbgkA/AcECQEHQWRkcmVzcwEBGgFX6zvnfm4FGMKRpJgWF+Fm10UnIO4lSVaoAgd1bnN0YWtlCQDMCAICLDhXaEg1Q0NKNk5ha1B2RXZBSmNpenFxRDdINmF4aHVwZFlIREZ1bVNEd3N5CQDMCAIFD2J0Y1VzZG5XaXRoZHJhdwUDbmlsBQNuaWwDCQAAAgUOdW5zdGFrZUJ0Y1VzZG4FDnVuc3Rha2VCdGNVc2RuBAxidGNVc2RuTFBGZWUJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUCdHcFA2ZlZQUJYnRjVXNkbkxQBA9idGNVc2RuVHJhbnNmZXIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFD2J0Y1VzZG5XaXRoZHJhdwUDZmVlBQlidGNVc2RuTFAEFXVwZGF0ZUJ0Y1VzZG5MUFN0YWtlZAkBDEludGVnZXJFbnRyeQIFCmtleUJUQ1VTRE4JAGUCBQ1idGNVc2RuU3Rha2VkBQ9idGNVc2RuV2l0aGRyYXcEDmJ1cm5CdGNVc2RuVGNpCQEEQnVybgIFDGJ0Y1VzZG5MUFRDSQUCYW0JAMwIAgUMYnRjVXNkbkxQRmVlCQDMCAIFD2J0Y1VzZG5UcmFuc2ZlcgkAzAgCBRV1cGRhdGVCdGNVc2RuTFBTdGFrZWQJAMwIAgUOYnVybkJ0Y1VzZG5UY2kFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQJpZAUOd2F2ZXNVc2RuTFBUQ0kEDHdhdmVzVXNkblRDSQQHJG1hdGNoMAkA7AcBBQ53YXZlc1VzZG5MUFRDSQMJAAECBQckbWF0Y2gwAgVBc3NldAQBcQUHJG1hdGNoMAgFAXEIcXVhbnRpdHkAAAQPd2F2ZXNVc2RuU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDGtleVdBVkVTVVNETgAABA9zaW5nbGVXYXZlc1VzZG4JAGsDBQ93YXZlc1VzZG5TdGFrZWQFA2RlZgUMd2F2ZXNVc2RuVENJBBF3YXZlc1VzZG5XaXRoZHJhdwkAawMFD3NpbmdsZVdhdmVzVXNkbgUCYW0FA2RlZgQDZmVlCQBrAwURd2F2ZXNVc2RuV2l0aGRyYXcFA2RlZgUHZmVlUGVyYwQQdW5zdGFrZVdhdmVzVXNkbgkA/AcECQEHQWRkcmVzcwEBGgFX6zvnfm4FGMKRpJgWF+Fm10UnIO4lSVaoAgd1bnN0YWtlCQDMCAICLDdLWmJKclZvcHdKaGtkd2JlMWVGREJiZXg0ZGtZNjNNeGpUTmpxWHRyemoxCQDMCAIFEXdhdmVzVXNkbldpdGhkcmF3BQNuaWwFA25pbAMJAAACBRB1bnN0YWtlV2F2ZXNVc2RuBRB1bnN0YWtlV2F2ZXNVc2RuBAx3YXZlc1VzbmRGZWUJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUCdHcFA2ZlZQULd2F2ZXNVc2RuTFAEEXdhdmVzVXNkblRyYW5zZmVyCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBRF3YXZlc1VzZG5XaXRoZHJhdwUDZmVlBQt3YXZlc1VzZG5MUAQXdXBkYXRlV2F2ZXNVc2RuTFBTdGFrZWQJAQxJbnRlZ2VyRW50cnkCBQxrZXlXQVZFU1VTRE4JAGUCBQ93YXZlc1VzZG5TdGFrZWQFEXdhdmVzVXNkbldpdGhkcmF3BBBidXJuV2F2ZXNVc2RuVENJCQEEQnVybgIFDndhdmVzVXNkbkxQVENJBQJhbQkAzAgCBQx3YXZlc1VzbmRGZWUJAMwIAgURd2F2ZXNVc2RuVHJhbnNmZXIJAMwIAgUXdXBkYXRlV2F2ZXNVc2RuTFBTdGFrZWQJAMwIAgUQYnVybldhdmVzVXNkblRDSQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFAmlkBQ1lbm5vVXNkbkxQVENJBAtlbm5vVXNkblRDSQQHJG1hdGNoMAkA7AcBBQ1lbm5vVXNkbkxQVENJAwkAAQIFByRtYXRjaDACBUFzc2V0BAFxBQckbWF0Y2gwCAUBcQhxdWFudGl0eQAABA5lbm5vVXNkblN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtrZXlFTk5PVVNETgAABA5zaW5nbGVFbm5vVXNkbgkAawMFDmVubm9Vc2RuU3Rha2VkBQNkZWYFC2Vubm9Vc2RuVENJBBBlbm5vVXNkbldpdGhkcmF3CQBrAwUOc2luZ2xlRW5ub1VzZG4FAmFtBQNkZWYEA2ZlZQkAawMFEGVubm9Vc2RuV2l0aGRyYXcFA2RlZgUHZmVlUGVyYwQPdW5zdGFrZUVubm9Vc2RuCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCB3Vuc3Rha2UJAMwIAgIsSG5XMzNkY0VhZVVUY2dNTGQ4dkhvSlI1aUFGWjJuZ0hEQWE5RTk0OTZrRFgJAMwIAgUQZW5ub1VzZG5XaXRoZHJhdwUDbmlsBQNuaWwDCQAAAgUPdW5zdGFrZUVubm9Vc2RuBQ91bnN0YWtlRW5ub1VzZG4EC2Vubm9Vc2RuRmVlCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEFAnR3BQNmZWUFCmVubm9Vc2RuTFAEEGVubm9Vc2RuVHJhbnNmZXIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFEGVubm9Vc2RuV2l0aGRyYXcFA2ZlZQUKZW5ub1VzZG5MUAQWdXBkYXRlRW5ub1VzZG5MUFN0YWtlZAkBDEludGVnZXJFbnRyeQIFC2tleUVOTk9VU0ROCQBlAgUOZW5ub1VzZG5TdGFrZWQFEGVubm9Vc2RuV2l0aGRyYXcED2J1cm5Fbm5vVXNkblRDSQkBBEJ1cm4CBQ1lbm5vVXNkbkxQVENJBQJhbQkAzAgCBQtlbm5vVXNkbkZlZQkAzAgCBRBlbm5vVXNkblRyYW5zZmVyCQDMCAIFFnVwZGF0ZUVubm9Vc2RuTFBTdGFrZWQJAMwIAgUPYnVybkVubm9Vc2RuVENJBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUCaWQFDW5zYnRVc2RuTFBUQ0kEC25zYnRVc2RuVENJBAckbWF0Y2gwCQDsBwEFDW5zYnRVc2RuTFBUQ0kDCQABAgUHJG1hdGNoMAIFQXNzZXQEAXEFByRtYXRjaDAIBQFxCHF1YW50aXR5AAAEDm5zYnRVc2RuU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tleU5TQlRVU0ROAAAEDnNpbmdsZU5zYnRVc2RuCQBrAwUObnNidFVzZG5TdGFrZWQFA2RlZgULbnNidFVzZG5UQ0kEEG5zYnRVc2RuV2l0aGRyYXcJAGsDBQ5zaW5nbGVOc2J0VXNkbgUCYW0FA2RlZgQDZmVlCQBrAwUQbnNidFVzZG5XaXRoZHJhdwUDZGVmBQdmZWVQZXJjBA91bnN0YWtlTnNidFVzZG4JAPwHBAkBB0FkZHJlc3MBARoBV+s7535uBRjCkaSYFhfhZtdFJyDuJUlWqAIHdW5zdGFrZQkAzAgCAixBR280OUhDdFFVZ2hmeEhTcFVYdWIzS0JhTVh5dW5KbVR4UTRhemdVNUF4NQkAzAgCBRBuc2J0VXNkbldpdGhkcmF3BQNuaWwFA25pbAMJAAACBQ91bnN0YWtlTnNidFVzZG4FD3Vuc3Rha2VOc2J0VXNkbgQLbnNidFVzZG5GZWUJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUCdHcFA2ZlZQUKbnNidFVzZG5MUAQQbnNidFVzZG5UcmFuc2ZlcgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUQbnNidFVzZG5XaXRoZHJhdwUDZmVlBQpuc2J0VXNkbkxQBBR1cGRhdGVOc2J0VXNkblN0YWtlZAkBDEludGVnZXJFbnRyeQIFC2tleU5TQlRVU0ROCQBlAgUObnNidFVzZG5TdGFrZWQFEG5zYnRVc2RuV2l0aGRyYXcED2J1cm5Oc2J0VXNkblRDSQkBBEJ1cm4CBQ1uc2J0VXNkbkxQVENJBQJhbQkAzAgCBQtuc2J0VXNkbkZlZQkAzAgCBRBuc2J0VXNkblRyYW5zZmVyCQDMCAIFFHVwZGF0ZU5zYnRVc2RuU3Rha2VkCQDMCAIFD2J1cm5Oc2J0VXNkblRDSQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFAmlkBQxsdGNVc2RuTFBUQ0kECmx0Y1VzZG5UQ0kEByRtYXRjaDAJAOwHAQUMbHRjVXNkbkxQVENJAwkAAQIFByRtYXRjaDACBUFzc2V0BAFxBQckbWF0Y2gwCAUBcQhxdWFudGl0eQAABA1sdGNVc2RuU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFCmtleUxUQ1VTRE4AAAQNc2luZ2xlTHRjVXNkbgkAawMFDWx0Y1VzZG5TdGFrZWQFA2RlZgUKbHRjVXNkblRDSQQPbHRjVXNkbldpdGhkcmF3CQBrAwUNc2luZ2xlTHRjVXNkbgUCYW0FA2RlZgQDZmVlCQBrAwUPbHRjVXNkbldpdGhkcmF3BQNkZWYFB2ZlZVBlcmMEDnVuc3Rha2VMdGNVc2RuCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCB3Vuc3Rha2UJAMwIAgIsQ05rcUM2R1BpODg4V2RKMUV1VnR1OUpHWjlWSHBBbjhlVEh3UjhZWnhYYnYJAMwIAgUPbHRjVXNkbldpdGhkcmF3BQNuaWwFA25pbAMJAAACBQ51bnN0YWtlTHRjVXNkbgUOdW5zdGFrZUx0Y1VzZG4ECmx0Y1VzZG5GZWUJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUCdHcFA2ZlZQUJbHRjVXNkbkxQBA9sdGNVc2RuVHJhbnNmZXIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFD2x0Y1VzZG5XaXRoZHJhdwUDZmVlBQlsdGNVc2RuTFAEE3VwZGF0ZUx0Y1VzZG5TdGFrZWQJAQxJbnRlZ2VyRW50cnkCBQprZXlMVENVU0ROCQBlAgUNbHRjVXNkblN0YWtlZAUPbHRjVXNkbldpdGhkcmF3BA5idXJuTHRjVXNkblRDSQkBBEJ1cm4CBQxsdGNVc2RuTFBUQ0kFAmFtCQDMCAIFCmx0Y1VzZG5GZWUJAMwIAgUPbHRjVXNkblRyYW5zZmVyCQDMCAIFE3VwZGF0ZUx0Y1VzZG5TdGFrZWQJAMwIAgUOYnVybkx0Y1VzZG5UQ0kFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECDUludmFsaWQgYXNzZXQBaQEQY29tcG91bmRXeFVzZG5MUAAECGNvbXBvdW5kCQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEAmNhCAUIY29tcG91bmQGYW1vdW50BAhpc09yYWNsZQkBDGNoZWNrQWRkcmVzcwEICAUBaQZjYWxsZXIFYnl0ZXMDCQECIT0CCAUIY29tcG91bmQHYXNzZXRJZAUId3hVc2RuTFAJAAIBAhthdHRhY2ggV1hVU0ROTFAgdG9rZW5zIG9ubHkDCQEBIQEFCGlzT3JhY2xlCQACAQIsWW91IGFyZSBub3QgYXV0aG90aXplZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24EDGZyb21Db21wb3VuZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFrZXl3eFVzZG5Db21wb3VuZAAABAt0b3RhbFN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQlrZXlXWFVTRE4AAAQGc3Rha2VDCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCBXN0YWtlBQNuaWwJAMwIAgUIY29tcG91bmQFA25pbAMJAAACBQZzdGFrZUMFBnN0YWtlQwQLdXBkYXRlU3RhdGUJAQxJbnRlZ2VyRW50cnkCBQlrZXlXWFVTRE4JAGQCBQt0b3RhbFN0YWtlZAUCY2EEAnRjCQEMSW50ZWdlckVudHJ5AgURa2V5d3hVc2RuQ29tcG91bmQJAGQCBQxmcm9tQ29tcG91bmQFAmNhCQDMCAIFC3VwZGF0ZVN0YXRlCQDMCAIFAnRjBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESY29tcG91bmRVc2R0VXNkbkxQAAQIY29tcG91bmQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQCY2EIBQhjb21wb3VuZAZhbW91bnQECGlzT3JhY2xlCQEMY2hlY2tBZGRyZXNzAQgIBQFpBmNhbGxlcgVieXRlcwMJAQIhPQIIBQhjb21wb3VuZAdhc3NldElkBQp1c2R0VXNkbkxQCQACAQIdYXR0YWNoIFVTRFRVU0ROTFAgdG9rZW5zIG9ubHkDCQEBIQEFCGlzT3JhY2xlCQACAQIsWW91IGFyZSBub3QgYXV0aG90aXplZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24EDGZyb21Db21wb3VuZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtrZXlDb21wb3VuZAAABAt0b3RhbFN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQlrZXlTdGFrZWQAAAQGc3Rha2VDCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCBXN0YWtlBQNuaWwJAMwIAgUIY29tcG91bmQFA25pbAMJAAACBQZzdGFrZUMFBnN0YWtlQwQLdXBkYXRlU3RhdGUJAQxJbnRlZ2VyRW50cnkCBQlrZXlTdGFrZWQJAGQCBQt0b3RhbFN0YWtlZAUCY2EEAnRjCQEMSW50ZWdlckVudHJ5AgULa2V5Q29tcG91bmQJAGQCBQxmcm9tQ29tcG91bmQFAmNhCQDMCAIFC3VwZGF0ZVN0YXRlCQDMCAIFAnRjBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESY29tcG91bmRVc2RjVXNkbkxQAAQIY29tcG91bmQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQCY2EIBQhjb21wb3VuZAZhbW91bnQECGlzT3JhY2xlCQEMY2hlY2tBZGRyZXNzAQgIBQFpBmNhbGxlcgVieXRlcwMJAQIhPQIIBQhjb21wb3VuZAdhc3NldElkBQp1c2RjVXNkbkxQCQACAQIdYXR0YWNoIFVTRENVU0ROTFAgdG9rZW5zIG9ubHkDCQEBIQEFCGlzT3JhY2xlCQACAQIsWW91IGFyZSBub3QgYXV0aG90aXplZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24EDGZyb21Db21wb3VuZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRNrZXlVc2RjVXNkbkNvbXBvdW5kAAAEC3RvdGFsU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tleVVTRENVU0ROAAAEBnN0YWtlQwkA/AcECQEHQWRkcmVzcwEBGgFX6zvnfm4FGMKRpJgWF+Fm10UnIO4lSVaoAgVzdGFrZQUDbmlsCQDMCAIFCGNvbXBvdW5kBQNuaWwDCQAAAgUGc3Rha2VDBQZzdGFrZUMEC3VwZGF0ZVN0YXRlCQEMSW50ZWdlckVudHJ5AgULa2V5VVNEQ1VTRE4JAGQCBQt0b3RhbFN0YWtlZAUCY2EEAnRjCQEMSW50ZWdlckVudHJ5AgUTa2V5VXNkY1VzZG5Db21wb3VuZAkAZAIFDGZyb21Db21wb3VuZAUCY2EJAMwIAgULdXBkYXRlU3RhdGUJAMwIAgUCdGMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJjb21wb3VuZFVzZGNVc2R0TFAABAhjb21wb3VuZAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAJjYQgFCGNvbXBvdW5kBmFtb3VudAQIaXNPcmFjbGUJAQxjaGVja0FkZHJlc3MBCAgFAWkGY2FsbGVyBWJ5dGVzAwkBAiE9AggFCGNvbXBvdW5kB2Fzc2V0SWQFCnVzZGNVc2R0TFAJAAIBAh1hdHRhY2ggVVNEQ1VTRFRMUCB0b2tlbnMgb25seQMJAQEhAQUIaXNPcmFjbGUJAAIBAixZb3UgYXJlIG5vdCBhdXRob3RpemVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbgQMZnJvbUNvbXBvdW5kCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFE2tleVVzZGNVc2R0Q29tcG91bmQAAAQLdG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULa2V5VVNEQ1VTRFQAAAQGc3Rha2VDCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCBXN0YWtlBQNuaWwJAMwIAgUIY29tcG91bmQFA25pbAMJAAACBQZzdGFrZUMFBnN0YWtlQwQLdXBkYXRlU3RhdGUJAQxJbnRlZ2VyRW50cnkCBQtrZXlVU0RDVVNEVAkAZAIFC3RvdGFsU3Rha2VkBQJjYQQCdGMJAQxJbnRlZ2VyRW50cnkCBRNrZXlVc2RjVXNkdENvbXBvdW5kCQBkAgUMZnJvbUNvbXBvdW5kBQJjYQkAzAgCBQt1cGRhdGVTdGF0ZQkAzAgCBQJ0YwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFGNvbXBvdW5kUHV6emxlVXNkbkxQAAQIY29tcG91bmQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQCY2EIBQhjb21wb3VuZAZhbW91bnQECGlzT3JhY2xlCQEMY2hlY2tBZGRyZXNzAQgIBQFpBmNhbGxlcgVieXRlcwMJAQIhPQIIBQhjb21wb3VuZAdhc3NldElkBQxwdXp6bGVVc2RuTFAJAAIBAh9hdHRhY2ggUFVaWkxFVVNETkxQIHRva2VucyBvbmx5AwkBASEBBQhpc09yYWNsZQkAAgECLFlvdSBhcmUgbm90IGF1dGhvdGl6ZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uBAxmcm9tQ29tcG91bmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVa2V5UHV6emxlVXNkbkNvbXBvdW5kAAAEC3RvdGFsU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDWtleVBVWlpMRVVTRE4AAAQGc3Rha2VDCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCBXN0YWtlBQNuaWwJAMwIAgUIY29tcG91bmQFA25pbAMJAAACBQZzdGFrZUMFBnN0YWtlQwQLdXBkYXRlU3RhdGUJAQxJbnRlZ2VyRW50cnkCBQ1rZXlQVVpaTEVVU0ROCQBkAgULdG90YWxTdGFrZWQFAmNhBAJ0YwkBDEludGVnZXJFbnRyeQIFFWtleVB1enpsZVVzZG5Db21wb3VuZAkAZAIFDGZyb21Db21wb3VuZAUCY2EJAMwIAgULdXBkYXRlU3RhdGUJAMwIAgUCdGMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJjb21wb3VuZE5zYnRVc2RuTFAABAhjb21wb3VuZAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAJjYQgFCGNvbXBvdW5kBmFtb3VudAQIaXNPcmFjbGUJAQxjaGVja0FkZHJlc3MBCAgFAWkGY2FsbGVyBWJ5dGVzAwkBAiE9AggFCGNvbXBvdW5kB2Fzc2V0SWQFCm5zYnRVc2RuTFAJAAIBAh1hdHRhY2ggTlNCVFVTRE5MUCB0b2tlbnMgb25seQMJAQEhAQUIaXNPcmFjbGUJAAIBAixZb3UgYXJlIG5vdCBhdXRob3RpemVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbgQMZnJvbUNvbXBvdW5kCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFE2tleU5zYnRVc2RuQ29tcG91bmQAAAQLdG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULa2V5TlNCVFVTRE4AAAQGc3Rha2VDCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCBXN0YWtlBQNuaWwJAMwIAgUIY29tcG91bmQFA25pbAMJAAACBQZzdGFrZUMFBnN0YWtlQwQLdXBkYXRlU3RhdGUJAQxJbnRlZ2VyRW50cnkCBQtrZXlOU0JUVVNETgkAZAIFC3RvdGFsU3Rha2VkBQJjYQQCdGMJAQxJbnRlZ2VyRW50cnkCBRNrZXlOc2J0VXNkbkNvbXBvdW5kCQBkAgUMZnJvbUNvbXBvdW5kBQJjYQkAzAgCBQt1cGRhdGVTdGF0ZQkAzAgCBQJ0YwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWNvbXBvdW5kQnRjVXNkbkxQAAQIY29tcG91bmQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQCY2EIBQhjb21wb3VuZAZhbW91bnQECGlzT3JhY2xlCQEMY2hlY2tBZGRyZXNzAQgIBQFpBmNhbGxlcgVieXRlcwMJAQIhPQIIBQhjb21wb3VuZAdhc3NldElkBQlidGNVc2RuTFAJAAIBAhxhdHRhY2ggQlRDVVNETkxQIHRva2VucyBvbmx5AwkBASEBBQhpc09yYWNsZQkAAgECLFlvdSBhcmUgbm90IGF1dGhvdGl6ZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uBAxmcm9tQ29tcG91bmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUSa2V5QnRjVXNkbkNvbXBvdW5kAAAEC3RvdGFsU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFCmtleUJUQ1VTRE4AAAQGc3Rha2VDCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCBXN0YWtlBQNuaWwJAMwIAgUIY29tcG91bmQFA25pbAMJAAACBQZzdGFrZUMFBnN0YWtlQwQLdXBkYXRlU3RhdGUJAQxJbnRlZ2VyRW50cnkCBQprZXlCVENVU0ROCQBkAgULdG90YWxTdGFrZWQFAmNhBAJ0YwkBDEludGVnZXJFbnRyeQIFEmtleUJ0Y1VzZG5Db21wb3VuZAkAZAIFDGZyb21Db21wb3VuZAUCY2EJAMwIAgULdXBkYXRlU3RhdGUJAMwIAgUCdGMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJjb21wb3VuZEVubm9Vc2RuTFAABAhjb21wb3VuZAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAJjYQgFCGNvbXBvdW5kBmFtb3VudAQIaXNPcmFjbGUJAQxjaGVja0FkZHJlc3MBCAgFAWkGY2FsbGVyBWJ5dGVzAwkBAiE9AggFCGNvbXBvdW5kB2Fzc2V0SWQFCmVubm9Vc2RuTFAJAAIBAh1hdHRhY2ggRU5OT1VTRE5MUCB0b2tlbnMgb25seQMJAQEhAQUIaXNPcmFjbGUJAAIBAixZb3UgYXJlIG5vdCBhdXRob3RpemVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbgQMZnJvbUNvbXBvdW5kCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFE2tleUVubm9Vc2RuQ29tcG91bmQAAAQLdG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULa2V5RU5OT1VTRE4AAAQGc3Rha2VDCQD8BwQJAQdBZGRyZXNzAQEaAVfrO+d+bgUYwpGkmBYX4WbXRScg7iVJVqgCBXN0YWtlBQNuaWwJAMwIAgUIY29tcG91bmQFA25pbAMJAAACBQZzdGFrZUMFBnN0YWtlQwQLdXBkYXRlU3RhdGUJAQxJbnRlZ2VyRW50cnkCBQtrZXlFTk5PVVNETgkAZAIFC3RvdGFsU3Rha2VkBQJjYQQCdGMJAQxJbnRlZ2VyRW50cnkCBRNrZXlFbm5vVXNkbkNvbXBvdW5kCQBkAgUMZnJvbUNvbXBvdW5kBQJjYQkAzAgCBQt1cGRhdGVTdGF0ZQkAzAgCBQJ0YwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2NvbXBvdW5kV2F2ZXNVc2RuTFAABAhjb21wb3VuZAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAJjYQgFCGNvbXBvdW5kBmFtb3VudAQIaXNPcmFjbGUJAQxjaGVja0FkZHJlc3MBCAgFAWkGY2FsbGVyBWJ5dGVzAwkBAiE9AggFCGNvbXBvdW5kB2Fzc2V0SWQFC3dhdmVzVXNkbkxQCQACAQIeYXR0YWNoIFdBVkVTVVNETkxQIHRva2VucyBvbmx5AwkBASEBBQhpc09yYWNsZQkAAgECLFlvdSBhcmUgbm90IGF1dGhvdGl6ZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uBAxmcm9tQ29tcG91bmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUUa2V5V2F2ZXNVc2RuQ29tcG91bmQAAAQLdG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUMa2V5V0FWRVNVU0ROAAAEBnN0YWtlQwkA/AcECQEHQWRkcmVzcwEBGgFX6zvnfm4FGMKRpJgWF+Fm10UnIO4lSVaoAgVzdGFrZQUDbmlsCQDMCAIFCGNvbXBvdW5kBQNuaWwDCQAAAgUGc3Rha2VDBQZzdGFrZUMEC3VwZGF0ZVN0YXRlCQEMSW50ZWdlckVudHJ5AgUMa2V5V0FWRVNVU0ROCQBkAgULdG90YWxTdGFrZWQFAmNhBAJ0YwkBDEludGVnZXJFbnRyeQIFFGtleVdhdmVzVXNkbkNvbXBvdW5kCQBkAgUMZnJvbUNvbXBvdW5kBQJjYQkAzAgCBQt1cGRhdGVTdGF0ZQkAzAgCBQJ0YwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWNvbXBvdW5kTHRjVXNkbkxQAAQIY29tcG91bmQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQCY2EIBQhjb21wb3VuZAZhbW91bnQECGlzT3JhY2xlCQEMY2hlY2tBZGRyZXNzAQgIBQFpBmNhbGxlcgVieXRlcwMJAQIhPQIIBQhjb21wb3VuZAdhc3NldElkBQlsdGNVc2RuTFAJAAIBAhxhdHRhY2ggTFRDVVNETkxQIHRva2VucyBvbmx5AwkBASEBBQhpc09yYWNsZQkAAgECLFlvdSBhcmUgbm90IGF1dGhvdGl6ZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uBAxmcm9tQ29tcG91bmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUSa2V5THRjVXNkbkNvbXBvdW5kAAAEC3RvdGFsU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDGtleVdBVkVTVVNETgAABAZzdGFrZUMJAPwHBAkBB0FkZHJlc3MBARoBV+s7535uBRjCkaSYFhfhZtdFJyDuJUlWqAIFc3Rha2UFA25pbAkAzAgCBQhjb21wb3VuZAUDbmlsAwkAAAIFBnN0YWtlQwUGc3Rha2VDBAt1cGRhdGVTdGF0ZQkBDEludGVnZXJFbnRyeQIFCmtleUxUQ1VTRE4JAGQCBQt0b3RhbFN0YWtlZAUCY2EEAnRjCQEMSW50ZWdlckVudHJ5AgUSa2V5THRjVXNkbkNvbXBvdW5kCQBkAgUMZnJvbUNvbXBvdW5kBQJjYQkAzAgCBQt1cGRhdGVTdGF0ZQkAzAgCBQJ0YwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDGluaXROU0JUVVNETgAEAnBtCQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEAmFtCAUCcG0GYW1vdW50AwkBAiE9AggFAnBtB2Fzc2V0SWQFCm5zYnRVc2RuTFAJAAIBAhBVbmV4cGVjdGVkIHRva2VuBAFzCQD8BwQJAQdBZGRyZXNzAQEaAVRZQCeTa0sp7r6xoQ7m3EC4z6SNegzrtQ8CBXN0YWtlBQNuaWwJAMwIAgUCcG0FA25pbAMJAAACBQFzBQFzBAN1cGQJAQxJbnRlZ2VyRW50cnkCBQtrZXlOU0JUVVNETgCa15iJAgQEdXBkSwkBDEludGVnZXJFbnRyeQIFE2tleU5zYnRVc2RuQ29tcG91bmQAAAkAzAgCBQN1cGQJAMwIAgUEdXBkSwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHNwb25zb3JCb29zdAAEAnBtCQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAECmxvY2tQZXJpb2QAZAMJAQIhPQIIBQJwbQdhc3NldElkBQR3eElkCQACAQIFRXJyb3IECXNwb25zb3JlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ5rZXlTcG9uc29yc2hpcAAABARsb2NrCQD8BwQJAQdBZGRyZXNzAQEaAVez5uZVGBFpsOQzD4hRQ6ScrtbVSwNLEVgCDGluY3JlYXNlTG9jawkAzAgCBQpsb2NrUGVyaW9kBQNuaWwJAMwIAgUCcG0FA25pbAMJAAACBQRsb2NrBQRsb2NrBAFzCQEMSW50ZWdlckVudHJ5AgUOa2V5U3BvbnNvcnNoaXAJAGQCCAUCcG0GYW1vdW50BQlzcG9uc29yZWQJAMwIAgUBcwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleYZWpH0=", "height": 3292489, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5JJW3ZDkPKbEBheZN5x4tfPn1G3cWA74DDwATj1vTueZ Next: HoLdfFMkpZEpSwyYA4Z5y1X12ZNTiDg7v8nnCMqC5siV Diff:
Old | New | Differences | |
---|---|---|---|
82 | 82 | let keyLTCUSDN = "LTC_USDN" | |
83 | 83 | ||
84 | 84 | let keyLtcUsdnCompound = "LTC_USDN_Compound" | |
85 | + | ||
86 | + | let wxId = base58'Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on' | |
87 | + | ||
88 | + | let keySponsorship = "Sponsorship_in_lock" | |
85 | 89 | ||
86 | 90 | let def = 100000000 | |
87 | 91 | ||
425 | 429 | let payment = value(i.payments[0]) | |
426 | 430 | let am = payment.amount | |
427 | 431 | let id = payment.assetId | |
428 | - | if ((size(i.payments) != 1)) | |
429 | - | then throw("1 pmnt expd") | |
430 | - | else if ((id == usdtUsdnLPTCI)) | |
431 | - | then { | |
432 | - | let TCIAmount = match assetInfo(usdtUsdnLPTCI) { | |
433 | - | case q: Asset => | |
434 | - | q.quantity | |
435 | - | case _ => | |
436 | - | 0 | |
437 | - | } | |
438 | - | let usdnUsdtStaked = valueOrElse(getInteger(this, keyStaked), 0) | |
439 | - | let forSingleTCI = fraction(usdnUsdtStaked, def, TCIAmount) | |
440 | - | let usdnLpToWithdraw = fraction(forSingleTCI, am, def) | |
441 | - | let fee = fraction(usdnLpToWithdraw, def, feePerc) | |
442 | - | let unstakeUsdtUsdnLP = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["97zHFp1C3cB7qfvx8Xv5f2rWp9nUSG5UnAamfPcW6txf", usdnLpToWithdraw], nil) | |
443 | - | if ((unstakeUsdtUsdnLP == unstakeUsdtUsdnLP)) | |
444 | - | then { | |
445 | - | let usdnLpfeeTransfer = ScriptTransfer(Address(tw), fee, usdtUsdnLP) | |
446 | - | let transfer = ScriptTransfer(i.caller, (usdnLpToWithdraw - fee), usdtUsdnLP) | |
447 | - | let updateUsdnLpStaked = IntegerEntry(keyStaked, (usdnUsdtStaked - usdnLpToWithdraw)) | |
448 | - | let brn = Burn(usdtUsdnLPTCI, am) | |
449 | - | [usdnLpfeeTransfer, transfer, updateUsdnLpStaked, brn] | |
450 | - | } | |
451 | - | else throw("Strict value is not equal to itself.") | |
452 | - | } | |
453 | - | else if ((id == wxUsdnLPTCI)) | |
432 | + | if (isStopped) | |
433 | + | then throw("smart contract is on lock") | |
434 | + | else if ((size(i.payments) != 1)) | |
435 | + | then throw("1 pmnt expd") | |
436 | + | else if ((id == usdtUsdnLPTCI)) | |
454 | 437 | then { | |
455 | - | let | |
438 | + | let TCIAmount = match assetInfo(usdtUsdnLPTCI) { | |
456 | 439 | case q: Asset => | |
457 | 440 | q.quantity | |
458 | 441 | case _ => | |
459 | 442 | 0 | |
460 | 443 | } | |
461 | - | let | |
462 | - | let | |
463 | - | let | |
464 | - | let fee = fraction( | |
465 | - | let | |
466 | - | if (( | |
444 | + | let usdnUsdtStaked = valueOrElse(getInteger(this, keyStaked), 0) | |
445 | + | let forSingleTCI = fraction(usdnUsdtStaked, def, TCIAmount) | |
446 | + | let usdnLpToWithdraw = fraction(forSingleTCI, am, def) | |
447 | + | let fee = fraction(usdnLpToWithdraw, def, feePerc) | |
448 | + | let unstakeUsdtUsdnLP = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["97zHFp1C3cB7qfvx8Xv5f2rWp9nUSG5UnAamfPcW6txf", usdnLpToWithdraw], nil) | |
449 | + | if ((unstakeUsdtUsdnLP == unstakeUsdtUsdnLP)) | |
467 | 450 | then { | |
468 | - | let | |
469 | - | let | |
470 | - | let | |
471 | - | let | |
472 | - | [ | |
451 | + | let usdnLpfeeTransfer = ScriptTransfer(Address(tw), fee, usdtUsdnLP) | |
452 | + | let transfer = ScriptTransfer(i.caller, (usdnLpToWithdraw - fee), usdtUsdnLP) | |
453 | + | let updateUsdnLpStaked = IntegerEntry(keyStaked, (usdnUsdtStaked - usdnLpToWithdraw)) | |
454 | + | let brn = Burn(usdtUsdnLPTCI, am) | |
455 | + | [usdnLpfeeTransfer, transfer, updateUsdnLpStaked, brn] | |
473 | 456 | } | |
474 | 457 | else throw("Strict value is not equal to itself.") | |
475 | 458 | } | |
476 | - | else if ((id == | |
459 | + | else if ((id == wxUsdnLPTCI)) | |
477 | 460 | then { | |
478 | - | let | |
461 | + | let wxTciAm = match assetInfo(wxUsdnLPTCI) { | |
479 | 462 | case q: Asset => | |
480 | 463 | q.quantity | |
481 | 464 | case _ => | |
482 | 465 | 0 | |
483 | 466 | } | |
484 | - | let | |
485 | - | let | |
486 | - | let | |
487 | - | let fee = fraction( | |
488 | - | let | |
489 | - | if (( | |
467 | + | let wxUsdnStaked = valueOrElse(getInteger(this, keyWXUSDN), 0) | |
468 | + | let singleWXLP = fraction(wxUsdnStaked, def, wxTciAm) | |
469 | + | let wxLpToWithdraw = fraction(singleWXLP, am, def) | |
470 | + | let fee = fraction(wxLpToWithdraw, def, feePerc) | |
471 | + | let unstakeWxUsdnLP = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["F2AKkA513k5yHEJkLsU6vWxCYYk811GpjLhwEv2WGwZ9", wxLpToWithdraw], nil) | |
472 | + | if ((unstakeWxUsdnLP == unstakeWxUsdnLP)) | |
490 | 473 | then { | |
491 | - | let | |
492 | - | let | |
493 | - | let | |
494 | - | let | |
495 | - | [ | |
474 | + | let wxLpFeeTransfer = ScriptTransfer(Address(tw), fee, wxUsdnLP) | |
475 | + | let wxLpTransfer = ScriptTransfer(i.caller, (wxLpToWithdraw - fee), wxUsdnLP) | |
476 | + | let updateWxLpStaked = IntegerEntry(keyWXUSDN, (wxUsdnStaked - wxLpToWithdraw)) | |
477 | + | let burnWxLpTci = Burn(wxUsdnLPTCI, am) | |
478 | + | [wxLpFeeTransfer, wxLpTransfer, updateWxLpStaked, burnWxLpTci] | |
496 | 479 | } | |
497 | 480 | else throw("Strict value is not equal to itself.") | |
498 | 481 | } | |
499 | - | else if ((id == | |
482 | + | else if ((id == usdcUsdnLPTCI)) | |
500 | 483 | then { | |
501 | - | let | |
484 | + | let usdcUsdnTCI = match assetInfo(usdcUsdnLPTCI) { | |
502 | 485 | case q: Asset => | |
503 | 486 | q.quantity | |
504 | 487 | case _ => | |
505 | 488 | 0 | |
506 | 489 | } | |
507 | - | let | |
508 | - | let | |
509 | - | let | |
510 | - | let fee = fraction( | |
511 | - | let | |
512 | - | if (( | |
490 | + | let usdcUsdnStaked = valueOrElse(getInteger(this, keyUSDCUSDN), 0) | |
491 | + | let singleUsdcLP = fraction(usdcUsdnStaked, def, usdcUsdnTCI) | |
492 | + | let usdcUsdnLpToWithdraw = fraction(singleUsdcLP, am, def) | |
493 | + | let fee = fraction(usdcUsdnLpToWithdraw, def, feePerc) | |
494 | + | let unstakeUsdcUsdnLP = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["EK6N7S38xbtBT3SxAqoGdDLCiX6rojX6G169CnSyuE5", usdcUsdnLpToWithdraw], nil) | |
495 | + | if ((unstakeUsdcUsdnLP == unstakeUsdcUsdnLP)) | |
513 | 496 | then { | |
514 | - | let | |
515 | - | let | |
516 | - | let | |
517 | - | let | |
518 | - | [ | |
497 | + | let usdcUsdnLPFee = ScriptTransfer(Address(tw), fee, usdcUsdnLP) | |
498 | + | let usdcUsdnTransfer = ScriptTransfer(i.caller, (usdcUsdnLpToWithdraw - fee), usdcUsdnLP) | |
499 | + | let updateUsdcUsdnLpStaked = IntegerEntry(keyUSDCUSDN, (usdcUsdnStaked - usdcUsdnLpToWithdraw)) | |
500 | + | let burnUsdcUsdnLpTci = Burn(usdcUsdnLPTCI, am) | |
501 | + | [usdcUsdnLPFee, usdcUsdnTransfer, updateUsdcUsdnLpStaked, burnUsdcUsdnLpTci] | |
519 | 502 | } | |
520 | 503 | else throw("Strict value is not equal to itself.") | |
521 | 504 | } | |
522 | - | else if ((id == | |
505 | + | else if ((id == usdcUsdtLPTCI)) | |
523 | 506 | then { | |
524 | - | let | |
507 | + | let usdcUsdtTci = match assetInfo(usdcUsdtLPTCI) { | |
525 | 508 | case q: Asset => | |
526 | 509 | q.quantity | |
527 | 510 | case _ => | |
528 | 511 | 0 | |
529 | 512 | } | |
530 | - | let | |
531 | - | let | |
532 | - | let | |
533 | - | let fee = fraction( | |
534 | - | let | |
535 | - | if (( | |
513 | + | let usdcUsdtStaked = valueOrElse(getInteger(this, keyUSDCUSDT), 0) | |
514 | + | let singleUsdcUsdt = fraction(usdcUsdtStaked, def, usdcUsdtTci) | |
515 | + | let usdcUsdtLpToWithdraw = fraction(singleUsdcUsdt, am, def) | |
516 | + | let fee = fraction(usdcUsdtLpToWithdraw, def, feePerc) | |
517 | + | let unstakeUsdcUsdtLP = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["EPhdEfmQaNcHyvDmRGhnLhgcJtKZ2a4k3ZBmKWtAEWyH", usdcUsdtLpToWithdraw], nil) | |
518 | + | if ((unstakeUsdcUsdtLP == unstakeUsdcUsdtLP)) | |
536 | 519 | then { | |
537 | - | let | |
538 | - | let | |
539 | - | let | |
540 | - | let | |
541 | - | [ | |
520 | + | let usdcUsdtLPFee = ScriptTransfer(Address(tw), fee, usdcUsdtLP) | |
521 | + | let usdcUsdtTransfer = ScriptTransfer(i.caller, (usdcUsdtLpToWithdraw - fee), usdcUsdtLP) | |
522 | + | let updateUsdcUsdtLpStaked = IntegerEntry(keyUSDCUSDT, (usdcUsdtStaked - usdcUsdtLpToWithdraw)) | |
523 | + | let burnUsdcUsdtLpTci = Burn(usdcUsdtLPTCI, am) | |
524 | + | [usdcUsdtLPFee, usdcUsdtTransfer, updateUsdcUsdtLpStaked, burnUsdcUsdtLpTci] | |
542 | 525 | } | |
543 | 526 | else throw("Strict value is not equal to itself.") | |
544 | 527 | } | |
545 | - | else if ((id == | |
528 | + | else if ((id == puzzleUsdnLPTCI)) | |
546 | 529 | then { | |
547 | - | let | |
530 | + | let puzzleUsdnTci = match assetInfo(puzzleUsdnLPTCI) { | |
548 | 531 | case q: Asset => | |
549 | 532 | q.quantity | |
550 | 533 | case _ => | |
551 | 534 | 0 | |
552 | 535 | } | |
553 | - | let | |
554 | - | let | |
555 | - | let | |
556 | - | let fee = fraction( | |
557 | - | let | |
558 | - | if (( | |
536 | + | let puzzleLPStaked = valueOrElse(getInteger(this, keyPUZZLEUSDN), 0) | |
537 | + | let singlePuzzleUsdn = fraction(puzzleLPStaked, def, puzzleUsdnTci) | |
538 | + | let puzzleUsdnWithdraw = fraction(singlePuzzleUsdn, am, def) | |
539 | + | let fee = fraction(puzzleUsdnWithdraw, def, feePerc) | |
540 | + | let unstakePuzzleUsdnLP = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["E8zHu33GfcNyGLypX77gZiUXfvuZQeaYmiEfsy7VYNwP", puzzleUsdnWithdraw], nil) | |
541 | + | if ((unstakePuzzleUsdnLP == unstakePuzzleUsdnLP)) | |
559 | 542 | then { | |
560 | - | let | |
561 | - | let | |
562 | - | let | |
563 | - | let | |
564 | - | [ | |
543 | + | let puzzleUsdnLPFee = ScriptTransfer(Address(tw), fee, puzzleUsdnLP) | |
544 | + | let puzzleUsdnTransfer = ScriptTransfer(i.caller, (puzzleUsdnWithdraw - fee), puzzleUsdnLP) | |
545 | + | let updatePuzzleUsdnLpStaked = IntegerEntry(keyPUZZLEUSDN, (puzzleLPStaked - puzzleUsdnWithdraw)) | |
546 | + | let burnPuzzleTCI = Burn(puzzleUsdnLPTCI, am) | |
547 | + | [puzzleUsdnLPFee, puzzleUsdnTransfer, updatePuzzleUsdnLpStaked, burnPuzzleTCI] | |
565 | 548 | } | |
566 | 549 | else throw("Strict value is not equal to itself.") | |
567 | 550 | } | |
568 | - | else if ((id == | |
551 | + | else if ((id == btcUsdnLPTCI)) | |
569 | 552 | then { | |
570 | - | let | |
553 | + | let btcUsdnTCI = match assetInfo(puzzleUsdnLPTCI) { | |
571 | 554 | case q: Asset => | |
572 | 555 | q.quantity | |
573 | 556 | case _ => | |
574 | 557 | 0 | |
575 | 558 | } | |
576 | - | let | |
577 | - | let | |
578 | - | let | |
579 | - | let fee = fraction( | |
580 | - | let | |
581 | - | if (( | |
559 | + | let btcUsdnStaked = valueOrElse(getInteger(this, keyBTCUSDN), 0) | |
560 | + | let singleBtcUsdn = fraction(btcUsdnStaked, def, btcUsdnTCI) | |
561 | + | let btcUsdnWithdraw = fraction(singleBtcUsdn, am, def) | |
562 | + | let fee = fraction(btcUsdnWithdraw, def, feePerc) | |
563 | + | let unstakeBtcUsdn = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["8WhH5CCJ6NakPvEvAJcizqqD7H6axhupdYHDFumSDwsy", btcUsdnWithdraw], nil) | |
564 | + | if ((unstakeBtcUsdn == unstakeBtcUsdn)) | |
582 | 565 | then { | |
583 | - | let | |
584 | - | let | |
585 | - | let | |
586 | - | let | |
587 | - | [ | |
566 | + | let btcUsdnLPFee = ScriptTransfer(Address(tw), fee, btcUsdnLP) | |
567 | + | let btcUsdnTransfer = ScriptTransfer(i.caller, (btcUsdnWithdraw - fee), btcUsdnLP) | |
568 | + | let updateBtcUsdnLPStaked = IntegerEntry(keyBTCUSDN, (btcUsdnStaked - btcUsdnWithdraw)) | |
569 | + | let burnBtcUsdnTci = Burn(btcUsdnLPTCI, am) | |
570 | + | [btcUsdnLPFee, btcUsdnTransfer, updateBtcUsdnLPStaked, burnBtcUsdnTci] | |
588 | 571 | } | |
589 | 572 | else throw("Strict value is not equal to itself.") | |
590 | 573 | } | |
591 | - | else if ((id == | |
574 | + | else if ((id == wavesUsdnLPTCI)) | |
592 | 575 | then { | |
593 | - | let | |
576 | + | let wavesUsdnTCI = match assetInfo(wavesUsdnLPTCI) { | |
594 | 577 | case q: Asset => | |
595 | 578 | q.quantity | |
596 | 579 | case _ => | |
597 | 580 | 0 | |
598 | 581 | } | |
599 | - | let | |
600 | - | let | |
601 | - | let | |
602 | - | let fee = fraction( | |
603 | - | let | |
604 | - | if (( | |
582 | + | let wavesUsdnStaked = valueOrElse(getInteger(this, keyWAVESUSDN), 0) | |
583 | + | let singleWavesUsdn = fraction(wavesUsdnStaked, def, wavesUsdnTCI) | |
584 | + | let wavesUsdnWithdraw = fraction(singleWavesUsdn, am, def) | |
585 | + | let fee = fraction(wavesUsdnWithdraw, def, feePerc) | |
586 | + | let unstakeWavesUsdn = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1", wavesUsdnWithdraw], nil) | |
587 | + | if ((unstakeWavesUsdn == unstakeWavesUsdn)) | |
605 | 588 | then { | |
606 | - | let | |
607 | - | let | |
608 | - | let | |
609 | - | let | |
610 | - | [ | |
589 | + | let wavesUsndFee = ScriptTransfer(Address(tw), fee, wavesUsdnLP) | |
590 | + | let wavesUsdnTransfer = ScriptTransfer(i.caller, (wavesUsdnWithdraw - fee), wavesUsdnLP) | |
591 | + | let updateWavesUsdnLPStaked = IntegerEntry(keyWAVESUSDN, (wavesUsdnStaked - wavesUsdnWithdraw)) | |
592 | + | let burnWavesUsdnTCI = Burn(wavesUsdnLPTCI, am) | |
593 | + | [wavesUsndFee, wavesUsdnTransfer, updateWavesUsdnLPStaked, burnWavesUsdnTCI] | |
611 | 594 | } | |
612 | 595 | else throw("Strict value is not equal to itself.") | |
613 | 596 | } | |
614 | - | else if ((id == | |
597 | + | else if ((id == ennoUsdnLPTCI)) | |
615 | 598 | then { | |
616 | - | let | |
599 | + | let ennoUsdnTCI = match assetInfo(ennoUsdnLPTCI) { | |
617 | 600 | case q: Asset => | |
618 | 601 | q.quantity | |
619 | 602 | case _ => | |
620 | 603 | 0 | |
621 | 604 | } | |
622 | - | let | |
623 | - | let | |
624 | - | let | |
625 | - | let fee = fraction( | |
626 | - | let | |
627 | - | if (( | |
605 | + | let ennoUsdnStaked = valueOrElse(getInteger(this, keyENNOUSDN), 0) | |
606 | + | let singleEnnoUsdn = fraction(ennoUsdnStaked, def, ennoUsdnTCI) | |
607 | + | let ennoUsdnWithdraw = fraction(singleEnnoUsdn, am, def) | |
608 | + | let fee = fraction(ennoUsdnWithdraw, def, feePerc) | |
609 | + | let unstakeEnnoUsdn = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["HnW33dcEaeUTcgMLd8vHoJR5iAFZ2ngHDAa9E9496kDX", ennoUsdnWithdraw], nil) | |
610 | + | if ((unstakeEnnoUsdn == unstakeEnnoUsdn)) | |
628 | 611 | then { | |
629 | - | let | |
630 | - | let | |
631 | - | let | |
632 | - | let | |
633 | - | [ | |
612 | + | let ennoUsdnFee = ScriptTransfer(Address(tw), fee, ennoUsdnLP) | |
613 | + | let ennoUsdnTransfer = ScriptTransfer(i.caller, (ennoUsdnWithdraw - fee), ennoUsdnLP) | |
614 | + | let updateEnnoUsdnLPStaked = IntegerEntry(keyENNOUSDN, (ennoUsdnStaked - ennoUsdnWithdraw)) | |
615 | + | let burnEnnoUsdnTCI = Burn(ennoUsdnLPTCI, am) | |
616 | + | [ennoUsdnFee, ennoUsdnTransfer, updateEnnoUsdnLPStaked, burnEnnoUsdnTCI] | |
634 | 617 | } | |
635 | 618 | else throw("Strict value is not equal to itself.") | |
636 | 619 | } | |
637 | - | else if ((id == | |
620 | + | else if ((id == nsbtUsdnLPTCI)) | |
638 | 621 | then { | |
639 | - | let | |
622 | + | let nsbtUsdnTCI = match assetInfo(nsbtUsdnLPTCI) { | |
640 | 623 | case q: Asset => | |
641 | 624 | q.quantity | |
642 | 625 | case _ => | |
643 | 626 | 0 | |
644 | 627 | } | |
645 | - | let | |
646 | - | let | |
647 | - | let | |
648 | - | let fee = fraction( | |
649 | - | let | |
650 | - | if (( | |
628 | + | let nsbtUsdnStaked = valueOrElse(getInteger(this, keyNSBTUSDN), 0) | |
629 | + | let singleNsbtUsdn = fraction(nsbtUsdnStaked, def, nsbtUsdnTCI) | |
630 | + | let nsbtUsdnWithdraw = fraction(singleNsbtUsdn, am, def) | |
631 | + | let fee = fraction(nsbtUsdnWithdraw, def, feePerc) | |
632 | + | let unstakeNsbtUsdn = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["AGo49HCtQUghfxHSpUXub3KBaMXyunJmTxQ4azgU5Ax5", nsbtUsdnWithdraw], nil) | |
633 | + | if ((unstakeNsbtUsdn == unstakeNsbtUsdn)) | |
651 | 634 | then { | |
652 | - | let | |
653 | - | let | |
654 | - | let | |
655 | - | let | |
656 | - | [ | |
635 | + | let nsbtUsdnFee = ScriptTransfer(Address(tw), fee, nsbtUsdnLP) | |
636 | + | let nsbtUsdnTransfer = ScriptTransfer(i.caller, (nsbtUsdnWithdraw - fee), nsbtUsdnLP) | |
637 | + | let updateNsbtUsdnStaked = IntegerEntry(keyNSBTUSDN, (nsbtUsdnStaked - nsbtUsdnWithdraw)) | |
638 | + | let burnNsbtUsdnTCI = Burn(nsbtUsdnLPTCI, am) | |
639 | + | [nsbtUsdnFee, nsbtUsdnTransfer, updateNsbtUsdnStaked, burnNsbtUsdnTCI] | |
657 | 640 | } | |
658 | 641 | else throw("Strict value is not equal to itself.") | |
659 | 642 | } | |
660 | - | else throw("Invalid asset") | |
643 | + | else if ((id == ltcUsdnLPTCI)) | |
644 | + | then { | |
645 | + | let ltcUsdnTCI = match assetInfo(ltcUsdnLPTCI) { | |
646 | + | case q: Asset => | |
647 | + | q.quantity | |
648 | + | case _ => | |
649 | + | 0 | |
650 | + | } | |
651 | + | let ltcUsdnStaked = valueOrElse(getInteger(this, keyLTCUSDN), 0) | |
652 | + | let singleLtcUsdn = fraction(ltcUsdnStaked, def, ltcUsdnTCI) | |
653 | + | let ltcUsdnWithdraw = fraction(singleLtcUsdn, am, def) | |
654 | + | let fee = fraction(ltcUsdnWithdraw, def, feePerc) | |
655 | + | let unstakeLtcUsdn = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["CNkqC6GPi888WdJ1EuVtu9JGZ9VHpAn8eTHwR8YZxXbv", ltcUsdnWithdraw], nil) | |
656 | + | if ((unstakeLtcUsdn == unstakeLtcUsdn)) | |
657 | + | then { | |
658 | + | let ltcUsdnFee = ScriptTransfer(Address(tw), fee, ltcUsdnLP) | |
659 | + | let ltcUsdnTransfer = ScriptTransfer(i.caller, (ltcUsdnWithdraw - fee), ltcUsdnLP) | |
660 | + | let updateLtcUsdnStaked = IntegerEntry(keyLTCUSDN, (ltcUsdnStaked - ltcUsdnWithdraw)) | |
661 | + | let burnLtcUsdnTCI = Burn(ltcUsdnLPTCI, am) | |
662 | + | [ltcUsdnFee, ltcUsdnTransfer, updateLtcUsdnStaked, burnLtcUsdnTCI] | |
663 | + | } | |
664 | + | else throw("Strict value is not equal to itself.") | |
665 | + | } | |
666 | + | else throw("Invalid asset") | |
661 | 667 | } | |
662 | 668 | ||
663 | 669 | ||
911 | 917 | } | |
912 | 918 | ||
913 | 919 | ||
920 | + | ||
921 | + | @Callable(i) | |
922 | + | func initNSBTUSDN () = { | |
923 | + | let pm = value(i.payments[0]) | |
924 | + | let am = pm.amount | |
925 | + | if ((pm.assetId != nsbtUsdnLP)) | |
926 | + | then throw("Unexpected token") | |
927 | + | else { | |
928 | + | let s = invoke(Address(base58'3Mx3zmXrMcLFCafMuPtXAzR4ZPVeZYb6qLz'), "stake", nil, [pm]) | |
929 | + | if ((s == s)) | |
930 | + | then { | |
931 | + | let upd = IntegerEntry(keyNSBTUSDN, 556149658) | |
932 | + | let updK = IntegerEntry(keyNsbtUsdnCompound, 0) | |
933 | + | [upd, updK] | |
934 | + | } | |
935 | + | else throw("Strict value is not equal to itself.") | |
936 | + | } | |
937 | + | } | |
938 | + | ||
939 | + | ||
940 | + | ||
941 | + | @Callable(i) | |
942 | + | func sponsorBoost () = { | |
943 | + | let pm = value(i.payments[0]) | |
944 | + | let lockPeriod = 100 | |
945 | + | if ((pm.assetId != wxId)) | |
946 | + | then throw("Error") | |
947 | + | else { | |
948 | + | let sponsored = valueOrElse(getInteger(this, keySponsorship), 0) | |
949 | + | let lock = invoke(Address(base58'3PJL8Hn8LACaSBWLQ3UVhctA5cTQLBFwBAP'), "increaseLock", [lockPeriod], [pm]) | |
950 | + | if ((lock == lock)) | |
951 | + | then { | |
952 | + | let s = IntegerEntry(keySponsorship, (pm.amount + sponsored)) | |
953 | + | [s] | |
954 | + | } | |
955 | + | else throw("Strict value is not equal to itself.") | |
956 | + | } | |
957 | + | } | |
958 | + | ||
959 | + | ||
914 | 960 | @Verifier(tx) | |
915 | 961 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
916 | 962 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let usdtUsdnLP = base58'97zHFp1C3cB7qfvx8Xv5f2rWp9nUSG5UnAamfPcW6txf' | |
5 | 5 | ||
6 | 6 | let usdtUsdnLPTCI = base58'2CD44HANZzsdU7yqRsmz7L9eA2Foh4YYMC4azMbaZEj6' | |
7 | 7 | ||
8 | 8 | let wxUsdnLP = base58'F2AKkA513k5yHEJkLsU6vWxCYYk811GpjLhwEv2WGwZ9' | |
9 | 9 | ||
10 | 10 | let wxUsdnLPTCI = base58'FuUobp3DcfARzDLcvtVW37i7FvMPvCCpgdcvWke8sBuh' | |
11 | 11 | ||
12 | 12 | let usdcUsdnLP = base58'EK6N7S38xbtBT3SxAqoGdDLCiX6rojX6G169CnSyuE5' | |
13 | 13 | ||
14 | 14 | let usdcUsdnLPTCI = base58'HZKFpNfyPG5gt4D6Nfy1zQSg2Ptmqv932GjNTCyBEeKP' | |
15 | 15 | ||
16 | 16 | let usdcUsdtLP = base58'EPhdEfmQaNcHyvDmRGhnLhgcJtKZ2a4k3ZBmKWtAEWyH' | |
17 | 17 | ||
18 | 18 | let usdcUsdtLPTCI = base58'BqPYkaiz7Le6fFu1rjZ54anrpT57EpvyugZCUqrsjXj' | |
19 | 19 | ||
20 | 20 | let puzzleUsdnLP = base58'E8zHu33GfcNyGLypX77gZiUXfvuZQeaYmiEfsy7VYNwP' | |
21 | 21 | ||
22 | 22 | let puzzleUsdnLPTCI = base58'Dh9QXSSABE5V6aRfu3mCbDAUokbpE7ER7pbZV6cvyg1A' | |
23 | 23 | ||
24 | 24 | let nsbtUsdnLP = base58'AGo49HCtQUghfxHSpUXub3KBaMXyunJmTxQ4azgU5Ax5' | |
25 | 25 | ||
26 | 26 | let nsbtUsdnLPTCI = base58'3hty6p21a9M4t9greh13nydX84bvaPyXDhKZ2FSmLNRg' | |
27 | 27 | ||
28 | 28 | let btcUsdnLP = base58'8WhH5CCJ6NakPvEvAJcizqqD7H6axhupdYHDFumSDwsy' | |
29 | 29 | ||
30 | 30 | let btcUsdnLPTCI = base58'FpRckcTCzfsfXwWhQCrL5rcrStRB6HxmRjP28qVFz4iu' | |
31 | 31 | ||
32 | 32 | let ennoUsdnLP = base58'HnW33dcEaeUTcgMLd8vHoJR5iAFZ2ngHDAa9E9496kDX' | |
33 | 33 | ||
34 | 34 | let ennoUsdnLPTCI = base58'57kEMQuVpmhsG9eCkcGRA3hTsZZGa6axKJfNwXEU4EM1' | |
35 | 35 | ||
36 | 36 | let wavesUsdnLP = base58'7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1' | |
37 | 37 | ||
38 | 38 | let wavesUsdnLPTCI = base58'EHia7oPmBSJyTd3Uix8sdpEvFXB9X18ioqreXiTaKyVJ' | |
39 | 39 | ||
40 | 40 | let ltcUsdnLP = base58'CNkqC6GPi888WdJ1EuVtu9JGZ9VHpAn8eTHwR8YZxXbv' | |
41 | 41 | ||
42 | 42 | let ltcUsdnLPTCI = base58'HgD36mcgHVF5beAQi6rPtatg4gVmMckvPExFR3jEDydW' | |
43 | 43 | ||
44 | 44 | let isStopped = false | |
45 | 45 | ||
46 | 46 | let keyStaked = "STAKED_LP" | |
47 | 47 | ||
48 | 48 | let keyCompound = "From_Compound" | |
49 | 49 | ||
50 | 50 | let keywxUsdnCompound = "WX_USDN_compound" | |
51 | 51 | ||
52 | 52 | let keyWXUSDN = "WX_USDN" | |
53 | 53 | ||
54 | 54 | let keyUsdcUsdnCompound = "USDC_USDN_compound" | |
55 | 55 | ||
56 | 56 | let keyUSDCUSDN = "USDC_USDN" | |
57 | 57 | ||
58 | 58 | let keyUsdcUsdtCompound = "USDC_USDT_compound" | |
59 | 59 | ||
60 | 60 | let keyUSDCUSDT = "USDC_USDT" | |
61 | 61 | ||
62 | 62 | let keyPuzzleUsdnCompound = "PUZZLE_USDN_compound" | |
63 | 63 | ||
64 | 64 | let keyPUZZLEUSDN = "PUZZLE_USDN" | |
65 | 65 | ||
66 | 66 | let keyNsbtUsdnCompound = "NSBT_USDN_compound" | |
67 | 67 | ||
68 | 68 | let keyNSBTUSDN = "NSBT_USDN" | |
69 | 69 | ||
70 | 70 | let keyBTCUSDN = "BTC_USDN" | |
71 | 71 | ||
72 | 72 | let keyBtcUsdnCompound = "BTC_USDN_Compound" | |
73 | 73 | ||
74 | 74 | let keyENNOUSDN = "ENNO_USDN" | |
75 | 75 | ||
76 | 76 | let keyEnnoUsdnCompound = "ENNO_USDN_Compound" | |
77 | 77 | ||
78 | 78 | let keyWAVESUSDN = "WAVES_USDN" | |
79 | 79 | ||
80 | 80 | let keyWavesUsdnCompound = "WAVES_USDN_Compound" | |
81 | 81 | ||
82 | 82 | let keyLTCUSDN = "LTC_USDN" | |
83 | 83 | ||
84 | 84 | let keyLtcUsdnCompound = "LTC_USDN_Compound" | |
85 | + | ||
86 | + | let wxId = base58'Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on' | |
87 | + | ||
88 | + | let keySponsorship = "Sponsorship_in_lock" | |
85 | 89 | ||
86 | 90 | let def = 100000000 | |
87 | 91 | ||
88 | 92 | let feePerc = 10000000000 | |
89 | 93 | ||
90 | 94 | let tw = base58'3P93R2GBkTGVehRPhytHr7sdxYww93jkbhm' | |
91 | 95 | ||
92 | 96 | let oracle = base58'3P6phwFZFQtZFuc9dvdXsgvtg8JEFVgECPA' | |
93 | 97 | ||
94 | 98 | func checkAddress (caller) = if ((caller != oracle)) | |
95 | 99 | then false | |
96 | 100 | else true | |
97 | 101 | ||
98 | 102 | ||
99 | 103 | @Callable(i) | |
100 | 104 | func depositWxUsdnLP () = { | |
101 | 105 | let pmt = value(i.payments[0]) | |
102 | 106 | let pmtAmount = pmt.amount | |
103 | 107 | if ((pmt.assetId != wxUsdnLP)) | |
104 | 108 | then throw("attach WXUSDNLP tokens only") | |
105 | 109 | else if (isStopped) | |
106 | 110 | then throw("smart contract is on lock") | |
107 | 111 | else { | |
108 | 112 | let tkStaked = valueOrElse(getInteger(this, keyWXUSDN), 0) | |
109 | 113 | let totalIssued = match assetInfo(wxUsdnLPTCI) { | |
110 | 114 | case asset: Asset => | |
111 | 115 | asset.quantity | |
112 | 116 | case _ => | |
113 | 117 | throw("Can't find asset") | |
114 | 118 | } | |
115 | 119 | let one = fraction(totalIssued, 100000000, tkStaked) | |
116 | 120 | let toIssue = fraction(pmtAmount, one, 100000000) | |
117 | 121 | let updateState = IntegerEntry(keyWXUSDN, (tkStaked + pmtAmount)) | |
118 | 122 | let LPstake = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [pmt]) | |
119 | 123 | if ((LPstake == LPstake)) | |
120 | 124 | then { | |
121 | 125 | let LPIssue = Reissue(wxUsdnLPTCI, toIssue, true) | |
122 | 126 | let transfer = ScriptTransfer(i.caller, toIssue, wxUsdnLPTCI) | |
123 | 127 | [LPIssue, transfer, updateState] | |
124 | 128 | } | |
125 | 129 | else throw("Strict value is not equal to itself.") | |
126 | 130 | } | |
127 | 131 | } | |
128 | 132 | ||
129 | 133 | ||
130 | 134 | ||
131 | 135 | @Callable(i) | |
132 | 136 | func depositUsdtUsdnLP () = { | |
133 | 137 | let pmt = value(i.payments[0]) | |
134 | 138 | let pmtAmount = pmt.amount | |
135 | 139 | if ((pmt.assetId != usdtUsdnLP)) | |
136 | 140 | then throw("attach USDTUSDNLP tokens only") | |
137 | 141 | else if (isStopped) | |
138 | 142 | then throw("smart contract is on lock") | |
139 | 143 | else { | |
140 | 144 | let tkStaked = valueOrElse(getInteger(this, keyStaked), 0) | |
141 | 145 | let totalIssued = match assetInfo(usdtUsdnLPTCI) { | |
142 | 146 | case asset: Asset => | |
143 | 147 | asset.quantity | |
144 | 148 | case _ => | |
145 | 149 | throw("Can't find asset") | |
146 | 150 | } | |
147 | 151 | let fromCompound = valueOrElse(getInteger(this, keyCompound), 0) | |
148 | 152 | let forOne = fraction(totalIssued, 100000000, tkStaked) | |
149 | 153 | let toIssue = fraction(pmtAmount, forOne, 100000000) | |
150 | 154 | let updateState = IntegerEntry(keyStaked, (tkStaked + pmtAmount)) | |
151 | 155 | let LPstake = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [pmt]) | |
152 | 156 | if ((LPstake == LPstake)) | |
153 | 157 | then { | |
154 | 158 | let LPIssue = Reissue(usdtUsdnLPTCI, toIssue, true) | |
155 | 159 | let transfer = ScriptTransfer(i.caller, toIssue, usdtUsdnLPTCI) | |
156 | 160 | [LPIssue, transfer, updateState] | |
157 | 161 | } | |
158 | 162 | else throw("Strict value is not equal to itself.") | |
159 | 163 | } | |
160 | 164 | } | |
161 | 165 | ||
162 | 166 | ||
163 | 167 | ||
164 | 168 | @Callable(i) | |
165 | 169 | func depositUsdcUsdnLP () = { | |
166 | 170 | let pmt = value(i.payments[0]) | |
167 | 171 | let pmtAmount = pmt.amount | |
168 | 172 | if ((pmt.assetId != usdcUsdnLP)) | |
169 | 173 | then throw("attach USDCUSDNLP tokens only") | |
170 | 174 | else if (isStopped) | |
171 | 175 | then throw("smart contract is on lock") | |
172 | 176 | else { | |
173 | 177 | let tkStaked = valueOrElse(getInteger(this, keyUSDCUSDN), 0) | |
174 | 178 | let totalIssued = match assetInfo(usdcUsdnLPTCI) { | |
175 | 179 | case asset: Asset => | |
176 | 180 | asset.quantity | |
177 | 181 | case _ => | |
178 | 182 | throw("Can't find asset") | |
179 | 183 | } | |
180 | 184 | let fromCompound = valueOrElse(getInteger(this, keyUsdcUsdnCompound), 0) | |
181 | 185 | let forOne = fraction(totalIssued, 100000000, tkStaked) | |
182 | 186 | let toIssue = fraction(pmtAmount, forOne, 100000000) | |
183 | 187 | let updateState = IntegerEntry(keyUSDCUSDN, (tkStaked + pmtAmount)) | |
184 | 188 | let LPstake = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [pmt]) | |
185 | 189 | if ((LPstake == LPstake)) | |
186 | 190 | then { | |
187 | 191 | let LPIssue = Reissue(usdcUsdnLPTCI, toIssue, true) | |
188 | 192 | let transfer = ScriptTransfer(i.caller, toIssue, usdcUsdnLPTCI) | |
189 | 193 | [LPIssue, transfer, updateState] | |
190 | 194 | } | |
191 | 195 | else throw("Strict value is not equal to itself.") | |
192 | 196 | } | |
193 | 197 | } | |
194 | 198 | ||
195 | 199 | ||
196 | 200 | ||
197 | 201 | @Callable(i) | |
198 | 202 | func depositUsdcUsdtLP () = { | |
199 | 203 | let pmt = value(i.payments[0]) | |
200 | 204 | let pmtAmount = pmt.amount | |
201 | 205 | if ((pmt.assetId != usdcUsdtLP)) | |
202 | 206 | then throw("attach USDCUSDTLP tokens only") | |
203 | 207 | else if (isStopped) | |
204 | 208 | then throw("smart contract is on lock") | |
205 | 209 | else { | |
206 | 210 | let tkStaked = valueOrElse(getInteger(this, keyUSDCUSDT), 0) | |
207 | 211 | let totalIssued = match assetInfo(usdcUsdtLPTCI) { | |
208 | 212 | case asset: Asset => | |
209 | 213 | asset.quantity | |
210 | 214 | case _ => | |
211 | 215 | throw("Can't find asset") | |
212 | 216 | } | |
213 | 217 | let fromCompound = valueOrElse(getInteger(this, keyUsdcUsdtCompound), 0) | |
214 | 218 | let forOne = fraction(totalIssued, 100000000, tkStaked) | |
215 | 219 | let toIssue = fraction(pmtAmount, forOne, 100000000) | |
216 | 220 | let updateState = IntegerEntry(keyUSDCUSDT, (tkStaked + pmtAmount)) | |
217 | 221 | let LPstake = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [pmt]) | |
218 | 222 | if ((LPstake == LPstake)) | |
219 | 223 | then { | |
220 | 224 | let LPIssue = Reissue(usdcUsdtLPTCI, toIssue, true) | |
221 | 225 | let transfer = ScriptTransfer(i.caller, toIssue, usdcUsdtLPTCI) | |
222 | 226 | [LPIssue, transfer, updateState] | |
223 | 227 | } | |
224 | 228 | else throw("Strict value is not equal to itself.") | |
225 | 229 | } | |
226 | 230 | } | |
227 | 231 | ||
228 | 232 | ||
229 | 233 | ||
230 | 234 | @Callable(i) | |
231 | 235 | func depositPuzzleUsdnLP () = { | |
232 | 236 | let pmt = value(i.payments[0]) | |
233 | 237 | let pmtAmount = pmt.amount | |
234 | 238 | if ((pmt.assetId != puzzleUsdnLP)) | |
235 | 239 | then throw("attach PUZZLEUDSNLP tokens only") | |
236 | 240 | else if (isStopped) | |
237 | 241 | then throw("smart contract is on lock") | |
238 | 242 | else { | |
239 | 243 | let tkStaked = valueOrElse(getInteger(this, keyPUZZLEUSDN), 0) | |
240 | 244 | let totalIssued = match assetInfo(puzzleUsdnLPTCI) { | |
241 | 245 | case asset: Asset => | |
242 | 246 | asset.quantity | |
243 | 247 | case _ => | |
244 | 248 | throw("Can't find asset") | |
245 | 249 | } | |
246 | 250 | let fromCompound = valueOrElse(getInteger(this, keyPuzzleUsdnCompound), 0) | |
247 | 251 | let forOne = fraction(totalIssued, 100000000, tkStaked) | |
248 | 252 | let toIssue = fraction(pmtAmount, forOne, 100000000) | |
249 | 253 | let updateState = IntegerEntry(keyPUZZLEUSDN, (tkStaked + pmtAmount)) | |
250 | 254 | let LPstake = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [pmt]) | |
251 | 255 | if ((LPstake == LPstake)) | |
252 | 256 | then { | |
253 | 257 | let LPIssue = Reissue(puzzleUsdnLPTCI, toIssue, true) | |
254 | 258 | let transfer = ScriptTransfer(i.caller, toIssue, puzzleUsdnLPTCI) | |
255 | 259 | [LPIssue, transfer, updateState] | |
256 | 260 | } | |
257 | 261 | else throw("Strict value is not equal to itself.") | |
258 | 262 | } | |
259 | 263 | } | |
260 | 264 | ||
261 | 265 | ||
262 | 266 | ||
263 | 267 | @Callable(i) | |
264 | 268 | func depositNsbtUsdnLP () = { | |
265 | 269 | let pmt = value(i.payments[0]) | |
266 | 270 | let pmtAmount = pmt.amount | |
267 | 271 | if ((pmt.assetId != nsbtUsdnLP)) | |
268 | 272 | then throw("attach NSBTUSDNLP tokens only") | |
269 | 273 | else if (isStopped) | |
270 | 274 | then throw("smart contract is on lock") | |
271 | 275 | else { | |
272 | 276 | let tkStaked = valueOrElse(getInteger(this, keyNSBTUSDN), 0) | |
273 | 277 | let totalIssued = match assetInfo(nsbtUsdnLPTCI) { | |
274 | 278 | case asset: Asset => | |
275 | 279 | asset.quantity | |
276 | 280 | case _ => | |
277 | 281 | throw("Can't find asset") | |
278 | 282 | } | |
279 | 283 | let one = fraction(totalIssued, 100000000, tkStaked) | |
280 | 284 | let toIssue = fraction(pmtAmount, one, 100000000) | |
281 | 285 | let updateState = IntegerEntry(keyNSBTUSDN, (tkStaked + pmtAmount)) | |
282 | 286 | let LPstake = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [pmt]) | |
283 | 287 | if ((LPstake == LPstake)) | |
284 | 288 | then { | |
285 | 289 | let LPIssue = Reissue(nsbtUsdnLPTCI, toIssue, true) | |
286 | 290 | let transfer = ScriptTransfer(i.caller, toIssue, nsbtUsdnLPTCI) | |
287 | 291 | [LPIssue, transfer, updateState] | |
288 | 292 | } | |
289 | 293 | else throw("Strict value is not equal to itself.") | |
290 | 294 | } | |
291 | 295 | } | |
292 | 296 | ||
293 | 297 | ||
294 | 298 | ||
295 | 299 | @Callable(i) | |
296 | 300 | func depositBtcUsdnLP () = { | |
297 | 301 | let pmt = value(i.payments[0]) | |
298 | 302 | let pmtAmount = pmt.amount | |
299 | 303 | if ((pmt.assetId != btcUsdnLP)) | |
300 | 304 | then throw("attach BTCUSDNLP tokens only") | |
301 | 305 | else if (isStopped) | |
302 | 306 | then throw("smart contract is on lock") | |
303 | 307 | else { | |
304 | 308 | let tkStaked = valueOrElse(getInteger(this, keyBTCUSDN), 0) | |
305 | 309 | let totalIssued = match assetInfo(btcUsdnLPTCI) { | |
306 | 310 | case asset: Asset => | |
307 | 311 | asset.quantity | |
308 | 312 | case _ => | |
309 | 313 | throw("Can't find asset") | |
310 | 314 | } | |
311 | 315 | let forOne = fraction(totalIssued, 100000000, tkStaked) | |
312 | 316 | let toIssue = fraction(pmtAmount, forOne, 100000000) | |
313 | 317 | let updateState = IntegerEntry(keyBTCUSDN, (tkStaked + pmtAmount)) | |
314 | 318 | let LPstake = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [pmt]) | |
315 | 319 | if ((LPstake == LPstake)) | |
316 | 320 | then { | |
317 | 321 | let LPIssue = Reissue(btcUsdnLPTCI, toIssue, true) | |
318 | 322 | let transfer = ScriptTransfer(i.caller, toIssue, btcUsdnLPTCI) | |
319 | 323 | [LPIssue, transfer, updateState] | |
320 | 324 | } | |
321 | 325 | else throw("Strict value is not equal to itself.") | |
322 | 326 | } | |
323 | 327 | } | |
324 | 328 | ||
325 | 329 | ||
326 | 330 | ||
327 | 331 | @Callable(i) | |
328 | 332 | func depositEnnoUsdnLP () = { | |
329 | 333 | let pmt = value(i.payments[0]) | |
330 | 334 | let pmtAmount = pmt.amount | |
331 | 335 | if ((pmt.assetId != ennoUsdnLP)) | |
332 | 336 | then throw("attach ENNOUSDNLP tokens only") | |
333 | 337 | else if (isStopped) | |
334 | 338 | then throw("smart contract is on lock") | |
335 | 339 | else { | |
336 | 340 | let tkStaked = valueOrElse(getInteger(this, keyENNOUSDN), 0) | |
337 | 341 | let totalIssued = match assetInfo(ennoUsdnLPTCI) { | |
338 | 342 | case asset: Asset => | |
339 | 343 | asset.quantity | |
340 | 344 | case _ => | |
341 | 345 | throw("Can't find asset") | |
342 | 346 | } | |
343 | 347 | let one = fraction(totalIssued, 100000000, tkStaked) | |
344 | 348 | let toIssue = fraction(pmtAmount, one, 100000000) | |
345 | 349 | let updateState = IntegerEntry(keyENNOUSDN, (tkStaked + pmtAmount)) | |
346 | 350 | let LPstake = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [pmt]) | |
347 | 351 | if ((LPstake == LPstake)) | |
348 | 352 | then { | |
349 | 353 | let LPIssue = Reissue(ennoUsdnLPTCI, toIssue, true) | |
350 | 354 | let transfer = ScriptTransfer(i.caller, toIssue, ennoUsdnLPTCI) | |
351 | 355 | [LPIssue, transfer, updateState] | |
352 | 356 | } | |
353 | 357 | else throw("Strict value is not equal to itself.") | |
354 | 358 | } | |
355 | 359 | } | |
356 | 360 | ||
357 | 361 | ||
358 | 362 | ||
359 | 363 | @Callable(i) | |
360 | 364 | func depositWavesUsdnLP () = { | |
361 | 365 | let pmt = value(i.payments[0]) | |
362 | 366 | let pmtAmount = pmt.amount | |
363 | 367 | if ((pmt.assetId != wavesUsdnLP)) | |
364 | 368 | then throw("attach WAVESUSDNLP tokens only") | |
365 | 369 | else if (isStopped) | |
366 | 370 | then throw("smart contract is on lock") | |
367 | 371 | else { | |
368 | 372 | let tkStaked = valueOrElse(getInteger(this, keyWAVESUSDN), 0) | |
369 | 373 | let totalIssued = match assetInfo(wavesUsdnLPTCI) { | |
370 | 374 | case asset: Asset => | |
371 | 375 | asset.quantity | |
372 | 376 | case _ => | |
373 | 377 | throw("Can't find asset") | |
374 | 378 | } | |
375 | 379 | let one = fraction(totalIssued, 100000000, tkStaked) | |
376 | 380 | let toIssue = fraction(pmtAmount, one, 100000000) | |
377 | 381 | let updateState = IntegerEntry(keyWAVESUSDN, (tkStaked + pmtAmount)) | |
378 | 382 | let LPstake = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [pmt]) | |
379 | 383 | if ((LPstake == LPstake)) | |
380 | 384 | then { | |
381 | 385 | let LPIssue = Reissue(wavesUsdnLPTCI, toIssue, true) | |
382 | 386 | let transfer = ScriptTransfer(i.caller, toIssue, wavesUsdnLPTCI) | |
383 | 387 | [LPIssue, transfer, updateState] | |
384 | 388 | } | |
385 | 389 | else throw("Strict value is not equal to itself.") | |
386 | 390 | } | |
387 | 391 | } | |
388 | 392 | ||
389 | 393 | ||
390 | 394 | ||
391 | 395 | @Callable(i) | |
392 | 396 | func depositLtcUsdnLP () = { | |
393 | 397 | let pmt = value(i.payments[0]) | |
394 | 398 | let pmtAmount = pmt.amount | |
395 | 399 | if ((pmt.assetId != ltcUsdnLP)) | |
396 | 400 | then throw("attach LTCUSDNLP tokens only") | |
397 | 401 | else if (isStopped) | |
398 | 402 | then throw("smart contract is on lock") | |
399 | 403 | else { | |
400 | 404 | let tkStaked = valueOrElse(getInteger(this, keyLTCUSDN), 0) | |
401 | 405 | let totalIssued = match assetInfo(ltcUsdnLPTCI) { | |
402 | 406 | case asset: Asset => | |
403 | 407 | asset.quantity | |
404 | 408 | case _ => | |
405 | 409 | throw("Can't find asset") | |
406 | 410 | } | |
407 | 411 | let one = fraction(totalIssued, 100000000, tkStaked) | |
408 | 412 | let toIssue = fraction(pmtAmount, one, 100000000) | |
409 | 413 | let updateState = IntegerEntry(keyLTCUSDN, (tkStaked + pmtAmount)) | |
410 | 414 | let LPstake = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [pmt]) | |
411 | 415 | if ((LPstake == LPstake)) | |
412 | 416 | then { | |
413 | 417 | let LPIssue = Reissue(ltcUsdnLPTCI, toIssue, true) | |
414 | 418 | let transfer = ScriptTransfer(i.caller, toIssue, ltcUsdnLPTCI) | |
415 | 419 | [LPIssue, transfer, updateState] | |
416 | 420 | } | |
417 | 421 | else throw("Strict value is not equal to itself.") | |
418 | 422 | } | |
419 | 423 | } | |
420 | 424 | ||
421 | 425 | ||
422 | 426 | ||
423 | 427 | @Callable(i) | |
424 | 428 | func withdraw () = { | |
425 | 429 | let payment = value(i.payments[0]) | |
426 | 430 | let am = payment.amount | |
427 | 431 | let id = payment.assetId | |
428 | - | if ((size(i.payments) != 1)) | |
429 | - | then throw("1 pmnt expd") | |
430 | - | else if ((id == usdtUsdnLPTCI)) | |
431 | - | then { | |
432 | - | let TCIAmount = match assetInfo(usdtUsdnLPTCI) { | |
433 | - | case q: Asset => | |
434 | - | q.quantity | |
435 | - | case _ => | |
436 | - | 0 | |
437 | - | } | |
438 | - | let usdnUsdtStaked = valueOrElse(getInteger(this, keyStaked), 0) | |
439 | - | let forSingleTCI = fraction(usdnUsdtStaked, def, TCIAmount) | |
440 | - | let usdnLpToWithdraw = fraction(forSingleTCI, am, def) | |
441 | - | let fee = fraction(usdnLpToWithdraw, def, feePerc) | |
442 | - | let unstakeUsdtUsdnLP = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["97zHFp1C3cB7qfvx8Xv5f2rWp9nUSG5UnAamfPcW6txf", usdnLpToWithdraw], nil) | |
443 | - | if ((unstakeUsdtUsdnLP == unstakeUsdtUsdnLP)) | |
444 | - | then { | |
445 | - | let usdnLpfeeTransfer = ScriptTransfer(Address(tw), fee, usdtUsdnLP) | |
446 | - | let transfer = ScriptTransfer(i.caller, (usdnLpToWithdraw - fee), usdtUsdnLP) | |
447 | - | let updateUsdnLpStaked = IntegerEntry(keyStaked, (usdnUsdtStaked - usdnLpToWithdraw)) | |
448 | - | let brn = Burn(usdtUsdnLPTCI, am) | |
449 | - | [usdnLpfeeTransfer, transfer, updateUsdnLpStaked, brn] | |
450 | - | } | |
451 | - | else throw("Strict value is not equal to itself.") | |
452 | - | } | |
453 | - | else if ((id == wxUsdnLPTCI)) | |
432 | + | if (isStopped) | |
433 | + | then throw("smart contract is on lock") | |
434 | + | else if ((size(i.payments) != 1)) | |
435 | + | then throw("1 pmnt expd") | |
436 | + | else if ((id == usdtUsdnLPTCI)) | |
454 | 437 | then { | |
455 | - | let | |
438 | + | let TCIAmount = match assetInfo(usdtUsdnLPTCI) { | |
456 | 439 | case q: Asset => | |
457 | 440 | q.quantity | |
458 | 441 | case _ => | |
459 | 442 | 0 | |
460 | 443 | } | |
461 | - | let | |
462 | - | let | |
463 | - | let | |
464 | - | let fee = fraction( | |
465 | - | let | |
466 | - | if (( | |
444 | + | let usdnUsdtStaked = valueOrElse(getInteger(this, keyStaked), 0) | |
445 | + | let forSingleTCI = fraction(usdnUsdtStaked, def, TCIAmount) | |
446 | + | let usdnLpToWithdraw = fraction(forSingleTCI, am, def) | |
447 | + | let fee = fraction(usdnLpToWithdraw, def, feePerc) | |
448 | + | let unstakeUsdtUsdnLP = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["97zHFp1C3cB7qfvx8Xv5f2rWp9nUSG5UnAamfPcW6txf", usdnLpToWithdraw], nil) | |
449 | + | if ((unstakeUsdtUsdnLP == unstakeUsdtUsdnLP)) | |
467 | 450 | then { | |
468 | - | let | |
469 | - | let | |
470 | - | let | |
471 | - | let | |
472 | - | [ | |
451 | + | let usdnLpfeeTransfer = ScriptTransfer(Address(tw), fee, usdtUsdnLP) | |
452 | + | let transfer = ScriptTransfer(i.caller, (usdnLpToWithdraw - fee), usdtUsdnLP) | |
453 | + | let updateUsdnLpStaked = IntegerEntry(keyStaked, (usdnUsdtStaked - usdnLpToWithdraw)) | |
454 | + | let brn = Burn(usdtUsdnLPTCI, am) | |
455 | + | [usdnLpfeeTransfer, transfer, updateUsdnLpStaked, brn] | |
473 | 456 | } | |
474 | 457 | else throw("Strict value is not equal to itself.") | |
475 | 458 | } | |
476 | - | else if ((id == | |
459 | + | else if ((id == wxUsdnLPTCI)) | |
477 | 460 | then { | |
478 | - | let | |
461 | + | let wxTciAm = match assetInfo(wxUsdnLPTCI) { | |
479 | 462 | case q: Asset => | |
480 | 463 | q.quantity | |
481 | 464 | case _ => | |
482 | 465 | 0 | |
483 | 466 | } | |
484 | - | let | |
485 | - | let | |
486 | - | let | |
487 | - | let fee = fraction( | |
488 | - | let | |
489 | - | if (( | |
467 | + | let wxUsdnStaked = valueOrElse(getInteger(this, keyWXUSDN), 0) | |
468 | + | let singleWXLP = fraction(wxUsdnStaked, def, wxTciAm) | |
469 | + | let wxLpToWithdraw = fraction(singleWXLP, am, def) | |
470 | + | let fee = fraction(wxLpToWithdraw, def, feePerc) | |
471 | + | let unstakeWxUsdnLP = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["F2AKkA513k5yHEJkLsU6vWxCYYk811GpjLhwEv2WGwZ9", wxLpToWithdraw], nil) | |
472 | + | if ((unstakeWxUsdnLP == unstakeWxUsdnLP)) | |
490 | 473 | then { | |
491 | - | let | |
492 | - | let | |
493 | - | let | |
494 | - | let | |
495 | - | [ | |
474 | + | let wxLpFeeTransfer = ScriptTransfer(Address(tw), fee, wxUsdnLP) | |
475 | + | let wxLpTransfer = ScriptTransfer(i.caller, (wxLpToWithdraw - fee), wxUsdnLP) | |
476 | + | let updateWxLpStaked = IntegerEntry(keyWXUSDN, (wxUsdnStaked - wxLpToWithdraw)) | |
477 | + | let burnWxLpTci = Burn(wxUsdnLPTCI, am) | |
478 | + | [wxLpFeeTransfer, wxLpTransfer, updateWxLpStaked, burnWxLpTci] | |
496 | 479 | } | |
497 | 480 | else throw("Strict value is not equal to itself.") | |
498 | 481 | } | |
499 | - | else if ((id == | |
482 | + | else if ((id == usdcUsdnLPTCI)) | |
500 | 483 | then { | |
501 | - | let | |
484 | + | let usdcUsdnTCI = match assetInfo(usdcUsdnLPTCI) { | |
502 | 485 | case q: Asset => | |
503 | 486 | q.quantity | |
504 | 487 | case _ => | |
505 | 488 | 0 | |
506 | 489 | } | |
507 | - | let | |
508 | - | let | |
509 | - | let | |
510 | - | let fee = fraction( | |
511 | - | let | |
512 | - | if (( | |
490 | + | let usdcUsdnStaked = valueOrElse(getInteger(this, keyUSDCUSDN), 0) | |
491 | + | let singleUsdcLP = fraction(usdcUsdnStaked, def, usdcUsdnTCI) | |
492 | + | let usdcUsdnLpToWithdraw = fraction(singleUsdcLP, am, def) | |
493 | + | let fee = fraction(usdcUsdnLpToWithdraw, def, feePerc) | |
494 | + | let unstakeUsdcUsdnLP = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["EK6N7S38xbtBT3SxAqoGdDLCiX6rojX6G169CnSyuE5", usdcUsdnLpToWithdraw], nil) | |
495 | + | if ((unstakeUsdcUsdnLP == unstakeUsdcUsdnLP)) | |
513 | 496 | then { | |
514 | - | let | |
515 | - | let | |
516 | - | let | |
517 | - | let | |
518 | - | [ | |
497 | + | let usdcUsdnLPFee = ScriptTransfer(Address(tw), fee, usdcUsdnLP) | |
498 | + | let usdcUsdnTransfer = ScriptTransfer(i.caller, (usdcUsdnLpToWithdraw - fee), usdcUsdnLP) | |
499 | + | let updateUsdcUsdnLpStaked = IntegerEntry(keyUSDCUSDN, (usdcUsdnStaked - usdcUsdnLpToWithdraw)) | |
500 | + | let burnUsdcUsdnLpTci = Burn(usdcUsdnLPTCI, am) | |
501 | + | [usdcUsdnLPFee, usdcUsdnTransfer, updateUsdcUsdnLpStaked, burnUsdcUsdnLpTci] | |
519 | 502 | } | |
520 | 503 | else throw("Strict value is not equal to itself.") | |
521 | 504 | } | |
522 | - | else if ((id == | |
505 | + | else if ((id == usdcUsdtLPTCI)) | |
523 | 506 | then { | |
524 | - | let | |
507 | + | let usdcUsdtTci = match assetInfo(usdcUsdtLPTCI) { | |
525 | 508 | case q: Asset => | |
526 | 509 | q.quantity | |
527 | 510 | case _ => | |
528 | 511 | 0 | |
529 | 512 | } | |
530 | - | let | |
531 | - | let | |
532 | - | let | |
533 | - | let fee = fraction( | |
534 | - | let | |
535 | - | if (( | |
513 | + | let usdcUsdtStaked = valueOrElse(getInteger(this, keyUSDCUSDT), 0) | |
514 | + | let singleUsdcUsdt = fraction(usdcUsdtStaked, def, usdcUsdtTci) | |
515 | + | let usdcUsdtLpToWithdraw = fraction(singleUsdcUsdt, am, def) | |
516 | + | let fee = fraction(usdcUsdtLpToWithdraw, def, feePerc) | |
517 | + | let unstakeUsdcUsdtLP = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["EPhdEfmQaNcHyvDmRGhnLhgcJtKZ2a4k3ZBmKWtAEWyH", usdcUsdtLpToWithdraw], nil) | |
518 | + | if ((unstakeUsdcUsdtLP == unstakeUsdcUsdtLP)) | |
536 | 519 | then { | |
537 | - | let | |
538 | - | let | |
539 | - | let | |
540 | - | let | |
541 | - | [ | |
520 | + | let usdcUsdtLPFee = ScriptTransfer(Address(tw), fee, usdcUsdtLP) | |
521 | + | let usdcUsdtTransfer = ScriptTransfer(i.caller, (usdcUsdtLpToWithdraw - fee), usdcUsdtLP) | |
522 | + | let updateUsdcUsdtLpStaked = IntegerEntry(keyUSDCUSDT, (usdcUsdtStaked - usdcUsdtLpToWithdraw)) | |
523 | + | let burnUsdcUsdtLpTci = Burn(usdcUsdtLPTCI, am) | |
524 | + | [usdcUsdtLPFee, usdcUsdtTransfer, updateUsdcUsdtLpStaked, burnUsdcUsdtLpTci] | |
542 | 525 | } | |
543 | 526 | else throw("Strict value is not equal to itself.") | |
544 | 527 | } | |
545 | - | else if ((id == | |
528 | + | else if ((id == puzzleUsdnLPTCI)) | |
546 | 529 | then { | |
547 | - | let | |
530 | + | let puzzleUsdnTci = match assetInfo(puzzleUsdnLPTCI) { | |
548 | 531 | case q: Asset => | |
549 | 532 | q.quantity | |
550 | 533 | case _ => | |
551 | 534 | 0 | |
552 | 535 | } | |
553 | - | let | |
554 | - | let | |
555 | - | let | |
556 | - | let fee = fraction( | |
557 | - | let | |
558 | - | if (( | |
536 | + | let puzzleLPStaked = valueOrElse(getInteger(this, keyPUZZLEUSDN), 0) | |
537 | + | let singlePuzzleUsdn = fraction(puzzleLPStaked, def, puzzleUsdnTci) | |
538 | + | let puzzleUsdnWithdraw = fraction(singlePuzzleUsdn, am, def) | |
539 | + | let fee = fraction(puzzleUsdnWithdraw, def, feePerc) | |
540 | + | let unstakePuzzleUsdnLP = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["E8zHu33GfcNyGLypX77gZiUXfvuZQeaYmiEfsy7VYNwP", puzzleUsdnWithdraw], nil) | |
541 | + | if ((unstakePuzzleUsdnLP == unstakePuzzleUsdnLP)) | |
559 | 542 | then { | |
560 | - | let | |
561 | - | let | |
562 | - | let | |
563 | - | let | |
564 | - | [ | |
543 | + | let puzzleUsdnLPFee = ScriptTransfer(Address(tw), fee, puzzleUsdnLP) | |
544 | + | let puzzleUsdnTransfer = ScriptTransfer(i.caller, (puzzleUsdnWithdraw - fee), puzzleUsdnLP) | |
545 | + | let updatePuzzleUsdnLpStaked = IntegerEntry(keyPUZZLEUSDN, (puzzleLPStaked - puzzleUsdnWithdraw)) | |
546 | + | let burnPuzzleTCI = Burn(puzzleUsdnLPTCI, am) | |
547 | + | [puzzleUsdnLPFee, puzzleUsdnTransfer, updatePuzzleUsdnLpStaked, burnPuzzleTCI] | |
565 | 548 | } | |
566 | 549 | else throw("Strict value is not equal to itself.") | |
567 | 550 | } | |
568 | - | else if ((id == | |
551 | + | else if ((id == btcUsdnLPTCI)) | |
569 | 552 | then { | |
570 | - | let | |
553 | + | let btcUsdnTCI = match assetInfo(puzzleUsdnLPTCI) { | |
571 | 554 | case q: Asset => | |
572 | 555 | q.quantity | |
573 | 556 | case _ => | |
574 | 557 | 0 | |
575 | 558 | } | |
576 | - | let | |
577 | - | let | |
578 | - | let | |
579 | - | let fee = fraction( | |
580 | - | let | |
581 | - | if (( | |
559 | + | let btcUsdnStaked = valueOrElse(getInteger(this, keyBTCUSDN), 0) | |
560 | + | let singleBtcUsdn = fraction(btcUsdnStaked, def, btcUsdnTCI) | |
561 | + | let btcUsdnWithdraw = fraction(singleBtcUsdn, am, def) | |
562 | + | let fee = fraction(btcUsdnWithdraw, def, feePerc) | |
563 | + | let unstakeBtcUsdn = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["8WhH5CCJ6NakPvEvAJcizqqD7H6axhupdYHDFumSDwsy", btcUsdnWithdraw], nil) | |
564 | + | if ((unstakeBtcUsdn == unstakeBtcUsdn)) | |
582 | 565 | then { | |
583 | - | let | |
584 | - | let | |
585 | - | let | |
586 | - | let | |
587 | - | [ | |
566 | + | let btcUsdnLPFee = ScriptTransfer(Address(tw), fee, btcUsdnLP) | |
567 | + | let btcUsdnTransfer = ScriptTransfer(i.caller, (btcUsdnWithdraw - fee), btcUsdnLP) | |
568 | + | let updateBtcUsdnLPStaked = IntegerEntry(keyBTCUSDN, (btcUsdnStaked - btcUsdnWithdraw)) | |
569 | + | let burnBtcUsdnTci = Burn(btcUsdnLPTCI, am) | |
570 | + | [btcUsdnLPFee, btcUsdnTransfer, updateBtcUsdnLPStaked, burnBtcUsdnTci] | |
588 | 571 | } | |
589 | 572 | else throw("Strict value is not equal to itself.") | |
590 | 573 | } | |
591 | - | else if ((id == | |
574 | + | else if ((id == wavesUsdnLPTCI)) | |
592 | 575 | then { | |
593 | - | let | |
576 | + | let wavesUsdnTCI = match assetInfo(wavesUsdnLPTCI) { | |
594 | 577 | case q: Asset => | |
595 | 578 | q.quantity | |
596 | 579 | case _ => | |
597 | 580 | 0 | |
598 | 581 | } | |
599 | - | let | |
600 | - | let | |
601 | - | let | |
602 | - | let fee = fraction( | |
603 | - | let | |
604 | - | if (( | |
582 | + | let wavesUsdnStaked = valueOrElse(getInteger(this, keyWAVESUSDN), 0) | |
583 | + | let singleWavesUsdn = fraction(wavesUsdnStaked, def, wavesUsdnTCI) | |
584 | + | let wavesUsdnWithdraw = fraction(singleWavesUsdn, am, def) | |
585 | + | let fee = fraction(wavesUsdnWithdraw, def, feePerc) | |
586 | + | let unstakeWavesUsdn = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1", wavesUsdnWithdraw], nil) | |
587 | + | if ((unstakeWavesUsdn == unstakeWavesUsdn)) | |
605 | 588 | then { | |
606 | - | let | |
607 | - | let | |
608 | - | let | |
609 | - | let | |
610 | - | [ | |
589 | + | let wavesUsndFee = ScriptTransfer(Address(tw), fee, wavesUsdnLP) | |
590 | + | let wavesUsdnTransfer = ScriptTransfer(i.caller, (wavesUsdnWithdraw - fee), wavesUsdnLP) | |
591 | + | let updateWavesUsdnLPStaked = IntegerEntry(keyWAVESUSDN, (wavesUsdnStaked - wavesUsdnWithdraw)) | |
592 | + | let burnWavesUsdnTCI = Burn(wavesUsdnLPTCI, am) | |
593 | + | [wavesUsndFee, wavesUsdnTransfer, updateWavesUsdnLPStaked, burnWavesUsdnTCI] | |
611 | 594 | } | |
612 | 595 | else throw("Strict value is not equal to itself.") | |
613 | 596 | } | |
614 | - | else if ((id == | |
597 | + | else if ((id == ennoUsdnLPTCI)) | |
615 | 598 | then { | |
616 | - | let | |
599 | + | let ennoUsdnTCI = match assetInfo(ennoUsdnLPTCI) { | |
617 | 600 | case q: Asset => | |
618 | 601 | q.quantity | |
619 | 602 | case _ => | |
620 | 603 | 0 | |
621 | 604 | } | |
622 | - | let | |
623 | - | let | |
624 | - | let | |
625 | - | let fee = fraction( | |
626 | - | let | |
627 | - | if (( | |
605 | + | let ennoUsdnStaked = valueOrElse(getInteger(this, keyENNOUSDN), 0) | |
606 | + | let singleEnnoUsdn = fraction(ennoUsdnStaked, def, ennoUsdnTCI) | |
607 | + | let ennoUsdnWithdraw = fraction(singleEnnoUsdn, am, def) | |
608 | + | let fee = fraction(ennoUsdnWithdraw, def, feePerc) | |
609 | + | let unstakeEnnoUsdn = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["HnW33dcEaeUTcgMLd8vHoJR5iAFZ2ngHDAa9E9496kDX", ennoUsdnWithdraw], nil) | |
610 | + | if ((unstakeEnnoUsdn == unstakeEnnoUsdn)) | |
628 | 611 | then { | |
629 | - | let | |
630 | - | let | |
631 | - | let | |
632 | - | let | |
633 | - | [ | |
612 | + | let ennoUsdnFee = ScriptTransfer(Address(tw), fee, ennoUsdnLP) | |
613 | + | let ennoUsdnTransfer = ScriptTransfer(i.caller, (ennoUsdnWithdraw - fee), ennoUsdnLP) | |
614 | + | let updateEnnoUsdnLPStaked = IntegerEntry(keyENNOUSDN, (ennoUsdnStaked - ennoUsdnWithdraw)) | |
615 | + | let burnEnnoUsdnTCI = Burn(ennoUsdnLPTCI, am) | |
616 | + | [ennoUsdnFee, ennoUsdnTransfer, updateEnnoUsdnLPStaked, burnEnnoUsdnTCI] | |
634 | 617 | } | |
635 | 618 | else throw("Strict value is not equal to itself.") | |
636 | 619 | } | |
637 | - | else if ((id == | |
620 | + | else if ((id == nsbtUsdnLPTCI)) | |
638 | 621 | then { | |
639 | - | let | |
622 | + | let nsbtUsdnTCI = match assetInfo(nsbtUsdnLPTCI) { | |
640 | 623 | case q: Asset => | |
641 | 624 | q.quantity | |
642 | 625 | case _ => | |
643 | 626 | 0 | |
644 | 627 | } | |
645 | - | let | |
646 | - | let | |
647 | - | let | |
648 | - | let fee = fraction( | |
649 | - | let | |
650 | - | if (( | |
628 | + | let nsbtUsdnStaked = valueOrElse(getInteger(this, keyNSBTUSDN), 0) | |
629 | + | let singleNsbtUsdn = fraction(nsbtUsdnStaked, def, nsbtUsdnTCI) | |
630 | + | let nsbtUsdnWithdraw = fraction(singleNsbtUsdn, am, def) | |
631 | + | let fee = fraction(nsbtUsdnWithdraw, def, feePerc) | |
632 | + | let unstakeNsbtUsdn = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["AGo49HCtQUghfxHSpUXub3KBaMXyunJmTxQ4azgU5Ax5", nsbtUsdnWithdraw], nil) | |
633 | + | if ((unstakeNsbtUsdn == unstakeNsbtUsdn)) | |
651 | 634 | then { | |
652 | - | let | |
653 | - | let | |
654 | - | let | |
655 | - | let | |
656 | - | [ | |
635 | + | let nsbtUsdnFee = ScriptTransfer(Address(tw), fee, nsbtUsdnLP) | |
636 | + | let nsbtUsdnTransfer = ScriptTransfer(i.caller, (nsbtUsdnWithdraw - fee), nsbtUsdnLP) | |
637 | + | let updateNsbtUsdnStaked = IntegerEntry(keyNSBTUSDN, (nsbtUsdnStaked - nsbtUsdnWithdraw)) | |
638 | + | let burnNsbtUsdnTCI = Burn(nsbtUsdnLPTCI, am) | |
639 | + | [nsbtUsdnFee, nsbtUsdnTransfer, updateNsbtUsdnStaked, burnNsbtUsdnTCI] | |
657 | 640 | } | |
658 | 641 | else throw("Strict value is not equal to itself.") | |
659 | 642 | } | |
660 | - | else throw("Invalid asset") | |
643 | + | else if ((id == ltcUsdnLPTCI)) | |
644 | + | then { | |
645 | + | let ltcUsdnTCI = match assetInfo(ltcUsdnLPTCI) { | |
646 | + | case q: Asset => | |
647 | + | q.quantity | |
648 | + | case _ => | |
649 | + | 0 | |
650 | + | } | |
651 | + | let ltcUsdnStaked = valueOrElse(getInteger(this, keyLTCUSDN), 0) | |
652 | + | let singleLtcUsdn = fraction(ltcUsdnStaked, def, ltcUsdnTCI) | |
653 | + | let ltcUsdnWithdraw = fraction(singleLtcUsdn, am, def) | |
654 | + | let fee = fraction(ltcUsdnWithdraw, def, feePerc) | |
655 | + | let unstakeLtcUsdn = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "unstake", ["CNkqC6GPi888WdJ1EuVtu9JGZ9VHpAn8eTHwR8YZxXbv", ltcUsdnWithdraw], nil) | |
656 | + | if ((unstakeLtcUsdn == unstakeLtcUsdn)) | |
657 | + | then { | |
658 | + | let ltcUsdnFee = ScriptTransfer(Address(tw), fee, ltcUsdnLP) | |
659 | + | let ltcUsdnTransfer = ScriptTransfer(i.caller, (ltcUsdnWithdraw - fee), ltcUsdnLP) | |
660 | + | let updateLtcUsdnStaked = IntegerEntry(keyLTCUSDN, (ltcUsdnStaked - ltcUsdnWithdraw)) | |
661 | + | let burnLtcUsdnTCI = Burn(ltcUsdnLPTCI, am) | |
662 | + | [ltcUsdnFee, ltcUsdnTransfer, updateLtcUsdnStaked, burnLtcUsdnTCI] | |
663 | + | } | |
664 | + | else throw("Strict value is not equal to itself.") | |
665 | + | } | |
666 | + | else throw("Invalid asset") | |
661 | 667 | } | |
662 | 668 | ||
663 | 669 | ||
664 | 670 | ||
665 | 671 | @Callable(i) | |
666 | 672 | func compoundWxUsdnLP () = { | |
667 | 673 | let compound = value(i.payments[0]) | |
668 | 674 | let ca = compound.amount | |
669 | 675 | let isOracle = checkAddress(i.caller.bytes) | |
670 | 676 | if ((compound.assetId != wxUsdnLP)) | |
671 | 677 | then throw("attach WXUSDNLP tokens only") | |
672 | 678 | else if (!(isOracle)) | |
673 | 679 | then throw("You are not authotized to call this function") | |
674 | 680 | else { | |
675 | 681 | let fromCompound = valueOrElse(getInteger(this, keywxUsdnCompound), 0) | |
676 | 682 | let totalStaked = valueOrElse(getInteger(this, keyWXUSDN), 0) | |
677 | 683 | let stakeC = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [compound]) | |
678 | 684 | if ((stakeC == stakeC)) | |
679 | 685 | then { | |
680 | 686 | let updateState = IntegerEntry(keyWXUSDN, (totalStaked + ca)) | |
681 | 687 | let tc = IntegerEntry(keywxUsdnCompound, (fromCompound + ca)) | |
682 | 688 | [updateState, tc] | |
683 | 689 | } | |
684 | 690 | else throw("Strict value is not equal to itself.") | |
685 | 691 | } | |
686 | 692 | } | |
687 | 693 | ||
688 | 694 | ||
689 | 695 | ||
690 | 696 | @Callable(i) | |
691 | 697 | func compoundUsdtUsdnLP () = { | |
692 | 698 | let compound = value(i.payments[0]) | |
693 | 699 | let ca = compound.amount | |
694 | 700 | let isOracle = checkAddress(i.caller.bytes) | |
695 | 701 | if ((compound.assetId != usdtUsdnLP)) | |
696 | 702 | then throw("attach USDTUSDNLP tokens only") | |
697 | 703 | else if (!(isOracle)) | |
698 | 704 | then throw("You are not authotized to call this function") | |
699 | 705 | else { | |
700 | 706 | let fromCompound = valueOrElse(getInteger(this, keyCompound), 0) | |
701 | 707 | let totalStaked = valueOrElse(getInteger(this, keyStaked), 0) | |
702 | 708 | let stakeC = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [compound]) | |
703 | 709 | if ((stakeC == stakeC)) | |
704 | 710 | then { | |
705 | 711 | let updateState = IntegerEntry(keyStaked, (totalStaked + ca)) | |
706 | 712 | let tc = IntegerEntry(keyCompound, (fromCompound + ca)) | |
707 | 713 | [updateState, tc] | |
708 | 714 | } | |
709 | 715 | else throw("Strict value is not equal to itself.") | |
710 | 716 | } | |
711 | 717 | } | |
712 | 718 | ||
713 | 719 | ||
714 | 720 | ||
715 | 721 | @Callable(i) | |
716 | 722 | func compoundUsdcUsdnLP () = { | |
717 | 723 | let compound = value(i.payments[0]) | |
718 | 724 | let ca = compound.amount | |
719 | 725 | let isOracle = checkAddress(i.caller.bytes) | |
720 | 726 | if ((compound.assetId != usdcUsdnLP)) | |
721 | 727 | then throw("attach USDCUSDNLP tokens only") | |
722 | 728 | else if (!(isOracle)) | |
723 | 729 | then throw("You are not authotized to call this function") | |
724 | 730 | else { | |
725 | 731 | let fromCompound = valueOrElse(getInteger(this, keyUsdcUsdnCompound), 0) | |
726 | 732 | let totalStaked = valueOrElse(getInteger(this, keyUSDCUSDN), 0) | |
727 | 733 | let stakeC = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [compound]) | |
728 | 734 | if ((stakeC == stakeC)) | |
729 | 735 | then { | |
730 | 736 | let updateState = IntegerEntry(keyUSDCUSDN, (totalStaked + ca)) | |
731 | 737 | let tc = IntegerEntry(keyUsdcUsdnCompound, (fromCompound + ca)) | |
732 | 738 | [updateState, tc] | |
733 | 739 | } | |
734 | 740 | else throw("Strict value is not equal to itself.") | |
735 | 741 | } | |
736 | 742 | } | |
737 | 743 | ||
738 | 744 | ||
739 | 745 | ||
740 | 746 | @Callable(i) | |
741 | 747 | func compoundUsdcUsdtLP () = { | |
742 | 748 | let compound = value(i.payments[0]) | |
743 | 749 | let ca = compound.amount | |
744 | 750 | let isOracle = checkAddress(i.caller.bytes) | |
745 | 751 | if ((compound.assetId != usdcUsdtLP)) | |
746 | 752 | then throw("attach USDCUSDTLP tokens only") | |
747 | 753 | else if (!(isOracle)) | |
748 | 754 | then throw("You are not authotized to call this function") | |
749 | 755 | else { | |
750 | 756 | let fromCompound = valueOrElse(getInteger(this, keyUsdcUsdtCompound), 0) | |
751 | 757 | let totalStaked = valueOrElse(getInteger(this, keyUSDCUSDT), 0) | |
752 | 758 | let stakeC = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [compound]) | |
753 | 759 | if ((stakeC == stakeC)) | |
754 | 760 | then { | |
755 | 761 | let updateState = IntegerEntry(keyUSDCUSDT, (totalStaked + ca)) | |
756 | 762 | let tc = IntegerEntry(keyUsdcUsdtCompound, (fromCompound + ca)) | |
757 | 763 | [updateState, tc] | |
758 | 764 | } | |
759 | 765 | else throw("Strict value is not equal to itself.") | |
760 | 766 | } | |
761 | 767 | } | |
762 | 768 | ||
763 | 769 | ||
764 | 770 | ||
765 | 771 | @Callable(i) | |
766 | 772 | func compoundPuzzleUsdnLP () = { | |
767 | 773 | let compound = value(i.payments[0]) | |
768 | 774 | let ca = compound.amount | |
769 | 775 | let isOracle = checkAddress(i.caller.bytes) | |
770 | 776 | if ((compound.assetId != puzzleUsdnLP)) | |
771 | 777 | then throw("attach PUZZLEUSDNLP tokens only") | |
772 | 778 | else if (!(isOracle)) | |
773 | 779 | then throw("You are not authotized to call this function") | |
774 | 780 | else { | |
775 | 781 | let fromCompound = valueOrElse(getInteger(this, keyPuzzleUsdnCompound), 0) | |
776 | 782 | let totalStaked = valueOrElse(getInteger(this, keyPUZZLEUSDN), 0) | |
777 | 783 | let stakeC = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [compound]) | |
778 | 784 | if ((stakeC == stakeC)) | |
779 | 785 | then { | |
780 | 786 | let updateState = IntegerEntry(keyPUZZLEUSDN, (totalStaked + ca)) | |
781 | 787 | let tc = IntegerEntry(keyPuzzleUsdnCompound, (fromCompound + ca)) | |
782 | 788 | [updateState, tc] | |
783 | 789 | } | |
784 | 790 | else throw("Strict value is not equal to itself.") | |
785 | 791 | } | |
786 | 792 | } | |
787 | 793 | ||
788 | 794 | ||
789 | 795 | ||
790 | 796 | @Callable(i) | |
791 | 797 | func compoundNsbtUsdnLP () = { | |
792 | 798 | let compound = value(i.payments[0]) | |
793 | 799 | let ca = compound.amount | |
794 | 800 | let isOracle = checkAddress(i.caller.bytes) | |
795 | 801 | if ((compound.assetId != nsbtUsdnLP)) | |
796 | 802 | then throw("attach NSBTUSDNLP tokens only") | |
797 | 803 | else if (!(isOracle)) | |
798 | 804 | then throw("You are not authotized to call this function") | |
799 | 805 | else { | |
800 | 806 | let fromCompound = valueOrElse(getInteger(this, keyNsbtUsdnCompound), 0) | |
801 | 807 | let totalStaked = valueOrElse(getInteger(this, keyNSBTUSDN), 0) | |
802 | 808 | let stakeC = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [compound]) | |
803 | 809 | if ((stakeC == stakeC)) | |
804 | 810 | then { | |
805 | 811 | let updateState = IntegerEntry(keyNSBTUSDN, (totalStaked + ca)) | |
806 | 812 | let tc = IntegerEntry(keyNsbtUsdnCompound, (fromCompound + ca)) | |
807 | 813 | [updateState, tc] | |
808 | 814 | } | |
809 | 815 | else throw("Strict value is not equal to itself.") | |
810 | 816 | } | |
811 | 817 | } | |
812 | 818 | ||
813 | 819 | ||
814 | 820 | ||
815 | 821 | @Callable(i) | |
816 | 822 | func compoundBtcUsdnLP () = { | |
817 | 823 | let compound = value(i.payments[0]) | |
818 | 824 | let ca = compound.amount | |
819 | 825 | let isOracle = checkAddress(i.caller.bytes) | |
820 | 826 | if ((compound.assetId != btcUsdnLP)) | |
821 | 827 | then throw("attach BTCUSDNLP tokens only") | |
822 | 828 | else if (!(isOracle)) | |
823 | 829 | then throw("You are not authotized to call this function") | |
824 | 830 | else { | |
825 | 831 | let fromCompound = valueOrElse(getInteger(this, keyBtcUsdnCompound), 0) | |
826 | 832 | let totalStaked = valueOrElse(getInteger(this, keyBTCUSDN), 0) | |
827 | 833 | let stakeC = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [compound]) | |
828 | 834 | if ((stakeC == stakeC)) | |
829 | 835 | then { | |
830 | 836 | let updateState = IntegerEntry(keyBTCUSDN, (totalStaked + ca)) | |
831 | 837 | let tc = IntegerEntry(keyBtcUsdnCompound, (fromCompound + ca)) | |
832 | 838 | [updateState, tc] | |
833 | 839 | } | |
834 | 840 | else throw("Strict value is not equal to itself.") | |
835 | 841 | } | |
836 | 842 | } | |
837 | 843 | ||
838 | 844 | ||
839 | 845 | ||
840 | 846 | @Callable(i) | |
841 | 847 | func compoundEnnoUsdnLP () = { | |
842 | 848 | let compound = value(i.payments[0]) | |
843 | 849 | let ca = compound.amount | |
844 | 850 | let isOracle = checkAddress(i.caller.bytes) | |
845 | 851 | if ((compound.assetId != ennoUsdnLP)) | |
846 | 852 | then throw("attach ENNOUSDNLP tokens only") | |
847 | 853 | else if (!(isOracle)) | |
848 | 854 | then throw("You are not authotized to call this function") | |
849 | 855 | else { | |
850 | 856 | let fromCompound = valueOrElse(getInteger(this, keyEnnoUsdnCompound), 0) | |
851 | 857 | let totalStaked = valueOrElse(getInteger(this, keyENNOUSDN), 0) | |
852 | 858 | let stakeC = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [compound]) | |
853 | 859 | if ((stakeC == stakeC)) | |
854 | 860 | then { | |
855 | 861 | let updateState = IntegerEntry(keyENNOUSDN, (totalStaked + ca)) | |
856 | 862 | let tc = IntegerEntry(keyEnnoUsdnCompound, (fromCompound + ca)) | |
857 | 863 | [updateState, tc] | |
858 | 864 | } | |
859 | 865 | else throw("Strict value is not equal to itself.") | |
860 | 866 | } | |
861 | 867 | } | |
862 | 868 | ||
863 | 869 | ||
864 | 870 | ||
865 | 871 | @Callable(i) | |
866 | 872 | func compoundWavesUsdnLP () = { | |
867 | 873 | let compound = value(i.payments[0]) | |
868 | 874 | let ca = compound.amount | |
869 | 875 | let isOracle = checkAddress(i.caller.bytes) | |
870 | 876 | if ((compound.assetId != wavesUsdnLP)) | |
871 | 877 | then throw("attach WAVESUSDNLP tokens only") | |
872 | 878 | else if (!(isOracle)) | |
873 | 879 | then throw("You are not authotized to call this function") | |
874 | 880 | else { | |
875 | 881 | let fromCompound = valueOrElse(getInteger(this, keyWavesUsdnCompound), 0) | |
876 | 882 | let totalStaked = valueOrElse(getInteger(this, keyWAVESUSDN), 0) | |
877 | 883 | let stakeC = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [compound]) | |
878 | 884 | if ((stakeC == stakeC)) | |
879 | 885 | then { | |
880 | 886 | let updateState = IntegerEntry(keyWAVESUSDN, (totalStaked + ca)) | |
881 | 887 | let tc = IntegerEntry(keyWavesUsdnCompound, (fromCompound + ca)) | |
882 | 888 | [updateState, tc] | |
883 | 889 | } | |
884 | 890 | else throw("Strict value is not equal to itself.") | |
885 | 891 | } | |
886 | 892 | } | |
887 | 893 | ||
888 | 894 | ||
889 | 895 | ||
890 | 896 | @Callable(i) | |
891 | 897 | func compoundLtcUsdnLP () = { | |
892 | 898 | let compound = value(i.payments[0]) | |
893 | 899 | let ca = compound.amount | |
894 | 900 | let isOracle = checkAddress(i.caller.bytes) | |
895 | 901 | if ((compound.assetId != ltcUsdnLP)) | |
896 | 902 | then throw("attach LTCUSDNLP tokens only") | |
897 | 903 | else if (!(isOracle)) | |
898 | 904 | then throw("You are not authotized to call this function") | |
899 | 905 | else { | |
900 | 906 | let fromCompound = valueOrElse(getInteger(this, keyLtcUsdnCompound), 0) | |
901 | 907 | let totalStaked = valueOrElse(getInteger(this, keyWAVESUSDN), 0) | |
902 | 908 | let stakeC = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "stake", nil, [compound]) | |
903 | 909 | if ((stakeC == stakeC)) | |
904 | 910 | then { | |
905 | 911 | let updateState = IntegerEntry(keyLTCUSDN, (totalStaked + ca)) | |
906 | 912 | let tc = IntegerEntry(keyLtcUsdnCompound, (fromCompound + ca)) | |
907 | 913 | [updateState, tc] | |
908 | 914 | } | |
909 | 915 | else throw("Strict value is not equal to itself.") | |
910 | 916 | } | |
911 | 917 | } | |
912 | 918 | ||
913 | 919 | ||
920 | + | ||
921 | + | @Callable(i) | |
922 | + | func initNSBTUSDN () = { | |
923 | + | let pm = value(i.payments[0]) | |
924 | + | let am = pm.amount | |
925 | + | if ((pm.assetId != nsbtUsdnLP)) | |
926 | + | then throw("Unexpected token") | |
927 | + | else { | |
928 | + | let s = invoke(Address(base58'3Mx3zmXrMcLFCafMuPtXAzR4ZPVeZYb6qLz'), "stake", nil, [pm]) | |
929 | + | if ((s == s)) | |
930 | + | then { | |
931 | + | let upd = IntegerEntry(keyNSBTUSDN, 556149658) | |
932 | + | let updK = IntegerEntry(keyNsbtUsdnCompound, 0) | |
933 | + | [upd, updK] | |
934 | + | } | |
935 | + | else throw("Strict value is not equal to itself.") | |
936 | + | } | |
937 | + | } | |
938 | + | ||
939 | + | ||
940 | + | ||
941 | + | @Callable(i) | |
942 | + | func sponsorBoost () = { | |
943 | + | let pm = value(i.payments[0]) | |
944 | + | let lockPeriod = 100 | |
945 | + | if ((pm.assetId != wxId)) | |
946 | + | then throw("Error") | |
947 | + | else { | |
948 | + | let sponsored = valueOrElse(getInteger(this, keySponsorship), 0) | |
949 | + | let lock = invoke(Address(base58'3PJL8Hn8LACaSBWLQ3UVhctA5cTQLBFwBAP'), "increaseLock", [lockPeriod], [pm]) | |
950 | + | if ((lock == lock)) | |
951 | + | then { | |
952 | + | let s = IntegerEntry(keySponsorship, (pm.amount + sponsored)) | |
953 | + | [s] | |
954 | + | } | |
955 | + | else throw("Strict value is not equal to itself.") | |
956 | + | } | |
957 | + | } | |
958 | + | ||
959 | + | ||
914 | 960 | @Verifier(tx) | |
915 | 961 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
916 | 962 |
github/deemru/w8io/3ef1775 196.14 ms ◑![]()