tx · AYygWMJdeActRtNjLCsdDSXtW7Cfwcuw4J7aHu8qf4NG

3PLrr8LpfYjUadnEQ1ov61uMWHdMopUCNAm:  -0.06000000 Waves

2023.12.28 18:15 [3972641] smart account 3PLrr8LpfYjUadnEQ1ov61uMWHdMopUCNAm > SELF 0.00000000 Waves

{ "type": 13, "id": "AYygWMJdeActRtNjLCsdDSXtW7Cfwcuw4J7aHu8qf4NG", "fee": 6000000, "feeAssetId": null, "timestamp": 1703776334901, "version": 2, "chainId": 87, "sender": "3PLrr8LpfYjUadnEQ1ov61uMWHdMopUCNAm", "senderPublicKey": "9iad7wmJLjXSuuid6X6UicRw3yJkLkSMrJoyKdDd5zbx", "proofs": [ "5SC5md2aeYcK8zwwyi4YbhtkSybE5t91GoZB1aRugNkbnyH3vXteYqWKMneFeo9Eyay6QkPA2DwXTMRcEoP9uGqg" ], "script": "base64:BgKMAQgCEhAKDhgYAQEICAEBAQEBCAEIEgMKAQESAwoBARIAEgQKAggBEgQKAggBEgMKAQESBAoCCAESAwoBARIECgIIARIFCgMICAESAwoBCBIAEgASAwoBCBIAEgMKAQESAwoBCBIDCgEIEgQKAgEBEgYKBAEBAQESABIAEgASAwoBCBIECgIIARIDCgEIfgADU0VQAgJfXwAFV0FWRVMCBXdhdmVzAAdNQVhfSU5UAP//////////fwAHTUFYX0ZFRQDAhD0ADU1BWF9BTVBMSUZJRVIAwIQ9ABRNQVhfV0VJR0hUX0FNUExJRklFUgDAhD0ACk1BWF9XRUlHSFQAwIQ9AA9GRUVfUkFURV9GQUNUT1IAwIQ9AAtSQVRFX0ZBQ1RPUgDAhD0ADlBFUkNFTlRfRkFDVE9SCQC2AgEAgICQu7rWrfANABdESVNCQWxBTkNFX0NPRUZGX0ZBQ1RPUgkAtgIBAICglKWNHQAQWkVST19JTlRfTElTVF8xMAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAFA25pbAAQWkVST19JTlRfTElTVF8xMQkAzQgCBRBaRVJPX0lOVF9MSVNUXzEwAAAACklOREVYX0xJU1QJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJBQNuaWwAC1pFUk9fQklHSU5UCQC2AgEAAAATWkVST19CSUdJTlRfTElTVF8xMQkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAUDbmlsAAxJTlRfREVDSU1BTFMACAAPQklHSU5UX0RFQ0lNQUxTABIAB0xJU1RfNjQJAL0JAgJ/MF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMAIBXwAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgALS0VZX1NUT1JBR0UCB1NUT1JBR0UACktFWV9BU1NFVFMCBkFTU0VUUwASS0VZX0FTU0VUX0JBTEFOQ0VTAg5BU1NFVF9CQUxBTkNFUwATS0VZX1JFV0FSRF9CQUxBTkNFUwIPUkVXQVJEX0JBTEFOQ0VTABFLRVlfQVNTRVRfV0VJR0hUUwINQVNTRVRfV0VJR0hUUwAKS0VZX0xQX0ZFRQIGTFBfRkVFABBLRVlfUFJPVE9DT0xfRkVFAgxQUk9UT0NPTF9GRUUADUtFWV9QUkVDSVNJT04CCVBSRUNJU0lPTgAUS0VZX1NJR01BX0ZFRV9QRVJfTFACEFNJR01BX0ZFRV9QRVJfTFAAGUtFWV9VU0VSX1NJR01BX0ZFRV9QRVJfTFACFVVTRVJfU0lHTUFfRkVFX1BFUl9MUAALS0VZX1VTRVJfTFACB1VTRVJfTFAADEtFWV9UT1RBTF9MUAIIVE9UQUxfTFAAEEtFWV9VU0VSX1BST0ZJVFMCDFVTRVJfUFJPRklUUwAMS0VZX1dBVENIRE9HAghXQVRDSERPRwATS0VZX1dBVENIRE9HX09GRlNFVAIPV0FUQ0hET0dfT0ZGU0VUABNLRVlfV0FUQ0hET0dfSEVJR0hUAg9XQVRDSERPR19IRUlHSFQBEF92YWxpZGF0ZUFkZHJlc3MCCGFkZHJlc3NfBGVycl8EByRtYXRjaDAJAKYIAQUIYWRkcmVzc18DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYJAAIBBQRlcnJfAQ5fdmFsaWRhdGVBc3NldAIIYXNzZXRJZF8EZXJyXwMJAAACBQhhc3NldElkXwUFV0FWRVMGBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEMX3ZhbGlkYXRlSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAZgIFDmxvd2VyQm91bmRhcnlfBQR2YWxfBgkAZgIFBHZhbF8FDnVwcGVyQm91bmRhcnlfCQACAQUEZXJyXwYBDV92YWxpZGF0ZUJvb2wDBHZhbF8HdGFyZ2V0XwRlcnJfAwkBAiE9AgUEdmFsXwUHdGFyZ2V0XwkAAgEFBGVycl8GARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GARRfdmFsaWRhdGVTdHJpbmdOb3RFcQMFdmFsMV8FdmFsMl8EZXJyXwMJAAACBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEQX3ZhbGlkYXRlSW50TGlzdAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAckbWF0Y2gwCQC2CQEFBGVsZW0DCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwAwUDYWNjCQEMX3ZhbGlkYXRlSW50BAUBYQUObG93ZXJCb3VuZGFyeV8FDnVwcGVyQm91bmRhcnlfBQRlcnJfBwkAAgEFBGVycl8KAAIkbAUEdmFsXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEPX3ZhbGlkYXRlQXNzZXRzAgdhc3NldHNfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0DBQNhY2MJAQ5fdmFsaWRhdGVBc3NldAIFBGVsZW0FBGVycl8HCgACJGwFB2Fzc2V0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBEl92YWxpZGF0ZUludEVxdWFscwMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GARJfdmFsaWRhdGVUb2tlbk5hbWUCBHZhbF8EZXJyXwMDCQBmAgAECQCxAgEFBHZhbF8GCQBmAgkAsQIBBQR2YWxfABAJAAIBBQRlcnJfBgETX3ZhbGlkYXRlVG9rZW5EZXNjcgIEdmFsXwRlcnJfAwkAZgIJALECAQUEdmFsXwDoBwkAAgEFBGVycl8GARFfdmFsaWRhdGVEZWNpbWFscwIEdmFsXwRlcnJfAwMJAGYCAAAFBHZhbF8GCQBmAgUEdmFsXwAICQACAQUEZXJyXwYBEF92YWxpZGF0ZVBheW1lbnQECHBheW1lbnRfCGFzc2V0SWRfD3JlcXVpcmVkQW1vdW50XwRlcnJfBAckbWF0Y2gwCAUIcGF5bWVudF8HYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwAwkBAiE9AgUIYXNzZXRJZF8JANgEAQUBYQkAAgEJAKwCAgUEZXJyXwIHOiBhc3NldAMJAGYCBQ9yZXF1aXJlZEFtb3VudF8IBQhwYXltZW50XwZhbW91bnQJAAIBCQCsAgIFBGVycl8CCDogYW1vdW50BgkAAgEJAKwCAgUEZXJyXwIHOiBhc3NldAEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwVsaXN0XwR2YWxfBGVycl8DCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQVsaXN0XwUEdmFsXwkAAgEFBGVycl8GAQtfYXNzZXRUb1N0cgEGYXNzZXRfBAckbWF0Y2gwBQZhc3NldF8DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAkA2AQBBQFhBQVXQVZFUwELX3N0clRvQXNzZXQBBmFzc2V0XwMDCQAAAgUGYXNzZXRfBQVXQVZFUwYJAAACBQZhc3NldF8CAAUEdW5pdAkA2QQBBQZhc3NldF8BCl9sb2FkUGF1c2UABAckbWF0Y2gwCQCgCAEFCktFWV9QQVVTRUQDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYQUHJG1hdGNoMAUBYQcBCl9zYXZlUGF1c2UBCWlzUGF1c2VkXwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUKS0VZX1BBVVNFRAUJaXNQYXVzZWRfBQNuaWwBC19sb2FkUGF1c2VyAAQHJG1hdGNoMAkAoggBBQpLRVlfUEFVU0VSAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABC19zYXZlUGF1c2VyAQdwYXVzZXJfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9QQVVTRVIJAKUIAQUHcGF1c2VyXwUDbmlsAQ1fbG9hZE11bHRpc2lnAAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAENX3NhdmVNdWx0aXNpZwEJbXVsdGlzaWdfCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9NVUxUSVNJRwkApQgBBQltdWx0aXNpZ18FA25pbAEMX2xvYWRTdG9yYWdlAAQHJG1hdGNoMAkAoggBBQtLRVlfU1RPUkFHRQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAEBnN0cnVjdAkAtQkCBQFhBQNTRVAJAJwKCgkA2QQBCQCRAwIFBnN0cnVjdAAACQAAAgkAkQMCBQZzdHJ1Y3QAAQIBMQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAFCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAICQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBnN0cnVjdAAJCQCcCgoBAAcAAAAAAAAAAAAAAAAAAAkBB0FkZHJlc3MBAQABDF9zYXZlU3RvcmFnZQEIc3RvcmFnZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgULS0VZX1NUT1JBR0UJALkJAgkAzAgCCQDYBAEIBQhzdG9yYWdlXwJfMQkAzAgCAwgFCHN0b3JhZ2VfAl8yAgExAgEwCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl8zCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl80CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl81CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl82CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl83CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl84CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl85CQDMCAIJAKUIAQgFCHN0b3JhZ2VfA18xMAUDbmlsBQNTRVAFA25pbAELX2xvYWRBc3NldHMABAckbWF0Y2gwCQCiCAEFCktFWV9BU1NFVFMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACQC9CQIFAWEFA1NFUAUDbmlsBQNuaWwBC19zYXZlQXNzZXRzAQdhc3NldHNfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9BU1NFVFMJALsJAgUHYXNzZXRzXwUDU0VQBQNuaWwBEl9sb2FkQXNzZXRCYWxhbmNlcwAKAQhmb2xkRnVuYwIDYWNjBGVsZW0EB2JhbGFuY2UJAQ1wYXJzZUludFZhbHVlAQUEZWxlbQkAlAoCCQDNCAIIBQNhY2MCXzEFB2JhbGFuY2UJAGQCCAUD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BGVsZW0JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFEEtFWV9VU0VSX1BST0ZJVFMJAMwIAgkApQgBBQV1c2VyXwUDbmlsBQNTRVAJALsJAgoAAiRsBQR2YWxfCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBQNTRVAFA25pbAENX2xvYWRXYXRjaGRvZwAEByRtYXRjaDAJAKIIAQUMS0VZX1dBVENIRE9HAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlV2F0Y2hkb2cBCXdhdGNoZG9nXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfV0FUQ0hET0cJAKUIAQUJd2F0Y2hkb2dfBQNuaWwBE19sb2FkV2F0Y2hkb2dPZmZzZXQABAckbWF0Y2gwCQCfCAEFE0tFWV9XQVRDSERPR19PRkZTRVQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABE19zYXZlV2F0Y2hkb2dPZmZzZXQBB29mZnNldF8JAMwIAgkBDEludGVnZXJFbnRyeQIFE0tFWV9XQVRDSERPR19PRkZTRVQFB29mZnNldF8FA25pbAERX29ubHlUaGlzQ29udHJhY3QBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfBQR0aGlzCQACAQIZX29ubHlUaGlzQ29udHJhY3Q6IHJldmVydAYBEF93aGVuTXVsdGlzaWdTZXQAAwkAAAIJAQ1fbG9hZE11bHRpc2lnAAkBB0FkZHJlc3MBAQAJAAIBAhhfd2hlbk11bHRpc2lnU2V0OiByZXZlcnQGARNfd2hlbk5vdEluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQECIT0CCAUHc3RvcmFnZQJfMQEACQACAQIbX3doZW5Ob3RJbml0aWFsaXplZDogcmV2ZXJ0BgEQX3doZW5Jbml0aWFsaXplZAAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UAAwkAAAIIBQdzdG9yYWdlAl8xAQAJAAIBAhhfd2hlbkluaXRpYWxpemVkOiByZXZlcnQGAQ5fd2hlbk5vdFBhdXNlZAADCQEKX2xvYWRQYXVzZQAJAAIBAhZfd2hlbk5vdFBhdXNlZDogcmV2ZXJ0BgELX3doZW5QYXVzZWQAAwkBASEBCQEKX2xvYWRQYXVzZQAJAAIBAhNfd2hlblBhdXNlZDogcmV2ZXJ0BgELX29ubHlQYXVzZXIBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfCQELX2xvYWRQYXVzZXIACQACAQITX29ubHlQYXVzZXI6IHJldmVydAYBDl9jaGVja1dhdGNoZG9nAAQCd2QEByRtYXRjaDAJAJoIAgkBDV9sb2FkV2F0Y2hkb2cABRNLRVlfV0FUQ0hET0dfSEVJR0hUAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAkAZAIFAWEJARNfbG9hZFdhdGNoZG9nT2Zmc2V0AAAAAwkAZgIFBmhlaWdodAUCd2QJAAIBAhZfY2hlY2tXYXRjaGRvZzogcmV2ZXJ0BgEMX2dldERlY2ltYWxzAQhhc3NldElkXwQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwCAUBYQhkZWNpbWFscwkAAgEJAKwCAgIXX2dldERlY2ltYWxzOiBubyBhc3NldD0FCGFzc2V0SWRfARJfbm9ybWFsaXplRGVjaW1hbHMEB2Ftb3VudF8Pc291cmNlRGVjaW1hbHNfD3RhcmdldERlY2ltYWxzXwZyb3VuZF8DCQBnAgUPc291cmNlRGVjaW1hbHNfBQ90YXJnZXREZWNpbWFsc18JAG4EBQdhbW91bnRfAAEJAGwGAAoAAAkAZQIFD3NvdXJjZURl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AwIFCGFtb3VudHNfBQVpbmRleAQKbmV3QmFsYW5jZQkAZAIFBGVsZW0FBmFtb3VudAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQpuZXdCYWxhbmNlCQBkAggFA2FjYwJfMwUKbmV3QmFsYW5jZQQGcmVzdWx0CgACJGwFCWJhbGFuY2VzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAggFBnJlc3VsdAJfMggFBnJlc3VsdAJfMwEcX2luY3JlbWVudEJhbGFuY2VzQnlQYXltZW50cwUJYmFsYW5jZXNfCXBheW1lbnRzXwdhc3NldHNfCWRlY2ltYWxzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQHcGF5bWVudAkAkQMCBQlwYXltZW50c18FBWluZGV4BA9wYXltZW50QXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEIBQdwYXltZW50B2Fzc2V0SWQEA2VycgMJAQIhPQIFD3BheW1lbnRBc3NldFN0cgkAkQMCBQdhc3NldHNfBQVpbmRleAkAAgEJAKwCAgkArAICBQRlcnJfAgg6IGluZGV4PQkApAMBBQVpbmRleAUEdW5pdAMJAAACBQNlcnIFA2VycgQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFD3BheW1lbnRBc3NldFN0cgQKbmV3QmFsYW5jZQkAZAIFBGVsZW0JARJfbm9ybWFsaXplRGVjaW1hbHMECAkAkQMCBQlwYXltZW50c18FBWluZGV4BmFtb3VudAUNYXNzZXREZWNpbWFscwUJ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AgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQZyZXN1bHQCXzIBEl9jYWxjdWxhdGVNaW51c0ZlZQUIYmFsYW5jZV8MZXF1aWxpYnJpdW1fCWxwQW1vdW50XxB3ZWlnaHRBbXBsaWZpZXJfEGRpc2JhbGFuY2VDb2VmZl8ECXRocmVzaG9sZAkAawMFDGVxdWlsaWJyaXVtXwkAZQIFFE1BWF9XRUlHSFRfQU1QTElGSUVSBRB3ZWlnaHRBbXBsaWZpZXJfBRRNQVhfV0VJR0hUX0FNUExJRklFUgMJAGYCBQhiYWxhbmNlXwUJdGhyZXNob2xkAAAJAKADAQkAvQIECQC8AgMJALYCAQUJbHBBbW91bnRfCQC2AgEFEGRpc2JhbGFuY2VDb2VmZl8FF0RJU0JBbEFOQ0VfQ09FRkZfRkFDVE9SCQC2AgEJAGUCBQl0aHJlc2hvbGQFCGJhbGFuY2VfCQC2AgEFCXRocmVzaG9sZAUHQ0VJTElORwEXX2NhbGN1bGF0ZU1pbnVzRmVlRGVsdGEGDmJhbGFuY2VCZWZvcmVfDWJhbGFuY2VBZnRlcl8MZXF1aWxpYnJpdW1fCWxwQW1vdW50XxB3ZWlnaHRBbXBsaWZpZXJfEGRpc2JhbGFuY2VDb2VmZl8DCQBmAgUNYmFsYW5jZUFmdGVyXwUOYmFsYW5jZUJlZm9yZV8AAAkAZQIJARJfY2FsY3VsYXRlTWludXNGZWUFBQ1iYWxhbmNlQWZ0ZXJfBQxlcXVpbGlicml1bV8FCWxwQW1vdW50XwUQd2VpZ2h0QW1wbGlmaWVyXwUQZGlzYmFsYW5jZUNvZWZmXwkBEl9jYWxjdWxhdGVNaW51c0ZlZQUFDmJhbGFuY2VCZWZvcmVfBQxlcXVpbGlicml1bV8FCWxwQW1vdW50XwUQd2VpZ2h0QW1wbGlmaWVyXwUQZGlzYmFsYW5jZUNvZWZmXwERX2NhbGN1bGF0ZVBsdXNGZWUDCGJhbGFuY2VfDGVxdWlsaWJyaXVtXw5yZXdhcmRCYWxhbmNlXwMJAGYCBQhiYWxhbmNlXwUMZXF1aWxpYnJpdW1fBQ5yZXdhcmRCYWxhbmNlXwkAbgQFDnJld2FyZEJhbGFuY2VfBQhiYWxhbmNlXwUMZXF1aWxpYnJpdW1fBQVGTE9PUgEWX2NhbGN1bGF0ZVBsdXNGZWVEZWx0YQQOYmFsYW5jZUJlZm9yZV8NYmFsYW5jZUFmdGVyXwxlcXVpbGlicml1bV8OcmV3YXJkQmFsYW5jZV8DCQBmAgUOYmFsYW5jZUJlZm9yZV8FDWJhbGFuY2VBZnRlcl8AAAkAZQIJARFfY2FsY3VsYXRlUGx1c0ZlZQMFDWJhbGFuY2VBZnRlcl8FDGVxdWlsaWJyaXVtXwUOcmV3YXJkQmFsYW5jZV8JARFfY2FsY3VsYXRlUGx1c0ZlZQMFDmJhbGFuY2VCZWZvcmVfBQxlcXVpbGlicml1bV8FDnJld2FyZEJhbGFuY2VfARNfdmFsaWRhdGVBbGxvY2F0aW9uAg5hc3NldEJhbGFuY2VzXw9yZXdhcmRCYWxhbmNlc18ECG1heEluZGV4CQCQAwEFDmFzc2V0QmFsYW5jZXNfCgEIZm9sZEZ1bmMCA2FjYwVpbmRleAMJAGcCBQVpbmRleAUIbWF4SW5kZXgFA2FjYwMJAGYCAAAJAJEDAgUOYXNzZXRCYWxhbmNlc18FBWluZGV4CQACAQIrX3ZhbGlkYXRlQWxsb2NhdGlvbjogbmVnYXRpdmUgYXNzZXRCYWxhbmNlcwMJAGYCAAAJAJEDAgUPcmV3YXJkQmFsYW5jZXNfBQVpbmRleAkAAgECLF92YWxpZGF0ZUFsbG9jYXRpb246IG5lZ2F0aXZlIHJld2FyZEJhbGFuY2VzBQNhY2MKAAIkbAUKSU5ERVhfTElTVAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgELX2NoZWNrcG9pbnQBBXVzZXJfBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEFBXVzZXJfBAt1c2VyUHJvZml0cwkBEF9sb2FkVXNlclByb2ZpdHMBBQV1c2VyXwQNc2lnbWFGZWVQZXJMcAkBEl9sb2FkU2lnbWFGZWVQZXJMcAAEEXVzZXJTaWdtYUZlZVBlckxwCQEWX2xvYWRVc2VyU2lnbWFGZWVQZXJMcAEFBXVzZXJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQNcHJvZml0VXBkYXRlZAkAZAIJAJEDAgULdXNlclByb2ZpdHMFBWluZGV4CQCgAwEJALwCAwkAtgIBBQZ1c2VyTHAJALgCAgkAkQMCBQ1zaWdtYUZlZVBlckxwBQVpbmRleAkAkQMCBRF1c2VyU2lnbWFGZWVQZXJMcAUFaW5kZXgFDlBFUkNFTlRfRkFDVE9SCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFDXByb2ZpdFVwZGF0ZWQEDSR0MDIyMzE0MjIzODcKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDIyMzE0MjIzODcCXzEEDnByb2ZpdHNVcGRhdGVkCAUNJHQwMjIzMTQyMjM4NwJfMgkAlAoCCQDOCAIJARBfc2F2ZVVzZXJQcm9maXRzAgUFdXNlcl8FDnByb2ZpdHNVcGRhdGVkCQEWX3NhdmVVc2VyU2lnbWFGZWVQZXJMcAIFBXVzZXJfBQ1zaWdtYUZlZVBlckxwBQ5wcm9maXRzVXBkYXRlZAEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEDnNpZ21hRmVlUGVyTHBfCHRvdGFsTHBfBmluZGV4XwZscEZlZV8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQZpbmRleF8FBWluZGV4CQC3AgIJAJEDAgUOc2lnbWFGZWVQZXJMcF8FBWluZGV4CQC8AgMJALYCAQUGbHBGZWVfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQh0b3RhbExwXwkAkQMCBQ5zaWdtYUZlZVBlckxwXwUFaW5kZXgJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQEDSR0MDIzMDM3MjMxMTYKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDIzMDM3MjMxMTYCXzEEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMjMwMzcyMzExNgJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQLYXNzZXRJbmRleF8HYW1vdW50XwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABAd0b3RhbExwCQEMX2xvYWRUb3RhbExwAAQNJHQwMjMzMzcyMzYxMgMJAAACBQd0b3RhbExwAAAJAJQKAgAACQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwUHTUFYX0ZFRQkAlAoCCQBrAwUHYW1vdW50XwUKbHBGZWVSYXRlXwUHTUFYX0ZFRQkAawMFB2Ftb3VudF8FEHByb3RvY29sRmVlUmF0ZV8FB01BWF9GRUUEBWxwRmVlCAUNJHQwMjMzMzcyMzYxMgJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAyMzMzNzIzNjEyAl8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQVscEZlZQAABQ1zaWdtYUZlZVBlckxwCQEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEBQ1zaWdtYUZlZVBlckxwBQd0b3RhbExwBQthc3NldEluZGV4XwUFbHBGZWUJAJUKAwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAELX2RlcG9zaXRBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQGYXNzZXRzCQELX2xvYWRBc3NldHMABA0kdDAyNDAxODI0MDcxCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAyNDAxODI0MDcxAl8xBAtzaWdtYVdlaWdodAgFDSR0MDI0MDE4MjQwNzECXzIEDSR0MDI0MDc2MjQxNDQJARJfbG9hZEFzc2V0QmFsYW5jZXMABBFwcmV2QXNzZXRCYWxhbmNlcwgFDSR0MDI0MDc2MjQxNDQCXzEEFHByZXZBc3NldFRvdGFsU3VwcGx5CAUNJHQwMjQwNzYyNDE0NAJfMgQNJHQwMjQxNTAyNTM4MAMJAAACBRRwcmV2QXNzZXRUb3RhbFN1cHBseQAACgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkCQBrAwkAkQMCBQxhc3NldFdlaWdodHMFBWluZGV4BQdhbW91bnRfBQtzaWdtYVdlaWdodAkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQEDSR0MDI0NTkyMjQ2NjYKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEA2lkeAgFDSR0MDI0NTkyMjQ2NjYCXzEEGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQIBQ0kdDAyNDU5MjI0NjY2Al8yCQCUCgIFB2Ftb3VudF8FGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEBXJhdGlvCQC8AgMJALYCAQUHYW1vdW50XwUOUEVSQ0VOVF9GQUNUT1IJALYCAQUUcHJldkFzc2V0VG90YWxTdXBwbHkKAQlmb2xkRnVuYzECA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkCQCgAwEJALwCAwUFcmF0aW8JALYCAQkAkQMCBRFwcmV2QXNzZXRCYWxhbmNlcwUFaW5kZXgFDlBFUkNFTlRfRkFDVE9SCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAQNJHQwMjUyMDkyNTI4NAoAAiRsBQZhc3NldHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlmb2xkRnVuYzECBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEA2lkeAgFDSR0MDI1MjA5MjUyODQCXzEEGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQIBQ0kdDAyNTIwOTI1Mjg0Al8yCQCUCgIJAGsDBQdhbW91bnRfBQ1scFRvdGFsU3VwcGx5BRRwcmV2QXNzZXRUb3RhbFN1cHBseQUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQObHBUb2tlbnNUb01pbnQIBQ0kdDAyNDE1MDI1MzgwAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjQxNTAyNTM4MAJfMgQNJHQwMjUzODYyNTQ5OQkBG19pbmNyZW1lbnRCYWxhbmNlc0J5QW1vdW50cwIFEXByZXZBc3NldEJhbGFuY2VzBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBA1hc3NldEJhbGFuY2VzCAUNJHQwMjUzODYyNTQ5OQJfMQQQYXNzZXRUb3RhbFN1cHBseQgFDSR0MDI1Mzg2MjU0OTkCXzIJAJUKAwUObHBUb2tlbnNUb01pbnQFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFDWFzc2V0QmFsYW5jZXMBCF9kZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQGYXNzZXRzCQELX2xvYWRBc3NldHMABA0kdDAyNTg2NTI1OTE4CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAyNTg2NTI1OTE4Al8xBAtzaWdtYVdlaWdodAgFDSR0MDI1ODY1MjU5MTgCXzIEDSR0MDI1OTIzMjU5OTEJARJfbG9hZEFzc2V0QmFsYW5jZXMABBFwcmV2QXNzZXRCYWxhbmNlcwgFDSR0MDI1OTIzMjU5OTECXzEEFHByZXZBc3NldFRvdGFsU3VwcGx5CAUNJHQwMjU5MjMyNTk5MQJfMgQScHJldlJld2FyZEJhbGFuY2VzCQETX2xvYWRSZXdhcmRCYWxhbmNlcwAEA2VycgMDCQAAAgUUcHJldkFzc2V0VG90YWxTdXBwbHkAAAYJAAACBQ1scFRvdGFsU3VwcGx5AAAJAAIBAhRfZGVwb3NpdDogZW1wdHkgcG9vbAYDCQAAAgUDZXJyBQNlcnIEEHNvdXJjZUFzc2V0SW5kZXgJAQV2YWx1ZQEJAM8IAgUGYXNzZXRzBQhhc3NldElkXwQRc291cmNlRXF1aWxpYnJpdW0JAGsDBRRwcmV2QXNzZXRUb3RhbFN1cHBseQkAkQMCBQxhc3NldFdlaWdodHMFEHNvdXJjZUFzc2V0SW5kZXgFC3NpZ21hV2VpZ2h0BBNzb3VyY2VCYWxhbmNlQmVmb3JlCQCRAwIFEXByZXZBc3NldEJhbGFuY2VzBRBzb3VyY2VBc3NldEluZGV4BBNzb3VyY2VSZXdhcmRCYWxhbmNlCQCRAwIFEnByZXZSZXdhcmRCYWxhbmNlcwUQc291cmNlQXNzZXRJbmRleAQSc291cmNlUGx1c0ZlZURlbHRhCQEWX2NhbGN1bGF0ZVBsdXNGZWVEZWx0YQQFE3NvdXJjZUJhbGFuY2VCZWZvcmUJAGQCBRNzb3VyY2VCYWxhbmNlQmVmb3JlBQdhbW91bnRfBRFzb3VyY2VFcXVpbGlicml1bQUTc291cmNlUmV3YXJkQmFsYW5jZQQRbmV3UmV3YXJkQmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRJwcmV2UmV3YXJkQmFsYW5jZXMFEHNvdXJjZUFzc2V0SW5kZXgFEnNvdXJjZVBsdXNGZWVEZWx0YQQQbmV3QXNzZXRCYWxhbmNlcwkBGF9pbmNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXByZXZBc3NldEJhbGFuY2VzBRBzb3VyY2VBc3NldEluZGV4CQBkAgUHYW1vdW50XwUSc291cmNlUGx1c0ZlZURlbHRhBA5scFRva2Vuc1RvTWludAkAZAIFB2Ftb3VudF8FEnNvdXJjZVBsdXNGZWVEZWx0YQQEZXJyMQkBE192YWxpZGF0ZUFsbG9jYXRpb24CBRBuZXdBc3NldEJhbGFuY2VzBRFuZXdSZXdhcmRCYWxhbmNlcwMJAAACBQRlcnIxBQRlcnIxBA0kdDAyNzA4MTI3MjEyCQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAAABQ5scFRva2Vuc1RvTWludAkAaQIFCWxwRmVlUmF0ZQACCQBpAgUPcHJvdG9jb2xGZWVSYXRlAAIEBWxwRmVlCAUNJHQwMjcwODEyNzIxMgJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAyNzA4MTI3MjEyAl8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDI3MDgxMjcyMTICXzMJAJgKBgUObHBUb2tlbnNUb01pbnQFEG5ld0Fzc2V0QmFsYW5jZXMFEW5ld1Jld2FyZEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxfd2l0aGRyYXdBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQNJHQwMjc0MjUyNzQ5MwkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjc0MjUyNzQ5MwJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyNzQyNTI3NDkzAl8yBA0kdDAyNzQ5ODI3NTUxCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAyNzQ5ODI3NTUxAl8xBAtzaWdtYVdlaWdodAgFDSR0MDI3NDk4Mjc1NTECXzIEDmxwVG9rZW5zVG9CdXJuBQdhbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvQnVybgAABQ1scFRvdGFsU3VwcGx5AiRfd2l0aGRyYXdBbGw6IGludmFsaWQgbHBUb2tlbnNUb0J1cm4DCQAAAgUDZXJyBQNlcnIEDSR0MDI3Njk1Mjc4MjgJARxfZGVjcmVtZW50QmFsYW5jZXNCeUxwQW1vdW50AwURcHJldkFzc2V0QmFsYW5jZXMFDmxwVG9rZW5zVG9CdXJuBQ1scFRvdGFsU3VwcGx5BA1hc3NldEJhbGFuY2VzCAUNJHQwMjc2OTUyNzgyOAJfMQQQYXNzZXRUb3RhbFN1cHBseQgFDSR0MDI3Njk1Mjc4MjgCXzIEDWJhbGFuY2VzVG9QYXkIBQ0kdDAyNzY5NTI3ODI4Al8zCQCVCgMFDmxwVG9rZW5zVG9CdXJuBQ1iYWxhbmNlc1RvUGF5BQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQlfd2l0aGRyYXcCCGFzc2V0SWRfCWxwQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcED2Rpc2JhbGFuY2VDb2VmZggFB3N0b3JhZ2UCXzgEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjgyMjIyODI5MAkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjgyMjIyODI5MAJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyODIyMjI4MjkwAl8yBA0kdDAyODI5NTI4MzQ4CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAyODI5NTI4MzQ4Al8xBAtzaWdtYVdlaWdodAgFDSR0MDI4Mjk1MjgzNDgCXzIEEnByZXZSZXdhcmRCYWxhbmNlcwkBE19sb2FkUmV3YXJkQmFsYW5jZXMABBB0YXJnZXRBc3NldEluZGV4CQEFdmFsdWUBCQDPCAIFBmFzc2V0cwUIYXNzZXRJZF8EE3RhcmdldEJhbGFuY2VCZWZvcmUJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgEEXRhcmdldEVxdWlsaWJyaXVtCQBrAwUUcHJldkFzc2V0VG90YWxTdXBwbHkJAJEDAgUMYXNzZXRXZWlnaHRzBRB0YXJnZXRBc3NldEluZGV4BQtzaWdtYVdlaWdodAQTdGFyZ2V0UmV3YXJkQmFsYW5jZQkAkQMCBRJwcmV2UmV3YXJkQmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgEE3RhcmdldE1pbnVzRmVlRGVsdGEJARdfY2FsY3VsYXRlTWludXNGZWVEZWx0YQYFE3RhcmdldEJhbGFuY2VCZWZvcmUJAGUCBRN0YXJnZXRCYWxhbmNlQmVmb3JlBQlscEFtb3VudF8FEXRhcmdldEVxdWlsaWJyaXVtBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUPd2VpZ2h0QW1wbGlmaWVyBQ9kaXNiYWxhbmNlQ29lZmYEDnJld2FyZEJhbGFuY2VzCQEYX2luY3JlbWVudEJhbGFuY2VCeUluZGV4AwUScHJldlJld2FyZEJhbGFuY2VzBRB0YXJnZXRBc3NldEluZGV4BRN0YXJnZXRNaW51c0ZlZURlbHRhBA1hc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgFCWxwQW1vdW50XwQMdGFyZ2V0QW1vdW50CQBlAgUJbHBBbW91bnRfBRN0YXJnZXRNaW51c0ZlZURlbHRhBANlcnIJARNfdmFsaWRhdGVBbGxvY2F0aW9uAgUNYXNzZXRCYWxhbmNlcwUOcmV3YXJkQmFsYW5jZXMDCQAAAgUDZXJyBQNlcnIEDSR0MDI5MzM0Mjk0ODIJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMECQBkAgUQdGFyZ2V0QXNzZXRJbmRleAABBQx0YXJnZXRBbW91bnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDI5MzM0Mjk0ODICXzEEC3Byb3RvY29sRmVlCAUNJHQwMjkzMzQyOTQ4MgJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAyOTMzNDI5NDgyAl8zCQCYCgYFDHRhcmdldEFtb3VudAUNYXNzZXRCYWxhbmNlcwUOcmV3YXJkQmFsYW5jZXMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BBV9zd2FwAxFzb3VyY2VBc3NldEluZGV4XxF0YXJnZXRBc3NldEluZGV4Xw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQJbHBGZWVSYXRlCAUHc3RvcmFnZQJfNAQPcHJvdG9jb2xGZWVSYXRlCAUHc3RvcmFnZQJfNQQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BA9kaXNiYWxhbmNlQ29lZmYIBQdzdG9yYWdlAl84BA0kdDAzMDAwOTMwMDc3CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAzMDAwOTMwMDc3Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDMwMDA5MzAwNzcCXzIEDSR0MDMwMDgyMzAxMzUJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDMwMDgyMzAxMzUCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMzAwODIzMDEzNQJfMgQScHJldlJld2FyZEJhbGFuY2VzCQETX2xvYWRSZXdhcmRCYWxhbmNlcwAEEXNvdXJjZUVxdWlsaWJyaXVtCQBrAwUUcHJldkFzc2V0VG90YWxTdXBwbHkJAJEDAgUMYXNzZXRXZWlnaHRzBRFzb3VyY2VBc3NldEluZGV4XwULc2lnbWFXZWlnaHQEE3NvdXJjZUJhbGFuY2VCZWZvcmUJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFEXNvdXJjZUFzc2V0SW5kZXhfBBNzb3VyY2VSZXdhcmRCYWxhbmNlCQCRAwIFEnByZXZSZXdhcmRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8EEnNvdXJjZVBsdXNGZWVEZWx0YQkBFl9jYWxjdWxhdGVQbHVzRmVlRGVsdGEEBRNzb3VyY2VCYWxhbmNlQmVmb3JlCQBkAgUTc291cmNlQmFsYW5jZUJlZm9yZQUNc291cmNlQW1vdW50XwURc291cmNlRXF1aWxpYnJpdW0FE3NvdXJjZVJld2FyZEJhbGFuY2UEE3RhcmdldEJhbGFuY2VCZWZvcmUJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFEXRhcmdldEFzc2V0SW5kZXhfBBF0YXJnZXRFcXVpbGlicml1bQkAawMFFHByZXZBc3NldFRvdGFsU3VwcGx5CQCRAwIFDGFzc2V0V2VpZ2h0cwURdGFyZ2V0QXNzZXRJbmRleF8FC3NpZ21hV2VpZ2h0BBN0YXJnZXRSZXdhcmRCYWxhbmNlCQCRAwIFEnByZXZSZXdhcmRCYWxhbmNlcwURdGFyZ2V0QXNzZXRJbmRleF8EE3RhcmdldE1pbnVzRmVlRGVsdGEJARdfY2FsY3VsYXRlTWludXNGZWVEZWx0YQYFE3RhcmdldEJhbGFuY2VCZWZvcmUJAGUCBRN0YXJnZXRCYWxhbmNlQmVmb3JlBQ1zb3VyY2VBbW91bnRfBRF0YXJnZXRFcXVpbGlicml1bQUUcHJldkFzc2V0VG90YWxTdXBwbHkFD3dlaWdodEFtcGxpZmllcgUPZGlzYmFsYW5jZUNvZWZmBBJ0ZW1wUmV3YXJkQmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRJwcmV2UmV3YXJkQmFsYW5jZXMFEXNvdXJjZUFzc2V0SW5kZXhfBRJzb3VyY2VQbHVzRmVlRGVsdGEEEW5ld1Jld2FyZEJhbGFuY2VzCQEYX2luY3JlbWVudEJhbGFuY2VCeUluZGV4AwUSdGVtcFJld2FyZEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUTdGFyZ2V0TWludXNGZWVEZWx0YQQRdGVtcEFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8JAGQCBQ1zb3VyY2VBbW91bnRfBRJzb3VyY2VQbHVzRmVlRGVsdGEEEG5ld0Fzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRF0ZW1wQXNzZXRCYWxhbmNlcwURdGFyZ2V0QXNzZXRJbmRleF8JAGQCBQ1zb3VyY2VBbW91bnRfBRJzb3VyY2VQbHVzRmVlRGVsdGEEDHRhcmdldEFtb3VudAkAZQIJAGQCBQ1zb3VyY2VBbW91bnRfBRJzb3VyY2VQbHVzRmVlRGVsdGEFE3RhcmdldE1pbnVzRmVlRGVsdGEEA2VycgkBE192YWxpZGF0ZUFsbG9jYXRpb24CBRBuZXdBc3NldEJhbGFuY2VzBRFuZXdSZXdhcmRCYWxhbmNlcwMJAAACBQNlcnIFA2VycgQNJHQwMzE3MTQzMTg1NQkBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQJAGQCBRF0YXJnZXRBc3NldEluZGV4XwABBQx0YXJnZXRBbW91bnQFCWxwRmVlUmF0ZQUPcHJvdG9jb2xGZWVSYXRlBAVscEZlZQgFDSR0MDMxNzE0MzE4NTUCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzE3MTQzMTg1NQJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzMTcxNDMxODU1Al8zCQCYCgYFDHRhcmdldEFtb3VudAUQbmV3QXNzZXRCYWxhbmNlcwURbmV3UmV3YXJkQmFsYW5jZXMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4bAWkBBGluaXQOB2Fzc2V0c18NYXNzZXRXZWlnaHRzXwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8MbHBUb2tlbk5hbWVfDWxwVG9rZW5EZXNjcl8QbHBUb2tlbkRlY2ltYWxzXxdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXxB3ZWlnaHRBbXBsaWZpZXJfEGRpc2JhbGFuY2VDb2VmZl8LZmVlTWF4UmF0ZV8UcHJvdG9jb2xGZWVDb250cmFjdF8KcHJlY2lzaW9uXwdwYXVzZXJfBANlcnIDAwMDAwMDAwMDAwMDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQETX3doZW5Ob3RJbml0aWFsaXplZAAHCQEQX3doZW5NdWx0aXNpZ1NldAAHCQEPX3ZhbGlkYXRlQXNzZXRzAgUHYXNzZXRzXwIUaW5pdDogaW52YWxpZCBhc3NldHMHCQEQX3ZhbGlkYXRlSW50TGlzdAQFDWFzc2V0V2VpZ2h0c18AAQUKTUFYX1dFSUdIVAIaaW5pdDogaW52YWxpZCBhc3NldFdlaWdodHMHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBBQdhc3NldHNfCQCQAwEFDWFzc2V0V2VpZ2h0c18CH2luaXQ6IGludmFsaWQgYXNzZXRXZWlnaHRzIHNpemUHCQEMX3ZhbGlkYXRlSW50BAUKbHBGZWVSYXRlXwAABQdNQVhfRkVFAhRpbml0OiBpbnZhbGlkIGxwIGZlZQcJAQxfdmFsaWRhdGVJbnQEBRBwcm90b2NvbEZlZVJhdGVfAAAFB01BWF9GRUUCGmluaXQ6IGludmFsaWQgcHJvdG9jb2wgZmVlBwkBEl92YWxpZGF0ZVRva2VuTmFtZQIFDGxwVG9rZW5OYW1lXwISaW5pdDogaW52YWxpZCBuYW1lBwkBE192YWxpZGF0ZVRva2VuRGVzY3ICBQ1scFRva2VuRGVzY3JfAhNpbml0OiBpbnZhbGlkIGRlc2NyBwkBEV92YWxpZGF0ZURlY2ltYWxzAgUQbHBUb2tlbkRlY2ltYWxzXwIWaW5pdDogaW52YWxpZCBkZWNpbWFscwcJAQxfdmFsaWRhdGVJbnQEBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwAABQ1NQVhfQU1QTElGSUVSAiRpbml0OiBpbnZhbGlkIG1heEFsbG9jYXRpb25BbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUQd2VpZ2h0QW1wbGlmaWVyXwAABRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwIdaW5pdDogaW52YWxpZCB3ZWlnaHRBbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUQZGlzYmFsYW5jZUNvZWZmXwAABQdNQVhfSU5UAh1pbml0OiBpbnZhbGlkIGRpc2JhbGFuY2VDb2VmZgcJAQxfdmFsaWRhdGVJbnQEBQtmZWVNYXhSYXRlXwAABQdNQVhfSU5UAhhpbml0OiBpbnZhbGlkIGZlZU1heFJhdGUHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFFHByb3RvY29sRmVlQ29udHJhY3RfAiFpbml0OiBpbnZhbGlkIHByb3RvY29sRmVlQ29udHJhY3QHCQEMX3ZhbGlkYXRlSW50BAUKcHJlY2lzaW9uXwABBQdNQVhfSU5UAhdpbml0OiBpbnZhbGlkIHByZWNpc2lvbgcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIUaW5pdDogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyBA0kdDAzMzc0NDMzODEzCQEUX3ByZXBhcmVBc3NldFdlaWdodHMBBQ1hc3NldFdlaWdodHNfBAxhc3NldFdlaWdodHMIBQ0kdDAzMzc0NDMzODEzAl8xBAtzaWdtYVdlaWdodAgFDSR0MDMzNzQ0MzM4MTMCXzIEDWFzc2V0QmFsYW5jZXMJARVfcHJlcGFyZUFzc2V0QmFsYW5jZXMBBQdhc3NldHNfBAVpc3N1ZQkAwggFBQxscFRva2VuTmFtZV8FDWxwVG9rZW5EZXNjcl8AAAUQbHBUb2tlbkRlY2ltYWxzXwYECWxwQXNzZXRJZAkAuAgBBQVpc3N1ZQQOc3RvcmFnZVVwZGF0ZWQJAJwKCgUJbHBBc3NldElkBgAABQpscEZlZVJhdGVfBRBwcm90b2NvbEZlZVJhdGVfBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwUQd2VpZ2h0QW1wbGlmaWVyXwUQZGlzYmFsYW5jZUNvZWZmXwULZmVlTWF4UmF0ZV8JARFAZXh0ck5hdGl2ZSgxMDYyKQEFFHByb3RvY29sRmVlQ29udHJhY3RfCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIFBWlzc3VlBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBC19zYXZlQXNzZXRzAQUHYXNzZXRzXwkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJARNfc2F2ZVJld2FyZEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwkBEV9zYXZlQXNzZXRXZWlnaHRzAQUMYXNzZXRXZWlnaHRzCQEOX3NhdmVQcmVjaXNpb24BBQpwcmVjaXNpb25fCQESX3NhdmVTaWdtYUZlZVBlckxwAQkBEl9sb2FkU2lnbWFGZWVQZXJMcAAJAQtfc2F2ZVBhdXNlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3BhdXNlcl8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKZGVwb3NpdEFsbAEHYW1vdW50XwQDZXJyAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAAFB01BWF9JTlQCGmRlcG9zaXRBbGw6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABA0kdDAzNTYxMjM1Njk3CQELX2RlcG9zaXRBbGwBBQdhbW91bnRfBA5scFRva2Vuc1RvTWludAgFDSR0MDM1NjEyMzU2OTcCXzEEGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQIBQ0kdDAzNTYxMjM1Njk3Al8yBA1hc3NldEJhbGFuY2VzCAUNJHQwMzU2MTIzNTY5NwJfMwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEED3BheW1lbnRBc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4B2Fzc2V0SWQEFHBheW1lbnRBc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUPcGF5bWVudEFzc2V0U3RyBBhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQJAJEDAgUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAUFaW5kZXgEDnJlcXVpcmVkQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBRRwYXltZW50QXNzZXREZWNpbWFscwUHQ0VJTElORwQEZXJyMQMJAQIhPQIFD3BheW1lbnRBc3NldFN0cgUEZWxlbQkAAgEJAKwCAgIjZGVwb3NpdEFsbDogaW52YWxpZCBwYXltZW50OiBpbmRleD0JAKQDAQUFaW5kZXgDCQBnAgAABQ5yZXF1aXJlZEFtb3VudAkAAgECJmRlcG9zaXRBbGw6IHRvbyBsaXR0bGUgYW1vdW50IHJlcXVpcmVkBQR1bml0AwkAAAIFBGVycjEFBGVycjEEBmNoYW5nZQMJAGYCCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50BQ5yZXF1aXJlZEFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50BQ5yZXF1aXJlZEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4B2Fzc2V0SWQFA25pbAMJAGYCBQ5yZXF1aXJlZEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4BmFtb3VudAkAAgEJAKwCAgkArAICCQCsAgICKGRlcG9zaXRBbGw6IGluc3VmZmljaWVudCBwYXltZW50LCBpbmRleD0JAKQDAQUFaW5kZXgCCywgcmVxdWlyZWQ9CQCkAwEFDnJlcXVpcmVkQW1vdW50BQNuaWwJAJQKAgkAZAIFBWluZGV4AAEJAM4IAggFA2FjYwJfMgUGY2hhbmdlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAzNjg0MDM2OTAyCgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAzNjg0MDM2OTAyAl8xBA1jaGFuZ2VBY3Rpb25zCAUNJHQwMzY4NDAzNjkwMgJfMgQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBkAggFB3N0b3JhZ2UCXzMFDmxwVG9rZW5zVG9NaW50CAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEHUmVpc3N1ZQMFCWxwQXNzZXRJZAUObHBUb2tlbnNUb01pbnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUObHBUb2tlbnNUb01pbnQFCWxwQXNzZXRJZAUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQ1jaGFuZ2VBY3Rpb25zBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2RlcG9zaXQBDG1pbkxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUMbWluTHBBbW91bnRfAAAFB01BWF9JTlQCHmRlcG9zaXQ6IGludmFsaWQgbWluIGxwIGFtb3VudAMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQUJbHBBc3NldElkBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUMbHBBc3NldElkU3RyBARlcnIxAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQ5fY2hlY2tXYXRjaGRvZwAHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBCAUBaQhwYXltZW50cwABAh5kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAh5kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYXNzZXQHCQEMX3ZhbGlkYXRlSW50BAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAQUHTUFYX0lOVAIfZGVwb3NpdDogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUEZXJyMQUEZXJyMQQIYXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0U3RyBBBhbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFDWFzc2V0RGVjaW1hbHMFCmxwRGVjaW1hbHMFBERPV04EDSR0MDM4MzQyMzg0NzQJAQhfZGVwb3NpdAIFCGFzc2V0U3RyBRBhbW91bnROb3JtYWxpemVkBA5scFRva2Vuc1RvTWludAgFDSR0MDM4MzQyMzg0NzQCXzEEDWFzc2V0QmFsYW5jZXMIBQ0kdDAzODM0MjM4NDc0Al8yBA5yZXdhcmRCYWxhbmNlcwgFDSR0MDM4MzQyMzg0NzQCXzMEBWxwRmVlCAUNJHQwMzgzNDIzODQ3NAJfNAQLcHJvdG9jb2xGZWUIBQ0kdDAzODM0MjM4NDc0Al81BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDM4MzQyMzg0NzQCXzYEDmxwVG9rZW5zVG9TZW5kCQBlAgkAZQIFDmxwVG9rZW5zVG9NaW50BQVscEZlZQULcHJvdG9jb2xGZWUEBGVycjIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvU2VuZAUMbWluTHBBbW91bnRfBQdNQVhfSU5UAhZkZXBvc2l0OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjIFBGVycjIEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvTWludAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAMwIAgkBB1JlaXNzdWUDBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9NaW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDmxwVG9rZW5zVG9TZW5kBQlscEFzc2V0SWQFA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwkBE19zYXZlUmV3YXJkQmFsYW5jZXMBBQ5yZXdhcmRCYWxhbmNlcwkBCl9zYXZlTHBGZWUCBQxscEFzc2V0SWRTdHIJAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQxscEFzc2V0SWRTdHIJARBfc2F2ZVByb3RvY29sRmVlAgUMbHBBc3NldElkU3RyCQBkAgULcHJvdG9jb2xGZWUJARBfbG9hZFByb3RvY29sRmVlAQUMbHBBc3NldElkU3RyCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELd2l0aGRyYXdBbGwABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQDYBAEFCWxwQXNzZXRJZAQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDGxwQXNzZXRJZFN0cgQGYXNzZXRzCQELX2xvYWRBc3NldHMABANlcnIDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIid2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAiJ3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEFB01BWF9JTlQCI3dpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQNJHQwMzk5ODI0MDA2OQkBDF93aXRoZHJhd0FsbAEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BA5scFRva2Vuc1RvQnVybggFDSR0MDM5OTgyNDAwNjkCXzEEDWJhbGFuY2VzVG9QYXkIBQ0kdDAzOTk4MjQwMDY5Al8yBA1hc3NldEJhbGFuY2VzCAUNJHQwMzk5ODI0MDA2OQJfMwQOcGF5bWVudEFjdGlvbnMJARhfZ2V0UGF5bWVudHNGcm9tQmFsYW5jZXMEBQZhc3NldHMFDWJhbGFuY2VzVG9QYXkIBQFpBmNhbGxlcgUKbHBEZWNpbWFscwQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBlAggFB3N0b3JhZ2UCXzMFDmxwVG9rZW5zVG9CdXJuCAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEEQnVybgIFCWxwQXNzZXRJZAUObHBUb2tlbnNUb0J1cm4FA25pbAUOcGF5bWVudEFjdGlvbnMJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcCCGFzc2V0SWRfCm1pbkFtb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAxscEFzc2V0SWRTdHIJANgEAQUJbHBBc3NldElkBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUMbHBBc3NldElkU3RyBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEA2VycgMDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQ5fY2hlY2tXYXRjaGRvZwAHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBCAUBaQhwYXltZW50cwABAh93aXRoZHJhdzogaW52YWxpZCBwYXltZW50cyBzaXplBwkBFF92YWxpZGF0ZVN0cmluZ0VxdWFsAwUMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCH3dpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnQgYXNzZXQHCQEMX3ZhbGlkYXRlSW50BAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAQUHTUFYX0lOVAIgd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudCBhbW91bnQHCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwUGYXNzZXRzBQhhc3NldElkXwIZd2l0aGRyYXc6IGludmFsaWQgYXNzZXRJZAcJAQxfdmFsaWRhdGVJbnQEBQptaW5BbW91bnRfAAAFB01BWF9JTlQCG3dpdGhkcmF3OiBpbnZhbGlkIG1pbkFtb3VudAcDCQAAAgUDZXJyBQNlcnIEDSR0MDQxNDIzNDE1NzgJAQlfd2l0aGRyYXcCBQhhc3NldElkXwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA0MTQyMzQxNTc4Al8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA0MTQyMzQxNTc4Al8yBBNmaW5hbFJld2FyZEJhbGFuY2VzCAUNJHQwNDE0MjM0MTU3OAJfMwQFbHBGZWUIBQ0kdDA0MTQyMzQxNTc4Al80BAtwcm90b2NvbEZlZQgFDSR0MDQxNDIzNDE1NzgCXzUEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDE0MjM0MTU3OAJfNgQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOBARlcnIxCQEMX3ZhbGlkYXRlSW50BAULZmluYWxBbW91bnQFCm1pbkFtb3VudF8FB01BWF9JTlQCF3dpdGhkcmF3OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjEFBGVycjEEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAMwIAgkBBEJ1cm4CBQlscEFzc2V0SWQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULZmluYWxBbW91bnQJAQtfc3RyVG9Bc3NldAEFCGFzc2V0SWRfBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFEmZpbmFsQXNzZXRCYWxhbmNlcwkBE19zYXZlUmV3YXJkQmFsYW5jZXMBBRNmaW5hbFJld2FyZEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFCGFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUIYXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUIYXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQhhc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBHN3YXACDnRhcmdldEFzc2V0SWRfCm1pbkFtb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQOc291cmNlQXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQEMX2dldERlY2ltYWxzAQUOc291cmNlQXNzZXRTdHIFCmxwRGVjaW1hbHMFBERPV04EEHNvdXJjZUFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnNvdXJjZUFzc2V0U3RyAhpzd2FwOiBpbnZhbGlkIHNvdXJjZSBhc3NldAMJAAACBRBzb3VyY2VBc3NldEluZGV4BRBzb3VyY2VBc3NldEluZGV4BBB0YXJnZXRBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ50YXJnZXRBc3NldElkXwIac3dhcDogaW52YWxpZCB0YXJnZXQgYXNzZXQDCQAAAgUQdGFyZ2V0QXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAQDZXJyAwMDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEOX2NoZWNrV2F0Y2hkb2cABwkBDF92YWxpZGF0ZUludAQFCm1pbkFtb3VudF8AAAUHTUFYX0lOVAIfc3dhcDogaW52YWxpZCBtaW4gdGFyZ2V0IGFtb3VudAcJAQxfdmFsaWRhdGVJbnQEBRZzb3VyY2VBbW91bnROb3JtYWxpemVkAAEFB01BWF9JTlQCG3N3YXA6IGludmFsaWQgc291cmNlIGFtb3VudAcJARRfdmFsaWRhdGVTdHJpbmdOb3RFcQMFDnNvdXJjZUFzc2V0U3RyBQ50YXJnZXRBc3NldElkXwIRc3dhcDogc2FtZSBhc3NldHMHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBCAUBaQhwYXltZW50cwABAhtzd2FwOiBpbnZhbGlkIHBheW1lbnRzIHNpemUHAwkAAAIFA2VycgUDZXJyBA0kdDA0Mzc0MzQzOTIyCQEFX3N3YXADBRBzb3VyY2VBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BRZzb3VyY2VBbW91bnROb3JtYWxpemVkBBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNDM3NDM0MzkyMgJfMQQSZmluYWxBc3NldEJhbGFuY2VzCAUNJHQwNDM3NDM0MzkyMgJfMgQTZmluYWxSZXdhcmRCYWxhbmNlcwgFDSR0MDQzNzQzNDM5MjICXzMEBWxwRmVlCAUNJHQwNDM3NDM0MzkyMgJfNAQLcHJvdG9jb2xGZWUIBQ0kdDA0Mzc0MzQzOTIyAl81BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQzNzQzNDM5MjICXzYEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUOdGFyZ2V0QXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgQEZXJyMQkBDF92YWxpZGF0ZUludAQFC2ZpbmFsQW1vdW50BQptaW5BbW91bnRfBQdNQVhfSU5UAhNzd2FwOiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjEFBGVycjEJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtmaW5hbEFtb3VudAkBC19zdHJUb0Fzc2V0AQUOdGFyZ2V0QXNzZXRJZF8FA25pbAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFEmZpbmFsQXNzZXRCYWxhbmNlcwkBE19zYXZlUmV3YXJkQmFsYW5jZXMBBRNmaW5hbFJld2FyZEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFDnRhcmdldEFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUOdGFyZ2V0QXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUOdGFyZ2V0QXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQ50YXJnZXRBc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWdldERlcG9zaXRBbGwBCWxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUJbHBBbW91bnRfAAEFB01BWF9JTlQCHWdldERlcG9zaXRBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA0NTA5NDQ1MTgxCQELX2RlcG9zaXRBbGwBBQlscEFtb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNDUwOTQ0NTE4MQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDQ1MDk0NDUxODECXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0NTA5NDQ1MTgxAl8zCQCUCgIFA25pbAkAlAoCBQ5scFRva2Vuc1RvTWludAUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpnZXREZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBANlcnIDCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAUIYXNzZXRJZF8CGWdldERlcG9zaXQ6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAEFB01BWF9JTlQCGmdldERlcG9zaXQ6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBBBhbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAUHYW1vdW50XwUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNDU5NDA0NjA3MgkBCF9kZXBvc2l0AgUIYXNzZXRJZF8FEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNDU5NDA0NjA3MgJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ1OTQwNDYwNzICXzIEDnJld2FyZEJhbGFuY2VzCAUNJHQwNDU5NDA0NjA3MgJfMwQFbHBGZWUIBQ0kdDA0NTk0MDQ2MDcyAl80BAtwcm90b2NvbEZlZQgFDSR0MDQ1OTQwNDYwNzICXzUEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDU5NDA0NjA3MgJfNgQObHBUb2tlbnNUb1NlbmQJAGUCCQBlAgUObHBUb2tlbnNUb01pbnQFBWxwRmVlBQtwcm90b2NvbEZlZQkAlAoCBQNuaWwFDmxwVG9rZW5zVG9TZW5kCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmdldFdpdGhkcmF3QWxsAQlscEFtb3VudF8EA2VycgkBDF92YWxpZGF0ZUludAQFCWxwQW1vdW50XwAABQdNQVhfSU5UAh5nZXRXaXRoZHJhd0FsbDogaW52YWxpZCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEDSR0MDQ2NTExNDY1ODcJAQxfd2l0aGRyYXdBbGwBBQlscEFtb3VudF8EDmxwVG9rZW5zVG9CdXJuCAUNJHQwNDY1MTE0NjU4NwJfMQQNYmFsYW5jZXNUb0dldAgFDSR0MDQ2NTExNDY1ODcCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0NjUxMTQ2NTg3Al8zCQCUCgIFA25pbAUNYmFsYW5jZXNUb0dldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtnZXRXaXRoZHJhdwIIYXNzZXRJZF8HYW1vdW50XwQDZXJyAwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMJAQtfbG9hZEFzc2V0cwAFCGFzc2V0SWRfAhpnZXRXaXRoZHJhdzogaW52YWxpZCBhc3NldAkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAQUHTUFYX0lOVAIbZ2V0V2l0aGRyYXc6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNJHQwNDcyMzg0NzM3MAkBCV93aXRoZHJhdwIFCGFzc2V0SWRfBQdhbW91bnRfBBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNDcyMzg0NzM3MAJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ3MjM4NDczNzACXzIEDnJld2FyZEJhbGFuY2VzCAUNJHQwNDcyMzg0NzM3MAJfMwQFbHBGZWUIBQ0kdDA0NzIzODQ3MzcwAl80BAtwcm90b2NvbEZlZQgFDSR0MDQ3MjM4NDczNzACXzUEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDcyMzg0NzM3MAJfNgQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOCQCUCgIFA25pbAULZmluYWxBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZ2V0U3dhcAMOc291cmNlQXNzZXRJZF8OdGFyZ2V0QXNzZXRJZF8Nc291cmNlQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABBBzb3VyY2VBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ5zb3VyY2VBc3NldElkXwIac3dhcDogaW52YWxpZCBzb3VyY2UgYXNzZXQDCQAAAgUQc291cmNlQXNzZXRJbmRleAUQc291cmNlQXNzZXRJbmRleAQQdGFyZ2V0QXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOdGFyZ2V0QXNzZXRJZF8CGnN3YXA6IGludmFsaWQgdGFyZ2V0IGFzc2V0AwkAAAIFEHRhcmdldEFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgEFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMEBQ1zb3VyY2VBbW91bnRfCQEMX2dldERlY2ltYWxzAQUOc291cmNlQXNzZXRJZF8FCmxwRGVjaW1hbHMFBERPV04EA2VycgMJAQxfdmFsaWRhdGVJbnQEBRZzb3VyY2VBbW91bnROb3JtYWxpemVkAAEFB01BWF9JTlQCG3N3YXA6IGludmFsaWQgc291cmNlIGFtb3VudAkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRJZF8FDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcDCQAAAgUDZXJyBQNlcnIEDSR0MDQ4NzgwNDg5NTkJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA0ODc4MDQ4OTU5Al8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA0ODc4MDQ4OTU5Al8yBBNmaW5hbFJld2FyZEJhbGFuY2VzCAUNJHQwNDg3ODA0ODk1OQJfMwQFbHBGZWUIBQ0kdDA0ODc4MDQ4OTU5Al80BAtwcm90b2NvbEZlZQgFDSR0MDQ4NzgwNDg5NTkCXzUEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDg3ODA0ODk1OQJfNgQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ50YXJnZXRBc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOCQCUCgIFA25pbAULZmluYWxBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIZ2V0Q2xhaW0BBXVzZXJfBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhZnZXRDbGFpbTogaW52YWxpZCB1c2VyCAUBaQZjYWxsZXIEDSR0MDQ5NjAxNDk2NTcJAQtfY2hlY2twb2ludAEFBHVzZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNDk2MDE0OTY1NwJfMQQLdXNlclByb2ZpdHMIBQ0kdDA0OTYwMTQ5NjU3Al8yCQCUCgIFA25pbAULdXNlclByb2ZpdHMBaQEKZ2V0QXNzZXRJZAAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xCQCUCgIFA25pbAkA2AQBBQlscEFzc2V0SWQBaQELZ2V0RGVjaW1hbHMABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkCQCUCgIFA25pbAUKbHBEZWNpbWFscwFpAQpjaGVja3BvaW50AQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwIYY2hlY2twb2ludDogaW52YWxpZCB1c2VyCAUBaQZjYWxsZXIJAQtfY2hlY2twb2ludAEFBHVzZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFc3Rha2UABANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBCAUHc3RvcmFnZQJfMQQEZXJyMQMDCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBCAUBaQhwYXltZW50cwABAhxzdGFrZTogaW52YWxpZCBwYXltZW50cyBzaXplCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIcc3Rha2U6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABQdNQVhfSU5UAh1zdGFrZTogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUEZXJyMQUEZXJyMQQNJHQwNTA4Njk1MDkyOQkBC19jaGVja3BvaW50AQgFAWkGY2FsbGVyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDUwODY5NTA5MjkCXzEEC3VzZXJQcm9maXRzCAUNJHQwNTA4Njk1MDkyOQJfMgkAlAoCCQDOCAIJAM4IAgURY2hlY2twb2ludEFjdGlvbnMJAQtfc2F2ZVVzZXJMcAIIBQFpBmNhbGxlcgkAZAIJAQtfbG9hZFVzZXJMcAEIBQFpBmNhbGxlcggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfc2F2ZVRvdGFsTHABCQBkAgkBDF9sb2FkVG90YWxMcAAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3Vuc3Rha2UBB2Ftb3VudF8EA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEIBQFpBmNhbGxlcgQEZXJyMQkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUGdXNlckxwAhd1bnN0YWtlOiBpbnZhbGlkIGFtb3VudAMJAAACBQRlcnIxBQRlcnIxBA0kdDA1MTQ0MDUxNTAwCQELX2NoZWNrcG9pbnQBCAUBaQZjYWxsZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTE0NDA1MTUwMAJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1MTQ0MDUxNTAwAl8yCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQdhbW91bnRfBQlscEFzc2V0SWQFA25pbAURY2hlY2twb2ludEFjdGlvbnMJAQtfc2F2ZVVzZXJMcAIIBQFpBmNhbGxlcgkAZQIFBnVzZXJMcAUHYW1vdW50XwkBDF9zYXZlVG90YWxMcAEJAGUCCQEMX2xvYWRUb3RhbExwAAUHYW1vdW50XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVjbGFpbQEFdXNlcl8EA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEBHVzZXIDCQBmAgkAsQIBBQV1c2VyXwAACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUFdXNlcl8CE2NsYWltOiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQUJbHBBc3NldElkBAZhc3NldHMJAMwIAgUMbHBBc3NldElkU3RyCQELX2xvYWRBc3NldHMABAhtYXhJbmRleAkAZQIJAJADAQUGYXNzZXRzAAEEDSR0MDUyMTg4NTIyNDQJAQtfY2hlY2twb2ludAEFBHVzZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTIxODg1MjI0NAJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1MjE4ODUyMjQ0Al8yCgEIZm9sZEZ1bmMCA2FjYwZwcm9maXQEBWluZGV4CAUDYWNjAl8xAwMJAGcCBQhtYXhJbmRleAUFaW5kZXgJAGYCBQZwcm9maXQAAAcEBWFzc2V0CQCRAwIFBmFzc2V0cwUFaW5kZXgJAJUKAwkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgAACQDNCAIIBQNhY2MCXzMJAQ5TY3JpcHRUcmFuc2ZlcgMFBHVzZXIFBnByb2ZpdAkBC19zdHJUb0Fzc2V0AQUFYXNzZXQJAJUKAwkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUGcHJvZml0CAUDYWNjAl8zBA0kdDA1MjYyMjUyNzEzCgACJGwFC3VzZXJQcm9maXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDAAAFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBANpZHgIBQ0kdDA1MjYyMjUyNzEzAl8xBBJ1c2VyUHJvZml0c1VwZGF0ZWQIBQ0kdDA1MjYyMjUyNzEzAl8yBA1wcm9maXRBY3Rpb25zCAUNJHQwNTI2MjI1MjcxMwJfMwkAlAoCCQDOCAIJAM4IAgUNcHJvZml0QWN0aW9ucwkA0QgCBRFjaGVja3BvaW50QWN0aW9ucwAACQEQX3NhdmVVc2VyUHJvZml0cwIFBHVzZXIFEnVzZXJQcm9maXRzVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhjbGFpbUFsbAEFdXNlcl8EA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEBHVzZXIDCQBmAgkAsQIBBQV1c2VyXwAACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUFdXNlcl8CFmNsYWltQWxsOiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQUJbHBBc3NldElkBAZhc3NldHMJAMwIAgUMbHBBc3NldElkU3RyCQELX2xvYWRBc3NldHMABAhtYXhJbmRleAkAZQIJAJADAQUGYXNzZXRzAAEEDSR0MDUzMzQzNTM0MDMJARJfbG9hZEFzc2V0QmFsYW5jZXMABA1hc3NldEJhbGFuY2VzCAUNJHQwNTMzNDM1MzQwMwJfMQQQYXNzZXRUb3RhbFN1cHBseQgFDSR0MDUzMzQzNTM0MDMCXzIEDSR0MDUzNDA5NTM0NjUJAQtfY2hlY2twb2ludAEFBHVzZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTM0MDk1MzQ2NQJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1MzQwOTUzNDY1Al8yCgEIZm9sZEZ1bmMCA2FjYwZwcm9maXQEBWluZGV4CAUDYWNjAl8xAwkAAAIFBWluZGV4AAAJAJcKBQkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgAACAUDYWNjAl8zCAUDYWNjAl80CQBkAggFA2FjYwJfNQUGcHJvZml0AwMJAGYCBQVpbmRleAAACQBnAgUIbWF4SW5kZXgFBWluZGV4BwQKYXNzZXRJbmRleAkAZQIFBWluZGV4AAEEB2JhbGFuY2UJAJEDAgUNYXNzZXRCYWxhbmNlcwUKYXNzZXRJbmRleAkAlwoFCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yAAAJAM0IAggFA2FjYwJfMwkAZAIFB2JhbGFuY2UFBnByb2ZpdAkAZAIIBQNhY2MCXzQFBnByb2ZpdAgFA2FjYwJfNQkAlwoFCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yAAAIBQNhY2MCXzMIBQNhY2MCXzQIBQNhY2MCXzUEDSR0MDU0MDAxNTQxMzcKAAIkbAULdXNlclByb2ZpdHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUAAAUDbmlsBQNuaWwAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBANpZHgIBQ0kdDA1NDAwMTU0MTM3Al8xBBJ1c2VyUHJvZml0c1VwZGF0ZWQIBQ0kdDA1NDAwMTU0MTM3Al8yBBRhc3NldEJhbGFuY2VzVXBkYXRlZAgFDSR0MDU0MDAxNTQxMzcCXzMEDmxwVG9rZW5zVG9NaW50CAUNJHQwNTQwMDE1NDEzNwJfNAQObHBUb2tlbnNQcm9maXQIBQ0kdDA1NDAwMTU0MTM3Al81BA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGQCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb01pbnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAMwIAgkBB1JlaXNzdWUDBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9NaW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGQCBQ5scFRva2Vuc1RvTWludAUObHBUb2tlbnNQcm9maXQFCWxwQXNzZXRJZAUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBRRhc3NldEJhbGFuY2VzVXBkYXRlZAkA0QgCBRFjaGVja3BvaW50QWN0aW9ucwAACQEQX3NhdmVVc2VyUHJvZml0cwIFBHVzZXIFEnVzZXJQcm9maXRzVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ51cGRhdGVQb29sRmVlcwIKbHBGZWVSYXRlXxBwcm90b2NvbEZlZVJhdGVfBANlcnIDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBDF92YWxpZGF0ZUludAQFCmxwRmVlUmF0ZV8AAAUHTUFYX0ZFRQIedXBkYXRlUG9vbEZlZXM6IGludmFsaWQgbHAgZmVlBwkBDF92YWxpZGF0ZUludAQFEHByb3RvY29sRmVlUmF0ZV8AAAUHTUFYX0ZFRQIkdXBkYXRlUG9vbEZlZXM6IGludmFsaWQgcHJvdG9jb2wgZmVlBwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMggFB3N0b3JhZ2UCXzMFCmxwRmVlUmF0ZV8FEHByb3RvY29sRmVlUmF0ZV8IBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEHVwZGF0ZVBvb2xQYXJhbXMEF21heEFsbG9jYXRpb25BbXBsaWZpZXJfEHdlaWdodEFtcGxpZmllcl8QZGlzYmFsYW5jZUNvZWZmXwtmZWVNYXhSYXRlXwQDZXJyAwMDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBDF92YWxpZGF0ZUludAQFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAAAFDU1BWF9BTVBMSUZJRVICMHVwZGF0ZVBvb2xQYXJhbXM6IGludmFsaWQgbWF4QWxsb2NhdGlvbkFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBRB3ZWlnaHRBbXBsaWZpZXJfAAAFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAil1cGRhdGVQb29sUGFyYW1zOiBpbnZhbGlkIHdlaWdodEFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBRBkaXNiYWxhbmNlQ29lZmZfAAAFB01BWF9JTlQCKXVwZGF0ZVBvb2xQYXJhbXM6IGludmFsaWQgZGlzYmFsYW5jZUNvZWZmBwkBDF92YWxpZGF0ZUludAQFC2ZlZU1heFJhdGVfAAAFB01BWF9JTlQCJHVwZGF0ZVBvb2xQYXJhbXM6IGludmFsaWQgZmVlTWF4UmF0ZQcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIIBQdzdG9yYWdlAl8zCAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfBRB3ZWlnaHRBbXBsaWZpZXJfBRBkaXNiYWxhbmNlQ29lZmZfBQtmZWVNYXhSYXRlXwgFB3N0b3JhZ2UDXzEwCQCUCgIJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ9taWdyYXRlQmFsYW5jZXMABANlcnIDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRva2VuU3VwcGx5CAUHc3RvcmFnZQJfMwQNJHQwNTY2NzI1NjczMgkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1NjY3MjU2NzMyAl8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwNTY2NzI1NjczMgJfMgQMYmFsYW5jZXNEaWZmCQCWAwEJAMwIAgkAZQIFEGFzc2V0VG90YWxTdXBwbHkFDWxwVG9rZW5TdXBwbHkJAMwIAgAABQNuaWwEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIFDWxwVG9rZW5TdXBwbHkFDGJhbGFuY2VzRGlmZggFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVwYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQYFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5wYXVzZQAEA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQtfd2hlblBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQcFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMdXBkYXRlUGF1c2VyAQdwYXVzZXJfBANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB3BhdXNlcl8CHHVwZGF0ZVBhdXNlcjogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQtfc2F2ZVBhdXNlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3BhdXNlcl8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOdXBkYXRlV2F0Y2hkb2cCCXdhdGNoZG9nXwdvZmZzZXRfBANlcnIDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQl3YXRjaGRvZ18CIHVwZGF0ZVdhdGNoZG9nOiBpbnZhbGlkIHdhdGNoZG9nBwkBDF92YWxpZGF0ZUludAQFB29mZnNldF8AAAUHTUFYX0lOVAIedXBkYXRlV2F0Y2hkb2c6IGludmFsaWQgb2Zmc2V0BwMJAAACBQNlcnIFA2VycgkAlAoCCQDOCAIJAQ1fc2F2ZVdhdGNoZG9nAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJd2F0Y2hkb2dfCQETX3NhdmVXYXRjaGRvZ09mZnNldAEFB29mZnNldF8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc2V0TXVsdGlzaWcBCW11bHRpc2lnXwQDZXJyAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCW11bHRpc2lnXwIdc2V0TXVsdGlzaWc6IGludmFsaWQgbXVsdGlzaWcHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQ1fc2F2ZU11bHRpc2lnAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbXVsdGlzaWdfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAhtdWx0aXNpZwUHJG1hdGNoMAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhtdWx0aXNpZwkAuQkCCQDMCAIFCktFWV9TVEFUVVMJAMwIAgkApQgBBQR0aGlzCQDMCAIJANgEAQgFAnR4AmlkBQNuaWwFA1NFUAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXmKSKyt", "height": 3972641, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FFi32RrJVgR31ubeRWP2a4M1QxHZMruEYzTgqZyhShvw Next: 3h4jiKnLcQd77vG4CdGHz5myLh92dKsJ6EMtv6bNkzWU Diff:
OldNewDifferences
1515
1616 let MAX_WEIGHT = 1000000
1717
18-let SLIPPAGE_RATE_FACTOR = 1000000
19-
2018 let FEE_RATE_FACTOR = 1000000
2119
2220 let RATE_FACTOR = 1000000
2321
2422 let PERCENT_FACTOR = toBigInt(1000000000000000000)
2523
24+let DISBAlANCE_COEFF_FACTOR = toBigInt(1000000000000)
25+
2626 let ZERO_INT_LIST_10 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2727
2828 let ZERO_INT_LIST_11 = (ZERO_INT_LIST_10 :+ 0)
2929
30+let INDEX_LIST = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
31+
3032 let ZERO_BIGINT = toBigInt(0)
3133
3234 let ZERO_BIGINT_LIST_11 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
5052 let KEY_ASSETS = "ASSETS"
5153
5254 let KEY_ASSET_BALANCES = "ASSET_BALANCES"
55+
56+let KEY_REWARD_BALANCES = "REWARD_BALANCES"
5357
5458 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
5559
310314 func foldFunc (acc,elem) = (acc :+ toString(elem))
311315
312316 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
317+ let $l = balances_
318+ let $s = size($l)
319+ let $acc0 = nil
320+ func $f0_1 ($a,$i) = if (($i >= $s))
321+ then $a
322+ else foldFunc($a, $l[$i])
323+
324+ func $f0_2 ($a,$i) = if (($i >= $s))
325+ then $a
326+ else throw("List size exceeds 10")
327+
328+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
329+ }, SEP))]
330+ }
331+
332+
333+func _loadRewardBalances () = {
334+ func foldFunc (acc,elem) = {
335+ let balance = parseIntValue(elem)
336+ (acc :+ balance)
337+ }
338+
339+ match getString(KEY_REWARD_BALANCES) {
340+ case a: String =>
341+ if ((size(a) > 0))
342+ then {
343+ let $l = split_51C(a, SEP)
344+ let $s = size($l)
345+ let $acc0 = nil
346+ func $f0_1 ($a,$i) = if (($i >= $s))
347+ then $a
348+ else foldFunc($a, $l[$i])
349+
350+ func $f0_2 ($a,$i) = if (($i >= $s))
351+ then $a
352+ else throw("List size exceeds 10")
353+
354+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
355+ }
356+ else ZERO_INT_LIST_10
357+ case _ =>
358+ ZERO_INT_LIST_10
359+ }
360+ }
361+
362+
363+func _saveRewardBalances (balances_) = {
364+ func foldFunc (acc,elem) = (acc :+ toString(elem))
365+
366+[StringEntry(KEY_REWARD_BALANCES, makeString_11C({
313367 let $l = balances_
314368 let $s = size($l)
315369 let $acc0 = nil
9481002 }
9491003
9501004
951-func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
952- then {
953- let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
954- if ((threshold > balance_))
955- then {
956- let maxDeviation = (threshold - balance_)
957- let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
958- if ((feeRate > feeMaxRate_))
959- then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
960- else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
961- }
962- else 0
963- }
964- else {
965- let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
966- if ((balance_ > threshold))
967- then {
968- let maxDeviation = (balance_ - threshold)
969- let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
970- if ((feeRate > feeMaxRate_))
971- then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
972- else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
973- }
974- else 0
975- }
976-
977-
978-func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = 0
979-
980-
981-func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
982- then true
983- else (lpTotalSupply_ == 0))
984- then true
985- else {
986- let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
987- let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
988- let diff = (newAssetsRate - prevAssetsRate)
989- if (if ((0 >= diff))
990- then ((-1 * _loadPrecision()) > diff)
991- else false)
992- then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
993- else true
994- }
995-
996-
997-func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
998- let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
999- let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
1000- let diff = (newUtil - prevUtil)
1001- if (if ((0 >= diff))
1002- then ((-1 * _loadPrecision()) > diff)
1003- else false)
1004- then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
1005- else true
1006- }
1007-
1008-
1009-func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
1010- let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
1011- let maxAllocationAmp = if ((balance_ > equilibrium))
1012- then (MAX_AMPLIFIER + maxAllocAmp_)
1013- else (MAX_AMPLIFIER - maxAllocAmp_)
1014- let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
1015- let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
1016- if ((balance_ > equilibrium))
1017- then if ((balance_ > maxAllocation))
1018- then if ((prevMaxAllocation > prevBalance_))
1019- then throw("_validateAssetAllocation: new up")
1020- else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
1021- then throw("_validateAssetAllocation: still up")
1022- else true
1023- else true
1024- else if ((maxAllocation > balance_))
1025- then if ((prevBalance_ > prevMaxAllocation))
1026- then throw("_validateAssetAllocation: new down")
1027- else if (((maxAllocation - balance_) > (prevMaxAllocation - prevBalance_)))
1028- then throw("_validateAssetAllocation: still down")
1029- else true
1030- else true
1031- }
1032-
1033-
1034-func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = true
1005+func _calculateMinusFee (balance_,equilibrium_,lpAmount_,weightAmplifier_,disbalanceCoeff_) = {
1006+ let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
1007+ if ((balance_ > threshold))
1008+ then 0
1009+ else toInt(fraction(fraction(toBigInt(lpAmount_), toBigInt(disbalanceCoeff_), DISBAlANCE_COEFF_FACTOR), toBigInt((threshold - balance_)), toBigInt(threshold), CEILING))
1010+ }
1011+
1012+
1013+func _calculateMinusFeeDelta (balanceBefore_,balanceAfter_,equilibrium_,lpAmount_,weightAmplifier_,disbalanceCoeff_) = if ((balanceAfter_ > balanceBefore_))
1014+ then 0
1015+ else (_calculateMinusFee(balanceAfter_, equilibrium_, lpAmount_, weightAmplifier_, disbalanceCoeff_) - _calculateMinusFee(balanceBefore_, equilibrium_, lpAmount_, weightAmplifier_, disbalanceCoeff_))
1016+
1017+
1018+func _calculatePlusFee (balance_,equilibrium_,rewardBalance_) = if ((balance_ > equilibrium_))
1019+ then rewardBalance_
1020+ else fraction(rewardBalance_, balance_, equilibrium_, FLOOR)
1021+
1022+
1023+func _calculatePlusFeeDelta (balanceBefore_,balanceAfter_,equilibrium_,rewardBalance_) = if ((balanceBefore_ > balanceAfter_))
1024+ then 0
1025+ else (_calculatePlusFee(balanceAfter_, equilibrium_, rewardBalance_) - _calculatePlusFee(balanceBefore_, equilibrium_, rewardBalance_))
1026+
1027+
1028+func _validateAllocation (assetBalances_,rewardBalances_) = {
1029+ let maxIndex = size(assetBalances_)
1030+ func foldFunc (acc,index) = if ((index >= maxIndex))
1031+ then acc
1032+ else if ((0 > assetBalances_[index]))
1033+ then throw("_validateAllocation: negative assetBalances")
1034+ else if ((0 > rewardBalances_[index]))
1035+ then throw("_validateAllocation: negative rewardBalances")
1036+ else acc
1037+
1038+ let $l = INDEX_LIST
1039+ let $s = size($l)
1040+ let $acc0 = true
1041+ func $f0_1 ($a,$i) = if (($i >= $s))
1042+ then $a
1043+ else foldFunc($a, $l[$i])
1044+
1045+ func $f0_2 ($a,$i) = if (($i >= $s))
1046+ then $a
1047+ else throw("List size exceeds 10")
1048+
1049+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
1050+ }
10351051
10361052
10371053 func _checkpoint (user_) = {
10451061 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10461062 }
10471063
1048- let $t02577125844 = {
1064+ let $t02231422387 = {
10491065 let $l = ZERO_INT_LIST_11
10501066 let $s = size($l)
10511067 let $acc0 = $Tuple2(0, nil)
10591075
10601076 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
10611077 }
1062- let idx = $t02577125844._1
1063- let profitsUpdated = $t02577125844._2
1078+ let idx = $t02231422387._1
1079+ let profitsUpdated = $t02231422387._2
10641080 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10651081 }
10661082
10741090 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10751091 }
10761092
1077- let $t02649426573 = {
1093+ let $t02303723116 = {
10781094 let $l = ZERO_INT_LIST_11
10791095 let $s = size($l)
10801096 let $acc0 = $Tuple2(0, nil)
10881104
10891105 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
10901106 }
1091- let idx = $t02649426573._1
1092- let sigmaFeePerLpUpdated = $t02649426573._2
1107+ let idx = $t02303723116._1
1108+ let sigmaFeePerLpUpdated = $t02303723116._2
10931109 sigmaFeePerLpUpdated
10941110 }
10951111
10971113 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10981114 let sigmaFeePerLp = _loadSigmaFeePerLp()
10991115 let totalLp = _loadTotalLp()
1100- let $t02679427069 = if ((totalLp == 0))
1116+ let $t02333723612 = if ((totalLp == 0))
11011117 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
11021118 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1103- let lpFee = $t02679427069._1
1104- let protocolFee = $t02679427069._2
1119+ let lpFee = $t02333723612._1
1120+ let protocolFee = $t02333723612._2
11051121 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11061122 then sigmaFeePerLp
11071123 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11121128 func _depositAll (amount_) = {
11131129 let storage = _loadStorage()
11141130 let lpTotalSupply = storage._3
1115- let weightAmplifier = storage._7
1116- let slippageRate = storage._8
1117- let feeMaxRate = storage._9
11181131 let assets = _loadAssets()
1119- let $t02757827631 = _loadAssetWeights()
1120- let assetWeights = $t02757827631._1
1121- let sigmaWeight = $t02757827631._2
1122- let $t02763627704 = _loadAssetBalances()
1123- let prevAssetBalances = $t02763627704._1
1124- let prevAssetTotalSupply = $t02763627704._2
1125- let $t02771028940 = if ((prevAssetTotalSupply == 0))
1132+ let $t02401824071 = _loadAssetWeights()
1133+ let assetWeights = $t02401824071._1
1134+ let sigmaWeight = $t02401824071._2
1135+ let $t02407624144 = _loadAssetBalances()
1136+ let prevAssetBalances = $t02407624144._1
1137+ let prevAssetTotalSupply = $t02407624144._2
1138+ let $t02415025380 = if ((prevAssetTotalSupply == 0))
11261139 then {
11271140 func foldFunc (acc,elem) = {
11281141 let index = acc._1
11301143 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11311144 }
11321145
1133- let $t02815228226 = {
1146+ let $t02459224666 = {
11341147 let $l = assets
11351148 let $s = size($l)
11361149 let $acc0 = $Tuple2(0, nil)
11441157
11451158 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11461159 }
1147- let idx = $t02815228226._1
1148- let requiredAmountsNormalized = $t02815228226._2
1160+ let idx = $t02459224666._1
1161+ let requiredAmountsNormalized = $t02459224666._2
11491162 $Tuple2(amount_, requiredAmountsNormalized)
11501163 }
11511164 else {
11561169 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11571170 }
11581171
1159- let $t02876928844 = {
1172+ let $t02520925284 = {
11601173 let $l = assets
11611174 let $s = size($l)
11621175 let $acc0 = $Tuple2(0, nil)
11701183
11711184 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11721185 }
1173- let idx = $t02876928844._1
1174- let requiredAmountsNormalized = $t02876928844._2
1186+ let idx = $t02520925284._1
1187+ let requiredAmountsNormalized = $t02520925284._2
11751188 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11761189 }
1177- let lpTokensToMint = $t02771028940._1
1178- let requiredAmountsNormalized = $t02771028940._2
1179- let $t02894629059 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1180- let assetBalances = $t02894629059._1
1181- let assetTotalSupply = $t02894629059._2
1182- let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1183- if ((err2 == err2))
1184- then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
1185- else throw("Strict value is not equal to itself.")
1190+ let lpTokensToMint = $t02415025380._1
1191+ let requiredAmountsNormalized = $t02415025380._2
1192+ let $t02538625499 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1193+ let assetBalances = $t02538625499._1
1194+ let assetTotalSupply = $t02538625499._2
1195+ $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11861196 }
11871197
11881198
11931203 let protocolFeeRate = storage._5
11941204 let maxAllocAmplifier = storage._6
11951205 let weightAmplifier = storage._7
1196- let slippageRate = storage._8
1197- let feeMaxRate = storage._9
11981206 let assets = _loadAssets()
1199- let $t02982229875 = _loadAssetWeights()
1200- let assetWeights = $t02982229875._1
1201- let sigmaWeight = $t02982229875._2
1202- let $t02988029994 = _loadAssetBalances()
1203- let prevAssetBalances = $t02988029994._1
1204- let prevAssetTotalSupply = $t02988029994._2
1205- let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
1206- let assetTotalSupply = (prevAssetTotalSupply + amount_)
1207- let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
1208- if ((err2 == err2))
1209- then {
1210- let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1211- let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1212- let lpTokensToMint = if ((lpTotalSupply == 0))
1213- then throw("_deposit: empty pool")
1214- else {
1215- let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
1216- let feeDiff = (fee - prevFee)
1217- let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
1218- let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
1219- let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1220- if ((err3 == err3))
1221- then lpTokensToMintInner
1222- else throw("Strict value is not equal to itself.")
1207+ let $t02586525918 = _loadAssetWeights()
1208+ let assetWeights = $t02586525918._1
1209+ let sigmaWeight = $t02586525918._2
1210+ let $t02592325991 = _loadAssetBalances()
1211+ let prevAssetBalances = $t02592325991._1
1212+ let prevAssetTotalSupply = $t02592325991._2
1213+ let prevRewardBalances = _loadRewardBalances()
1214+ let err = if (if ((prevAssetTotalSupply == 0))
1215+ then true
1216+ else (lpTotalSupply == 0))
1217+ then throw("_deposit: empty pool")
1218+ else true
1219+ if ((err == err))
1220+ then {
1221+ let sourceAssetIndex = value(indexOf(assets, assetId_))
1222+ let sourceEquilibrium = fraction(prevAssetTotalSupply, assetWeights[sourceAssetIndex], sigmaWeight)
1223+ let sourceBalanceBefore = prevAssetBalances[sourceAssetIndex]
1224+ let sourceRewardBalance = prevRewardBalances[sourceAssetIndex]
1225+ let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + amount_), sourceEquilibrium, sourceRewardBalance)
1226+ let newRewardBalances = _decrementBalanceByIndex(prevRewardBalances, sourceAssetIndex, sourcePlusFeeDelta)
1227+ let newAssetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex, (amount_ + sourcePlusFeeDelta))
1228+ let lpTokensToMint = (amount_ + sourcePlusFeeDelta)
1229+ let err1 = _validateAllocation(newAssetBalances, newRewardBalances)
1230+ if ((err1 == err1))
1231+ then {
1232+ let $t02708127212 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1233+ let lpFee = $t02708127212._1
1234+ let protocolFee = $t02708127212._2
1235+ let sigmaFeePerLpUpdated = $t02708127212._3
1236+ $Tuple6(lpTokensToMint, newAssetBalances, newRewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12231237 }
1224- let $t03165631787 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1225- let lpFee = $t03165631787._1
1226- let protocolFee = $t03165631787._2
1227- let sigmaFeePerLpUpdated = $t03165631787._3
1228- $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
1238+ else throw("Strict value is not equal to itself.")
12291239 }
12301240 else throw("Strict value is not equal to itself.")
12311241 }
12341244 func _withdrawAll (amount_) = {
12351245 let storage = _loadStorage()
12361246 let lpTotalSupply = storage._3
1237- let maxAllocAmplifier = storage._6
1238- let weightAmplifier = storage._7
1239- let slippageRate = storage._8
1240- let feeMaxRate = storage._9
1241- let $t03212132189 = _loadAssetBalances()
1242- let prevAssetBalances = $t03212132189._1
1243- let prevAssetTotalSupply = $t03212132189._2
1244- let $t03219432247 = _loadAssetWeights()
1245- let assetWeights = $t03219432247._1
1246- let sigmaWeight = $t03219432247._2
1247+ let $t02742527493 = _loadAssetBalances()
1248+ let prevAssetBalances = $t02742527493._1
1249+ let prevAssetTotalSupply = $t02742527493._2
1250+ let $t02749827551 = _loadAssetWeights()
1251+ let assetWeights = $t02749827551._1
1252+ let sigmaWeight = $t02749827551._2
12471253 let lpTokensToBurn = amount_
1248- let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
1249- if ((err == err))
1250- then {
1251- let $t03238932522 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1252- let assetBalances = $t03238932522._1
1253- let assetTotalSupply = $t03238932522._2
1254- let balancesToPay = $t03238932522._3
1255- let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1256- if ((err2 == err2))
1257- then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
1258- else throw("Strict value is not equal to itself.")
1254+ let err = _validateInt(lpTokensToBurn, 0, lpTotalSupply, "_withdrawAll: invalid lpTokensToBurn")
1255+ if ((err == err))
1256+ then {
1257+ let $t02769527828 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1258+ let assetBalances = $t02769527828._1
1259+ let assetTotalSupply = $t02769527828._2
1260+ let balancesToPay = $t02769527828._3
1261+ $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12591262 }
12601263 else throw("Strict value is not equal to itself.")
12611264 }
12681271 let protocolFeeRate = storage._5
12691272 let maxAllocAmplifier = storage._6
12701273 let weightAmplifier = storage._7
1271- let slippageRate = storage._8
1272- let feeMaxRate = storage._9
1273- let precision = _loadPrecision()
1274+ let disbalanceCoeff = storage._8
12741275 let assets = _loadAssets()
1275- let $t03331433382 = _loadAssetBalances()
1276- let prevAssetBalances = $t03331433382._1
1277- let prevAssetTotalSupply = $t03331433382._2
1278- let $t03338733440 = _loadAssetWeights()
1279- let assetWeights = $t03338733440._1
1280- let sigmaWeight = $t03338733440._2
1276+ let $t02822228290 = _loadAssetBalances()
1277+ let prevAssetBalances = $t02822228290._1
1278+ let prevAssetTotalSupply = $t02822228290._2
1279+ let $t02829528348 = _loadAssetWeights()
1280+ let assetWeights = $t02829528348._1
1281+ let sigmaWeight = $t02829528348._2
1282+ let prevRewardBalances = _loadRewardBalances()
12811283 let targetAssetIndex = value(indexOf(assets, assetId_))
1282- let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1283- let prevUtilValue = (prevAssetTotalSupply - prevFee)
1284- let k = fraction(toBigInt((lpTotalSupply - lpAmount_)), PERCENT_FACTOR, toBigInt(lpTotalSupply))
1285- let prevUtilValueWithK = toInt(fraction(toBigInt(prevUtilValue), k, PERCENT_FACTOR))
1286- let prevUtilValueDivLp = fraction(toBigInt(prevUtilValue), PERCENT_FACTOR, toBigInt(lpTotalSupply), CEILING)
1287- func foldFunc (acc,elem) = if (acc._1)
1288- then acc
1289- else {
1290- let startInner = acc._2
1291- let stopInner = acc._3
1292- let currentAmount = ((stopInner + startInner) / 2)
1293- let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
1294- let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
1295- let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1296- if (if (((utilValue - prevUtilValueWithK) > (-1 * precision)))
1297- then (precision > (utilValue - prevUtilValueWithK))
1298- else false)
1299- then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
1300- else if ((0 > (utilValue - prevUtilValueWithK)))
1301- then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValueWithK))
1302- else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
1303- }
1304-
1305- let targetAmount = {
1306- let stop = toInt(fraction(toBigInt((lpAmount_ + prevFee)), prevUtilValueDivLp, PERCENT_FACTOR, CEILING))
1307- let $t03530635418 = {
1308- let $l = LIST_64
1309- let $s = size($l)
1310- let $acc0 = $Tuple5(false, 0, stop, 0, 0)
1311- func $f0_1 ($a,$i) = if (($i >= $s))
1312- then $a
1313- else foldFunc($a, $l[$i])
1314-
1315- func $f0_2 ($a,$i) = if (($i >= $s))
1316- then $a
1317- else throw("List size exceeds 64")
1318-
1319- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
1320- }
1321- let success = $t03530635418._1
1322- let startOut = $t03530635418._2
1323- let stopOut = $t03530635418._3
1324- let targetAmountOut = $t03530635418._4
1325- let diffOut = $t03530635418._5
1326- if (!(success))
1327- then throw(((("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
1328- else targetAmountOut
1329- }
1330- let finalAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
1331- let finalAssetTotalSupply = (prevAssetTotalSupply - targetAmount)
1332- let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
1333- then _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, lpTotalSupply, (lpTotalSupply - lpAmount_), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1334- else false
1335- if ((err1 == err1))
1336- then {
1337- let $t03641036558 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1338- let lpFee = $t03641036558._1
1339- let protocolFee = $t03641036558._2
1340- let sigmaFeePerLpUpdated = $t03641036558._3
1341- $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
1284+ let targetBalanceBefore = prevAssetBalances[targetAssetIndex]
1285+ let targetEquilibrium = fraction(prevAssetTotalSupply, assetWeights[targetAssetIndex], sigmaWeight)
1286+ let targetRewardBalance = prevRewardBalances[targetAssetIndex]
1287+ let targetMinusFeeDelta = _calculateMinusFeeDelta(targetBalanceBefore, (targetBalanceBefore - lpAmount_), targetEquilibrium, prevAssetTotalSupply, weightAmplifier, disbalanceCoeff)
1288+ let rewardBalances = _incrementBalanceByIndex(prevRewardBalances, targetAssetIndex, targetMinusFeeDelta)
1289+ let assetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, lpAmount_)
1290+ let targetAmount = (lpAmount_ - targetMinusFeeDelta)
1291+ let err = _validateAllocation(assetBalances, rewardBalances)
1292+ if ((err == err))
1293+ then {
1294+ let $t02933429482 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1295+ let lpFee = $t02933429482._1
1296+ let protocolFee = $t02933429482._2
1297+ let sigmaFeePerLpUpdated = $t02933429482._3
1298+ $Tuple6(targetAmount, assetBalances, rewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13421299 }
13431300 else throw("Strict value is not equal to itself.")
13441301 }
13531310 let protocolFeeRate = storage._5
13541311 let maxAllocAmplifier = storage._6
13551312 let weightAmplifier = storage._7
1356- let slippageRate = storage._8
1357- let feeMaxRate = storage._9
1358- let precision = _loadPrecision()
1359- let $t03714037208 = _loadAssetBalances()
1360- let prevAssetBalances = $t03714037208._1
1361- let prevAssetTotalSupply = $t03714037208._2
1362- let $t03721337266 = _loadAssetWeights()
1363- let assetWeights = $t03721337266._1
1364- let sigmaWeight = $t03721337266._2
1365- let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
1366- let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
1367- let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1368- let prevUtilValue = (prevAssetTotalSupply - prevFee)
1369- func foldFunc (acc,elem) = if (acc._1)
1370- then acc
1371- else {
1372- let startInner = acc._2
1373- let stopInner = acc._3
1374- let currentAmount = ((stopInner + startInner) / 2)
1375- let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
1376- let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
1377- let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1378- if (if (((utilValue - prevUtilValue) > (-1 * precision)))
1379- then (precision > (utilValue - prevUtilValue))
1380- else false)
1381- then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValue))
1382- else if ((0 > (utilValue - prevUtilValue)))
1383- then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValue))
1384- else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValue))
1385- }
1386-
1387- let targetAmount = {
1388- let targetAmount = sourceAmount_
1389- let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
1390- let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
1391- let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1392- let feeDiff = (fee - prevFee)
1393- if ((feeDiff == 0))
1394- then targetAmount
1395- else {
1396- let $t03923939370 = {
1397- let $l = LIST_64
1398- let $s = size($l)
1399- let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, 0)
1400- func $f0_1 ($a,$i) = if (($i >= $s))
1401- then $a
1402- else foldFunc($a, $l[$i])
1403-
1404- func $f0_2 ($a,$i) = if (($i >= $s))
1405- then $a
1406- else throw("List size exceeds 64")
1407-
1408- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
1409- }
1410- let success = $t03923939370._1
1411- let startOut = $t03923939370._2
1412- let stopOut = $t03923939370._3
1413- let targetAmountOut = $t03923939370._4
1414- let diffOut = $t03923939370._5
1415- if (!(success))
1416- then throw(((("_swap: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
1417- else targetAmountOut
1418- }
1419- }
1420- let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
1421- let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
1422- let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
1423- then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1424- else false
1425- if ((err1 == err1))
1426- then {
1427- let $t04021740358 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1428- let lpFee = $t04021740358._1
1429- let protocolFee = $t04021740358._2
1430- let sigmaFeePerLpUpdated = $t04021740358._3
1431- $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
1432- }
1433- else throw("Strict value is not equal to itself.")
1434- }
1435-
1436-
1437-@Callable(i)
1438-func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
1313+ let disbalanceCoeff = storage._8
1314+ let $t03000930077 = _loadAssetBalances()
1315+ let prevAssetBalances = $t03000930077._1
1316+ let prevAssetTotalSupply = $t03000930077._2
1317+ let $t03008230135 = _loadAssetWeights()
1318+ let assetWeights = $t03008230135._1
1319+ let sigmaWeight = $t03008230135._2
1320+ let prevRewardBalances = _loadRewardBalances()
1321+ let sourceEquilibrium = fraction(prevAssetTotalSupply, assetWeights[sourceAssetIndex_], sigmaWeight)
1322+ let sourceBalanceBefore = prevAssetBalances[sourceAssetIndex_]
1323+ let sourceRewardBalance = prevRewardBalances[sourceAssetIndex_]
1324+ let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + sourceAmount_), sourceEquilibrium, sourceRewardBalance)
1325+ let targetBalanceBefore = prevAssetBalances[targetAssetIndex_]
1326+ let targetEquilibrium = fraction(prevAssetTotalSupply, assetWeights[targetAssetIndex_], sigmaWeight)
1327+ let targetRewardBalance = prevRewardBalances[targetAssetIndex_]
1328+ let targetMinusFeeDelta = _calculateMinusFeeDelta(targetBalanceBefore, (targetBalanceBefore - sourceAmount_), targetEquilibrium, prevAssetTotalSupply, weightAmplifier, disbalanceCoeff)
1329+ let tempRewardBalances = _decrementBalanceByIndex(prevRewardBalances, sourceAssetIndex_, sourcePlusFeeDelta)
1330+ let newRewardBalances = _incrementBalanceByIndex(tempRewardBalances, targetAssetIndex_, targetMinusFeeDelta)
1331+ let tempAssetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, (sourceAmount_ + sourcePlusFeeDelta))
1332+ let newAssetBalances = _decrementBalanceByIndex(tempAssetBalances, targetAssetIndex_, (sourceAmount_ + sourcePlusFeeDelta))
1333+ let targetAmount = ((sourceAmount_ + sourcePlusFeeDelta) - targetMinusFeeDelta)
1334+ let err = _validateAllocation(newAssetBalances, newRewardBalances)
1335+ if ((err == err))
1336+ then {
1337+ let $t03171431855 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1338+ let lpFee = $t03171431855._1
1339+ let protocolFee = $t03171431855._2
1340+ let sigmaFeePerLpUpdated = $t03171431855._3
1341+ $Tuple6(targetAmount, newAssetBalances, newRewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
1342+ }
1343+ else throw("Strict value is not equal to itself.")
1344+ }
1345+
1346+
1347+@Callable(i)
1348+func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,disbalanceCoeff_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
14391349 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
14401350 then _whenNotInitialized()
14411351 else false)
14611371 else false)
14621372 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
14631373 else false)
1464- then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
1374+ then _validateInt(disbalanceCoeff_, 0, MAX_INT, "init: invalid disbalanceCoeff")
14651375 else false)
14661376 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
14671377 else false)
14731383 else false
14741384 if ((err == err))
14751385 then {
1476- let $t04222142290 = _prepareAssetWeights(assetWeights_)
1477- let assetWeights = $t04222142290._1
1478- let sigmaWeight = $t04222142290._2
1386+ let $t03374433813 = _prepareAssetWeights(assetWeights_)
1387+ let assetWeights = $t03374433813._1
1388+ let sigmaWeight = $t03374433813._2
14791389 let assetBalances = _prepareAssetBalances(assets_)
14801390 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14811391 let lpAssetId = calculateAssetId(issue)
1482- let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
1483- $Tuple2(((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
1392+ let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, disbalanceCoeff_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
1393+ $Tuple2((((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveRewardBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
14841394 }
14851395 else throw("Strict value is not equal to itself.")
14861396 }
15001410 let lpAssetId = storage._1
15011411 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15021412 let assets = _loadAssets()
1503- let $t04404044125 = _depositAll(amount_)
1504- let lpTokensToMint = $t04404044125._1
1505- let requiredAmountsNormalized = $t04404044125._2
1506- let assetBalances = $t04404044125._3
1413+ let $t03561235697 = _depositAll(amount_)
1414+ let lpTokensToMint = $t03561235697._1
1415+ let requiredAmountsNormalized = $t03561235697._2
1416+ let assetBalances = $t03561235697._3
15071417 func foldFunc (acc,elem) = {
15081418 let index = acc._1
15091419 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15271437 else throw("Strict value is not equal to itself.")
15281438 }
15291439
1530- let $t04526845330 = {
1440+ let $t03684036902 = {
15311441 let $l = assets
15321442 let $s = size($l)
15331443 let $acc0 = $Tuple2(0, nil)
15411451
15421452 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
15431453 }
1544- let idx = $t04526845330._1
1545- let changeActions = $t04526845330._2
1454+ let idx = $t03684036902._1
1455+ let changeActions = $t03684036902._2
15461456 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15471457 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15481458 }
15761486 let assetStr = _assetToStr(i.payments[0].assetId)
15771487 let assetDecimals = _getDecimals(assetStr)
15781488 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1579- let $t04677046886 = _deposit(assetStr, amountNormalized)
1580- let lpTokensToMint = $t04677046886._1
1581- let assetBalances = $t04677046886._2
1582- let lpFee = $t04677046886._3
1583- let protocolFee = $t04677046886._4
1584- let sigmaFeePerLpUpdated = $t04677046886._5
1489+ let $t03834238474 = _deposit(assetStr, amountNormalized)
1490+ let lpTokensToMint = $t03834238474._1
1491+ let assetBalances = $t03834238474._2
1492+ let rewardBalances = $t03834238474._3
1493+ let lpFee = $t03834238474._4
1494+ let protocolFee = $t03834238474._5
1495+ let sigmaFeePerLpUpdated = $t03834238474._6
15851496 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
15861497 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
15871498 if ((err2 == err2))
15881499 then {
15891500 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1590- $Tuple2(((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToSend, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
1501+ $Tuple2((((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToSend, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveRewardBalances(rewardBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15911502 }
15921503 else throw("Strict value is not equal to itself.")
15931504 }
16141525 else false
16151526 if ((err == err))
16161527 then {
1617- let $t04834748434 = _withdrawAll(i.payments[0].amount)
1618- let lpTokensToBurn = $t04834748434._1
1619- let balancesToPay = $t04834748434._2
1620- let assetBalances = $t04834748434._3
1528+ let $t03998240069 = _withdrawAll(i.payments[0].amount)
1529+ let lpTokensToBurn = $t03998240069._1
1530+ let balancesToPay = $t03998240069._2
1531+ let assetBalances = $t03998240069._3
16211532 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16221533 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16231534 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16511562 else false
16521563 if ((err == err))
16531564 then {
1654- let $t04978849922 = _withdraw(assetId_, i.payments[0].amount)
1655- let targetAmountNormalized = $t04978849922._1
1656- let finalAssetBalances = $t04978849922._2
1657- let lpFee = $t04978849922._3
1658- let protocolFee = $t04978849922._4
1659- let sigmaFeePerLpUpdated = $t04978849922._5
1565+ let $t04142341578 = _withdraw(assetId_, i.payments[0].amount)
1566+ let targetAmountNormalized = $t04142341578._1
1567+ let finalAssetBalances = $t04142341578._2
1568+ let finalRewardBalances = $t04142341578._3
1569+ let lpFee = $t04142341578._4
1570+ let protocolFee = $t04142341578._5
1571+ let sigmaFeePerLpUpdated = $t04142341578._6
16601572 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16611573 let targetDecimals = _getDecimals(assetId_)
16621574 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16641576 if ((err1 == err1))
16651577 then {
16661578 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - i.payments[0].amount), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1667- $Tuple2(((((([Burn(lpAssetId, i.payments[0].amount), ScriptTransfer(i.caller, finalAmount, _strToAsset(assetId_))] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(assetId_, (lpFee + _loadLpFee(assetId_)))) ++ _saveProtocolFee(assetId_, (protocolFee + _loadProtocolFee(assetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
1579+ $Tuple2((((((([Burn(lpAssetId, i.payments[0].amount), ScriptTransfer(i.caller, finalAmount, _strToAsset(assetId_))] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(finalAssetBalances)) ++ _saveRewardBalances(finalRewardBalances)) ++ _saveLpFee(assetId_, (lpFee + _loadLpFee(assetId_)))) ++ _saveProtocolFee(assetId_, (protocolFee + _loadProtocolFee(assetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16681580 }
16691581 else throw("Strict value is not equal to itself.")
16701582 }
17021614 else false
17031615 if ((err == err))
17041616 then {
1705- let $t05203552193 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1706- let targetAmountNormalized = $t05203552193._1
1707- let finalAssetBalances = $t05203552193._2
1708- let lpFee = $t05203552193._3
1709- let protocolFee = $t05203552193._4
1710- let sigmaFeePerLpUpdated = $t05203552193._5
1617+ let $t04374343922 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1618+ let targetAmountNormalized = $t04374343922._1
1619+ let finalAssetBalances = $t04374343922._2
1620+ let finalRewardBalances = $t04374343922._3
1621+ let lpFee = $t04374343922._4
1622+ let protocolFee = $t04374343922._5
1623+ let sigmaFeePerLpUpdated = $t04374343922._6
17111624 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17121625 let targetDecimals = _getDecimals(targetAssetId_)
17131626 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17141627 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: less than min")
17151628 if ((err1 == err1))
1716- then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
1629+ then $Tuple2(((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveRewardBalances(finalRewardBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
17171630 else throw("Strict value is not equal to itself.")
17181631 }
17191632 else throw("Strict value is not equal to itself.")
17301643 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17311644 if ((err == err))
17321645 then {
1733- let $t05331353400 = _depositAll(lpAmount_)
1734- let lpTokensToMint = $t05331353400._1
1735- let requiredAmountsNormalized = $t05331353400._2
1736- let assetBalances = $t05331353400._3
1646+ let $t04509445181 = _depositAll(lpAmount_)
1647+ let lpTokensToMint = $t04509445181._1
1648+ let requiredAmountsNormalized = $t04509445181._2
1649+ let assetBalances = $t04509445181._3
17371650 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17381651 }
17391652 else throw("Strict value is not equal to itself.")
17531666 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17541667 let assetDecimals = _getDecimals(assetId_)
17551668 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1756- let $t05415954275 = _deposit(assetId_, amountNormalized)
1757- let lpTokensToMint = $t05415954275._1
1758- let assetBalances = $t05415954275._2
1759- let lpFee = $t05415954275._3
1760- let protocolFee = $t05415954275._4
1761- let sigmaFeePerLpUpdated = $t05415954275._5
1669+ let $t04594046072 = _deposit(assetId_, amountNormalized)
1670+ let lpTokensToMint = $t04594046072._1
1671+ let assetBalances = $t04594046072._2
1672+ let rewardBalances = $t04594046072._3
1673+ let lpFee = $t04594046072._4
1674+ let protocolFee = $t04594046072._5
1675+ let sigmaFeePerLpUpdated = $t04594046072._6
17621676 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
17631677 $Tuple2(nil, lpTokensToSend)
17641678 }
17721686 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17731687 if ((err == err))
17741688 then {
1775- let $t05471454790 = _withdrawAll(lpAmount_)
1776- let lpTokensToBurn = $t05471454790._1
1777- let balancesToGet = $t05471454790._2
1778- let assetBalances = $t05471454790._3
1689+ let $t04651146587 = _withdrawAll(lpAmount_)
1690+ let lpTokensToBurn = $t04651146587._1
1691+ let balancesToGet = $t04651146587._2
1692+ let assetBalances = $t04651146587._3
17791693 $Tuple2(nil, balancesToGet)
17801694 }
17811695 else throw("Strict value is not equal to itself.")
17931707 let storage = _loadStorage()
17941708 let lpAssetId = storage._1
17951709 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1796- let $t05544155557 = _withdraw(assetId_, amount_)
1797- let targetAmountNormalized = $t05544155557._1
1798- let assetBalances = $t05544155557._2
1799- let lpFee = $t05544155557._3
1800- let protocolFee = $t05544155557._4
1801- let sigmaFeePerLpUpdated = $t05544155557._5
1710+ let $t04723847370 = _withdraw(assetId_, amount_)
1711+ let targetAmountNormalized = $t04723847370._1
1712+ let assetBalances = $t04723847370._2
1713+ let rewardBalances = $t04723847370._3
1714+ let lpFee = $t04723847370._4
1715+ let protocolFee = $t04723847370._5
1716+ let sigmaFeePerLpUpdated = $t04723847370._6
18021717 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18031718 let targetDecimals = _getDecimals(assetId_)
18041719 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18271742 else false
18281743 if ((err == err))
18291744 then {
1830- let $t05696757125 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1831- let targetAmountNormalized = $t05696757125._1
1832- let finalAssetBalances = $t05696757125._2
1833- let lpFee = $t05696757125._3
1834- let protocolFee = $t05696757125._4
1835- let sigmaFeePerLpUpdated = $t05696757125._5
1745+ let $t04878048959 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1746+ let targetAmountNormalized = $t04878048959._1
1747+ let finalAssetBalances = $t04878048959._2
1748+ let finalRewardBalances = $t04878048959._3
1749+ let lpFee = $t04878048959._4
1750+ let protocolFee = $t04878048959._5
1751+ let sigmaFeePerLpUpdated = $t04878048959._6
18361752 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18371753 let targetDecimals = _getDecimals(targetAssetId_)
18381754 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18521768 let user = if ((size(user_) > 0))
18531769 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18541770 else i.caller
1855- let $t05776757823 = _checkpoint(user)
1856- let checkpointActions = $t05776757823._1
1857- let userProfits = $t05776757823._2
1771+ let $t04960149657 = _checkpoint(user)
1772+ let checkpointActions = $t04960149657._1
1773+ let userProfits = $t04960149657._2
18581774 $Tuple2(nil, userProfits)
18591775 }
18601776
18611777
18621778
18631779 @Callable(i)
1864-func getUtilFunc () = {
1780+func getAssetId () = {
18651781 let storage = _loadStorage()
1866- let lpTotalSupply = storage._3
1867- let weightAmplifier = storage._7
1868- let slippageRate = storage._8
1869- let feeMaxRate = storage._9
1870- let $t05815658216 = _loadAssetBalances()
1871- let assetBalances = $t05815658216._1
1872- let assetTotalSupply = $t05815658216._2
1873- let $t05822158274 = _loadAssetWeights()
1874- let assetWeights = $t05822158274._1
1875- let sigmaWeight = $t05822158274._2
1876- let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1877- let utilValue = (assetTotalSupply - fee)
1878- $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
1879- }
1880-
1881-
1882-
1883-@Callable(i)
1884-func getFeeFunc () = {
1782+ let lpAssetId = storage._1
1783+ $Tuple2(nil, toBase58String(lpAssetId))
1784+ }
1785+
1786+
1787+
1788+@Callable(i)
1789+func getDecimals () = {
18851790 let storage = _loadStorage()
1886- let weightAmplifier = storage._7
1887- let slippageRate = storage._8
1888- let feeMaxRate = storage._9
1889- let $t05870658766 = _loadAssetBalances()
1890- let assetBalances = $t05870658766._1
1891- let assetTotalSupply = $t05870658766._2
1892- let $t05877158824 = _loadAssetWeights()
1893- let assetWeights = $t05877158824._1
1894- let sigmaWeight = $t05877158824._2
1895- let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1896- $Tuple2(nil, fee)
1791+ let lpAssetId = storage._1
1792+ let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1793+ $Tuple2(nil, lpDecimals)
18971794 }
18981795
18991796
19311828 else false
19321829 if ((err1 == err1))
19331830 then {
1934- let $t05983259892 = _checkpoint(i.caller)
1935- let checkpointActions = $t05983259892._1
1936- let userProfits = $t05983259892._2
1831+ let $t05086950929 = _checkpoint(i.caller)
1832+ let checkpointActions = $t05086950929._1
1833+ let userProfits = $t05086950929._2
19371834 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19381835 }
19391836 else throw("Strict value is not equal to itself.")
19561853 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19571854 if ((err1 == err1))
19581855 then {
1959- let $t06040360463 = _checkpoint(i.caller)
1960- let checkpointActions = $t06040360463._1
1961- let userProfits = $t06040360463._2
1856+ let $t05144051500 = _checkpoint(i.caller)
1857+ let checkpointActions = $t05144051500._1
1858+ let userProfits = $t05144051500._2
19621859 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19631860 }
19641861 else throw("Strict value is not equal to itself.")
19831880 let lpAssetIdStr = _assetToStr(lpAssetId)
19841881 let assets = [lpAssetIdStr, _loadAssets()]
19851882 let maxIndex = (size(assets) - 1)
1986- let userLp = _loadUserLp(user)
1987- let $t06118661242 = _checkpoint(user)
1988- let checkpointActions = $t06118661242._1
1989- let userProfits = $t06118661242._2
1883+ let $t05218852244 = _checkpoint(user)
1884+ let checkpointActions = $t05218852244._1
1885+ let userProfits = $t05218852244._2
19901886 func foldFunc (acc,profit) = {
19911887 let index = acc._1
19921888 if (if ((maxIndex >= index))
19991895 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
20001896 }
20011897
2002- let $t06162061711 = {
1898+ let $t05262252713 = {
20031899 let $l = userProfits
20041900 let $s = size($l)
20051901 let $acc0 = $Tuple3(0, nil, nil)
20131909
20141910 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
20151911 }
2016- let idx = $t06162061711._1
2017- let userProfitsUpdated = $t06162061711._2
2018- let profitActions = $t06162061711._3
1912+ let idx = $t05262252713._1
1913+ let userProfitsUpdated = $t05262252713._2
1914+ let profitActions = $t05262252713._3
20191915 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
1916+ }
1917+ else throw("Strict value is not equal to itself.")
1918+ }
1919+
1920+
1921+
1922+@Callable(i)
1923+func claimAll (user_) = {
1924+ let err = if (_whenInitialized())
1925+ then _whenNotPaused()
1926+ else false
1927+ if ((err == err))
1928+ then {
1929+ let user = if ((size(user_) > 0))
1930+ then valueOrErrorMessage(addressFromString(user_), "claimAll: invalid user")
1931+ else i.caller
1932+ let storage = _loadStorage()
1933+ let lpAssetId = storage._1
1934+ let lpAssetIdStr = _assetToStr(lpAssetId)
1935+ let assets = [lpAssetIdStr, _loadAssets()]
1936+ let maxIndex = (size(assets) - 1)
1937+ let $t05334353403 = _loadAssetBalances()
1938+ let assetBalances = $t05334353403._1
1939+ let assetTotalSupply = $t05334353403._2
1940+ let $t05340953465 = _checkpoint(user)
1941+ let checkpointActions = $t05340953465._1
1942+ let userProfits = $t05340953465._2
1943+ func foldFunc (acc,profit) = {
1944+ let index = acc._1
1945+ if ((index == 0))
1946+ then $Tuple5((index + 1), (acc._2 :+ 0), acc._3, acc._4, (acc._5 + profit))
1947+ else if (if ((index > 0))
1948+ then (maxIndex >= index)
1949+ else false)
1950+ then {
1951+ let assetIndex = (index - 1)
1952+ let balance = assetBalances[assetIndex]
1953+ $Tuple5((index + 1), (acc._2 :+ 0), (acc._3 :+ (balance + profit)), (acc._4 + profit), acc._5)
1954+ }
1955+ else $Tuple5((index + 1), (acc._2 :+ 0), acc._3, acc._4, acc._5)
1956+ }
1957+
1958+ let $t05400154137 = {
1959+ let $l = userProfits
1960+ let $s = size($l)
1961+ let $acc0 = $Tuple5(0, nil, nil, 0, 0)
1962+ func $f0_1 ($a,$i) = if (($i >= $s))
1963+ then $a
1964+ else foldFunc($a, $l[$i])
1965+
1966+ func $f0_2 ($a,$i) = if (($i >= $s))
1967+ then $a
1968+ else throw("List size exceeds 11")
1969+
1970+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
1971+ }
1972+ let idx = $t05400154137._1
1973+ let userProfitsUpdated = $t05400154137._2
1974+ let assetBalancesUpdated = $t05400154137._3
1975+ let lpTokensToMint = $t05400154137._4
1976+ let lpTokensProfit = $t05400154137._5
1977+ let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1978+ $Tuple2((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, (lpTokensToMint + lpTokensProfit), lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalancesUpdated)) ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
1979+ }
1980+ else throw("Strict value is not equal to itself.")
1981+ }
1982+
1983+
1984+
1985+@Callable(i)
1986+func updatePoolFees (lpFeeRate_,protocolFeeRate_) = {
1987+ let err = if (if (if (_onlyThisContract(i.caller))
1988+ then _whenInitialized()
1989+ else false)
1990+ then _validateInt(lpFeeRate_, 0, MAX_FEE, "updatePoolFees: invalid lp fee")
1991+ else false)
1992+ then _validateInt(protocolFeeRate_, 0, MAX_FEE, "updatePoolFees: invalid protocol fee")
1993+ else false
1994+ if ((err == err))
1995+ then {
1996+ let storage = _loadStorage()
1997+ let storageUpdated = $Tuple10(storage._1, storage._2, storage._3, lpFeeRate_, protocolFeeRate_, storage._6, storage._7, storage._8, storage._9, storage._10)
1998+ $Tuple2(_saveStorage(storageUpdated), unit)
1999+ }
2000+ else throw("Strict value is not equal to itself.")
2001+ }
2002+
2003+
2004+
2005+@Callable(i)
2006+func updatePoolParams (maxAllocationAmplifier_,weightAmplifier_,disbalanceCoeff_,feeMaxRate_) = {
2007+ let err = if (if (if (if (if (_onlyThisContract(i.caller))
2008+ then _whenInitialized()
2009+ else false)
2010+ then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "updatePoolParams: invalid maxAllocationAmplifier")
2011+ else false)
2012+ then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "updatePoolParams: invalid weightAmplifier")
2013+ else false)
2014+ then _validateInt(disbalanceCoeff_, 0, MAX_INT, "updatePoolParams: invalid disbalanceCoeff")
2015+ else false)
2016+ then _validateInt(feeMaxRate_, 0, MAX_INT, "updatePoolParams: invalid feeMaxRate")
2017+ else false
2018+ if ((err == err))
2019+ then {
2020+ let storage = _loadStorage()
2021+ let storageUpdated = $Tuple10(storage._1, storage._2, storage._3, storage._4, storage._5, maxAllocationAmplifier_, weightAmplifier_, disbalanceCoeff_, feeMaxRate_, storage._10)
2022+ $Tuple2(_saveStorage(storageUpdated), unit)
2023+ }
2024+ else throw("Strict value is not equal to itself.")
2025+ }
2026+
2027+
2028+
2029+@Callable(i)
2030+func migrateBalances () = {
2031+ let err = if (_onlyThisContract(i.caller))
2032+ then _whenInitialized()
2033+ else false
2034+ if ((err == err))
2035+ then {
2036+ let storage = _loadStorage()
2037+ let lpTokenSupply = storage._3
2038+ let $t05667256732 = _loadAssetBalances()
2039+ let assetBalances = $t05667256732._1
2040+ let assetTotalSupply = $t05667256732._2
2041+ let balancesDiff = max([(assetTotalSupply - lpTokenSupply), 0])
2042+ let storageUpdated = $Tuple10(storage._1, storage._2, (lpTokenSupply + balancesDiff), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
2043+ $Tuple2(_saveStorage(storageUpdated), unit)
20202044 }
20212045 else throw("Strict value is not equal to itself.")
20222046 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let WAVES = "waves"
77
88 let MAX_INT = 9223372036854775807
99
1010 let MAX_FEE = 1000000
1111
1212 let MAX_AMPLIFIER = 1000000
1313
1414 let MAX_WEIGHT_AMPLIFIER = 1000000
1515
1616 let MAX_WEIGHT = 1000000
1717
18-let SLIPPAGE_RATE_FACTOR = 1000000
19-
2018 let FEE_RATE_FACTOR = 1000000
2119
2220 let RATE_FACTOR = 1000000
2321
2422 let PERCENT_FACTOR = toBigInt(1000000000000000000)
2523
24+let DISBAlANCE_COEFF_FACTOR = toBigInt(1000000000000)
25+
2626 let ZERO_INT_LIST_10 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2727
2828 let ZERO_INT_LIST_11 = (ZERO_INT_LIST_10 :+ 0)
2929
30+let INDEX_LIST = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
31+
3032 let ZERO_BIGINT = toBigInt(0)
3133
3234 let ZERO_BIGINT_LIST_11 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
3335
3436 let INT_DECIMALS = 8
3537
3638 let BIGINT_DECIMALS = 18
3739
3840 let LIST_64 = split_51C("0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0", "_")
3941
4042 let KEY_MULTISIG = "MULTISIG"
4143
4244 let KEY_STATUS = "STATUS"
4345
4446 let KEY_PAUSED = "PAUSED"
4547
4648 let KEY_PAUSER = "PAUSER"
4749
4850 let KEY_STORAGE = "STORAGE"
4951
5052 let KEY_ASSETS = "ASSETS"
5153
5254 let KEY_ASSET_BALANCES = "ASSET_BALANCES"
55+
56+let KEY_REWARD_BALANCES = "REWARD_BALANCES"
5357
5458 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
5559
5660 let KEY_LP_FEE = "LP_FEE"
5761
5862 let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
5963
6064 let KEY_PRECISION = "PRECISION"
6165
6266 let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
6367
6468 let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
6569
6670 let KEY_USER_LP = "USER_LP"
6771
6872 let KEY_TOTAL_LP = "TOTAL_LP"
6973
7074 let KEY_USER_PROFITS = "USER_PROFITS"
7175
7276 let KEY_WATCHDOG = "WATCHDOG"
7377
7478 let KEY_WATCHDOG_OFFSET = "WATCHDOG_OFFSET"
7579
7680 let KEY_WATCHDOG_HEIGHT = "WATCHDOG_HEIGHT"
7781
7882 func _validateAddress (address_,err_) = match addressFromString(address_) {
7983 case a: Address =>
8084 true
8185 case _ =>
8286 throw(err_)
8387 }
8488
8589
8690 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
8791 then true
8892 else match assetInfo(fromBase58String(assetId_)) {
8993 case a: Asset =>
9094 true
9195 case _ =>
9296 throw(err_)
9397 }
9498
9599
96100 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
97101 then true
98102 else (val_ > upperBoundary_))
99103 then throw(err_)
100104 else true
101105
102106
103107 func _validateBool (val_,target_,err_) = if ((val_ != target_))
104108 then throw(err_)
105109 else true
106110
107111
108112 func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
109113 then throw(err_)
110114 else true
111115
112116
113117 func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
114118 then throw(err_)
115119 else true
116120
117121
118122 func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
119123 func foldFunc (acc,elem) = match parseInt(elem) {
120124 case a: Int =>
121125 if (acc)
122126 then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
123127 else false
124128 case _ =>
125129 throw(err_)
126130 }
127131
128132 let $l = val_
129133 let $s = size($l)
130134 let $acc0 = true
131135 func $f0_1 ($a,$i) = if (($i >= $s))
132136 then $a
133137 else foldFunc($a, $l[$i])
134138
135139 func $f0_2 ($a,$i) = if (($i >= $s))
136140 then $a
137141 else throw("List size exceeds 10")
138142
139143 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
140144 }
141145
142146
143147 func _validateAssets (assets_,err_) = {
144148 func foldFunc (acc,elem) = if (acc)
145149 then _validateAsset(elem, err_)
146150 else false
147151
148152 let $l = assets_
149153 let $s = size($l)
150154 let $acc0 = true
151155 func $f0_1 ($a,$i) = if (($i >= $s))
152156 then $a
153157 else foldFunc($a, $l[$i])
154158
155159 func $f0_2 ($a,$i) = if (($i >= $s))
156160 then $a
157161 else throw("List size exceeds 10")
158162
159163 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
160164 }
161165
162166
163167 func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
164168 then throw(err_)
165169 else true
166170
167171
168172 func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
169173 then true
170174 else (size(val_) > 16))
171175 then throw(err_)
172176 else true
173177
174178
175179 func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
176180 then throw(err_)
177181 else true
178182
179183
180184 func _validateDecimals (val_,err_) = if (if ((0 > val_))
181185 then true
182186 else (val_ > 8))
183187 then throw(err_)
184188 else true
185189
186190
187191 func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
188192 case a: ByteVector =>
189193 if ((assetId_ != toBase58String(a)))
190194 then throw((err_ + ": asset"))
191195 else if ((requiredAmount_ > payment_.amount))
192196 then throw((err_ + ": amount"))
193197 else true
194198 case _ =>
195199 throw((err_ + ": asset"))
196200 }
197201
198202
199203 func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
200204 then throw(err_)
201205 else true
202206
203207
204208 func _assetToStr (asset_) = match asset_ {
205209 case a: ByteVector =>
206210 toBase58String(a)
207211 case _ =>
208212 WAVES
209213 }
210214
211215
212216 func _strToAsset (asset_) = if (if ((asset_ == WAVES))
213217 then true
214218 else (asset_ == ""))
215219 then unit
216220 else fromBase58String(asset_)
217221
218222
219223 func _loadPause () = match getBoolean(KEY_PAUSED) {
220224 case a: Boolean =>
221225 a
222226 case _ =>
223227 false
224228 }
225229
226230
227231 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
228232
229233
230234 func _loadPauser () = match getString(KEY_PAUSER) {
231235 case a: String =>
232236 addressFromStringValue(a)
233237 case _ =>
234238 Address(base58'')
235239 }
236240
237241
238242 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
239243
240244
241245 func _loadMultisig () = match getString(KEY_MULTISIG) {
242246 case a: String =>
243247 addressFromStringValue(a)
244248 case _ =>
245249 Address(base58'')
246250 }
247251
248252
249253 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
250254
251255
252256 func _loadStorage () = match getString(KEY_STORAGE) {
253257 case a: String =>
254258 let struct = split(a, SEP)
255259 $Tuple10(fromBase58String(struct[0]), (struct[1] == "1"), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseIntValue(struct[5]), parseIntValue(struct[6]), parseIntValue(struct[7]), parseIntValue(struct[8]), addressFromStringValue(struct[9]))
256260 case _ =>
257261 $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
258262 }
259263
260264
261265 func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
262266 then "1"
263267 else "0", toString(storage_._3), toString(storage_._4), toString(storage_._5), toString(storage_._6), toString(storage_._7), toString(storage_._8), toString(storage_._9), toString(storage_._10)], SEP))]
264268
265269
266270 func _loadAssets () = match getString(KEY_ASSETS) {
267271 case a: String =>
268272 if ((size(a) > 0))
269273 then split_51C(a, SEP)
270274 else nil
271275 case _ =>
272276 nil
273277 }
274278
275279
276280 func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
277281
278282
279283 func _loadAssetBalances () = {
280284 func foldFunc (acc,elem) = {
281285 let balance = parseIntValue(elem)
282286 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
283287 }
284288
285289 match getString(KEY_ASSET_BALANCES) {
286290 case a: String =>
287291 if ((size(a) > 0))
288292 then {
289293 let $l = split_51C(a, SEP)
290294 let $s = size($l)
291295 let $acc0 = $Tuple2(nil, 0)
292296 func $f0_1 ($a,$i) = if (($i >= $s))
293297 then $a
294298 else foldFunc($a, $l[$i])
295299
296300 func $f0_2 ($a,$i) = if (($i >= $s))
297301 then $a
298302 else throw("List size exceeds 10")
299303
300304 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
301305 }
302306 else $Tuple2(ZERO_INT_LIST_10, 0)
303307 case _ =>
304308 $Tuple2(ZERO_INT_LIST_10, 0)
305309 }
306310 }
307311
308312
309313 func _saveAssetBalances (balances_) = {
310314 func foldFunc (acc,elem) = (acc :+ toString(elem))
311315
312316 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
317+ let $l = balances_
318+ let $s = size($l)
319+ let $acc0 = nil
320+ func $f0_1 ($a,$i) = if (($i >= $s))
321+ then $a
322+ else foldFunc($a, $l[$i])
323+
324+ func $f0_2 ($a,$i) = if (($i >= $s))
325+ then $a
326+ else throw("List size exceeds 10")
327+
328+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
329+ }, SEP))]
330+ }
331+
332+
333+func _loadRewardBalances () = {
334+ func foldFunc (acc,elem) = {
335+ let balance = parseIntValue(elem)
336+ (acc :+ balance)
337+ }
338+
339+ match getString(KEY_REWARD_BALANCES) {
340+ case a: String =>
341+ if ((size(a) > 0))
342+ then {
343+ let $l = split_51C(a, SEP)
344+ let $s = size($l)
345+ let $acc0 = nil
346+ func $f0_1 ($a,$i) = if (($i >= $s))
347+ then $a
348+ else foldFunc($a, $l[$i])
349+
350+ func $f0_2 ($a,$i) = if (($i >= $s))
351+ then $a
352+ else throw("List size exceeds 10")
353+
354+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
355+ }
356+ else ZERO_INT_LIST_10
357+ case _ =>
358+ ZERO_INT_LIST_10
359+ }
360+ }
361+
362+
363+func _saveRewardBalances (balances_) = {
364+ func foldFunc (acc,elem) = (acc :+ toString(elem))
365+
366+[StringEntry(KEY_REWARD_BALANCES, makeString_11C({
313367 let $l = balances_
314368 let $s = size($l)
315369 let $acc0 = nil
316370 func $f0_1 ($a,$i) = if (($i >= $s))
317371 then $a
318372 else foldFunc($a, $l[$i])
319373
320374 func $f0_2 ($a,$i) = if (($i >= $s))
321375 then $a
322376 else throw("List size exceeds 10")
323377
324378 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
325379 }, SEP))]
326380 }
327381
328382
329383 func _loadAssetWeights () = {
330384 func foldFunc (acc,elem) = {
331385 let weight = parseIntValue(elem)
332386 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
333387 }
334388
335389 match getString(KEY_ASSET_WEIGHTS) {
336390 case a: String =>
337391 if ((size(a) > 0))
338392 then {
339393 let $l = split_51C(a, SEP)
340394 let $s = size($l)
341395 let $acc0 = $Tuple2(nil, 0)
342396 func $f0_1 ($a,$i) = if (($i >= $s))
343397 then $a
344398 else foldFunc($a, $l[$i])
345399
346400 func $f0_2 ($a,$i) = if (($i >= $s))
347401 then $a
348402 else throw("List size exceeds 10")
349403
350404 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
351405 }
352406 else $Tuple2(ZERO_INT_LIST_10, 0)
353407 case _ =>
354408 $Tuple2(ZERO_INT_LIST_10, 0)
355409 }
356410 }
357411
358412
359413 func _saveAssetWeights (weights_) = {
360414 func foldFunc (acc,elem) = (acc :+ toString(elem))
361415
362416 [StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
363417 let $l = weights_
364418 let $s = size($l)
365419 let $acc0 = nil
366420 func $f0_1 ($a,$i) = if (($i >= $s))
367421 then $a
368422 else foldFunc($a, $l[$i])
369423
370424 func $f0_2 ($a,$i) = if (($i >= $s))
371425 then $a
372426 else throw("List size exceeds 10")
373427
374428 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
375429 }, SEP))]
376430 }
377431
378432
379433 func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
380434 case a: Int =>
381435 a
382436 case _ =>
383437 0
384438 }
385439
386440
387441 func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
388442
389443
390444 func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
391445 case a: Int =>
392446 a
393447 case _ =>
394448 0
395449 }
396450
397451
398452 func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
399453
400454
401455 func _loadPrecision () = match getInteger(KEY_PRECISION) {
402456 case a: Int =>
403457 a
404458 case _ =>
405459 0
406460 }
407461
408462
409463 func _savePrecision (val_) = [IntegerEntry(KEY_PRECISION, val_)]
410464
411465
412466 func _loadSigmaFeePerLp () = {
413467 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
414468
415469 match getString(KEY_SIGMA_FEE_PER_LP) {
416470 case a: String =>
417471 if ((size(a) > 0))
418472 then {
419473 let $l = split_51C(a, SEP)
420474 let $s = size($l)
421475 let $acc0 = nil
422476 func $f0_1 ($a,$i) = if (($i >= $s))
423477 then $a
424478 else foldFunc($a, $l[$i])
425479
426480 func $f0_2 ($a,$i) = if (($i >= $s))
427481 then $a
428482 else throw("List size exceeds 11")
429483
430484 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
431485 }
432486 else ZERO_BIGINT_LIST_11
433487 case _ =>
434488 ZERO_BIGINT_LIST_11
435489 }
436490 }
437491
438492
439493 func _saveSigmaFeePerLp (val_) = {
440494 func foldFunc (acc,elem) = (acc :+ toString(elem))
441495
442496 [StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
443497 let $l = val_
444498 let $s = size($l)
445499 let $acc0 = nil
446500 func $f0_1 ($a,$i) = if (($i >= $s))
447501 then $a
448502 else foldFunc($a, $l[$i])
449503
450504 func $f0_2 ($a,$i) = if (($i >= $s))
451505 then $a
452506 else throw("List size exceeds 11")
453507
454508 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
455509 }, SEP))]
456510 }
457511
458512
459513 func _loadUserSigmaFeePerLp (user_) = {
460514 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
461515
462516 match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
463517 case a: String =>
464518 if ((size(a) > 0))
465519 then {
466520 let $l = split_51C(a, SEP)
467521 let $s = size($l)
468522 let $acc0 = nil
469523 func $f0_1 ($a,$i) = if (($i >= $s))
470524 then $a
471525 else foldFunc($a, $l[$i])
472526
473527 func $f0_2 ($a,$i) = if (($i >= $s))
474528 then $a
475529 else throw("List size exceeds 11")
476530
477531 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
478532 }
479533 else ZERO_BIGINT_LIST_11
480534 case _ =>
481535 ZERO_BIGINT_LIST_11
482536 }
483537 }
484538
485539
486540 func _saveUserSigmaFeePerLp (user_,val_) = {
487541 func foldFunc (acc,elem) = (acc :+ toString(elem))
488542
489543 [StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
490544 let $l = val_
491545 let $s = size($l)
492546 let $acc0 = nil
493547 func $f0_1 ($a,$i) = if (($i >= $s))
494548 then $a
495549 else foldFunc($a, $l[$i])
496550
497551 func $f0_2 ($a,$i) = if (($i >= $s))
498552 then $a
499553 else throw("List size exceeds 11")
500554
501555 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
502556 }, SEP))]
503557 }
504558
505559
506560 func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
507561 case a: Int =>
508562 a
509563 case _ =>
510564 0
511565 }
512566
513567
514568 func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
515569
516570
517571 func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
518572 case a: Int =>
519573 a
520574 case _ =>
521575 0
522576 }
523577
524578
525579 func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
526580
527581
528582 func _loadUserProfits (user_) = {
529583 func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
530584
531585 match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
532586 case a: String =>
533587 if ((size(a) > 0))
534588 then {
535589 let $l = split_51C(a, SEP)
536590 let $s = size($l)
537591 let $acc0 = nil
538592 func $f0_1 ($a,$i) = if (($i >= $s))
539593 then $a
540594 else foldFunc($a, $l[$i])
541595
542596 func $f0_2 ($a,$i) = if (($i >= $s))
543597 then $a
544598 else throw("List size exceeds 11")
545599
546600 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
547601 }
548602 else ZERO_INT_LIST_11
549603 case _ =>
550604 ZERO_INT_LIST_11
551605 }
552606 }
553607
554608
555609 func _saveUserProfits (user_,val_) = {
556610 func foldFunc (acc,elem) = (acc :+ toString(elem))
557611
558612 [StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
559613 let $l = val_
560614 let $s = size($l)
561615 let $acc0 = nil
562616 func $f0_1 ($a,$i) = if (($i >= $s))
563617 then $a
564618 else foldFunc($a, $l[$i])
565619
566620 func $f0_2 ($a,$i) = if (($i >= $s))
567621 then $a
568622 else throw("List size exceeds 11")
569623
570624 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
571625 }, SEP))]
572626 }
573627
574628
575629 func _loadWatchdog () = match getString(KEY_WATCHDOG) {
576630 case a: String =>
577631 addressFromStringValue(a)
578632 case _ =>
579633 Address(base58'')
580634 }
581635
582636
583637 func _saveWatchdog (watchdog_) = [StringEntry(KEY_WATCHDOG, toString(watchdog_))]
584638
585639
586640 func _loadWatchdogOffset () = match getInteger(KEY_WATCHDOG_OFFSET) {
587641 case a: Int =>
588642 a
589643 case _ =>
590644 0
591645 }
592646
593647
594648 func _saveWatchdogOffset (offset_) = [IntegerEntry(KEY_WATCHDOG_OFFSET, offset_)]
595649
596650
597651 func _onlyThisContract (caller_) = if ((caller_ != this))
598652 then throw("_onlyThisContract: revert")
599653 else true
600654
601655
602656 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
603657 then throw("_whenMultisigSet: revert")
604658 else true
605659
606660
607661 func _whenNotInitialized () = {
608662 let storage = _loadStorage()
609663 if ((storage._1 != base58''))
610664 then throw("_whenNotInitialized: revert")
611665 else true
612666 }
613667
614668
615669 func _whenInitialized () = {
616670 let storage = _loadStorage()
617671 if ((storage._1 == base58''))
618672 then throw("_whenInitialized: revert")
619673 else true
620674 }
621675
622676
623677 func _whenNotPaused () = if (_loadPause())
624678 then throw("_whenNotPaused: revert")
625679 else true
626680
627681
628682 func _whenPaused () = if (!(_loadPause()))
629683 then throw("_whenPaused: revert")
630684 else true
631685
632686
633687 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
634688 then throw("_onlyPauser: revert")
635689 else true
636690
637691
638692 func _checkWatchdog () = {
639693 let wd = match getInteger(_loadWatchdog(), KEY_WATCHDOG_HEIGHT) {
640694 case a: Int =>
641695 (a + _loadWatchdogOffset())
642696 case _ =>
643697 0
644698 }
645699 if ((height > wd))
646700 then throw("_checkWatchdog: revert")
647701 else true
648702 }
649703
650704
651705 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
652706 case a: Asset =>
653707 a.decimals
654708 case _ =>
655709 throw(("_getDecimals: no asset=" + assetId_))
656710 }
657711
658712
659713 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
660714 then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
661715 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
662716
663717
664718 func _prepareAssetBalances (assets_) = {
665719 func foldFunc (acc,elem) = (acc :+ 0)
666720
667721 let $l = assets_
668722 let $s = size($l)
669723 let $acc0 = nil
670724 func $f0_1 ($a,$i) = if (($i >= $s))
671725 then $a
672726 else foldFunc($a, $l[$i])
673727
674728 func $f0_2 ($a,$i) = if (($i >= $s))
675729 then $a
676730 else throw("List size exceeds 10")
677731
678732 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
679733 }
680734
681735
682736 func _prepareAssetWeights (assetWeights_) = {
683737 func foldFunc (acc,elem) = {
684738 let weight = parseIntValue(elem)
685739 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
686740 }
687741
688742 let $l = assetWeights_
689743 let $s = size($l)
690744 let $acc0 = $Tuple2(nil, 0)
691745 func $f0_1 ($a,$i) = if (($i >= $s))
692746 then $a
693747 else foldFunc($a, $l[$i])
694748
695749 func $f0_2 ($a,$i) = if (($i >= $s))
696750 then $a
697751 else throw("List size exceeds 10")
698752
699753 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
700754 }
701755
702756
703757 func _getAssetBalances (assets_,decimals_) = {
704758 func foldFunc (acc,elem) = {
705759 let assetDecimals = _getDecimals(elem)
706760 let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
707761 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
708762 }
709763
710764 let $l = assets_
711765 let $s = size($l)
712766 let $acc0 = $Tuple2(nil, 0)
713767 func $f0_1 ($a,$i) = if (($i >= $s))
714768 then $a
715769 else foldFunc($a, $l[$i])
716770
717771 func $f0_2 ($a,$i) = if (($i >= $s))
718772 then $a
719773 else throw("List size exceeds 10")
720774
721775 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
722776 }
723777
724778
725779 func _listIntToString (assets_) = {
726780 func foldFunc (acc,elem) = (acc :+ toString(elem))
727781
728782 makeString({
729783 let $l = assets_
730784 let $s = size($l)
731785 let $acc0 = nil
732786 func $f0_1 ($a,$i) = if (($i >= $s))
733787 then $a
734788 else foldFunc($a, $l[$i])
735789
736790 func $f0_2 ($a,$i) = if (($i >= $s))
737791 then $a
738792 else throw("List size exceeds 11")
739793
740794 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
741795 }, SEP)
742796 }
743797
744798
745799 func _listBigIntToString (assets_) = {
746800 func foldFunc (acc,elem) = (acc :+ toString(elem))
747801
748802 makeString({
749803 let $l = assets_
750804 let $s = size($l)
751805 let $acc0 = nil
752806 func $f0_1 ($a,$i) = if (($i >= $s))
753807 then $a
754808 else foldFunc($a, $l[$i])
755809
756810 func $f0_2 ($a,$i) = if (($i >= $s))
757811 then $a
758812 else throw("List size exceeds 11")
759813
760814 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
761815 }, SEP)
762816 }
763817
764818
765819 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
766820 func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
767821
768822 let $l = weights_
769823 let $s = size($l)
770824 let $acc0 = nil
771825 func $f0_1 ($a,$i) = if (($i >= $s))
772826 then $a
773827 else foldFunc($a, $l[$i])
774828
775829 func $f0_2 ($a,$i) = if (($i >= $s))
776830 then $a
777831 else throw("List size exceeds 10")
778832
779833 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
780834 }
781835
782836
783837 func _incrementBalancesByAmounts (balances_,amounts_) = {
784838 func foldFunc (acc,elem) = {
785839 let index = acc._1
786840 let amount = amounts_[index]
787841 let newBalance = (elem + amount)
788842 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
789843 }
790844
791845 let result = {
792846 let $l = balances_
793847 let $s = size($l)
794848 let $acc0 = $Tuple3(0, nil, 0)
795849 func $f0_1 ($a,$i) = if (($i >= $s))
796850 then $a
797851 else foldFunc($a, $l[$i])
798852
799853 func $f0_2 ($a,$i) = if (($i >= $s))
800854 then $a
801855 else throw("List size exceeds 10")
802856
803857 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
804858 }
805859 $Tuple2(result._2, result._3)
806860 }
807861
808862
809863 func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
810864 func foldFunc (acc,elem) = {
811865 let index = acc._1
812866 let payment = payments_[index]
813867 let paymentAssetStr = _assetToStr(payment.assetId)
814868 let err = if ((paymentAssetStr != assets_[index]))
815869 then throw(((err_ + ": index=") + toString(index)))
816870 else unit
817871 if ((err == err))
818872 then {
819873 let assetDecimals = _getDecimals(paymentAssetStr)
820874 let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
821875 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
822876 }
823877 else throw("Strict value is not equal to itself.")
824878 }
825879
826880 let result = {
827881 let $l = balances_
828882 let $s = size($l)
829883 let $acc0 = $Tuple3(0, nil, 0)
830884 func $f0_1 ($a,$i) = if (($i >= $s))
831885 then $a
832886 else foldFunc($a, $l[$i])
833887
834888 func $f0_2 ($a,$i) = if (($i >= $s))
835889 then $a
836890 else throw("List size exceeds 10")
837891
838892 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
839893 }
840894 $Tuple2(result._2, result._3)
841895 }
842896
843897
844898 func _incrementBalanceByIndex (balances_,index_,amount_) = {
845899 func foldFunc (acc,elem) = {
846900 let index = acc._1
847901 if ((index == index_))
848902 then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
849903 else $Tuple2((index + 1), (acc._2 :+ elem))
850904 }
851905
852906 let result = {
853907 let $l = balances_
854908 let $s = size($l)
855909 let $acc0 = $Tuple2(0, nil)
856910 func $f0_1 ($a,$i) = if (($i >= $s))
857911 then $a
858912 else foldFunc($a, $l[$i])
859913
860914 func $f0_2 ($a,$i) = if (($i >= $s))
861915 then $a
862916 else throw("List size exceeds 10")
863917
864918 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
865919 }
866920 result._2
867921 }
868922
869923
870924 func _decrementBalanceByIndex (balances_,index_,amount_) = {
871925 func foldFunc (acc,elem) = {
872926 let index = acc._1
873927 if (if ((index == index_))
874928 then (amount_ > elem)
875929 else false)
876930 then throw("insufficient balance")
877931 else if (if ((index == index_))
878932 then (elem >= amount_)
879933 else false)
880934 then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
881935 else $Tuple2((index + 1), (acc._2 :+ elem))
882936 }
883937
884938 let result = {
885939 let $l = balances_
886940 let $s = size($l)
887941 let $acc0 = $Tuple2(0, nil)
888942 func $f0_1 ($a,$i) = if (($i >= $s))
889943 then $a
890944 else foldFunc($a, $l[$i])
891945
892946 func $f0_2 ($a,$i) = if (($i >= $s))
893947 then $a
894948 else throw("List size exceeds 10")
895949
896950 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
897951 }
898952 result._2
899953 }
900954
901955
902956 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
903957 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
904958 func foldFunc (acc,elem) = {
905959 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
906960 let deltaBalance = (elem - newBalance)
907961 if ((0 > deltaBalance))
908962 then throw("insufficient delta balance")
909963 else $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
910964 }
911965
912966 let $l = balances_
913967 let $s = size($l)
914968 let $acc0 = $Tuple3(nil, 0, nil)
915969 func $f0_1 ($a,$i) = if (($i >= $s))
916970 then $a
917971 else foldFunc($a, $l[$i])
918972
919973 func $f0_2 ($a,$i) = if (($i >= $s))
920974 then $a
921975 else throw("List size exceeds 10")
922976
923977 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
924978 }
925979
926980
927981 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
928982 func foldFunc (acc,elem) = {
929983 let index = acc._1
930984 $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
931985 }
932986
933987 let result = {
934988 let $l = assets_
935989 let $s = size($l)
936990 let $acc0 = $Tuple2(0, nil)
937991 func $f0_1 ($a,$i) = if (($i >= $s))
938992 then $a
939993 else foldFunc($a, $l[$i])
940994
941995 func $f0_2 ($a,$i) = if (($i >= $s))
942996 then $a
943997 else throw("List size exceeds 10")
944998
945999 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
9461000 }
9471001 result._2
9481002 }
9491003
9501004
951-func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
952- then {
953- let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
954- if ((threshold > balance_))
955- then {
956- let maxDeviation = (threshold - balance_)
957- let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
958- if ((feeRate > feeMaxRate_))
959- then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
960- else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
961- }
962- else 0
963- }
964- else {
965- let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
966- if ((balance_ > threshold))
967- then {
968- let maxDeviation = (balance_ - threshold)
969- let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
970- if ((feeRate > feeMaxRate_))
971- then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
972- else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
973- }
974- else 0
975- }
976-
977-
978-func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = 0
979-
980-
981-func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
982- then true
983- else (lpTotalSupply_ == 0))
984- then true
985- else {
986- let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
987- let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
988- let diff = (newAssetsRate - prevAssetsRate)
989- if (if ((0 >= diff))
990- then ((-1 * _loadPrecision()) > diff)
991- else false)
992- then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
993- else true
994- }
995-
996-
997-func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
998- let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
999- let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
1000- let diff = (newUtil - prevUtil)
1001- if (if ((0 >= diff))
1002- then ((-1 * _loadPrecision()) > diff)
1003- else false)
1004- then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
1005- else true
1006- }
1007-
1008-
1009-func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
1010- let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
1011- let maxAllocationAmp = if ((balance_ > equilibrium))
1012- then (MAX_AMPLIFIER + maxAllocAmp_)
1013- else (MAX_AMPLIFIER - maxAllocAmp_)
1014- let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
1015- let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
1016- if ((balance_ > equilibrium))
1017- then if ((balance_ > maxAllocation))
1018- then if ((prevMaxAllocation > prevBalance_))
1019- then throw("_validateAssetAllocation: new up")
1020- else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
1021- then throw("_validateAssetAllocation: still up")
1022- else true
1023- else true
1024- else if ((maxAllocation > balance_))
1025- then if ((prevBalance_ > prevMaxAllocation))
1026- then throw("_validateAssetAllocation: new down")
1027- else if (((maxAllocation - balance_) > (prevMaxAllocation - prevBalance_)))
1028- then throw("_validateAssetAllocation: still down")
1029- else true
1030- else true
1031- }
1032-
1033-
1034-func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = true
1005+func _calculateMinusFee (balance_,equilibrium_,lpAmount_,weightAmplifier_,disbalanceCoeff_) = {
1006+ let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
1007+ if ((balance_ > threshold))
1008+ then 0
1009+ else toInt(fraction(fraction(toBigInt(lpAmount_), toBigInt(disbalanceCoeff_), DISBAlANCE_COEFF_FACTOR), toBigInt((threshold - balance_)), toBigInt(threshold), CEILING))
1010+ }
1011+
1012+
1013+func _calculateMinusFeeDelta (balanceBefore_,balanceAfter_,equilibrium_,lpAmount_,weightAmplifier_,disbalanceCoeff_) = if ((balanceAfter_ > balanceBefore_))
1014+ then 0
1015+ else (_calculateMinusFee(balanceAfter_, equilibrium_, lpAmount_, weightAmplifier_, disbalanceCoeff_) - _calculateMinusFee(balanceBefore_, equilibrium_, lpAmount_, weightAmplifier_, disbalanceCoeff_))
1016+
1017+
1018+func _calculatePlusFee (balance_,equilibrium_,rewardBalance_) = if ((balance_ > equilibrium_))
1019+ then rewardBalance_
1020+ else fraction(rewardBalance_, balance_, equilibrium_, FLOOR)
1021+
1022+
1023+func _calculatePlusFeeDelta (balanceBefore_,balanceAfter_,equilibrium_,rewardBalance_) = if ((balanceBefore_ > balanceAfter_))
1024+ then 0
1025+ else (_calculatePlusFee(balanceAfter_, equilibrium_, rewardBalance_) - _calculatePlusFee(balanceBefore_, equilibrium_, rewardBalance_))
1026+
1027+
1028+func _validateAllocation (assetBalances_,rewardBalances_) = {
1029+ let maxIndex = size(assetBalances_)
1030+ func foldFunc (acc,index) = if ((index >= maxIndex))
1031+ then acc
1032+ else if ((0 > assetBalances_[index]))
1033+ then throw("_validateAllocation: negative assetBalances")
1034+ else if ((0 > rewardBalances_[index]))
1035+ then throw("_validateAllocation: negative rewardBalances")
1036+ else acc
1037+
1038+ let $l = INDEX_LIST
1039+ let $s = size($l)
1040+ let $acc0 = true
1041+ func $f0_1 ($a,$i) = if (($i >= $s))
1042+ then $a
1043+ else foldFunc($a, $l[$i])
1044+
1045+ func $f0_2 ($a,$i) = if (($i >= $s))
1046+ then $a
1047+ else throw("List size exceeds 10")
1048+
1049+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
1050+ }
10351051
10361052
10371053 func _checkpoint (user_) = {
10381054 let userLp = _loadUserLp(user_)
10391055 let userProfits = _loadUserProfits(user_)
10401056 let sigmaFeePerLp = _loadSigmaFeePerLp()
10411057 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
10421058 func foldFunc (acc,elem) = {
10431059 let index = acc._1
10441060 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
10451061 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10461062 }
10471063
1048- let $t02577125844 = {
1064+ let $t02231422387 = {
10491065 let $l = ZERO_INT_LIST_11
10501066 let $s = size($l)
10511067 let $acc0 = $Tuple2(0, nil)
10521068 func $f0_1 ($a,$i) = if (($i >= $s))
10531069 then $a
10541070 else foldFunc($a, $l[$i])
10551071
10561072 func $f0_2 ($a,$i) = if (($i >= $s))
10571073 then $a
10581074 else throw("List size exceeds 11")
10591075
10601076 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
10611077 }
1062- let idx = $t02577125844._1
1063- let profitsUpdated = $t02577125844._2
1078+ let idx = $t02231422387._1
1079+ let profitsUpdated = $t02231422387._2
10641080 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10651081 }
10661082
10671083
10681084 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
10691085 func foldFunc (acc,elem) = {
10701086 let index = acc._1
10711087 let sigmaFeePerLpUpdated = if ((index_ == index))
10721088 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
10731089 else sigmaFeePerLp_[index]
10741090 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10751091 }
10761092
1077- let $t02649426573 = {
1093+ let $t02303723116 = {
10781094 let $l = ZERO_INT_LIST_11
10791095 let $s = size($l)
10801096 let $acc0 = $Tuple2(0, nil)
10811097 func $f0_1 ($a,$i) = if (($i >= $s))
10821098 then $a
10831099 else foldFunc($a, $l[$i])
10841100
10851101 func $f0_2 ($a,$i) = if (($i >= $s))
10861102 then $a
10871103 else throw("List size exceeds 11")
10881104
10891105 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
10901106 }
1091- let idx = $t02649426573._1
1092- let sigmaFeePerLpUpdated = $t02649426573._2
1107+ let idx = $t02303723116._1
1108+ let sigmaFeePerLpUpdated = $t02303723116._2
10931109 sigmaFeePerLpUpdated
10941110 }
10951111
10961112
10971113 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10981114 let sigmaFeePerLp = _loadSigmaFeePerLp()
10991115 let totalLp = _loadTotalLp()
1100- let $t02679427069 = if ((totalLp == 0))
1116+ let $t02333723612 = if ((totalLp == 0))
11011117 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
11021118 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1103- let lpFee = $t02679427069._1
1104- let protocolFee = $t02679427069._2
1119+ let lpFee = $t02333723612._1
1120+ let protocolFee = $t02333723612._2
11051121 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11061122 then sigmaFeePerLp
11071123 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11081124 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
11091125 }
11101126
11111127
11121128 func _depositAll (amount_) = {
11131129 let storage = _loadStorage()
11141130 let lpTotalSupply = storage._3
1115- let weightAmplifier = storage._7
1116- let slippageRate = storage._8
1117- let feeMaxRate = storage._9
11181131 let assets = _loadAssets()
1119- let $t02757827631 = _loadAssetWeights()
1120- let assetWeights = $t02757827631._1
1121- let sigmaWeight = $t02757827631._2
1122- let $t02763627704 = _loadAssetBalances()
1123- let prevAssetBalances = $t02763627704._1
1124- let prevAssetTotalSupply = $t02763627704._2
1125- let $t02771028940 = if ((prevAssetTotalSupply == 0))
1132+ let $t02401824071 = _loadAssetWeights()
1133+ let assetWeights = $t02401824071._1
1134+ let sigmaWeight = $t02401824071._2
1135+ let $t02407624144 = _loadAssetBalances()
1136+ let prevAssetBalances = $t02407624144._1
1137+ let prevAssetTotalSupply = $t02407624144._2
1138+ let $t02415025380 = if ((prevAssetTotalSupply == 0))
11261139 then {
11271140 func foldFunc (acc,elem) = {
11281141 let index = acc._1
11291142 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
11301143 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11311144 }
11321145
1133- let $t02815228226 = {
1146+ let $t02459224666 = {
11341147 let $l = assets
11351148 let $s = size($l)
11361149 let $acc0 = $Tuple2(0, nil)
11371150 func $f0_1 ($a,$i) = if (($i >= $s))
11381151 then $a
11391152 else foldFunc($a, $l[$i])
11401153
11411154 func $f0_2 ($a,$i) = if (($i >= $s))
11421155 then $a
11431156 else throw("List size exceeds 10")
11441157
11451158 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11461159 }
1147- let idx = $t02815228226._1
1148- let requiredAmountsNormalized = $t02815228226._2
1160+ let idx = $t02459224666._1
1161+ let requiredAmountsNormalized = $t02459224666._2
11491162 $Tuple2(amount_, requiredAmountsNormalized)
11501163 }
11511164 else {
11521165 let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
11531166 func foldFunc1 (acc,elem) = {
11541167 let index = acc._1
11551168 let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
11561169 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11571170 }
11581171
1159- let $t02876928844 = {
1172+ let $t02520925284 = {
11601173 let $l = assets
11611174 let $s = size($l)
11621175 let $acc0 = $Tuple2(0, nil)
11631176 func $f0_1 ($a,$i) = if (($i >= $s))
11641177 then $a
11651178 else foldFunc1($a, $l[$i])
11661179
11671180 func $f0_2 ($a,$i) = if (($i >= $s))
11681181 then $a
11691182 else throw("List size exceeds 10")
11701183
11711184 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11721185 }
1173- let idx = $t02876928844._1
1174- let requiredAmountsNormalized = $t02876928844._2
1186+ let idx = $t02520925284._1
1187+ let requiredAmountsNormalized = $t02520925284._2
11751188 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11761189 }
1177- let lpTokensToMint = $t02771028940._1
1178- let requiredAmountsNormalized = $t02771028940._2
1179- let $t02894629059 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1180- let assetBalances = $t02894629059._1
1181- let assetTotalSupply = $t02894629059._2
1182- let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1183- if ((err2 == err2))
1184- then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
1185- else throw("Strict value is not equal to itself.")
1190+ let lpTokensToMint = $t02415025380._1
1191+ let requiredAmountsNormalized = $t02415025380._2
1192+ let $t02538625499 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1193+ let assetBalances = $t02538625499._1
1194+ let assetTotalSupply = $t02538625499._2
1195+ $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11861196 }
11871197
11881198
11891199 func _deposit (assetId_,amount_) = {
11901200 let storage = _loadStorage()
11911201 let lpTotalSupply = storage._3
11921202 let lpFeeRate = storage._4
11931203 let protocolFeeRate = storage._5
11941204 let maxAllocAmplifier = storage._6
11951205 let weightAmplifier = storage._7
1196- let slippageRate = storage._8
1197- let feeMaxRate = storage._9
11981206 let assets = _loadAssets()
1199- let $t02982229875 = _loadAssetWeights()
1200- let assetWeights = $t02982229875._1
1201- let sigmaWeight = $t02982229875._2
1202- let $t02988029994 = _loadAssetBalances()
1203- let prevAssetBalances = $t02988029994._1
1204- let prevAssetTotalSupply = $t02988029994._2
1205- let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
1206- let assetTotalSupply = (prevAssetTotalSupply + amount_)
1207- let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
1208- if ((err2 == err2))
1209- then {
1210- let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1211- let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1212- let lpTokensToMint = if ((lpTotalSupply == 0))
1213- then throw("_deposit: empty pool")
1214- else {
1215- let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
1216- let feeDiff = (fee - prevFee)
1217- let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
1218- let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
1219- let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1220- if ((err3 == err3))
1221- then lpTokensToMintInner
1222- else throw("Strict value is not equal to itself.")
1207+ let $t02586525918 = _loadAssetWeights()
1208+ let assetWeights = $t02586525918._1
1209+ let sigmaWeight = $t02586525918._2
1210+ let $t02592325991 = _loadAssetBalances()
1211+ let prevAssetBalances = $t02592325991._1
1212+ let prevAssetTotalSupply = $t02592325991._2
1213+ let prevRewardBalances = _loadRewardBalances()
1214+ let err = if (if ((prevAssetTotalSupply == 0))
1215+ then true
1216+ else (lpTotalSupply == 0))
1217+ then throw("_deposit: empty pool")
1218+ else true
1219+ if ((err == err))
1220+ then {
1221+ let sourceAssetIndex = value(indexOf(assets, assetId_))
1222+ let sourceEquilibrium = fraction(prevAssetTotalSupply, assetWeights[sourceAssetIndex], sigmaWeight)
1223+ let sourceBalanceBefore = prevAssetBalances[sourceAssetIndex]
1224+ let sourceRewardBalance = prevRewardBalances[sourceAssetIndex]
1225+ let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + amount_), sourceEquilibrium, sourceRewardBalance)
1226+ let newRewardBalances = _decrementBalanceByIndex(prevRewardBalances, sourceAssetIndex, sourcePlusFeeDelta)
1227+ let newAssetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex, (amount_ + sourcePlusFeeDelta))
1228+ let lpTokensToMint = (amount_ + sourcePlusFeeDelta)
1229+ let err1 = _validateAllocation(newAssetBalances, newRewardBalances)
1230+ if ((err1 == err1))
1231+ then {
1232+ let $t02708127212 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1233+ let lpFee = $t02708127212._1
1234+ let protocolFee = $t02708127212._2
1235+ let sigmaFeePerLpUpdated = $t02708127212._3
1236+ $Tuple6(lpTokensToMint, newAssetBalances, newRewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12231237 }
1224- let $t03165631787 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1225- let lpFee = $t03165631787._1
1226- let protocolFee = $t03165631787._2
1227- let sigmaFeePerLpUpdated = $t03165631787._3
1228- $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
1238+ else throw("Strict value is not equal to itself.")
12291239 }
12301240 else throw("Strict value is not equal to itself.")
12311241 }
12321242
12331243
12341244 func _withdrawAll (amount_) = {
12351245 let storage = _loadStorage()
12361246 let lpTotalSupply = storage._3
1237- let maxAllocAmplifier = storage._6
1238- let weightAmplifier = storage._7
1239- let slippageRate = storage._8
1240- let feeMaxRate = storage._9
1241- let $t03212132189 = _loadAssetBalances()
1242- let prevAssetBalances = $t03212132189._1
1243- let prevAssetTotalSupply = $t03212132189._2
1244- let $t03219432247 = _loadAssetWeights()
1245- let assetWeights = $t03219432247._1
1246- let sigmaWeight = $t03219432247._2
1247+ let $t02742527493 = _loadAssetBalances()
1248+ let prevAssetBalances = $t02742527493._1
1249+ let prevAssetTotalSupply = $t02742527493._2
1250+ let $t02749827551 = _loadAssetWeights()
1251+ let assetWeights = $t02749827551._1
1252+ let sigmaWeight = $t02749827551._2
12471253 let lpTokensToBurn = amount_
1248- let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
1249- if ((err == err))
1250- then {
1251- let $t03238932522 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1252- let assetBalances = $t03238932522._1
1253- let assetTotalSupply = $t03238932522._2
1254- let balancesToPay = $t03238932522._3
1255- let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1256- if ((err2 == err2))
1257- then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
1258- else throw("Strict value is not equal to itself.")
1254+ let err = _validateInt(lpTokensToBurn, 0, lpTotalSupply, "_withdrawAll: invalid lpTokensToBurn")
1255+ if ((err == err))
1256+ then {
1257+ let $t02769527828 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1258+ let assetBalances = $t02769527828._1
1259+ let assetTotalSupply = $t02769527828._2
1260+ let balancesToPay = $t02769527828._3
1261+ $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12591262 }
12601263 else throw("Strict value is not equal to itself.")
12611264 }
12621265
12631266
12641267 func _withdraw (assetId_,lpAmount_) = {
12651268 let storage = _loadStorage()
12661269 let lpTotalSupply = storage._3
12671270 let lpFeeRate = storage._4
12681271 let protocolFeeRate = storage._5
12691272 let maxAllocAmplifier = storage._6
12701273 let weightAmplifier = storage._7
1271- let slippageRate = storage._8
1272- let feeMaxRate = storage._9
1273- let precision = _loadPrecision()
1274+ let disbalanceCoeff = storage._8
12741275 let assets = _loadAssets()
1275- let $t03331433382 = _loadAssetBalances()
1276- let prevAssetBalances = $t03331433382._1
1277- let prevAssetTotalSupply = $t03331433382._2
1278- let $t03338733440 = _loadAssetWeights()
1279- let assetWeights = $t03338733440._1
1280- let sigmaWeight = $t03338733440._2
1276+ let $t02822228290 = _loadAssetBalances()
1277+ let prevAssetBalances = $t02822228290._1
1278+ let prevAssetTotalSupply = $t02822228290._2
1279+ let $t02829528348 = _loadAssetWeights()
1280+ let assetWeights = $t02829528348._1
1281+ let sigmaWeight = $t02829528348._2
1282+ let prevRewardBalances = _loadRewardBalances()
12811283 let targetAssetIndex = value(indexOf(assets, assetId_))
1282- let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1283- let prevUtilValue = (prevAssetTotalSupply - prevFee)
1284- let k = fraction(toBigInt((lpTotalSupply - lpAmount_)), PERCENT_FACTOR, toBigInt(lpTotalSupply))
1285- let prevUtilValueWithK = toInt(fraction(toBigInt(prevUtilValue), k, PERCENT_FACTOR))
1286- let prevUtilValueDivLp = fraction(toBigInt(prevUtilValue), PERCENT_FACTOR, toBigInt(lpTotalSupply), CEILING)
1287- func foldFunc (acc,elem) = if (acc._1)
1288- then acc
1289- else {
1290- let startInner = acc._2
1291- let stopInner = acc._3
1292- let currentAmount = ((stopInner + startInner) / 2)
1293- let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
1294- let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
1295- let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1296- if (if (((utilValue - prevUtilValueWithK) > (-1 * precision)))
1297- then (precision > (utilValue - prevUtilValueWithK))
1298- else false)
1299- then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
1300- else if ((0 > (utilValue - prevUtilValueWithK)))
1301- then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValueWithK))
1302- else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
1303- }
1304-
1305- let targetAmount = {
1306- let stop = toInt(fraction(toBigInt((lpAmount_ + prevFee)), prevUtilValueDivLp, PERCENT_FACTOR, CEILING))
1307- let $t03530635418 = {
1308- let $l = LIST_64
1309- let $s = size($l)
1310- let $acc0 = $Tuple5(false, 0, stop, 0, 0)
1311- func $f0_1 ($a,$i) = if (($i >= $s))
1312- then $a
1313- else foldFunc($a, $l[$i])
1314-
1315- func $f0_2 ($a,$i) = if (($i >= $s))
1316- then $a
1317- else throw("List size exceeds 64")
1318-
1319- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
1320- }
1321- let success = $t03530635418._1
1322- let startOut = $t03530635418._2
1323- let stopOut = $t03530635418._3
1324- let targetAmountOut = $t03530635418._4
1325- let diffOut = $t03530635418._5
1326- if (!(success))
1327- then throw(((("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
1328- else targetAmountOut
1329- }
1330- let finalAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
1331- let finalAssetTotalSupply = (prevAssetTotalSupply - targetAmount)
1332- let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
1333- then _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, lpTotalSupply, (lpTotalSupply - lpAmount_), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1334- else false
1335- if ((err1 == err1))
1336- then {
1337- let $t03641036558 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1338- let lpFee = $t03641036558._1
1339- let protocolFee = $t03641036558._2
1340- let sigmaFeePerLpUpdated = $t03641036558._3
1341- $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
1284+ let targetBalanceBefore = prevAssetBalances[targetAssetIndex]
1285+ let targetEquilibrium = fraction(prevAssetTotalSupply, assetWeights[targetAssetIndex], sigmaWeight)
1286+ let targetRewardBalance = prevRewardBalances[targetAssetIndex]
1287+ let targetMinusFeeDelta = _calculateMinusFeeDelta(targetBalanceBefore, (targetBalanceBefore - lpAmount_), targetEquilibrium, prevAssetTotalSupply, weightAmplifier, disbalanceCoeff)
1288+ let rewardBalances = _incrementBalanceByIndex(prevRewardBalances, targetAssetIndex, targetMinusFeeDelta)
1289+ let assetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, lpAmount_)
1290+ let targetAmount = (lpAmount_ - targetMinusFeeDelta)
1291+ let err = _validateAllocation(assetBalances, rewardBalances)
1292+ if ((err == err))
1293+ then {
1294+ let $t02933429482 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1295+ let lpFee = $t02933429482._1
1296+ let protocolFee = $t02933429482._2
1297+ let sigmaFeePerLpUpdated = $t02933429482._3
1298+ $Tuple6(targetAmount, assetBalances, rewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13421299 }
13431300 else throw("Strict value is not equal to itself.")
13441301 }
13451302
13461303
13471304 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
13481305 let storage = _loadStorage()
13491306 let lpAssetId = storage._1
13501307 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13511308 let lpTotalSupply = storage._3
13521309 let lpFeeRate = storage._4
13531310 let protocolFeeRate = storage._5
13541311 let maxAllocAmplifier = storage._6
13551312 let weightAmplifier = storage._7
1356- let slippageRate = storage._8
1357- let feeMaxRate = storage._9
1358- let precision = _loadPrecision()
1359- let $t03714037208 = _loadAssetBalances()
1360- let prevAssetBalances = $t03714037208._1
1361- let prevAssetTotalSupply = $t03714037208._2
1362- let $t03721337266 = _loadAssetWeights()
1363- let assetWeights = $t03721337266._1
1364- let sigmaWeight = $t03721337266._2
1365- let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
1366- let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
1367- let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1368- let prevUtilValue = (prevAssetTotalSupply - prevFee)
1369- func foldFunc (acc,elem) = if (acc._1)
1370- then acc
1371- else {
1372- let startInner = acc._2
1373- let stopInner = acc._3
1374- let currentAmount = ((stopInner + startInner) / 2)
1375- let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
1376- let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
1377- let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1378- if (if (((utilValue - prevUtilValue) > (-1 * precision)))
1379- then (precision > (utilValue - prevUtilValue))
1380- else false)
1381- then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValue))
1382- else if ((0 > (utilValue - prevUtilValue)))
1383- then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValue))
1384- else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValue))
1385- }
1386-
1387- let targetAmount = {
1388- let targetAmount = sourceAmount_
1389- let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
1390- let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
1391- let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1392- let feeDiff = (fee - prevFee)
1393- if ((feeDiff == 0))
1394- then targetAmount
1395- else {
1396- let $t03923939370 = {
1397- let $l = LIST_64
1398- let $s = size($l)
1399- let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, 0)
1400- func $f0_1 ($a,$i) = if (($i >= $s))
1401- then $a
1402- else foldFunc($a, $l[$i])
1403-
1404- func $f0_2 ($a,$i) = if (($i >= $s))
1405- then $a
1406- else throw("List size exceeds 64")
1407-
1408- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
1409- }
1410- let success = $t03923939370._1
1411- let startOut = $t03923939370._2
1412- let stopOut = $t03923939370._3
1413- let targetAmountOut = $t03923939370._4
1414- let diffOut = $t03923939370._5
1415- if (!(success))
1416- then throw(((("_swap: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
1417- else targetAmountOut
1418- }
1419- }
1420- let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
1421- let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
1422- let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
1423- then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1424- else false
1425- if ((err1 == err1))
1426- then {
1427- let $t04021740358 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1428- let lpFee = $t04021740358._1
1429- let protocolFee = $t04021740358._2
1430- let sigmaFeePerLpUpdated = $t04021740358._3
1431- $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
1432- }
1433- else throw("Strict value is not equal to itself.")
1434- }
1435-
1436-
1437-@Callable(i)
1438-func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
1313+ let disbalanceCoeff = storage._8
1314+ let $t03000930077 = _loadAssetBalances()
1315+ let prevAssetBalances = $t03000930077._1
1316+ let prevAssetTotalSupply = $t03000930077._2
1317+ let $t03008230135 = _loadAssetWeights()
1318+ let assetWeights = $t03008230135._1
1319+ let sigmaWeight = $t03008230135._2
1320+ let prevRewardBalances = _loadRewardBalances()
1321+ let sourceEquilibrium = fraction(prevAssetTotalSupply, assetWeights[sourceAssetIndex_], sigmaWeight)
1322+ let sourceBalanceBefore = prevAssetBalances[sourceAssetIndex_]
1323+ let sourceRewardBalance = prevRewardBalances[sourceAssetIndex_]
1324+ let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + sourceAmount_), sourceEquilibrium, sourceRewardBalance)
1325+ let targetBalanceBefore = prevAssetBalances[targetAssetIndex_]
1326+ let targetEquilibrium = fraction(prevAssetTotalSupply, assetWeights[targetAssetIndex_], sigmaWeight)
1327+ let targetRewardBalance = prevRewardBalances[targetAssetIndex_]
1328+ let targetMinusFeeDelta = _calculateMinusFeeDelta(targetBalanceBefore, (targetBalanceBefore - sourceAmount_), targetEquilibrium, prevAssetTotalSupply, weightAmplifier, disbalanceCoeff)
1329+ let tempRewardBalances = _decrementBalanceByIndex(prevRewardBalances, sourceAssetIndex_, sourcePlusFeeDelta)
1330+ let newRewardBalances = _incrementBalanceByIndex(tempRewardBalances, targetAssetIndex_, targetMinusFeeDelta)
1331+ let tempAssetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, (sourceAmount_ + sourcePlusFeeDelta))
1332+ let newAssetBalances = _decrementBalanceByIndex(tempAssetBalances, targetAssetIndex_, (sourceAmount_ + sourcePlusFeeDelta))
1333+ let targetAmount = ((sourceAmount_ + sourcePlusFeeDelta) - targetMinusFeeDelta)
1334+ let err = _validateAllocation(newAssetBalances, newRewardBalances)
1335+ if ((err == err))
1336+ then {
1337+ let $t03171431855 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1338+ let lpFee = $t03171431855._1
1339+ let protocolFee = $t03171431855._2
1340+ let sigmaFeePerLpUpdated = $t03171431855._3
1341+ $Tuple6(targetAmount, newAssetBalances, newRewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
1342+ }
1343+ else throw("Strict value is not equal to itself.")
1344+ }
1345+
1346+
1347+@Callable(i)
1348+func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,disbalanceCoeff_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
14391349 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
14401350 then _whenNotInitialized()
14411351 else false)
14421352 then _whenMultisigSet()
14431353 else false)
14441354 then _validateAssets(assets_, "init: invalid assets")
14451355 else false)
14461356 then _validateIntList(assetWeights_, 1, MAX_WEIGHT, "init: invalid assetWeights")
14471357 else false)
14481358 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
14491359 else false)
14501360 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
14511361 else false)
14521362 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
14531363 else false)
14541364 then _validateTokenName(lpTokenName_, "init: invalid name")
14551365 else false)
14561366 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
14571367 else false)
14581368 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
14591369 else false)
14601370 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
14611371 else false)
14621372 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
14631373 else false)
1464- then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
1374+ then _validateInt(disbalanceCoeff_, 0, MAX_INT, "init: invalid disbalanceCoeff")
14651375 else false)
14661376 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
14671377 else false)
14681378 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
14691379 else false)
14701380 then _validateInt(precision_, 1, MAX_INT, "init: invalid precision")
14711381 else false)
14721382 then _validateAddress(pauser_, "init: invalid pauser")
14731383 else false
14741384 if ((err == err))
14751385 then {
1476- let $t04222142290 = _prepareAssetWeights(assetWeights_)
1477- let assetWeights = $t04222142290._1
1478- let sigmaWeight = $t04222142290._2
1386+ let $t03374433813 = _prepareAssetWeights(assetWeights_)
1387+ let assetWeights = $t03374433813._1
1388+ let sigmaWeight = $t03374433813._2
14791389 let assetBalances = _prepareAssetBalances(assets_)
14801390 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14811391 let lpAssetId = calculateAssetId(issue)
1482- let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
1483- $Tuple2(((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
1392+ let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, disbalanceCoeff_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
1393+ $Tuple2((((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveRewardBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
14841394 }
14851395 else throw("Strict value is not equal to itself.")
14861396 }
14871397
14881398
14891399
14901400 @Callable(i)
14911401 func depositAll (amount_) = {
14921402 let err = if (if (_whenInitialized())
14931403 then _whenNotPaused()
14941404 else false)
14951405 then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
14961406 else false
14971407 if ((err == err))
14981408 then {
14991409 let storage = _loadStorage()
15001410 let lpAssetId = storage._1
15011411 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15021412 let assets = _loadAssets()
1503- let $t04404044125 = _depositAll(amount_)
1504- let lpTokensToMint = $t04404044125._1
1505- let requiredAmountsNormalized = $t04404044125._2
1506- let assetBalances = $t04404044125._3
1413+ let $t03561235697 = _depositAll(amount_)
1414+ let lpTokensToMint = $t03561235697._1
1415+ let requiredAmountsNormalized = $t03561235697._2
1416+ let assetBalances = $t03561235697._3
15071417 func foldFunc (acc,elem) = {
15081418 let index = acc._1
15091419 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15101420 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
15111421 let requiredAmountNormalized = requiredAmountsNormalized[index]
15121422 let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
15131423 let err1 = if ((paymentAssetStr != elem))
15141424 then throw(("depositAll: invalid payment: index=" + toString(index)))
15151425 else if ((0 >= requiredAmount))
15161426 then throw("depositAll: too little amount required")
15171427 else unit
15181428 if ((err1 == err1))
15191429 then {
15201430 let change = if ((i.payments[index].amount > requiredAmount))
15211431 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
15221432 else if ((requiredAmount > i.payments[index].amount))
15231433 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
15241434 else nil
15251435 $Tuple2((index + 1), (acc._2 ++ change))
15261436 }
15271437 else throw("Strict value is not equal to itself.")
15281438 }
15291439
1530- let $t04526845330 = {
1440+ let $t03684036902 = {
15311441 let $l = assets
15321442 let $s = size($l)
15331443 let $acc0 = $Tuple2(0, nil)
15341444 func $f0_1 ($a,$i) = if (($i >= $s))
15351445 then $a
15361446 else foldFunc($a, $l[$i])
15371447
15381448 func $f0_2 ($a,$i) = if (($i >= $s))
15391449 then $a
15401450 else throw("List size exceeds 10")
15411451
15421452 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
15431453 }
1544- let idx = $t04526845330._1
1545- let changeActions = $t04526845330._2
1454+ let idx = $t03684036902._1
1455+ let changeActions = $t03684036902._2
15461456 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15471457 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15481458 }
15491459 else throw("Strict value is not equal to itself.")
15501460 }
15511461
15521462
15531463
15541464 @Callable(i)
15551465 func deposit (minLpAmount_) = {
15561466 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
15571467 if ((err == err))
15581468 then {
15591469 let storage = _loadStorage()
15601470 let lpAssetId = storage._1
15611471 let lpAssetIdStr = _assetToStr(lpAssetId)
15621472 let lpDecimals = _getDecimals(lpAssetIdStr)
15631473 let err1 = if (if (if (if (if (_whenInitialized())
15641474 then _whenNotPaused()
15651475 else false)
15661476 then _checkWatchdog()
15671477 else false)
15681478 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
15691479 else false)
15701480 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
15711481 else false)
15721482 then _validateInt(i.payments[0].amount, 1, MAX_INT, "deposit: invalid payment amount")
15731483 else false
15741484 if ((err1 == err1))
15751485 then {
15761486 let assetStr = _assetToStr(i.payments[0].assetId)
15771487 let assetDecimals = _getDecimals(assetStr)
15781488 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1579- let $t04677046886 = _deposit(assetStr, amountNormalized)
1580- let lpTokensToMint = $t04677046886._1
1581- let assetBalances = $t04677046886._2
1582- let lpFee = $t04677046886._3
1583- let protocolFee = $t04677046886._4
1584- let sigmaFeePerLpUpdated = $t04677046886._5
1489+ let $t03834238474 = _deposit(assetStr, amountNormalized)
1490+ let lpTokensToMint = $t03834238474._1
1491+ let assetBalances = $t03834238474._2
1492+ let rewardBalances = $t03834238474._3
1493+ let lpFee = $t03834238474._4
1494+ let protocolFee = $t03834238474._5
1495+ let sigmaFeePerLpUpdated = $t03834238474._6
15851496 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
15861497 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
15871498 if ((err2 == err2))
15881499 then {
15891500 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1590- $Tuple2(((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToSend, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
1501+ $Tuple2((((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToSend, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveRewardBalances(rewardBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15911502 }
15921503 else throw("Strict value is not equal to itself.")
15931504 }
15941505 else throw("Strict value is not equal to itself.")
15951506 }
15961507 else throw("Strict value is not equal to itself.")
15971508 }
15981509
15991510
16001511
16011512 @Callable(i)
16021513 func withdrawAll () = {
16031514 let storage = _loadStorage()
16041515 let lpAssetId = storage._1
16051516 let lpAssetIdStr = toBase58String(lpAssetId)
16061517 let lpDecimals = _getDecimals(lpAssetIdStr)
16071518 let assets = _loadAssets()
16081519 let err = if (if (if (_whenInitialized())
16091520 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
16101521 else false)
16111522 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
16121523 else false)
16131524 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdrawAll: invalid payment amount")
16141525 else false
16151526 if ((err == err))
16161527 then {
1617- let $t04834748434 = _withdrawAll(i.payments[0].amount)
1618- let lpTokensToBurn = $t04834748434._1
1619- let balancesToPay = $t04834748434._2
1620- let assetBalances = $t04834748434._3
1528+ let $t03998240069 = _withdrawAll(i.payments[0].amount)
1529+ let lpTokensToBurn = $t03998240069._1
1530+ let balancesToPay = $t03998240069._2
1531+ let assetBalances = $t03998240069._3
16211532 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16221533 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16231534 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16241535 }
16251536 else throw("Strict value is not equal to itself.")
16261537 }
16271538
16281539
16291540
16301541 @Callable(i)
16311542 func withdraw (assetId_,minAmount_) = {
16321543 let storage = _loadStorage()
16331544 let lpAssetId = storage._1
16341545 let lpAssetIdStr = toBase58String(lpAssetId)
16351546 let lpDecimals = _getDecimals(lpAssetIdStr)
16361547 let assets = _loadAssets()
16371548 let err = if (if (if (if (if (if (if (_whenInitialized())
16381549 then _whenNotPaused()
16391550 else false)
16401551 then _checkWatchdog()
16411552 else false)
16421553 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
16431554 else false)
16441555 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
16451556 else false)
16461557 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdraw: invalid payment amount")
16471558 else false)
16481559 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
16491560 else false)
16501561 then _validateInt(minAmount_, 0, MAX_INT, "withdraw: invalid minAmount")
16511562 else false
16521563 if ((err == err))
16531564 then {
1654- let $t04978849922 = _withdraw(assetId_, i.payments[0].amount)
1655- let targetAmountNormalized = $t04978849922._1
1656- let finalAssetBalances = $t04978849922._2
1657- let lpFee = $t04978849922._3
1658- let protocolFee = $t04978849922._4
1659- let sigmaFeePerLpUpdated = $t04978849922._5
1565+ let $t04142341578 = _withdraw(assetId_, i.payments[0].amount)
1566+ let targetAmountNormalized = $t04142341578._1
1567+ let finalAssetBalances = $t04142341578._2
1568+ let finalRewardBalances = $t04142341578._3
1569+ let lpFee = $t04142341578._4
1570+ let protocolFee = $t04142341578._5
1571+ let sigmaFeePerLpUpdated = $t04142341578._6
16601572 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16611573 let targetDecimals = _getDecimals(assetId_)
16621574 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16631575 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: less than min")
16641576 if ((err1 == err1))
16651577 then {
16661578 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - i.payments[0].amount), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1667- $Tuple2(((((([Burn(lpAssetId, i.payments[0].amount), ScriptTransfer(i.caller, finalAmount, _strToAsset(assetId_))] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(assetId_, (lpFee + _loadLpFee(assetId_)))) ++ _saveProtocolFee(assetId_, (protocolFee + _loadProtocolFee(assetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
1579+ $Tuple2((((((([Burn(lpAssetId, i.payments[0].amount), ScriptTransfer(i.caller, finalAmount, _strToAsset(assetId_))] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(finalAssetBalances)) ++ _saveRewardBalances(finalRewardBalances)) ++ _saveLpFee(assetId_, (lpFee + _loadLpFee(assetId_)))) ++ _saveProtocolFee(assetId_, (protocolFee + _loadProtocolFee(assetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16681580 }
16691581 else throw("Strict value is not equal to itself.")
16701582 }
16711583 else throw("Strict value is not equal to itself.")
16721584 }
16731585
16741586
16751587
16761588 @Callable(i)
16771589 func swap (targetAssetId_,minAmount_) = {
16781590 let storage = _loadStorage()
16791591 let lpAssetId = storage._1
16801592 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16811593 let assets = _loadAssets()
16821594 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
16831595 let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
16841596 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
16851597 if ((sourceAssetIndex == sourceAssetIndex))
16861598 then {
16871599 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16881600 if ((targetAssetIndex == targetAssetIndex))
16891601 then {
16901602 let err = if (if (if (if (if (if (_whenInitialized())
16911603 then _whenNotPaused()
16921604 else false)
16931605 then _checkWatchdog()
16941606 else false)
16951607 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16961608 else false)
16971609 then _validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount")
16981610 else false)
16991611 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
17001612 else false)
17011613 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
17021614 else false
17031615 if ((err == err))
17041616 then {
1705- let $t05203552193 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1706- let targetAmountNormalized = $t05203552193._1
1707- let finalAssetBalances = $t05203552193._2
1708- let lpFee = $t05203552193._3
1709- let protocolFee = $t05203552193._4
1710- let sigmaFeePerLpUpdated = $t05203552193._5
1617+ let $t04374343922 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1618+ let targetAmountNormalized = $t04374343922._1
1619+ let finalAssetBalances = $t04374343922._2
1620+ let finalRewardBalances = $t04374343922._3
1621+ let lpFee = $t04374343922._4
1622+ let protocolFee = $t04374343922._5
1623+ let sigmaFeePerLpUpdated = $t04374343922._6
17111624 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17121625 let targetDecimals = _getDecimals(targetAssetId_)
17131626 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17141627 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: less than min")
17151628 if ((err1 == err1))
1716- then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
1629+ then $Tuple2(((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveRewardBalances(finalRewardBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
17171630 else throw("Strict value is not equal to itself.")
17181631 }
17191632 else throw("Strict value is not equal to itself.")
17201633 }
17211634 else throw("Strict value is not equal to itself.")
17221635 }
17231636 else throw("Strict value is not equal to itself.")
17241637 }
17251638
17261639
17271640
17281641 @Callable(i)
17291642 func getDepositAll (lpAmount_) = {
17301643 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17311644 if ((err == err))
17321645 then {
1733- let $t05331353400 = _depositAll(lpAmount_)
1734- let lpTokensToMint = $t05331353400._1
1735- let requiredAmountsNormalized = $t05331353400._2
1736- let assetBalances = $t05331353400._3
1646+ let $t04509445181 = _depositAll(lpAmount_)
1647+ let lpTokensToMint = $t04509445181._1
1648+ let requiredAmountsNormalized = $t04509445181._2
1649+ let assetBalances = $t04509445181._3
17371650 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17381651 }
17391652 else throw("Strict value is not equal to itself.")
17401653 }
17411654
17421655
17431656
17441657 @Callable(i)
17451658 func getDeposit (assetId_,amount_) = {
17461659 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
17471660 then _validateInt(amount_, 1, MAX_INT, "getDeposit: invalid amount")
17481661 else false
17491662 if ((err == err))
17501663 then {
17511664 let storage = _loadStorage()
17521665 let lpAssetId = storage._1
17531666 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17541667 let assetDecimals = _getDecimals(assetId_)
17551668 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1756- let $t05415954275 = _deposit(assetId_, amountNormalized)
1757- let lpTokensToMint = $t05415954275._1
1758- let assetBalances = $t05415954275._2
1759- let lpFee = $t05415954275._3
1760- let protocolFee = $t05415954275._4
1761- let sigmaFeePerLpUpdated = $t05415954275._5
1669+ let $t04594046072 = _deposit(assetId_, amountNormalized)
1670+ let lpTokensToMint = $t04594046072._1
1671+ let assetBalances = $t04594046072._2
1672+ let rewardBalances = $t04594046072._3
1673+ let lpFee = $t04594046072._4
1674+ let protocolFee = $t04594046072._5
1675+ let sigmaFeePerLpUpdated = $t04594046072._6
17621676 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
17631677 $Tuple2(nil, lpTokensToSend)
17641678 }
17651679 else throw("Strict value is not equal to itself.")
17661680 }
17671681
17681682
17691683
17701684 @Callable(i)
17711685 func getWithdrawAll (lpAmount_) = {
17721686 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17731687 if ((err == err))
17741688 then {
1775- let $t05471454790 = _withdrawAll(lpAmount_)
1776- let lpTokensToBurn = $t05471454790._1
1777- let balancesToGet = $t05471454790._2
1778- let assetBalances = $t05471454790._3
1689+ let $t04651146587 = _withdrawAll(lpAmount_)
1690+ let lpTokensToBurn = $t04651146587._1
1691+ let balancesToGet = $t04651146587._2
1692+ let assetBalances = $t04651146587._3
17791693 $Tuple2(nil, balancesToGet)
17801694 }
17811695 else throw("Strict value is not equal to itself.")
17821696 }
17831697
17841698
17851699
17861700 @Callable(i)
17871701 func getWithdraw (assetId_,amount_) = {
17881702 let err = if (_validateListContains(_loadAssets(), assetId_, "getWithdraw: invalid asset"))
17891703 then _validateInt(amount_, 1, MAX_INT, "getWithdraw: invalid amount")
17901704 else false
17911705 if ((err == err))
17921706 then {
17931707 let storage = _loadStorage()
17941708 let lpAssetId = storage._1
17951709 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1796- let $t05544155557 = _withdraw(assetId_, amount_)
1797- let targetAmountNormalized = $t05544155557._1
1798- let assetBalances = $t05544155557._2
1799- let lpFee = $t05544155557._3
1800- let protocolFee = $t05544155557._4
1801- let sigmaFeePerLpUpdated = $t05544155557._5
1710+ let $t04723847370 = _withdraw(assetId_, amount_)
1711+ let targetAmountNormalized = $t04723847370._1
1712+ let assetBalances = $t04723847370._2
1713+ let rewardBalances = $t04723847370._3
1714+ let lpFee = $t04723847370._4
1715+ let protocolFee = $t04723847370._5
1716+ let sigmaFeePerLpUpdated = $t04723847370._6
18021717 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18031718 let targetDecimals = _getDecimals(assetId_)
18041719 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18051720 $Tuple2(nil, finalAmount)
18061721 }
18071722 else throw("Strict value is not equal to itself.")
18081723 }
18091724
18101725
18111726
18121727 @Callable(i)
18131728 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
18141729 let storage = _loadStorage()
18151730 let lpAssetId = storage._1
18161731 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
18171732 let assets = _loadAssets()
18181733 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
18191734 if ((sourceAssetIndex == sourceAssetIndex))
18201735 then {
18211736 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
18221737 if ((targetAssetIndex == targetAssetIndex))
18231738 then {
18241739 let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
18251740 let err = if (_validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount"))
18261741 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
18271742 else false
18281743 if ((err == err))
18291744 then {
1830- let $t05696757125 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1831- let targetAmountNormalized = $t05696757125._1
1832- let finalAssetBalances = $t05696757125._2
1833- let lpFee = $t05696757125._3
1834- let protocolFee = $t05696757125._4
1835- let sigmaFeePerLpUpdated = $t05696757125._5
1745+ let $t04878048959 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1746+ let targetAmountNormalized = $t04878048959._1
1747+ let finalAssetBalances = $t04878048959._2
1748+ let finalRewardBalances = $t04878048959._3
1749+ let lpFee = $t04878048959._4
1750+ let protocolFee = $t04878048959._5
1751+ let sigmaFeePerLpUpdated = $t04878048959._6
18361752 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18371753 let targetDecimals = _getDecimals(targetAssetId_)
18381754 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18391755 $Tuple2(nil, finalAmount)
18401756 }
18411757 else throw("Strict value is not equal to itself.")
18421758 }
18431759 else throw("Strict value is not equal to itself.")
18441760 }
18451761 else throw("Strict value is not equal to itself.")
18461762 }
18471763
18481764
18491765
18501766 @Callable(i)
18511767 func getClaim (user_) = {
18521768 let user = if ((size(user_) > 0))
18531769 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18541770 else i.caller
1855- let $t05776757823 = _checkpoint(user)
1856- let checkpointActions = $t05776757823._1
1857- let userProfits = $t05776757823._2
1771+ let $t04960149657 = _checkpoint(user)
1772+ let checkpointActions = $t04960149657._1
1773+ let userProfits = $t04960149657._2
18581774 $Tuple2(nil, userProfits)
18591775 }
18601776
18611777
18621778
18631779 @Callable(i)
1864-func getUtilFunc () = {
1780+func getAssetId () = {
18651781 let storage = _loadStorage()
1866- let lpTotalSupply = storage._3
1867- let weightAmplifier = storage._7
1868- let slippageRate = storage._8
1869- let feeMaxRate = storage._9
1870- let $t05815658216 = _loadAssetBalances()
1871- let assetBalances = $t05815658216._1
1872- let assetTotalSupply = $t05815658216._2
1873- let $t05822158274 = _loadAssetWeights()
1874- let assetWeights = $t05822158274._1
1875- let sigmaWeight = $t05822158274._2
1876- let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1877- let utilValue = (assetTotalSupply - fee)
1878- $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
1879- }
1880-
1881-
1882-
1883-@Callable(i)
1884-func getFeeFunc () = {
1782+ let lpAssetId = storage._1
1783+ $Tuple2(nil, toBase58String(lpAssetId))
1784+ }
1785+
1786+
1787+
1788+@Callable(i)
1789+func getDecimals () = {
18851790 let storage = _loadStorage()
1886- let weightAmplifier = storage._7
1887- let slippageRate = storage._8
1888- let feeMaxRate = storage._9
1889- let $t05870658766 = _loadAssetBalances()
1890- let assetBalances = $t05870658766._1
1891- let assetTotalSupply = $t05870658766._2
1892- let $t05877158824 = _loadAssetWeights()
1893- let assetWeights = $t05877158824._1
1894- let sigmaWeight = $t05877158824._2
1895- let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1896- $Tuple2(nil, fee)
1791+ let lpAssetId = storage._1
1792+ let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1793+ $Tuple2(nil, lpDecimals)
18971794 }
18981795
18991796
19001797
19011798 @Callable(i)
19021799 func checkpoint (user_) = {
19031800 let err = if (_whenInitialized())
19041801 then _whenNotPaused()
19051802 else false
19061803 if ((err == err))
19071804 then {
19081805 let user = if ((size(user_) > 0))
19091806 then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
19101807 else i.caller
19111808 _checkpoint(user)
19121809 }
19131810 else throw("Strict value is not equal to itself.")
19141811 }
19151812
19161813
19171814
19181815 @Callable(i)
19191816 func stake () = {
19201817 let err = if (_whenInitialized())
19211818 then _whenNotPaused()
19221819 else false
19231820 if ((err == err))
19241821 then {
19251822 let storage = _loadStorage()
19261823 let lpAssetIdStr = _assetToStr(storage._1)
19271824 let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
19281825 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
19291826 else false)
19301827 then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
19311828 else false
19321829 if ((err1 == err1))
19331830 then {
1934- let $t05983259892 = _checkpoint(i.caller)
1935- let checkpointActions = $t05983259892._1
1936- let userProfits = $t05983259892._2
1831+ let $t05086950929 = _checkpoint(i.caller)
1832+ let checkpointActions = $t05086950929._1
1833+ let userProfits = $t05086950929._2
19371834 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19381835 }
19391836 else throw("Strict value is not equal to itself.")
19401837 }
19411838 else throw("Strict value is not equal to itself.")
19421839 }
19431840
19441841
19451842
19461843 @Callable(i)
19471844 func unstake (amount_) = {
19481845 let err = if (_whenInitialized())
19491846 then _whenNotPaused()
19501847 else false
19511848 if ((err == err))
19521849 then {
19531850 let storage = _loadStorage()
19541851 let lpAssetId = storage._1
19551852 let userLp = _loadUserLp(i.caller)
19561853 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19571854 if ((err1 == err1))
19581855 then {
1959- let $t06040360463 = _checkpoint(i.caller)
1960- let checkpointActions = $t06040360463._1
1961- let userProfits = $t06040360463._2
1856+ let $t05144051500 = _checkpoint(i.caller)
1857+ let checkpointActions = $t05144051500._1
1858+ let userProfits = $t05144051500._2
19621859 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19631860 }
19641861 else throw("Strict value is not equal to itself.")
19651862 }
19661863 else throw("Strict value is not equal to itself.")
19671864 }
19681865
19691866
19701867
19711868 @Callable(i)
19721869 func claim (user_) = {
19731870 let err = if (_whenInitialized())
19741871 then _whenNotPaused()
19751872 else false
19761873 if ((err == err))
19771874 then {
19781875 let user = if ((size(user_) > 0))
19791876 then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
19801877 else i.caller
19811878 let storage = _loadStorage()
19821879 let lpAssetId = storage._1
19831880 let lpAssetIdStr = _assetToStr(lpAssetId)
19841881 let assets = [lpAssetIdStr, _loadAssets()]
19851882 let maxIndex = (size(assets) - 1)
1986- let userLp = _loadUserLp(user)
1987- let $t06118661242 = _checkpoint(user)
1988- let checkpointActions = $t06118661242._1
1989- let userProfits = $t06118661242._2
1883+ let $t05218852244 = _checkpoint(user)
1884+ let checkpointActions = $t05218852244._1
1885+ let userProfits = $t05218852244._2
19901886 func foldFunc (acc,profit) = {
19911887 let index = acc._1
19921888 if (if ((maxIndex >= index))
19931889 then (profit > 0)
19941890 else false)
19951891 then {
19961892 let asset = assets[index]
19971893 $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
19981894 }
19991895 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
20001896 }
20011897
2002- let $t06162061711 = {
1898+ let $t05262252713 = {
20031899 let $l = userProfits
20041900 let $s = size($l)
20051901 let $acc0 = $Tuple3(0, nil, nil)
20061902 func $f0_1 ($a,$i) = if (($i >= $s))
20071903 then $a
20081904 else foldFunc($a, $l[$i])
20091905
20101906 func $f0_2 ($a,$i) = if (($i >= $s))
20111907 then $a
20121908 else throw("List size exceeds 11")
20131909
20141910 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
20151911 }
2016- let idx = $t06162061711._1
2017- let userProfitsUpdated = $t06162061711._2
2018- let profitActions = $t06162061711._3
1912+ let idx = $t05262252713._1
1913+ let userProfitsUpdated = $t05262252713._2
1914+ let profitActions = $t05262252713._3
20191915 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
1916+ }
1917+ else throw("Strict value is not equal to itself.")
1918+ }
1919+
1920+
1921+
1922+@Callable(i)
1923+func claimAll (user_) = {
1924+ let err = if (_whenInitialized())
1925+ then _whenNotPaused()
1926+ else false
1927+ if ((err == err))
1928+ then {
1929+ let user = if ((size(user_) > 0))
1930+ then valueOrErrorMessage(addressFromString(user_), "claimAll: invalid user")
1931+ else i.caller
1932+ let storage = _loadStorage()
1933+ let lpAssetId = storage._1
1934+ let lpAssetIdStr = _assetToStr(lpAssetId)
1935+ let assets = [lpAssetIdStr, _loadAssets()]
1936+ let maxIndex = (size(assets) - 1)
1937+ let $t05334353403 = _loadAssetBalances()
1938+ let assetBalances = $t05334353403._1
1939+ let assetTotalSupply = $t05334353403._2
1940+ let $t05340953465 = _checkpoint(user)
1941+ let checkpointActions = $t05340953465._1
1942+ let userProfits = $t05340953465._2
1943+ func foldFunc (acc,profit) = {
1944+ let index = acc._1
1945+ if ((index == 0))
1946+ then $Tuple5((index + 1), (acc._2 :+ 0), acc._3, acc._4, (acc._5 + profit))
1947+ else if (if ((index > 0))
1948+ then (maxIndex >= index)
1949+ else false)
1950+ then {
1951+ let assetIndex = (index - 1)
1952+ let balance = assetBalances[assetIndex]
1953+ $Tuple5((index + 1), (acc._2 :+ 0), (acc._3 :+ (balance + profit)), (acc._4 + profit), acc._5)
1954+ }
1955+ else $Tuple5((index + 1), (acc._2 :+ 0), acc._3, acc._4, acc._5)
1956+ }
1957+
1958+ let $t05400154137 = {
1959+ let $l = userProfits
1960+ let $s = size($l)
1961+ let $acc0 = $Tuple5(0, nil, nil, 0, 0)
1962+ func $f0_1 ($a,$i) = if (($i >= $s))
1963+ then $a
1964+ else foldFunc($a, $l[$i])
1965+
1966+ func $f0_2 ($a,$i) = if (($i >= $s))
1967+ then $a
1968+ else throw("List size exceeds 11")
1969+
1970+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
1971+ }
1972+ let idx = $t05400154137._1
1973+ let userProfitsUpdated = $t05400154137._2
1974+ let assetBalancesUpdated = $t05400154137._3
1975+ let lpTokensToMint = $t05400154137._4
1976+ let lpTokensProfit = $t05400154137._5
1977+ let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1978+ $Tuple2((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, (lpTokensToMint + lpTokensProfit), lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalancesUpdated)) ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
1979+ }
1980+ else throw("Strict value is not equal to itself.")
1981+ }
1982+
1983+
1984+
1985+@Callable(i)
1986+func updatePoolFees (lpFeeRate_,protocolFeeRate_) = {
1987+ let err = if (if (if (_onlyThisContract(i.caller))
1988+ then _whenInitialized()
1989+ else false)
1990+ then _validateInt(lpFeeRate_, 0, MAX_FEE, "updatePoolFees: invalid lp fee")
1991+ else false)
1992+ then _validateInt(protocolFeeRate_, 0, MAX_FEE, "updatePoolFees: invalid protocol fee")
1993+ else false
1994+ if ((err == err))
1995+ then {
1996+ let storage = _loadStorage()
1997+ let storageUpdated = $Tuple10(storage._1, storage._2, storage._3, lpFeeRate_, protocolFeeRate_, storage._6, storage._7, storage._8, storage._9, storage._10)
1998+ $Tuple2(_saveStorage(storageUpdated), unit)
1999+ }
2000+ else throw("Strict value is not equal to itself.")
2001+ }
2002+
2003+
2004+
2005+@Callable(i)
2006+func updatePoolParams (maxAllocationAmplifier_,weightAmplifier_,disbalanceCoeff_,feeMaxRate_) = {
2007+ let err = if (if (if (if (if (_onlyThisContract(i.caller))
2008+ then _whenInitialized()
2009+ else false)
2010+ then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "updatePoolParams: invalid maxAllocationAmplifier")
2011+ else false)
2012+ then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "updatePoolParams: invalid weightAmplifier")
2013+ else false)
2014+ then _validateInt(disbalanceCoeff_, 0, MAX_INT, "updatePoolParams: invalid disbalanceCoeff")
2015+ else false)
2016+ then _validateInt(feeMaxRate_, 0, MAX_INT, "updatePoolParams: invalid feeMaxRate")
2017+ else false
2018+ if ((err == err))
2019+ then {
2020+ let storage = _loadStorage()
2021+ let storageUpdated = $Tuple10(storage._1, storage._2, storage._3, storage._4, storage._5, maxAllocationAmplifier_, weightAmplifier_, disbalanceCoeff_, feeMaxRate_, storage._10)
2022+ $Tuple2(_saveStorage(storageUpdated), unit)
2023+ }
2024+ else throw("Strict value is not equal to itself.")
2025+ }
2026+
2027+
2028+
2029+@Callable(i)
2030+func migrateBalances () = {
2031+ let err = if (_onlyThisContract(i.caller))
2032+ then _whenInitialized()
2033+ else false
2034+ if ((err == err))
2035+ then {
2036+ let storage = _loadStorage()
2037+ let lpTokenSupply = storage._3
2038+ let $t05667256732 = _loadAssetBalances()
2039+ let assetBalances = $t05667256732._1
2040+ let assetTotalSupply = $t05667256732._2
2041+ let balancesDiff = max([(assetTotalSupply - lpTokenSupply), 0])
2042+ let storageUpdated = $Tuple10(storage._1, storage._2, (lpTokenSupply + balancesDiff), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
2043+ $Tuple2(_saveStorage(storageUpdated), unit)
20202044 }
20212045 else throw("Strict value is not equal to itself.")
20222046 }
20232047
20242048
20252049
20262050 @Callable(i)
20272051 func pause () = {
20282052 let err = if (if (_onlyPauser(i.caller))
20292053 then _whenInitialized()
20302054 else false)
20312055 then _whenNotPaused()
20322056 else false
20332057 if ((err == err))
20342058 then $Tuple2(_savePause(true), unit)
20352059 else throw("Strict value is not equal to itself.")
20362060 }
20372061
20382062
20392063
20402064 @Callable(i)
20412065 func unpause () = {
20422066 let err = if (if (_onlyThisContract(i.caller))
20432067 then _whenInitialized()
20442068 else false)
20452069 then _whenPaused()
20462070 else false
20472071 if ((err == err))
20482072 then $Tuple2(_savePause(false), unit)
20492073 else throw("Strict value is not equal to itself.")
20502074 }
20512075
20522076
20532077
20542078 @Callable(i)
20552079 func updatePauser (pauser_) = {
20562080 let err = if (if (_onlyThisContract(i.caller))
20572081 then _whenInitialized()
20582082 else false)
20592083 then _validateAddress(pauser_, "updatePauser: invalid pauser")
20602084 else false
20612085 if ((err == err))
20622086 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
20632087 else throw("Strict value is not equal to itself.")
20642088 }
20652089
20662090
20672091
20682092 @Callable(i)
20692093 func updateWatchdog (watchdog_,offset_) = {
20702094 let err = if (if (if (_onlyThisContract(i.caller))
20712095 then _whenInitialized()
20722096 else false)
20732097 then _validateAddress(watchdog_, "updateWatchdog: invalid watchdog")
20742098 else false)
20752099 then _validateInt(offset_, 0, MAX_INT, "updateWatchdog: invalid offset")
20762100 else false
20772101 if ((err == err))
20782102 then $Tuple2((_saveWatchdog(addressFromStringValue(watchdog_)) ++ _saveWatchdogOffset(offset_)), unit)
20792103 else throw("Strict value is not equal to itself.")
20802104 }
20812105
20822106
20832107
20842108 @Callable(i)
20852109 func setMultisig (multisig_) = {
20862110 let err = if (_onlyThisContract(i.caller))
20872111 then _validateAddress(multisig_, "setMultisig: invalid multisig")
20882112 else false
20892113 if ((err == err))
20902114 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
20912115 else throw("Strict value is not equal to itself.")
20922116 }
20932117
20942118
20952119 @Verifier(tx)
20962120 func verify () = match getString(KEY_MULTISIG) {
20972121 case multisig: String =>
20982122 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEP)), false)
20992123 case _ =>
21002124 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
21012125 }
21022126

github/deemru/w8io/3ef1775 
171.23 ms