tx · 8kkD6eEkMENyEuKTuhqWkJZcuLEEkDdThFiMS5PT1j1j

3P7Job1QorQJYPzEnmBnGaCqtpcB4ohiz5p:  -0.03000000 Waves

2022.12.29 16:27 [3447136] smart account 3P7Job1QorQJYPzEnmBnGaCqtpcB4ohiz5p > SELF 0.00000000 Waves

{ "type": 13, "id": "8kkD6eEkMENyEuKTuhqWkJZcuLEEkDdThFiMS5PT1j1j", "fee": 3000000, "feeAssetId": null, "timestamp": 1672320545379, "version": 1, "sender": "3P7Job1QorQJYPzEnmBnGaCqtpcB4ohiz5p", "senderPublicKey": "9hjWnJ9WvGatiYbxGGQMEnifVHCK6ZmwUbzH8EXcuPYv", "proofs": [ "4thvWLMSJq2NJWVkBELJjwQZ4uFhzK27myTzXp3qzwPzxk7GoaQ5FDH7MhUHV7AjLpv9autHYXmWynwvzm1KTvXP" ], "script": "base64:BgJxCAISCAoGCAgIAQEBEgMKAQESBQoDAQEBEgQKAgEBEgMKAQgSBAoCAQESBAoCAQESABIAEgMKAQgSBAoCAQESABIECgIBARIAEgASAwoBCBIAEgASAwoBARIAEgASAwoBBBIAEgASABIDCgEIEgMKAQhIAAdOX0NPSU5TCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAgdOX0NPSU5TAAtOX0NPSU5TX2JpZwkAtgIBBQdOX0NPSU5TAAtOX0NPSU5TX01BWAAKAA5UT0tFTl9ERUNJTUFMUwAGAApUT0tFTl9SQVRFAMCEPQAPRkVFX0RFTk9NSU5BVE9SAIDIr6AlAAlQUkVDSVNJT04AwIQ9AAhERUNJTUFMUwAGAA1NQVhfQURNSU5fRkVFAIDIr6AlAAdNQVhfRkVFAIDkl9ASAAVNQVhfQQDAhD0ADE1BWF9BX0NIQU5HRQAKABNBRE1JTl9BQ1RJT05TX0RFTEFZCQBpAgkAaAIAAwCAowUAPAANTUlOX1JBTVBfVElNRQkAaQIAgKMFADwADVZQX0xPR19QRVJJT0QAgLiZKQAMVlBfUFJFQ0lTSU9OAICglKWNHQAFY29pbnMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIFY29pbnMCASwAA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIDZmVlAAdOX2ZlZV80CQBpAgkAaAIFA2ZlZQUHTl9DT0lOUwkAaAIABAkAZQIFB05fQ09JTlMAAQAJYWRtaW5fZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAglhZG1pbl9mZWUADGlzX2F1dG9fZmVlcwkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwIMaXNfYXV0b19mZWVzAAVvd25lcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIFb3duZXIABXRva2VuCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCBXRva2VuAA50b2tlbl9xdWFudGl0eQgJAQV2YWx1ZQEJAOwHAQUFdG9rZW4IcXVhbnRpdHkACWluaXRpYWxfQQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIJaW5pdGlhbF9BAAhmdXR1cmVfQQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIIZnV0dXJlX0EADmluaXRpYWxfQV90aW1lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCDmluaXRpYWxfQV90aW1lAAAADWZ1dHVyZV9BX3RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwINZnV0dXJlX0FfdGltZQAAABZhZG1pbl9hY3Rpb25zX2RlYWRsaW5lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCFmFkbWluX2FjdGlvbnNfZGVhZGxpbmUAAAAbdHJhbnNmZXJfb3duZXJzaGlwX2RlYWRsaW5lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCG3RyYW5zZmVyX293bmVyc2hpcF9kZWFkbGluZQAAAApmdXR1cmVfZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAgpmdXR1cmVfZmVlABBmdXR1cmVfYWRtaW5fZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAhBmdXR1cmVfYWRtaW5fZmVlAAxmdXR1cmVfb3duZXIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCDGZ1dHVyZV9vd25lcgAJaXNfa2lsbGVkCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzAglpc19raWxsZWQADWtpbGxfZGVhZGxpbmUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCDWtpbGxfZGVhZGxpbmUAEEtJTExfREVBRExJTkVfRFQJAGkCCQBoAgkAaAIAAgAeAICjBQA8AARiaWcwCQC2AgEAAAAEYmlnMQkAtgIBAAEABGJpZzIJALYCAQACAA1oZWlnaHRBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMCDWhlaWdodEFkZHJlc3MCE25vIHNldHRpbmdzIGRlZmluZWQCFGJhZCBzZXR0aW5ncyBhZGRyZXNzAAZIRUlHSFQFBmhlaWdodAAPYmxvY2tfdGltZXN0YW1wBQZIRUlHSFQBB2FsbG93ZWQBBmNhbGxlcgkAAAIFBW93bmVyBQZjYWxsZXIBCnNlcmlh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BAJkeQkAZQIJAGUCBQx4cF9yZWR1Y2VkX2kJAQdnZXRfeV9EBAUDYW1wBQFpCQEIYmlnX2xpc3QBBQp4cF9yZWR1Y2VkBQJEMQABCQCVCgMFAmR5CQBlAgUEZHlfMAUCZHkFAkQwAQ12aXJ0dWFsX3ByaWNlAQFECQBrAwUBRAUMVlBfUFJFQ0lTSU9OBQ50b2tlbl9xdWFudGl0eQEIbG9nX2RhdGECAUQDYWRkBAl0b3RhbF92b2wJALcCAgkApwMBCQELdmFsdWVPckVsc2UCCQCiCAECA3ZvbAIBMAkAtgIBBQNhZGQEEHRvdGFsX3ZvbF9zdHJpbmcJAKYDAQUJdG90YWxfdm9sCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgIDdm9sBRB0b3RhbF92b2xfc3RyaW5nBQNuaWwECmxvZ19wZXJpb2QJAKQDAQkAaQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQ1WUF9MT0dfUEVSSU9EBAdsb2dfa2V5CQCsAgICBGxvZ18FCmxvZ19wZXJpb2QDCQEJaXNEZWZpbmVkAQkAoggBBQdsb2dfa2V5BQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUHbG9nX2tleQkArAICCQCsAgIJAKwCAgkArAICCQCkAwEJAQ12aXJ0dWFsX3ByaWNlAQUBRAIBXwUQdG90YWxfdm9sX3N0cmluZwIBXwkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUDbmlsAQ9nZXRfbmVhcmVzdF9sb2cBBnBlcmlvZAoBBGZvbGQCCWxvZ192YWx1ZQRzdGVwAwkBAiE9AgUJbG9nX3ZhbHVlAgAFCWxvZ192YWx1ZQQHbG9nX2tleQkArAICAgRsb2dfCQCkAwEJAGUCBQZwZXJpb2QFBHN0ZXAJAQt2YWx1ZU9yRWxzZQIJAKIIAQUHbG9nX2tleQIABAdsaXN0MzBwCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOCQDMCAIADwkAzAgCABAJAMwIAgARCQDMCAIAEgkAzAgCABMJAMwIAgAUCQDMCAIAFQkAzAgCABYJAMwIAgAXCQDMCAIAGAkAzAgCABkJAMwIAgAaCQDMCAIAGwkAzAgCABwJAMwIAgAdBQNuaWwEB2xpc3QzMG0JAMwIAgD///////////8BCQDMCAIA/v//////////AQkAzAgCAP3//////////wEJAMwIAgD8//////////8BCQDMCAIA+///////////AQkAzAgCAPr//////////wEJAMwIAgD5//////////8BCQDMCAIA+P//////////AQkAzAgCAPf//////////wEJAMwIAgD2//////////8BCQDMCAIA9f//////////AQkAzAgCAPT//////////wEJAMwIAgDz//////////8BCQDMCAIA8v//////////AQkAzAgCAPH//////////wEJAMwIAgDw//////////8BCQDMCAIA7///////////AQkAzAgCAO7//////////wEJAMwIAgDt//////////8BCQDMCAIA7P//////////AQkAzAgCAOv//////////wEJAMwIAgDq//////////8BCQDMCAIA6f//////////AQkAzAgCAOj//////////wEJAMwIAgDn//////////8BCQDMCAIA5v//////////AQkAzAgCAOX//////////wEJAMwIAgDk//////////8BCQDMCAIA4///////////AQkAzAgCAOL//////////wEFA25pbAQIdmFsdWUzMHAKAAIkbAUHbGlzdDMwcAoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMzAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4DCQECIT0CBQh2YWx1ZTMwcAIABQh2YWx1ZTMwcAoAAiRsBQdsaXN0MzBtCgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgEWZ2V0X3ZpcnR1YWxfcHJpY2VfZGlmZgEDX3QwBAN2cDEJAQ12aXJ0dWFsX3ByaWNlAQkBBWdldF9EAgkBCGJpZ19saXN0AQUIYmFsYW5jZXMFA2FtcAQNdnAxX3RpbWVzdGFtcAgFCWxhc3RCbG9jawl0aW1lc3RhbXAEAnQwAwkAZwIAAAUDX3QwCQBkAgUNdnAxX3RpbWVzdGFtcAUDX3QwBQNfdDAECXQwX3BlcmlvZAkAaQIFAnQwBQ1WUF9MT0dfUEVSSU9EBAlsb2dfdmFsdWUJAQ9nZXRfbmVhcmVzdF9sb2cBBQl0MF9wZXJpb2QDCQAAAgUJbG9nX3ZhbHVlAgAJAJUKAwUDdnAxBQN2cDEAAAQIbG9nX2xpc3QJALUJAgUJbG9nX3ZhbHVlAgFfBAN2cDAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhsb2dfbGlzdAAABA12cDBfdGltZXN0YW1wCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIbG9nX2xpc3QAAgkAlQoDBQN2cDEFA3ZwMAkAZQIFDXZwMV90aW1lc3RhbXAFDXZwMF90aW1lc3RhbXABD2dldF92b2x1bWVfZGlmZgEDX3QwBAR2b2wxCQCnAwEJAQt2YWx1ZU9yRWxzZQIJAKIIAQIDdm9sAgEwBA52b2wxX3RpbWVzdGFtcAgFCWxhc3RCbG9jawl0aW1lc3RhbXAEAnQwAwkAZwIAAAUDX3QwCQBkAgUOdm9sMV90aW1lc3RhbXAFA190MAUDX3QwBAl0MF9wZXJpb2QJAGkCBQJ0MAUNVlBfTE9HX1BFUklPRAQJbG9nX3ZhbHVlCQEPZ2V0X25lYXJlc3RfbG9nAQUJdDBfcGVyaW9kAwkAAAIFCWxvZ192YWx1ZQIACQCVCgMFBHZvbDEFBHZvbDEAAAQIbG9nX2xpc3QJALUJAgUJbG9nX3ZhbHVlAgFfBAR2b2wwCQCnAwEJAJEDAgUIbG9nX2xpc3QAAQQOdm9sMF90aW1lc3RhbXAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhsb2dfbGlzdAACCQCVCgMFBHZvbDEFBHZvbDAJAGUCBQ52b2wxX3RpbWVzdGFtcAUOdm9sMF90aW1lc3RhbXABEl9jYWxjX3Rva2VuX2Ftb3VudAEMbmV3X2JhbGFuY2VzBAJEMAMJAAACBQ50b2tlbl9xdWFudGl0eQAAAAAJAQVnZXRfRAIJAQhiaWdfbGlzdAEFCGJhbGFuY2VzBQNhbXAEAkQxCQEFZ2V0X0QCCQEIYmlnX2xpc3QBBQxuZXdfYmFsYW5jZXMFA2FtcAMJAQZhc3NlcnQBCQBmAgUCRDEFAkQwCQACAQIHRDEgPiBEMAQNJHQwMTMwNTIxNTAwMgMJAGYCBQ50b2tlbl9xdWFudGl0eQAACgEMZmVlX2JhbGFuY2VzAgNvbGQDbmV3CgEEZm9sZAIDYWNjBWluZGV4BAtvbGRfYmFsYW5jZQkAkQMCBQNvbGQFBWluZGV4BAtuZXdfYmFsYW5jZQkAkQMCBQNuZXcFBWluZGV4BA1pZGVhbF9iYWxhbmNlCQBrAwUCRDEFC29sZF9iYWxhbmNlBQJEMAQKZGlmZmVyZW5jZQMJAGYCBQ1pZGVhbF9iYWxhbmNlBQtuZXdfYmFsYW5jZQkAZQIFDWlkZWFsX2JhbGFuY2UFC25ld19iYWxhbmNlCQBlAgULbmV3X2JhbGFuY2UFDWlkZWFsX2JhbGFuY2UECmFtb3VudF9mZWUJAGsDBQdOX2ZlZV80BQpkaWZmZXJlbmNlBQ9GRUVfREVOT01JTkFUT1IEEGFtb3VudF9hZG1pbl9mZWUJAGsDBQphbW91bnRfZmVlBQlhZG1pbl9mZWUFD0ZFRV9ERU5PTUlOQVRPUgkAlgoECQDNCAIIBQNhY2MCXzEJAGUCBQtuZXdfYmFsYW5jZQUQYW1vdW50X2FkbWluX2ZlZQkAzQgCCAUDYWNjAl8yCQBlAgULbmV3X2JhbGFuY2UFCmFtb3VudF9mZWUDAwUMaXNfYXV0b19mZWVzCQBmAgUQYW1vdW50X2FkbWluX2ZlZQAABwkAzQgCCAUDYWNjAl8zCQEOU2NyaXB0VHJhbnNmZXIDBQVvd25lcgUQYW1vdW50X2FkbWluX2ZlZQkA2QQBCQCRAwIFBWNvaW5zBQVpbmRleAgFA2FjYwJfMwkAZAIIBQNhY2MCXzQJAGsDBQphbW91bnRfZmVlBQpUT0tFTl9SQVRFCQCRAwIFBXJhdGVzBQVpbmRleAoAAiRsBQ1pbmRleF9OX0NPSU5TCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBQNuaWwFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEDSR0MDE0NTI2MTQ2MDgJAQxmZWVfYmFsYW5jZXMCBQhiYWxhbmNlcwUMbmV3X2JhbGFuY2VzBAZmaW5hbHMIBQ0kdDAxNDUyNjE0NjA4Al8xBAdub19mZWVzCAUNJHQwMTQ1MjYxNDYwOAJfMgQHYWN0aW9ucwgFDSR0MDE0NTI2MTQ2MDgCXzMEB2ZlZV9zdW0IBQ0kdDAxNDUyNjE0NjA4Al80CQCVCgMFBmZpbmFscwkBBWdldF9EAgkBCGJpZ19saXN0AQUHbm9fZmVlcwUDYW1wCQDOCAIFB2FjdGlvbnMJAQhsb2dfZGF0YQIFAkQwAwkAAAIFA2ZlZQAAAAAJAGsDBQdmZWVfc3VtBQ9GRUVfREVOT01JTkFUT1IFA2ZlZQkAlQoDBQxuZXdfYmFsYW5jZXMFAkQxBQNuaWwEDmZpbmFsX2JhbGFuY2VzCAUNJHQwMTMwNTIxNTAwMgJfMQQCRDIIBQ0kdDAxMzA1MjE1MDAyAl8yBAxmZWVzX2FjdGlvbnMIBQ0kdDAxMzA1MjE1MDAyAl8zBAttaW50X2Ftb3VudAMJAAACBQ50b2tlbl9xdWFudGl0eQAABQJEMQkAawMFDnRva2VuX3F1YW50aXR5CQBlAgUCRDIFAkQwBQJEMAkAlQoDBQ5maW5hbF9iYWxhbmNlcwULbWludF9hbW91bnQFDGZlZXNfYWN0aW9ucxsDbXNnAQRpbml0BgZfb3duZXIGX2NvaW5zC19wb29sX3Rva2VuAl9BBF9mZWUKX2FkbWluX2ZlZQMJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMCBXRva2VuCQACAQITYWxyZWFkeSBpbml0aWFsaXplZAMJAQIhPQIIBQNtc2cGY2FsbGVyBQR0aGlzCQACAQIYc2VsZiBpbml0aWFsaXphdGlvbiBvbmx5BApjb2luc19saXN0CQC1CQIFBl9jb2lucwIBLAQBbgkAkAMBBQpjb2luc19saXN0AwkAZgIAAgUBbgkAAgECD3RvbyBzbWFsbCBjb2lucwMJAGYCBQFuBQtOX0NPSU5TX01BWAkAAgECDnRvbyBtYW55IGNvaW5zCgEKZHVwbGljYXRlcwIDYWNjBWluZGV4AwMJAGcCBQVpbmRleAUBbgYJAAACBQNhY2MHBQNhY2MJAAACCQDPCAIFCmNvaW5zX2xpc3QJAJEDAgUKY29pbnNfbGlzdAUFaW5kZXgFBWluZGV4AwkAAAIHCgACJGwFEWluZGV4X05fQ09JTlNfTUFYCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCmR1cGxpY2F0ZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAAIBAhdkdXBsaWNhdGUgY29pbiBkZXRlY3RlZAoBCGRlY2ltYWxzAQRjb2luCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA2QQBBQRjb2luCQCsAgICEmZyb21CYXNlNThTdHJpbmc6IAUEY29pbgkArAICAgthc3NldEluZm86IAUEY29pbghkZWNpbWFscwoBBGZvbGQCA2FjYwRjb2luCQCVCgMJAGQCCAUDYWNjAl8xAAEJAM0IAggFA2FjYwJfMgAACQDNCAIIBQNhY2MCXzMJAGwGAAoAAAkBCGRlY2ltYWxzAQUEY29pbgAAAAAFBERPV04EDSR0MDE2MjYzMTYzNTgKAAIkbAUKY29pbnNfbGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQIX05fQ09JTlMIBQ0kdDAxNjI2MzE2MzU4Al8xBAV6ZXJvcwgFDSR0MDE2MjYzMTYzNTgCXzIEBl9yYXRlcwgFDSR0MDE2MjYzMTYzNTgCXzMECmlzc3VlVG9rZW4JAMIIBQULX3Bvb2xfdG9rZW4JAKwCAgINTFAgdG9rZW4gZm9yIAUGX2NvaW5zAAAFDlRPS0VOX0RFQ0lNQUxTBgQHdG9rZW5JZAkA2AQBCQC4CAEFCmlzc3VlVG9rZW4JAMwIAgkBC1N0cmluZ0VudHJ5AgIFY29pbnMFBl9jb2lucwkAzAgCCQELU3RyaW5nRW50cnkCAgVyYXRlcwkAuQkCCQEJbGlzdF9pdG9zAQUGX3JhdGVzAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQICCGJhbGFuY2VzCQC5CQIJAQlsaXN0X2l0b3MBBQV6ZXJvcwIBLAkAzAgCCQEMSW50ZWdlckVudHJ5AgIHTl9DT0lOUwUIX05fQ09JTlMJAMwIAgkBDEludGVnZXJFbnRyeQICCWluaXRpYWxfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQJfQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIDZmVlBQRfZmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglhZG1pbl9mZWUFCl9hZG1pbl9mZWUJAMwIAgkBC1N0cmluZ0VudHJ5AgIFb3duZXIJAQxjaGVja0FkZHJlc3MBBQZfb3duZXIJAMwIAgkBDEludGVnZXJFbnRyeQICDWtpbGxfZGVhZGxpbmUJAGQCBQZoZWlnaHQFEEtJTExfREVBRExJTkVfRFQJAMwIAgkBC1N0cmluZ0VudHJ5AgIFdG9rZW4FB3Rva2VuSWQJAMwIAgkBDEJvb2xlYW5FbnRyeQICCWlzX2tpbGxlZAcJAMwIAgkBDEJvb2xlYW5FbnRyeQICDGlzX2F1dG9fZmVlcwYJAMwIAgUKaXNzdWVUb2tlbgUDbmlsA21zZwENYWRkX2xpcXVpZGl0eQEPbWluX21pbnRfYW1vdW50AwkBASEBCQEKc2VyaWFsaXplZAAJAQV0aHJvdwADCQEGYXNzZXJ0AQkBASEBBQlpc19raWxsZWQJAAIBAglpcyBraWxsZWQKARB1cGRhdGVfMV9iYWxhbmNlAwRiYXNlBnRhcmdldAZhbW91bnQKAQRmb2xkAgNhY2MFaW5kZXgJAM0IAgUDYWNjCQBkAgkAkQMCBQRiYXNlBQVpbmRleAMJAAACBQVpbmRleAUGdGFyZ2V0BQZhbW91bnQAAAoAAiRsBQ1pbmRleF9OX0NPSU5TCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCgELdXBfYmFsYW5jZXMCBGJhc2UIcGF5bWVudHMEAW4JAJADAQUIcGF5bWVudHMDCQBmAgABBQFuCQACAQIRcGF5bWVudHMgc2l6ZSA8IDEDCQBmAgUBbgULTl9DT0lOU19NQVgJAAIBAhtwYXltZW50cyBzaXplID4gTl9DT0lOU19NQVgKAQRmb2xkAgNhY2MHcGF5bWVudAkBEHVwZGF0ZV8xX2JhbGFuY2UDBQNhY2MJAQpjb2luX2luZGV4AQUHcGF5bWVudAgFB3BheW1lbnQGYW1vdW50CgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUEYmFzZQoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQMbmV3X2JhbGFuY2VzCQELdXBfYmFsYW5jZXMCBQhiYWxhbmNlcwgFA21zZwhwYXltZW50cwMDCQAAAgUOdG9rZW5fcXVhbnRpdHkAAAkAAAIJAJcDAQUMbmV3X2JhbGFuY2VzAAAHCQACAQIiaW5pdGlhbCBkZXBvc2l0IHJlcXVpcmVzIGFsbCBjb2lucwQNJHQwMTgyODExODM2NwkBEl9jYWxjX3Rva2VuX2Ftb3VudAEFDG5ld19iYWxhbmNlcwQOZmluYWxfYmFsYW5jZXMIBQ0kdDAxODI4MTE4MzY3Al8xBAttaW50X2Ftb3VudAgFDSR0MDE4MjgxMTgzNjcCXzIEDGZlZXNfYWN0aW9ucwgFDSR0MDE4MjgxMTgzNjcCXzMDCQEGYXNzZXJ0AQkAZwIFC21pbnRfYW1vdW50BQ9taW5fbWludF9hbW91bnQJAAIBAhRzbGlwcGFnZSBzY3Jld2VkIHlvdQkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQICCGJhbGFuY2VzCQC5CQIJAQlsaXN0X2l0b3MBBQ5maW5hbF9iYWxhbmNlcwIBLAkAzAgCCQEHUmVpc3N1ZQMFBXRva2VuBQttaW50X2Ftb3VudAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwZjYWxsZXIFC21pbnRfYW1vdW50BQV0b2tlbgUDbmlsBQxmZWVzX2FjdGlvbnMDbXNnAQZnZXRfZHkDAWkBagJkeAQEeHBfaQkAkQMCBQhiYWxhbmNlcwUBaQQEeHBfagkAkQMCBQhiYWxhbmNlcwUBagQBeAkAZAIFBHhwX2kFAmR4BA0kdDAxODgyNzE4ODgwCQEFZ2V0X3kEBQFpBQFqBQF4CQEIYmlnX2xpc3QBBQhiYWxhbmNlcwQBeQgFDSR0MDE4ODI3MTg4ODACXzEEAUQIBQ0kdDAxODgyNzE4ODgwAl8yBANfZHkJAGUCCQBlAgUEeHBfagUBeQABBAZkeV9mZWUJAGsDBQNfZHkFA2ZlZQUPRkVFX0RFTk9NSU5BVE9SBAJkeQkAZQIFA19keQUGZHlfZmVlCQCUCgIFA25pbAUCZHkDbXNnAQhleGNoYW5nZQIBagZtaW5fZHkDCQEBIQEJAQdhbGxvd2VkAQgFA21zZwZjYWxsZXIJAAIBAgghYWxsb3dlZAMJAQZhc3NlcnQBCQEBIQEFCWlzX2tpbGxlZAkAAgECCWlzIGtpbGxlZAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQIVc2l6ZSggcGF5bWVudHMgKSAhPSAxBAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAQCZHgIBQdwYXltZW50BmFtb3VudAQBaQkBCmNvaW5faW5kZXgBBQdwYXltZW50BAR4cF9pCQCRAwIFCGJhbGFuY2VzBQFpBAR4cF9qCQCRAwIFCGJhbGFuY2VzBQFqBAF4CQBkAgUEeHBfaQUCZHgEDSR0MDE5NDQ5MTk1MDIJAQVnZXRfeQQFAWkFAWoFAXgJAQhiaWdfbGlzdAEFCGJhbGFuY2VzBAF5CAUNJHQwMTk0NDkxOTUwMgJfMQQBRAgFDSR0MDE5NDQ5MTk1MDICXzIEA19keQkAZQIJAGUCBQR4cF9qBQF5AAEEBmR5X2ZlZQkAawMFA19keQUDZmVlBQ9GRUVfREVOT01JTkFUT1IEAmR5CQBlAgUDX2R5BQZkeV9mZWUDCQEGYXNzZXJ0AQkAZwIFAmR5BQZtaW5fZHkJAAIBAi5leGNoYW5nZSByZXN1bHRlZCBpbiBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkBAxkeV9hZG1pbl9mZWUJAGsDBQZkeV9mZWUFCWFkbWluX2ZlZQUPRkVFX0RFTk9NSU5BVE9SCgEEZm9sZAIDYWNjBWluZGV4CQDNCAIFA2FjYwMJAAACBQVpbmRleAUBaQkAZAIJAJEDAgUIYmFsYW5jZXMFBWluZGV4BQJkeAMJAAACBQVpbmRleAUBagkAZQIJAGUCCQCRAwIFCGJhbGFuY2VzBQVpbmRleAUCZHkFDGR5X2FkbWluX2ZlZQkAkQMCBQhiYWxhbmNlcwUFaW5kZXgEDmZpbmFsX2JhbGFuY2VzCgACJGwFDWluZGV4X05fQ09JTlMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoECHRva2VuT3V0CQDZBAEJAJEDAgUFY29pbnMFAWoJAJQKAgkAzggCCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgIIYmFsYW5jZXMJALkJAgkBCWxpc3RfaXRvcwEFDmZpbmFsX2JhbGFuY2VzAgEsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQJkeQUIdG9rZW5PdXQFA25pbAMDBQxpc19hdXRvX2ZlZXMJAGYCBQxkeV9hZG1pbl9mZWUAAAcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUFb3duZXIFDGR5X2FkbWluX2ZlZQUIdG9rZW5PdXQFA25pbAUDbmlsCQEIbG9nX2RhdGECBQFEAwkAAAIFA2ZlZQAAAAAJAGsDCQBrAwUGZHlfZmVlBQpUT0tFTl9SQVRFCQCRAwIFBXJhdGVzBQFqBQ9GRUVfREVOT01JTkFUT1IFA2ZlZQUCZHkDbXNnARByZW1vdmVfbGlxdWlkaXR5AQxfbWluX2Ftb3VudHMDCQEBIQEJAQpzZXJpYWxpemVkAAkBBXRocm93AAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQIVc2l6ZSggcGF5bWVudHMgKSAhPSAxBAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAMJAQIhPQIIBQdwYXltZW50B2Fzc2V0SWQFBXRva2VuCQACAQINdW5rbm93biB0b2tlbgQLbWluX2Ftb3VudHMDCQAAAgUMX21pbl9hbW91bnRzAgEwBQNuaWwJAQlsaXN0X3N0b2kBCQC1CQIFDF9taW5fYW1vdW50cwIBLAMDCQECIT0CBQxfbWluX2Ftb3VudHMCATAJAQIhPQIJAJADAQULbWluX2Ftb3VudHMFB05fQ09JTlMHCQACAQIdbWluX2Ftb3VudHMuc2l6ZSgpICE9IE5fQ09JTlMEBmFtb3VudAgFB3BheW1lbnQGYW1vdW50BAZjYWxsZXIIBQNtc2cGY2FsbGVyCgEEZm9sZAIDYWNjBWluZGV4BAdiYWxhbmNlCQCRAwIFCGJhbGFuY2VzBQVpbmRleAQKYW1vdW50X291dAkAawMFB2JhbGFuY2UFBmFtb3VudAUOdG9rZW5fcXVhbnRpdHkDAwkBAiE9AgUMX21pbl9hbW91bnRzAgEwCQBmAgkAkQMCBQttaW5fYW1vdW50cwUFaW5kZXgFCmFtb3VudF9vdXQHCQACAQIwd2l0aGRyYXdhbCByZXN1bHRlZCBpbiBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkCQCUCgIJAM0IAggFA2FjYwJfMQkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQphbW91bnRfb3V0CQDZBAEJAJEDAgUFY29pbnMFBWluZGV4CQDNCAIIBQNhY2MCXzIJAGUCBQdiYWxhbmNlBQphbW91bnRfb3V0BA0kdDAyMTcyOTIxODA4CgACJGwFDWluZGV4X05fQ09JTlMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAl0cmFuc2ZlcnMIBQ0kdDAyMTcyOTIxODA4Al8xBA5maW5hbF9iYWxhbmNlcwgFDSR0MDIxNzI5MjE4MDgCXzIJAM4IAgUJdHJhbnNmZXJzCQDMCAIJAQtTdHJpbmdFbnRyeQICCGJhbGFuY2VzCQC5CQIJAQlsaXN0X2l0b3MBBQ5maW5hbF9iYWxhbmNlcwIBLAkAzAgCCQEEQnVybgIFBXRva2VuBQZhbW91bnQFA25pbANtc2cBFmNhbGNfd2l0aGRyYXdfb25lX2NvaW4CDV90b2tlbl9hbW91bnQBaQkAlAoCBQNuaWwICQEXX2NhbGNfd2l0aGRyYXdfb25lX2NvaW4CBQ1fdG9rZW5fYW1vdW50BQFpAl8xA21zZwEZcmVtb3ZlX2xpcXVpZGl0eV9vbmVfY29pbgIBaQptaW5fYW1vdW50AwkBASEBCQEHYWxsb3dlZAEIBQNtc2cGY2FsbGVyCQACAQIIIWFsbG93ZWQDCQEGYXNzZXJ0AQkBASEBBQlpc19raWxsZWQJAAIBAglpcyBraWxsZWQDCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECFXNpemUoIHBheW1lbnRzICkgIT0gMQQHcGF5bWVudAkAkQMCCAUDbXNnCHBheW1lbnRzAAADCQECIT0CCAUHcGF5bWVudAdhc3NldElkBQV0b2tlbgkAAgECDXVua25vd24gdG9rZW4EDV90b2tlbl9hbW91bnQIBQdwYXltZW50BmFtb3VudAQNJHQwMjI1MzIyMjU5OQkBF19jYWxjX3dpdGhkcmF3X29uZV9jb2luAgUNX3Rva2VuX2Ftb3VudAUBaQQCZHkIBQ0kdDAyMjUzMjIyNTk5Al8xBAZkeV9mZWUIBQ0kdDAyMjUzMjIyNTk5Al8yBAFECAUNJHQwMjI1MzIyMjU5OQJfMwMJAQZhc3NlcnQBCQBnAgUCZHkFCm1pbl9hbW91bnQJAAIBAhhub3QgZW5vdWdoIGNvaW5zIHJlbW92ZWQEDGR5X2FkbWluX2ZlZQkAawMFBmR5X2ZlZQUJYWRtaW5fZmVlBQ9GRUVfREVOT01JTkFUT1IECmR5X2FuZF9mZWUJAGQCBQJkeQUMZHlfYWRtaW5fZmVlCgEEZm9sZAIDYWNjBWluZGV4CQDNCAIFA2FjYwkAZQIJAJEDAgUIYmFsYW5jZXMFBWluZGV4AwkAAAIFBWluZGV4BQFpBQpkeV9hbmRfZmVlAAAEDmZpbmFsX2JhbGFuY2VzCgACJGwFDWluZGV4X05fQ09JTlMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoECHRva2VuT3V0CQDZBAEJAJEDAgUFY29pbnMFAWkJAJQKAgkAzggCCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgIIYmFsYW5jZXMJALkJAgkBCWxpc3RfaXRvcwEFDmZpbmFsX2JhbGFuY2VzAgEsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQJkeQUIdG9rZW5PdXQJAMwIAgkBBEJ1cm4CBQV0b2tlbgUNX3Rva2VuX2Ftb3VudAUDbmlsAwMFDGlzX2F1dG9fZmVlcwkAZgIFDGR5X2FkbWluX2ZlZQAABwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQVvd25lcgUMZHlfYWRtaW5fZmVlBQh0b2tlbk91dAUDbmlsBQNuaWwJAQhsb2dfZGF0YQIFAUQDCQAAAgUDZmVlAAAAAAkAawMJAGsDBQZkeV9mZWUFClRPS0VOX1JBVEUJAJEDAgUFcmF0ZXMFAWkFD0ZFRV9ERU5PTUlOQVRPUgUDZmVlBQJkeQNtc2cBAUEACQCUCgIFA25pbAUDYW1wA21zZwERZ2V0X3ZpcnR1YWxfcHJpY2UABAFECQEFZ2V0X0QCCQEIYmlnX2xpc3QBBQhiYWxhbmNlcwUDYW1wCQCUCgIFA25pbAkBDXZpcnR1YWxfcHJpY2UBBQFEA21zZwERY2FsY190b2tlbl9hbW91bnQBCF9hbW91bnRzBAdhbW91bnRzCQEJbGlzdF9zdG9pAQkAtQkCBQhfYW1vdW50cwIBLAMJAQIhPQIJAJADAQUHYW1vdW50cwUHTl9DT0lOUwkAAgECE25vdCBlbm91Z2h0IGFtb3VudHMKAQRmb2xkAgNhY2MFaW5kZXgJAM0IAgUDYWNjCQBkAgkAkQMCBQhiYWxhbmNlcwUFaW5kZXgJAJEDAgUHYW1vdW50cwUFaW5kZXgEDG5ld19iYWxhbmNlcwoAAiRsBQ1pbmRleF9OX0NPSU5TCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA0kdDAyNDA3NzI0MTYzCQESX2NhbGNfdG9rZW5fYW1vdW50AQUMbmV3X2JhbGFuY2VzBA5maW5hbF9iYWxhbmNlcwgFDSR0MDI0MDc3MjQxNjMCXzEEC21pbnRfYW1vdW50CAUNJHQwMjQwNzcyNDE2MwJfMgQMZmVlc19hY3Rpb25zCAUNJHQwMjQwNzcyNDE2MwJfMwkAlAoCBQNuaWwFC21pbnRfYW1vdW50A21zZwEGcmFtcF9BAglfZnV0dXJlX0EMX2Z1dHVyZV90aW1lAwkBBmFzc2VydAEJAAACCAUDbXNnBmNhbGxlcgUFb3duZXIJAAIBAgpvbmx5IG93bmVyAwkBBmFzc2VydAEDCQAAAgUOaW5pdGlhbF9BX3RpbWUAAAYJAGcCBQ9ibG9ja190aW1lc3RhbXAJAGQCBQ5pbml0aWFsX0FfdGltZQUNTUlOX1JBTVBfVElNRQkAAgECCXRvbyBvZnRlbgMJAQZhc3NlcnQBCQBnAgUMX2Z1dHVyZV90aW1lCQBkAgUPYmxvY2tfdGltZXN0YW1wBQ1NSU5fUkFNUF9USU1FCQACAQIRaW5zdWZmaWNpZW50IHRpbWUECl9pbml0aWFsX0EFA2FtcAMJAQZhc3NlcnQBAwkAZgIFCV9mdXR1cmVfQQAACQBmAgUFTUFYX0EFCV9mdXR1cmVfQQcJAAIBAhFvdXQgb2YgYmFzZSByYW5nZQMJAQZhc3NlcnQBAwMJAGcCBQlfZnV0dXJlX0EFCl9pbml0aWFsX0EJAGcCCQBoAgUKX2luaXRpYWxfQQUMTUFYX0FfQ0hBTkdFBQlfZnV0dXJlX0EHBgMJAGYCBQpfaW5pdGlhbF9BBQlfZnV0dXJlX0EJAGcCCQBoAgUJX2Z1dHVyZV9BBQxNQVhfQV9DSEFOR0UFCl9pbml0aWFsX0EHCQACAQIMb3V0IG9mIHJhbmdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFCl9pbml0aWFsX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQlfZnV0dXJlX0EJAMwIAgkBDEludGVnZXJFbnRyeQICDmluaXRpYWxfQV90aW1lBQ9ibG9ja190aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQICDWZ1dHVyZV9BX3RpbWUFDF9mdXR1cmVfdGltZQUDbmlsA21zZwELc3RvcF9yYW1wX0EAAwkBBmFzc2VydAEJAAACCAUDbXNnBmNhbGxlcgUFb3duZXIJAAIBAgpvbmx5IG93bmVyBAljdXJyZW50X0EFA2FtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQljdXJyZW50X0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQljdXJyZW50X0EJAMwIAgkBDEludGVnZXJFbnRyeQICDmluaXRpYWxfQV90aW1lBQ9ibG9ja190aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQICDWZ1dHVyZV9BX3RpbWUFD2Jsb2NrX3RpbWVzdGFtcAUDbmlsA21zZwEOY29tbWl0X25ld19mZWUCB25ld19mZWUNbmV3X2FkbWluX2ZlZQMJAQZhc3NlcnQBCQAAAggFA21zZwZjYWxsZXIFBW93bmVyCQACAQIKb25seSBvd25lcgMJAQZhc3NlcnQBCQAAAgUWYWRtaW5fYWN0aW9uc19kZWFkbGluZQAACQACAQINYWN0aXZlIGFjdGlvbgMJAQZhc3NlcnQBCQBnAgUHTUFYX0ZFRQUHbmV3X2ZlZQkAAgECE2ZlZSBleGNlZWRzIG1heGltdW0DCQEGYXNzZXJ0AQkAZwIFDU1BWF9BRE1JTl9GRUUFDW5ld19hZG1pbl9mZWUJAAIBAhlhZG1pbiBmZWUgZXhjZWVkcyBtYXhpbXVtBAlfZGVhZGxpbmUJAGQCBQ9ibG9ja190aW1lc3RhbXAFE0FETUlOX0FDVElPTlNfREVMQVkJAMwIAgkBDEludGVnZXJFbnRyeQICFmFkbWluX2FjdGlvbnNfZGVhZGxpbmUFCV9kZWFkbGluZQkAzAgCCQEMSW50ZWdlckVudHJ5AgIKZnV0dXJlX2ZlZQUHbmV3X2ZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgIQZnV0dXJlX2FkbWluX2ZlZQUNbmV3X2FkbWluX2ZlZQUDbmlsA21zZwENYXBwbHlfbmV3X2ZlZQADCQEGYXNzZXJ0AQkAAAIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCm9ubHkgb3duZXIDCQEGYXNzZXJ0AQkAZwIFD2Jsb2NrX3RpbWVzdGFtcAUWYWRtaW5fYWN0aW9uc19kZWFkbGluZQkAAgECEWluc3VmZmljaWVudCB0aW1lAwkBBmFzc2VydAEJAQIhPQIFFmFkbWluX2FjdGlvbnNfZGVhZGxpbmUAAAkAAgECEG5vIGFjdGl2ZSBhY3Rpb24JAMwIAgkBDEludGVnZXJFbnRyeQICFmFkbWluX2FjdGlvbnNfZGVhZGxpbmUAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgIDZmVlBQpmdXR1cmVfZmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglhZG1pbl9mZWUFEGZ1dHVyZV9hZG1pbl9mZWUFA25pbANtc2cBFXJldmVydF9uZXdfcGFyYW1ldGVycwADCQEGYXNzZXJ0AQkAAAIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCm9ubHkgb3duZXIJAMwIAgkBDEludGVnZXJFbnRyeQICFmFkbWluX2FjdGlvbnNfZGVhZGxpbmUAAAUDbmlsA21zZwEZY29tbWl0X3RyYW5zZmVyX293bmVyc2hpcAEGX293bmVyAwkBBmFzc2VydAEJAAACCAUDbXNnBmNhbGxlcgUFb3duZXIJAAIBAgpvbmx5IG93bmVyAwkBBmFzc2VydAEJAAACBRt0cmFuc2Zlcl9vd25lcnNoaXBfZGVhZGxpbmUAAAkAAgECD2FjdGl2ZSB0cmFuc2ZlcgQJX2RlYWRsaW5lCQBkAgUPYmxvY2tfdGltZXN0YW1wBRNBRE1JTl9BQ1RJT05TX0RFTEFZCQDMCAIJAQxJbnRlZ2VyRW50cnkCAht0cmFuc2Zlcl9vd25lcnNoaXBfZGVhZGxpbmUFCV9kZWFkbGluZQkAzAgCCQELU3RyaW5nRW50cnkCAgxmdXR1cmVfb3duZXIJAQxjaGVja0FkZHJlc3MBBQZfb3duZXIFA25pbANtc2cBGGFwcGx5X3RyYW5zZmVyX293bmVyc2hpcAADCQEGYXNzZXJ0AQkAAAIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCm9ubHkgb3duZXIDCQEGYXNzZXJ0AQkAZwIFD2Jsb2NrX3RpbWVzdGFtcAUbdHJhbnNmZXJfb3duZXJzaGlwX2RlYWRsaW5lCQACAQIRaW5zdWZmaWNpZW50IHRpbWUDCQEGYXNzZXJ0AQkBAiE9AgUbdHJhbnNmZXJfb3duZXJzaGlwX2RlYWRsaW5lAAAJAAIBAhJubyBhY3RpdmUgdHJhbnNmZXIJAMwIAgkBDEludGVnZXJFbnRyeQICG3RyYW5zZmVyX293bmVyc2hpcF9kZWFkbGluZQAACQDMCAIJAQtTdHJpbmdFbnRyeQICBW93bmVyBQxmdXR1cmVfb3duZXIFA25pbANtc2cBGXJldmVydF90cmFuc2Zlcl9vd25lcnNoaXAAAwkBBmFzc2VydAEJAAACCAUDbXNnBmNhbGxlcgUFb3duZXIJAAIBAgpvbmx5IG93bmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCAht0cmFuc2Zlcl9vd25lcnNoaXBfZGVhZGxpbmUAAAUDbmlsA21zZwEOYWRtaW5fYmFsYW5jZXMBAWkJAJQKAgUDbmlsCQENYWRtaW5fYmFsYW5jZQEFAWkDbXNnARN3aXRoZHJhd19hZG1pbl9mZWVzAAMJAQZhc3NlcnQBCQAAAggFA21zZwZjYWxsZXIFBW93bmVyCQACAQIKb25seSBvd25lcgoBBGZvbGQCA2FjYwVpbmRleAkAzQgCBQNhY2MJAQ5TY3JpcHRUcmFuc2ZlcgMFBW93bmVyCQENYWRtaW5fYmFsYW5jZQEFBWluZGV4CQDZBAEJAJEDAgUFY29pbnMFBWluZGV4CgACJGwFDWluZGV4X05fQ09JTlMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDbXNnARFkb25hdGVfYWRtaW5fZmVlcwADCQEGYXNzZXJ0AQkAAAIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCm9ubHkgb3duZXIKAQRmb2xkAgNhY2MFaW5kZXgJAM0IAgUDYWNjCQBkAgkAkQMCBQhiYWxhbmNlcwUFaW5kZXgJAQ1hZG1pbl9iYWxhbmNlAQUFaW5kZXgEDG5ld19iYWxhbmNlcwoAAiRsBQ1pbmRleF9OX0NPSU5TCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQDMCAIJAQtTdHJpbmdFbnRyeQICCGJhbGFuY2VzCQC5CQIJAQlsaXN0X2l0b3MBBQxuZXdfYmFsYW5jZXMCASwFA25pbANtc2cBDXNldF9hdXRvX2ZlZXMBDV9pc19hdXRvX2ZlZXMDCQEGYXNzZXJ0AQkAAAIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCm9ubHkgb3duZXIJAMwIAgkBDEJvb2xlYW5FbnRyeQICDGlzX2F1dG9fZmVlcwUNX2lzX2F1dG9fZmVlcwUDbmlsA21zZwEHa2lsbF9tZQADCQEGYXNzZXJ0AQkAAAIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCm9ubHkgb3duZXIDCQEGYXNzZXJ0AQkAZgIFDWtpbGxfZGVhZGxpbmUFD2Jsb2NrX3RpbWVzdGFtcAkAAgECE2RlYWRsaW5lIGhhcyBwYXNzZWQJAMwIAgkBDEJvb2xlYW5FbnRyeQICCWlzX2tpbGxlZAYFA25pbANtc2cBCXVua2lsbF9tZQADCQEGYXNzZXJ0AQkAAAIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCm9ubHkgb3duZXIJAMwIAgkBDEJvb2xlYW5FbnRyeQICCWlzX2tpbGxlZAcFA25pbANtc2cBCXNlcmlhbGl6ZQADCQECIT0CCAUDbXNnBmNhbGxlcgUEdGhpcwkAAgECCXNlbGYgb25seQQCaWQJANgEAQgFA21zZw10cmFuc2FjdGlvbklkAwkAAAIJAJ0IAgUEdGhpcwIKc2VyaWFsaXplZAUCaWQJAAIBAhJhbHJlYWR5IHNlcmlhbGl6ZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgIKc2VyaWFsaXplZAUCaWQFA25pbANtc2cBEnNldF9oZWlnaHRfYWRkcmVzcwEOX2hlaWdodEFkZHJlc3MDCQECIT0CCAUDbXNnBmNhbGxlcgUFb3duZXIJAAIBAgpvbmx5IG93bmVyCQDMCAIJAQtTdHJpbmdFbnRyeQICDWhlaWdodEFkZHJlc3MJAQxjaGVja0FkZHJlc3MBBQ5faGVpZ2h0QWRkcmVzcwUDbmlsAWkBDHNldF92ZXJpZmllcgEIdmVyaWZpZXIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg5zZWxmIGNhbGwgb25seQQJYWRkcmVzc09LBAckbWF0Y2gwCQCmCAEFCHZlcmlmaWVyAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGBwMJAQEhAQUJYWRkcmVzc09LCQACAQkArAICAhd2ZXJpZmllciB3cm9uZyBhZGRyZXNzIAUIdmVyaWZpZXIDCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzAgh2ZXJpZmllcgkAAgECGHZlcmlmaWVyIGFscmVhZHkgZGVmaW5lZAkAzAgCCQELU3RyaW5nRW50cnkCAgh2ZXJpZmllcgUIdmVyaWZpZXIFA25pbAECdHgBBnZlcmlmeQAEByRtYXRjaDAJAJ0IAgUEdGhpcwIIdmVyaWZpZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAh2ZXJpZmllcgUHJG1hdGNoMAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQh2ZXJpZmllcgkArAICCQCsAgIJAKwCAgIHc3RhdHVzXwkApQgBBQR0aGlzAgFfCQDYBAEIBQJ0eAJpZAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXmxVjTH", "chainId": 87, "height": 3447136, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: A11yc5TjvDq3vzdyfsLa3NZ2b2qNvncictQsbkErze1R Next: 7r4DY88WrcyvbhuRAXewzaYEaqdn79FMU43fXsKDbqau Diff:
OldNewDifferences
8686 let block_timestamp = HEIGHT
8787
8888 func allowed (caller) = (owner == caller)
89+
90+
91+func serialized () = {
92+ let serialize = invoke(this, "serialize", nil, nil)
93+ if ((serialize == serialize))
94+ then true
95+ else throw("Strict value is not equal to itself.")
96+ }
8997
9098
9199 func assert (a) = if (a)
303311 else $Tuple2(D, false)
304312 }
305313
306- let $t061556217 = {
314+ let $t062486310 = {
307315 let $l = list16
308316 let $s = size($l)
309317 let $acc0 = $Tuple2(S, false)
317325
318326 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
319327 }
320- let D = $t061556217._1
321- let finished = $t061556217._2
328+ let D = $t062486310._1
329+ let finished = $t062486310._2
322330 if ((finished == false))
323331 then throw(("D_proc() not finished with " + toString(D)))
324332 else toInt(D)
341349 let D_big = toBigInt(D)
342350 let Ann_big = toBigInt((amp * N_COINS))
343351 func S_c (acc,index) = {
344- let $t068106829 = acc
345- let S_ = $t068106829._1
346- let c = $t068106829._2
352+ let $t069036922 = acc
353+ let S_ = $t069036922._1
354+ let c = $t069036922._2
347355 let x_ = if ((index == i))
348356 then toBigInt(fraction(x, TOKEN_RATE, rates[index]))
349357 else xp[index]
352360 else $Tuple2(S_, c)
353361 }
354362
355- let $t071057169 = {
363+ let $t071987262 = {
356364 let $l = index_N_COINS
357365 let $s = size($l)
358366 let $acc0 = $Tuple2(big0, D_big)
366374
367375 $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)
368376 }
369- let S_ = $t071057169._1
370- let c_ = $t071057169._2
377+ let S_ = $t071987262._1
378+ let c_ = $t071987262._2
371379 let c = fraction(c_, D_big, fraction(Ann_big, N_COINS_big, big1))
372380 let bD = ((S_ + fraction(D_big, big1, Ann_big)) - D_big)
373381 func y_proc (acc,unused) = if ((acc._2 == true))
384392 else $Tuple2(y, false)
385393 }
386394
387- let $t077497815 = {
395+ let $t078427908 = {
388396 let $l = list16
389397 let $s = size($l)
390398 let $acc0 = $Tuple2(D_big, false)
398406
399407 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
400408 }
401- let y = $t077497815._1
402- let finished = $t077497815._2
409+ let y = $t078427908._1
410+ let finished = $t078427908._2
403411 if ((finished == false))
404412 then throw(("y_proc() not finished with " + toString(y)))
405413 else $Tuple2(fraction(toInt(y), rates[j], TOKEN_RATE), D)
414422 let D_big = toBigInt(D)
415423 let Ann_big = toBigInt((amp * N_COINS))
416424 func S_c (acc,index) = {
417- let $t083208339 = acc
418- let S_ = $t083208339._1
419- let c = $t083208339._2
425+ let $t084138432 = acc
426+ let S_ = $t084138432._1
427+ let c = $t084138432._2
420428 let x_ = if ((index == i))
421429 then big0
422430 else xp[index]
425433 else $Tuple2(S_, c)
426434 }
427435
428- let $t085698633 = {
436+ let $t086628726 = {
429437 let $l = index_N_COINS
430438 let $s = size($l)
431439 let $acc0 = $Tuple2(big0, D_big)
439447
440448 $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)
441449 }
442- let S_ = $t085698633._1
443- let c_ = $t085698633._2
450+ let S_ = $t086628726._1
451+ let c_ = $t086628726._2
444452 let c = fraction(c_, D_big, fraction(Ann_big, N_COINS_big, big1))
445453 let bD = ((S_ + fraction(D_big, big1, Ann_big)) - D_big)
446454 func y_proc (acc,unused) = if ((acc._2 == true))
457465 else $Tuple2(y, false)
458466 }
459467
460- let $t092139279 = {
468+ let $t093069372 = {
461469 let $l = list16
462470 let $s = size($l)
463471 let $acc0 = $Tuple2(D_big, false)
471479
472480 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
473481 }
474- let y = $t092139279._1
475- let finished = $t092139279._2
482+ let y = $t093069372._1
483+ let finished = $t093069372._2
476484 if ((finished == false))
477485 then throw(("y_proc() not finished with " + toString(y)))
478486 else fraction(toInt(y), rates[i], TOKEN_RATE)
618626 if (assert((D1 > D0)))
619627 then throw("D1 > D0")
620628 else {
621- let $t01295914909 = if ((token_quantity > 0))
629+ let $t01305215002 = if ((token_quantity > 0))
622630 then {
623631 func fee_balances (old,new) = {
624632 func fold (acc,index) = {
651659 $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)
652660 }
653661
654- let $t01443314515 = fee_balances(balances, new_balances)
655- let finals = $t01443314515._1
656- let no_fees = $t01443314515._2
657- let actions = $t01443314515._3
658- let fee_sum = $t01443314515._4
662+ let $t01452614608 = fee_balances(balances, new_balances)
663+ let finals = $t01452614608._1
664+ let no_fees = $t01452614608._2
665+ let actions = $t01452614608._3
666+ let fee_sum = $t01452614608._4
659667 $Tuple3(finals, get_D(big_list(no_fees), amp), (actions ++ log_data(D0, if ((fee == 0))
660668 then 0
661669 else fraction(fee_sum, FEE_DENOMINATOR, fee))))
662670 }
663671 else $Tuple3(new_balances, D1, nil)
664- let final_balances = $t01295914909._1
665- let D2 = $t01295914909._2
666- let fees_actions = $t01295914909._3
672+ let final_balances = $t01305215002._1
673+ let D2 = $t01305215002._2
674+ let fees_actions = $t01305215002._3
667675 let mint_amount = if ((token_quantity == 0))
668676 then D1
669677 else fraction(token_quantity, (D2 - D0), D0)
711719
712720 func fold (acc,coin) = $Tuple3((acc._1 + 1), (acc._2 :+ 0), (acc._3 :+ pow(10, 0, decimals(coin), 0, 0, DOWN)))
713721
714- let $t01617016265 = {
722+ let $t01626316358 = {
715723 let $l = coins_list
716724 let $s = size($l)
717725 let $acc0 = $Tuple3(0, nil, nil)
725733
726734 $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)
727735 }
728- let _N_COINS = $t01617016265._1
729- let zeros = $t01617016265._2
730- let _rates = $t01617016265._3
736+ let _N_COINS = $t01626316358._1
737+ let zeros = $t01626316358._2
738+ let _rates = $t01626316358._3
731739 let issueToken = Issue(_pool_token, ("LP token for " + _coins), 0, TOKEN_DECIMALS, true)
732740 let tokenId = toBase58String(calculateAssetId(issueToken))
733741 [StringEntry("coins", _coins), StringEntry("rates", makeString(list_itos(_rates), ",")), StringEntry("balances", makeString(list_itos(zeros), ",")), IntegerEntry("N_COINS", _N_COINS), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry("fee", _fee), IntegerEntry("admin_fee", _admin_fee), StringEntry("owner", checkAddress(_owner)), IntegerEntry("kill_deadline", (height + KILL_DEADLINE_DT)), StringEntry("token", tokenId), BooleanEntry("is_killed", false), BooleanEntry("is_auto_fees", true), issueToken]
738746
739747
740748 @Callable(msg)
741-func add_liquidity (min_mint_amount) = if (!(allowed(msg.caller)))
742- then throw("!allowed")
749+func add_liquidity (min_mint_amount) = if (!(serialized()))
750+ then throw()
743751 else if (assert(!(is_killed)))
744752 then throw("is killed")
745753 else {
792800 else false)
793801 then throw("initial deposit requires all coins")
794802 else {
795- let $t01820918295 = _calc_token_amount(new_balances)
796- let final_balances = $t01820918295._1
797- let mint_amount = $t01820918295._2
798- let fees_actions = $t01820918295._3
803+ let $t01828118367 = _calc_token_amount(new_balances)
804+ let final_balances = $t01828118367._1
805+ let mint_amount = $t01828118367._2
806+ let fees_actions = $t01828118367._3
799807 if (assert((mint_amount >= min_mint_amount)))
800808 then throw("slippage screwed you")
801809 else ([StringEntry("balances", makeString(list_itos(final_balances), ",")), Reissue(token, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, token)] ++ fees_actions)
809817 let xp_i = balances[i]
810818 let xp_j = balances[j]
811819 let x = (xp_i + dx)
812- let $t01875518808 = get_y(i, j, x, big_list(balances))
813- let y = $t01875518808._1
814- let D = $t01875518808._2
820+ let $t01882718880 = get_y(i, j, x, big_list(balances))
821+ let y = $t01882718880._1
822+ let D = $t01882718880._2
815823 let _dy = ((xp_j - y) - 1)
816824 let dy_fee = fraction(_dy, fee, FEE_DENOMINATOR)
817825 let dy = (_dy - dy_fee)
834842 let xp_i = balances[i]
835843 let xp_j = balances[j]
836844 let x = (xp_i + dx)
837- let $t01937719430 = get_y(i, j, x, big_list(balances))
838- let y = $t01937719430._1
839- let D = $t01937719430._2
845+ let $t01944919502 = get_y(i, j, x, big_list(balances))
846+ let y = $t01944919502._1
847+ let D = $t01944919502._2
840848 let _dy = ((xp_j - y) - 1)
841849 let dy_fee = fraction(_dy, fee, FEE_DENOMINATOR)
842850 let dy = (_dy - dy_fee)
878886
879887
880888 @Callable(msg)
881-func remove_liquidity (_min_amounts) = if ((size(msg.payments) != 1))
882- then throw("size( payments ) != 1")
883- else {
884- let payment = msg.payments[0]
885- if ((payment.assetId != token))
886- then throw("unknown token")
887- else {
888- let min_amounts = if ((_min_amounts == "0"))
889- then nil
890- else list_stoi(split(_min_amounts, ","))
891- if (if ((_min_amounts != "0"))
892- then (size(min_amounts) != N_COINS)
893- else false)
894- then throw("min_amounts.size() != N_COINS")
895- else {
896- let amount = payment.amount
897- let caller = msg.caller
898- func fold (acc,index) = {
899- let balance = balances[index]
900- let amount_out = fraction(balance, amount, token_quantity)
901- if (if ((_min_amounts != "0"))
902- then (min_amounts[index] > amount_out)
903- else false)
904- then throw("withdrawal resulted in fewer coins than expected")
905- else $Tuple2((acc._1 :+ ScriptTransfer(caller, amount_out, fromBase58String(coins[index]))), (acc._2 :+ (balance - amount_out)))
889+func remove_liquidity (_min_amounts) = if (!(serialized()))
890+ then throw()
891+ else if ((size(msg.payments) != 1))
892+ then throw("size( payments ) != 1")
893+ else {
894+ let payment = msg.payments[0]
895+ if ((payment.assetId != token))
896+ then throw("unknown token")
897+ else {
898+ let min_amounts = if ((_min_amounts == "0"))
899+ then nil
900+ else list_stoi(split(_min_amounts, ","))
901+ if (if ((_min_amounts != "0"))
902+ then (size(min_amounts) != N_COINS)
903+ else false)
904+ then throw("min_amounts.size() != N_COINS")
905+ else {
906+ let amount = payment.amount
907+ let caller = msg.caller
908+ func fold (acc,index) = {
909+ let balance = balances[index]
910+ let amount_out = fraction(balance, amount, token_quantity)
911+ if (if ((_min_amounts != "0"))
912+ then (min_amounts[index] > amount_out)
913+ else false)
914+ then throw("withdrawal resulted in fewer coins than expected")
915+ else $Tuple2((acc._1 :+ ScriptTransfer(caller, amount_out, fromBase58String(coins[index]))), (acc._2 :+ (balance - amount_out)))
916+ }
917+
918+ let $t02172921808 = {
919+ let $l = index_N_COINS
920+ let $s = size($l)
921+ let $acc0 = $Tuple2(nil, nil)
922+ func $f0_1 ($a,$i) = if (($i >= $s))
923+ then $a
924+ else fold($a, $l[$i])
925+
926+ func $f0_2 ($a,$i) = if (($i >= $s))
927+ then $a
928+ else throw("List size exceeds 10")
929+
930+ $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)
931+ }
932+ let transfers = $t02172921808._1
933+ let final_balances = $t02172921808._2
934+ (transfers ++ [StringEntry("balances", makeString(list_itos(final_balances), ",")), Burn(token, amount)])
906935 }
907-
908- let $t02161521694 = {
909- let $l = index_N_COINS
910- let $s = size($l)
911- let $acc0 = $Tuple2(nil, nil)
912- func $f0_1 ($a,$i) = if (($i >= $s))
913- then $a
914- else fold($a, $l[$i])
915-
916- func $f0_2 ($a,$i) = if (($i >= $s))
917- then $a
918- else throw("List size exceeds 10")
919-
920- $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)
921- }
922- let transfers = $t02161521694._1
923- let final_balances = $t02161521694._2
924- (transfers ++ [StringEntry("balances", makeString(list_itos(final_balances), ",")), Burn(token, amount)])
925- }
926- }
927- }
936+ }
937+ }
928938
929939
930940
946956 then throw("unknown token")
947957 else {
948958 let _token_amount = payment.amount
949- let $t02241822485 = _calc_withdraw_one_coin(_token_amount, i)
950- let dy = $t02241822485._1
951- let dy_fee = $t02241822485._2
952- let D = $t02241822485._3
959+ let $t02253222599 = _calc_withdraw_one_coin(_token_amount, i)
960+ let dy = $t02253222599._1
961+ let dy_fee = $t02253222599._2
962+ let D = $t02253222599._3
953963 if (assert((dy >= min_amount)))
954964 then throw("not enough coins removed")
955965 else {
10221032
10231033 $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)
10241034 }
1025- let $t02396324049 = _calc_token_amount(new_balances)
1026- let final_balances = $t02396324049._1
1027- let mint_amount = $t02396324049._2
1028- let fees_actions = $t02396324049._3
1035+ let $t02407724163 = _calc_token_amount(new_balances)
1036+ let final_balances = $t02407724163._1
1037+ let mint_amount = $t02407724163._2
1038+ let fees_actions = $t02407724163._3
10291039 $Tuple2(nil, mint_amount)
10301040 }
10311041 }
12101220
12111221
12121222 @Callable(msg)
1223+func serialize () = if ((msg.caller != this))
1224+ then throw("self only")
1225+ else {
1226+ let id = toBase58String(msg.transactionId)
1227+ if ((getString(this, "serialized") == id))
1228+ then throw("already serialized")
1229+ else [StringEntry("serialized", id)]
1230+ }
1231+
1232+
1233+
1234+@Callable(msg)
12131235 func set_height_address (_heightAddress) = if ((msg.caller != owner))
12141236 then throw("only owner")
12151237 else [StringEntry("heightAddress", checkAddress(_heightAddress))]
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let N_COINS = getIntegerValue(this, "N_COINS")
55
66 let N_COINS_big = toBigInt(N_COINS)
77
88 let N_COINS_MAX = 10
99
1010 let TOKEN_DECIMALS = 6
1111
1212 let TOKEN_RATE = 1000000
1313
1414 let FEE_DENOMINATOR = 10000000000
1515
1616 let PRECISION = 1000000
1717
1818 let DECIMALS = 6
1919
2020 let MAX_ADMIN_FEE = 10000000000
2121
2222 let MAX_FEE = 5000000000
2323
2424 let MAX_A = 1000000
2525
2626 let MAX_A_CHANGE = 10
2727
2828 let ADMIN_ACTIONS_DELAY = ((3 * 86400) / 60)
2929
3030 let MIN_RAMP_TIME = (86400 / 60)
3131
3232 let VP_LOG_PERIOD = 86400000
3333
3434 let VP_PRECISION = 1000000000000
3535
3636 let coins = split(getStringValue(this, "coins"), ",")
3737
3838 let fee = getIntegerValue(this, "fee")
3939
4040 let N_fee_4 = ((fee * N_COINS) / (4 * (N_COINS - 1)))
4141
4242 let admin_fee = getIntegerValue(this, "admin_fee")
4343
4444 let is_auto_fees = getBooleanValue(this, "is_auto_fees")
4545
4646 let owner = addressFromStringValue(getStringValue(this, "owner"))
4747
4848 let token = fromBase58String(getStringValue(this, "token"))
4949
5050 let token_quantity = value(assetInfo(token)).quantity
5151
5252 let initial_A = getIntegerValue(this, "initial_A")
5353
5454 let future_A = getIntegerValue(this, "future_A")
5555
5656 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
5757
5858 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
5959
6060 let admin_actions_deadline = valueOrElse(getInteger(this, "admin_actions_deadline"), 0)
6161
6262 let transfer_ownership_deadline = valueOrElse(getInteger(this, "transfer_ownership_deadline"), 0)
6363
6464 let future_fee = getIntegerValue(this, "future_fee")
6565
6666 let future_admin_fee = getIntegerValue(this, "future_admin_fee")
6767
6868 let future_owner = getStringValue(this, "future_owner")
6969
7070 let is_killed = getBooleanValue(this, "is_killed")
7171
7272 let kill_deadline = getIntegerValue(this, "kill_deadline")
7373
7474 let KILL_DEADLINE_DT = (((2 * 30) * 86400) / 60)
7575
7676 let big0 = toBigInt(0)
7777
7878 let big1 = toBigInt(1)
7979
8080 let big2 = toBigInt(2)
8181
8282 let heightAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, "heightAddress"), "no settings defined")), "bad settings address")
8383
8484 let HEIGHT = height
8585
8686 let block_timestamp = HEIGHT
8787
8888 func allowed (caller) = (owner == caller)
89+
90+
91+func serialized () = {
92+ let serialize = invoke(this, "serialize", nil, nil)
93+ if ((serialize == serialize))
94+ then true
95+ else throw("Strict value is not equal to itself.")
96+ }
8997
9098
9199 func assert (a) = if (a)
92100 then false
93101 else true
94102
95103
96104 func list_itos (list) = if ((size(list) > N_COINS_MAX))
97105 then throw("list_itos: list.size() > N_COINS_MAX")
98106 else {
99107 func fold (acc,val) = (acc :+ toString(val))
100108
101109 let $l = list
102110 let $s = size($l)
103111 let $acc0 = nil
104112 func $f0_1 ($a,$i) = if (($i >= $s))
105113 then $a
106114 else fold($a, $l[$i])
107115
108116 func $f0_2 ($a,$i) = if (($i >= $s))
109117 then $a
110118 else throw("List size exceeds 10")
111119
112120 $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)
113121 }
114122
115123
116124 func list_stoi (list) = if ((size(list) > N_COINS_MAX))
117125 then throw("list_stoi: list.size() > N_COINS_MAX")
118126 else {
119127 func fold (acc,val) = (acc :+ parseIntValue(val))
120128
121129 let $l = list
122130 let $s = size($l)
123131 let $acc0 = nil
124132 func $f0_1 ($a,$i) = if (($i >= $s))
125133 then $a
126134 else fold($a, $l[$i])
127135
128136 func $f0_2 ($a,$i) = if (($i >= $s))
129137 then $a
130138 else throw("List size exceeds 10")
131139
132140 $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)
133141 }
134142
135143
136144 let balances = list_stoi(split(getStringValue(this, "balances"), ","))
137145
138146 let rates = list_stoi(split(getStringValue(this, "rates"), ","))
139147
140148 let rates_size = size(rates)
141149
142150 let index_N_COINS_MAX = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
143151
144152 func index_n (n) = if ((n > N_COINS_MAX))
145153 then throw("index_n: n > N_COINS_MAX")
146154 else {
147155 func fold (acc,index) = if ((n > index))
148156 then (acc :+ index)
149157 else acc
150158
151159 let $l = index_N_COINS_MAX
152160 let $s = size($l)
153161 let $acc0 = nil
154162 func $f0_1 ($a,$i) = if (($i >= $s))
155163 then $a
156164 else fold($a, $l[$i])
157165
158166 func $f0_2 ($a,$i) = if (($i >= $s))
159167 then $a
160168 else throw("List size exceeds 10")
161169
162170 $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)
163171 }
164172
165173
166174 let index_N_COINS = index_n(N_COINS)
167175
168176 let index_N_COINS_1 = (index_N_COINS :+ N_COINS)
169177
170178 func big_list (list) = if ((size(list) != N_COINS))
171179 then throw("big_list: list.size() != N_COINS")
172180 else {
173181 func fold (acc,index) = (acc :+ toBigInt(fraction(list[index], TOKEN_RATE, rates[index])))
174182
175183 let $l = index_N_COINS
176184 let $s = size($l)
177185 let $acc0 = nil
178186 func $f0_1 ($a,$i) = if (($i >= $s))
179187 then $a
180188 else fold($a, $l[$i])
181189
182190 func $f0_2 ($a,$i) = if (($i >= $s))
183191 then $a
184192 else throw("List size exceeds 10")
185193
186194 $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)
187195 }
188196
189197
190198 func coin_index (payment) = match payment.assetId {
191199 case assetId: ByteVector =>
192200 valueOrErrorMessage(indexOf(coins, toBase58String(assetId)), (toBase58String(assetId) + " out of pool"))
193201 case _ =>
194202 throw("unsupported assetId")
195203 }
196204
197205
198206 func admin_balance (i) = if (if ((0 > i))
199207 then true
200208 else (i > N_COINS))
201209 then throw("i out of index")
202210 else (assetBalance(this, fromBase58String(coins[i])) - balances[i])
203211
204212
205213 func checkAddress (a58) = {
206214 let a = addressFromStringValue(a58)
207215 toString(a)
208216 }
209217
210218
211219 let amp = {
212220 let t1 = future_A_time
213221 let A1 = future_A
214222 if ((t1 > block_timestamp))
215223 then {
216224 let A0 = initial_A
217225 let t0 = initial_A_time
218226 if ((A1 > A0))
219227 then (A0 + (((A1 - A0) * (block_timestamp - t0)) / (t1 - t0)))
220228 else (A0 - (((A0 - A1) * (block_timestamp - t0)) / (t1 - t0)))
221229 }
222230 else A1
223231 }
224232
225233 func list_sum (list) = {
226234 func fold (acc,val) = (acc + val)
227235
228236 let $l = list
229237 let $s = size($l)
230238 let $acc0 = big0
231239 func $f0_1 ($a,$i) = if (($i >= $s))
232240 then $a
233241 else fold($a, $l[$i])
234242
235243 func $f0_2 ($a,$i) = if (($i >= $s))
236244 then $a
237245 else throw("List size exceeds 10")
238246
239247 $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)
240248 }
241249
242250
243251 func list_mult (list) = {
244252 func fold (acc,val) = fraction(fraction(acc, val, big1), N_COINS_big, big1)
245253
246254 let $l = list
247255 let $s = size($l)
248256 let $acc0 = big1
249257 func $f0_1 ($a,$i) = if (($i >= $s))
250258 then $a
251259 else fold($a, $l[$i])
252260
253261 func $f0_2 ($a,$i) = if (($i >= $s))
254262 then $a
255263 else throw("List size exceeds 10")
256264
257265 $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)
258266 }
259267
260268
261269 let list16 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
262270
263271 func get_D (xp,amp) = {
264272 let S = list_sum(xp)
265273 if ((toInt(S) == 0))
266274 then 0
267275 else {
268276 let Ann = (amp * N_COINS)
269277 let AnnS = fraction(toBigInt(Ann), S, big1)
270278 let Ann1 = toBigInt((Ann - 1))
271279 let xd = list_mult(xp)
272280 let N_COINS_1 = (N_COINS + 1)
273281 let N_COINS_1_big = toBigInt(N_COINS_1)
274282 func D_mult (val) = {
275283 func fold (acc,index) = fraction(acc, val, big1)
276284
277285 let $l = index_N_COINS_1
278286 let $s = size($l)
279287 let $acc0 = big1
280288 func $f0_1 ($a,$i) = if (($i >= $s))
281289 then $a
282290 else fold($a, $l[$i])
283291
284292 func $f0_2 ($a,$i) = if (($i >= $s))
285293 then $a
286294 else throw("List size exceeds 11")
287295
288296 $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)
289297 }
290298
291299 func D_proc (acc,unused) = if ((acc._2 == true))
292300 then acc
293301 else {
294302 let Dprev = acc._1
295303 let D_P = fraction(D_mult(Dprev), big1, xd)
296304 let D = fraction((AnnS + fraction(N_COINS_big, D_P, big1)), Dprev, (fraction(Ann1, Dprev, big1) + fraction(N_COINS_1_big, D_P, big1)))
297305 if ((D > Dprev))
298306 then if ((1 >= toInt((D - Dprev))))
299307 then $Tuple2(D, true)
300308 else $Tuple2(D, false)
301309 else if ((1 >= toInt((Dprev - D))))
302310 then $Tuple2(D, true)
303311 else $Tuple2(D, false)
304312 }
305313
306- let $t061556217 = {
314+ let $t062486310 = {
307315 let $l = list16
308316 let $s = size($l)
309317 let $acc0 = $Tuple2(S, false)
310318 func $f0_1 ($a,$i) = if (($i >= $s))
311319 then $a
312320 else D_proc($a, $l[$i])
313321
314322 func $f0_2 ($a,$i) = if (($i >= $s))
315323 then $a
316324 else throw("List size exceeds 16")
317325
318326 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
319327 }
320- let D = $t061556217._1
321- let finished = $t061556217._2
328+ let D = $t062486310._1
329+ let finished = $t062486310._2
322330 if ((finished == false))
323331 then throw(("D_proc() not finished with " + toString(D)))
324332 else toInt(D)
325333 }
326334 }
327335
328336
329337 func get_y (i,j,x,xp) = if (assert((i != j)))
330338 then throw("same coin")
331339 else if (assert(if ((j >= 0))
332340 then (i >= 0)
333341 else false))
334342 then throw("below zero")
335343 else if (assert(if ((N_COINS > j))
336344 then (N_COINS > i)
337345 else false))
338346 then throw("above N_COINS")
339347 else {
340348 let D = get_D(xp, amp)
341349 let D_big = toBigInt(D)
342350 let Ann_big = toBigInt((amp * N_COINS))
343351 func S_c (acc,index) = {
344- let $t068106829 = acc
345- let S_ = $t068106829._1
346- let c = $t068106829._2
352+ let $t069036922 = acc
353+ let S_ = $t069036922._1
354+ let c = $t069036922._2
347355 let x_ = if ((index == i))
348356 then toBigInt(fraction(x, TOKEN_RATE, rates[index]))
349357 else xp[index]
350358 if ((index != j))
351359 then $Tuple2((S_ + x_), fraction(c, D_big, fraction(x_, N_COINS_big, big1)))
352360 else $Tuple2(S_, c)
353361 }
354362
355- let $t071057169 = {
363+ let $t071987262 = {
356364 let $l = index_N_COINS
357365 let $s = size($l)
358366 let $acc0 = $Tuple2(big0, D_big)
359367 func $f0_1 ($a,$i) = if (($i >= $s))
360368 then $a
361369 else S_c($a, $l[$i])
362370
363371 func $f0_2 ($a,$i) = if (($i >= $s))
364372 then $a
365373 else throw("List size exceeds 10")
366374
367375 $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)
368376 }
369- let S_ = $t071057169._1
370- let c_ = $t071057169._2
377+ let S_ = $t071987262._1
378+ let c_ = $t071987262._2
371379 let c = fraction(c_, D_big, fraction(Ann_big, N_COINS_big, big1))
372380 let bD = ((S_ + fraction(D_big, big1, Ann_big)) - D_big)
373381 func y_proc (acc,unused) = if ((acc._2 == true))
374382 then acc
375383 else {
376384 let y_prev = acc._1
377385 let y = fraction((fraction(y_prev, y_prev, big1) + c), big1, (fraction(big2, y_prev, big1) + bD))
378386 if ((y > y_prev))
379387 then if ((1 >= toInt((y - y_prev))))
380388 then $Tuple2(y, true)
381389 else $Tuple2(y, false)
382390 else if ((1 >= toInt((y_prev - y))))
383391 then $Tuple2(y, true)
384392 else $Tuple2(y, false)
385393 }
386394
387- let $t077497815 = {
395+ let $t078427908 = {
388396 let $l = list16
389397 let $s = size($l)
390398 let $acc0 = $Tuple2(D_big, false)
391399 func $f1_1 ($a,$i) = if (($i >= $s))
392400 then $a
393401 else y_proc($a, $l[$i])
394402
395403 func $f1_2 ($a,$i) = if (($i >= $s))
396404 then $a
397405 else throw("List size exceeds 16")
398406
399407 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
400408 }
401- let y = $t077497815._1
402- let finished = $t077497815._2
409+ let y = $t078427908._1
410+ let finished = $t078427908._2
403411 if ((finished == false))
404412 then throw(("y_proc() not finished with " + toString(y)))
405413 else $Tuple2(fraction(toInt(y), rates[j], TOKEN_RATE), D)
406414 }
407415
408416
409417 func get_y_D (amp,i,xp,D) = if (assert((i >= 0)))
410418 then throw("i below zero")
411419 else if (assert((N_COINS > i)))
412420 then throw("i above N_COINS")
413421 else {
414422 let D_big = toBigInt(D)
415423 let Ann_big = toBigInt((amp * N_COINS))
416424 func S_c (acc,index) = {
417- let $t083208339 = acc
418- let S_ = $t083208339._1
419- let c = $t083208339._2
425+ let $t084138432 = acc
426+ let S_ = $t084138432._1
427+ let c = $t084138432._2
420428 let x_ = if ((index == i))
421429 then big0
422430 else xp[index]
423431 if ((index != i))
424432 then $Tuple2((S_ + x_), fraction(c, D_big, fraction(x_, N_COINS_big, big1)))
425433 else $Tuple2(S_, c)
426434 }
427435
428- let $t085698633 = {
436+ let $t086628726 = {
429437 let $l = index_N_COINS
430438 let $s = size($l)
431439 let $acc0 = $Tuple2(big0, D_big)
432440 func $f0_1 ($a,$i) = if (($i >= $s))
433441 then $a
434442 else S_c($a, $l[$i])
435443
436444 func $f0_2 ($a,$i) = if (($i >= $s))
437445 then $a
438446 else throw("List size exceeds 10")
439447
440448 $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)
441449 }
442- let S_ = $t085698633._1
443- let c_ = $t085698633._2
450+ let S_ = $t086628726._1
451+ let c_ = $t086628726._2
444452 let c = fraction(c_, D_big, fraction(Ann_big, N_COINS_big, big1))
445453 let bD = ((S_ + fraction(D_big, big1, Ann_big)) - D_big)
446454 func y_proc (acc,unused) = if ((acc._2 == true))
447455 then acc
448456 else {
449457 let y_prev = acc._1
450458 let y = fraction((fraction(y_prev, y_prev, big1) + c), big1, (fraction(big2, y_prev, big1) + bD))
451459 if ((y > y_prev))
452460 then if ((1 >= toInt((y - y_prev))))
453461 then $Tuple2(y, true)
454462 else $Tuple2(y, false)
455463 else if ((1 >= toInt((y_prev - y))))
456464 then $Tuple2(y, true)
457465 else $Tuple2(y, false)
458466 }
459467
460- let $t092139279 = {
468+ let $t093069372 = {
461469 let $l = list16
462470 let $s = size($l)
463471 let $acc0 = $Tuple2(D_big, false)
464472 func $f1_1 ($a,$i) = if (($i >= $s))
465473 then $a
466474 else y_proc($a, $l[$i])
467475
468476 func $f1_2 ($a,$i) = if (($i >= $s))
469477 then $a
470478 else throw("List size exceeds 16")
471479
472480 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
473481 }
474- let y = $t092139279._1
475- let finished = $t092139279._2
482+ let y = $t093069372._1
483+ let finished = $t093069372._2
476484 if ((finished == false))
477485 then throw(("y_proc() not finished with " + toString(y)))
478486 else fraction(toInt(y), rates[i], TOKEN_RATE)
479487 }
480488
481489
482490 func _calc_withdraw_one_coin (_token_amount,i) = {
483491 let xp = big_list(balances)
484492 let D0 = get_D(xp, amp)
485493 let D1 = (D0 - fraction(_token_amount, D0, token_quantity))
486494 let new_y = get_y_D(amp, i, xp, D1)
487495 let dy_0 = (balances[i] - new_y)
488496 func fold (acc,index) = {
489497 let xp_j = balances[index]
490498 let dx_expected = if ((index == i))
491499 then (fraction(xp_j, D1, D0) - new_y)
492500 else (xp_j - fraction(xp_j, D1, D0))
493501 (acc :+ (xp_j - fraction(N_fee_4, dx_expected, FEE_DENOMINATOR)))
494502 }
495503
496504 let xp_reduced = {
497505 let $l = index_N_COINS
498506 let $s = size($l)
499507 let $acc0 = nil
500508 func $f0_1 ($a,$i) = if (($i >= $s))
501509 then $a
502510 else fold($a, $l[$i])
503511
504512 func $f0_2 ($a,$i) = if (($i >= $s))
505513 then $a
506514 else throw("List size exceeds 10")
507515
508516 $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)
509517 }
510518 let xp_reduced_i = xp_reduced[i]
511519 let dy = ((xp_reduced_i - get_y_D(amp, i, big_list(xp_reduced), D1)) - 1)
512520 $Tuple3(dy, (dy_0 - dy), D0)
513521 }
514522
515523
516524 func virtual_price (D) = fraction(D, VP_PRECISION, token_quantity)
517525
518526
519527 func log_data (D,add) = {
520528 let total_vol = (parseBigIntValue(valueOrElse(getString("vol"), "0")) + toBigInt(add))
521529 let total_vol_string = toString(total_vol)
522530 ([StringEntry("vol", total_vol_string)] ++ {
523531 let log_period = toString((lastBlock.timestamp / VP_LOG_PERIOD))
524532 let log_key = ("log_" + log_period)
525533 if (isDefined(getString(log_key)))
526534 then nil
527535 else [StringEntry(log_key, ((((toString(virtual_price(D)) + "_") + total_vol_string) + "_") + toString(lastBlock.timestamp)))]
528536 })
529537 }
530538
531539
532540 func get_nearest_log (period) = {
533541 func fold (log_value,step) = if ((log_value != ""))
534542 then log_value
535543 else {
536544 let log_key = ("log_" + toString((period - step)))
537545 valueOrElse(getString(log_key), "")
538546 }
539547
540548 let list30p = [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]
541549 let list30m = [-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]
542550 let value30p = {
543551 let $l = list30p
544552 let $s = size($l)
545553 let $acc0 = ""
546554 func $f0_1 ($a,$i) = if (($i >= $s))
547555 then $a
548556 else fold($a, $l[$i])
549557
550558 func $f0_2 ($a,$i) = if (($i >= $s))
551559 then $a
552560 else throw("List size exceeds 30")
553561
554562 $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($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)
555563 }
556564 if ((value30p != ""))
557565 then value30p
558566 else {
559567 let $l = list30m
560568 let $s = size($l)
561569 let $acc0 = ""
562570 func $f1_1 ($a,$i) = if (($i >= $s))
563571 then $a
564572 else fold($a, $l[$i])
565573
566574 func $f1_2 ($a,$i) = if (($i >= $s))
567575 then $a
568576 else throw("List size exceeds 30")
569577
570578 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_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)
571579 }
572580 }
573581
574582
575583 func get_virtual_price_diff (_t0) = {
576584 let vp1 = virtual_price(get_D(big_list(balances), amp))
577585 let vp1_timestamp = lastBlock.timestamp
578586 let t0 = if ((0 >= _t0))
579587 then (vp1_timestamp + _t0)
580588 else _t0
581589 let t0_period = (t0 / VP_LOG_PERIOD)
582590 let log_value = get_nearest_log(t0_period)
583591 if ((log_value == ""))
584592 then $Tuple3(vp1, vp1, 0)
585593 else {
586594 let log_list = split(log_value, "_")
587595 let vp0 = parseIntValue(log_list[0])
588596 let vp0_timestamp = parseIntValue(log_list[2])
589597 $Tuple3(vp1, vp0, (vp1_timestamp - vp0_timestamp))
590598 }
591599 }
592600
593601
594602 func get_volume_diff (_t0) = {
595603 let vol1 = parseBigIntValue(valueOrElse(getString("vol"), "0"))
596604 let vol1_timestamp = lastBlock.timestamp
597605 let t0 = if ((0 >= _t0))
598606 then (vol1_timestamp + _t0)
599607 else _t0
600608 let t0_period = (t0 / VP_LOG_PERIOD)
601609 let log_value = get_nearest_log(t0_period)
602610 if ((log_value == ""))
603611 then $Tuple3(vol1, vol1, 0)
604612 else {
605613 let log_list = split(log_value, "_")
606614 let vol0 = parseBigIntValue(log_list[1])
607615 let vol0_timestamp = parseIntValue(log_list[2])
608616 $Tuple3(vol1, vol0, (vol1_timestamp - vol0_timestamp))
609617 }
610618 }
611619
612620
613621 func _calc_token_amount (new_balances) = {
614622 let D0 = if ((token_quantity == 0))
615623 then 0
616624 else get_D(big_list(balances), amp)
617625 let D1 = get_D(big_list(new_balances), amp)
618626 if (assert((D1 > D0)))
619627 then throw("D1 > D0")
620628 else {
621- let $t01295914909 = if ((token_quantity > 0))
629+ let $t01305215002 = if ((token_quantity > 0))
622630 then {
623631 func fee_balances (old,new) = {
624632 func fold (acc,index) = {
625633 let old_balance = old[index]
626634 let new_balance = new[index]
627635 let ideal_balance = fraction(D1, old_balance, D0)
628636 let difference = if ((ideal_balance > new_balance))
629637 then (ideal_balance - new_balance)
630638 else (new_balance - ideal_balance)
631639 let amount_fee = fraction(N_fee_4, difference, FEE_DENOMINATOR)
632640 let amount_admin_fee = fraction(amount_fee, admin_fee, FEE_DENOMINATOR)
633641 $Tuple4((acc._1 :+ (new_balance - amount_admin_fee)), (acc._2 :+ (new_balance - amount_fee)), if (if (is_auto_fees)
634642 then (amount_admin_fee > 0)
635643 else false)
636644 then (acc._3 :+ ScriptTransfer(owner, amount_admin_fee, fromBase58String(coins[index])))
637645 else acc._3, (acc._4 + fraction(amount_fee, TOKEN_RATE, rates[index])))
638646 }
639647
640648 let $l = index_N_COINS
641649 let $s = size($l)
642650 let $acc0 = $Tuple4(nil, nil, nil, 0)
643651 func $f0_1 ($a,$i) = if (($i >= $s))
644652 then $a
645653 else fold($a, $l[$i])
646654
647655 func $f0_2 ($a,$i) = if (($i >= $s))
648656 then $a
649657 else throw("List size exceeds 10")
650658
651659 $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)
652660 }
653661
654- let $t01443314515 = fee_balances(balances, new_balances)
655- let finals = $t01443314515._1
656- let no_fees = $t01443314515._2
657- let actions = $t01443314515._3
658- let fee_sum = $t01443314515._4
662+ let $t01452614608 = fee_balances(balances, new_balances)
663+ let finals = $t01452614608._1
664+ let no_fees = $t01452614608._2
665+ let actions = $t01452614608._3
666+ let fee_sum = $t01452614608._4
659667 $Tuple3(finals, get_D(big_list(no_fees), amp), (actions ++ log_data(D0, if ((fee == 0))
660668 then 0
661669 else fraction(fee_sum, FEE_DENOMINATOR, fee))))
662670 }
663671 else $Tuple3(new_balances, D1, nil)
664- let final_balances = $t01295914909._1
665- let D2 = $t01295914909._2
666- let fees_actions = $t01295914909._3
672+ let final_balances = $t01305215002._1
673+ let D2 = $t01305215002._2
674+ let fees_actions = $t01305215002._3
667675 let mint_amount = if ((token_quantity == 0))
668676 then D1
669677 else fraction(token_quantity, (D2 - D0), D0)
670678 $Tuple3(final_balances, mint_amount, fees_actions)
671679 }
672680 }
673681
674682
675683 @Callable(msg)
676684 func init (_owner,_coins,_pool_token,_A,_fee,_admin_fee) = if (isDefined(getString(this, "token")))
677685 then throw("already initialized")
678686 else if ((msg.caller != this))
679687 then throw("self initialization only")
680688 else {
681689 let coins_list = split(_coins, ",")
682690 let n = size(coins_list)
683691 if ((2 > n))
684692 then throw("too small coins")
685693 else if ((n > N_COINS_MAX))
686694 then throw("too many coins")
687695 else {
688696 func duplicates (acc,index) = if (if ((index >= n))
689697 then true
690698 else (acc == false))
691699 then acc
692700 else (indexOf(coins_list, coins_list[index]) == index)
693701
694702 if ((false == {
695703 let $l = index_N_COINS_MAX
696704 let $s = size($l)
697705 let $acc0 = true
698706 func $f0_1 ($a,$i) = if (($i >= $s))
699707 then $a
700708 else duplicates($a, $l[$i])
701709
702710 func $f0_2 ($a,$i) = if (($i >= $s))
703711 then $a
704712 else throw("List size exceeds 10")
705713
706714 $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)
707715 }))
708716 then throw("duplicate coin detected")
709717 else {
710718 func decimals (coin) = valueOrErrorMessage(assetInfo(valueOrErrorMessage(fromBase58String(coin), ("fromBase58String: " + coin))), ("assetInfo: " + coin)).decimals
711719
712720 func fold (acc,coin) = $Tuple3((acc._1 + 1), (acc._2 :+ 0), (acc._3 :+ pow(10, 0, decimals(coin), 0, 0, DOWN)))
713721
714- let $t01617016265 = {
722+ let $t01626316358 = {
715723 let $l = coins_list
716724 let $s = size($l)
717725 let $acc0 = $Tuple3(0, nil, nil)
718726 func $f0_1 ($a,$i) = if (($i >= $s))
719727 then $a
720728 else fold($a, $l[$i])
721729
722730 func $f0_2 ($a,$i) = if (($i >= $s))
723731 then $a
724732 else throw("List size exceeds 10")
725733
726734 $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)
727735 }
728- let _N_COINS = $t01617016265._1
729- let zeros = $t01617016265._2
730- let _rates = $t01617016265._3
736+ let _N_COINS = $t01626316358._1
737+ let zeros = $t01626316358._2
738+ let _rates = $t01626316358._3
731739 let issueToken = Issue(_pool_token, ("LP token for " + _coins), 0, TOKEN_DECIMALS, true)
732740 let tokenId = toBase58String(calculateAssetId(issueToken))
733741 [StringEntry("coins", _coins), StringEntry("rates", makeString(list_itos(_rates), ",")), StringEntry("balances", makeString(list_itos(zeros), ",")), IntegerEntry("N_COINS", _N_COINS), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry("fee", _fee), IntegerEntry("admin_fee", _admin_fee), StringEntry("owner", checkAddress(_owner)), IntegerEntry("kill_deadline", (height + KILL_DEADLINE_DT)), StringEntry("token", tokenId), BooleanEntry("is_killed", false), BooleanEntry("is_auto_fees", true), issueToken]
734742 }
735743 }
736744 }
737745
738746
739747
740748 @Callable(msg)
741-func add_liquidity (min_mint_amount) = if (!(allowed(msg.caller)))
742- then throw("!allowed")
749+func add_liquidity (min_mint_amount) = if (!(serialized()))
750+ then throw()
743751 else if (assert(!(is_killed)))
744752 then throw("is killed")
745753 else {
746754 func update_1_balance (base,target,amount) = {
747755 func fold (acc,index) = (acc :+ (base[index] + (if ((index == target))
748756 then amount
749757 else 0)))
750758
751759 let $l = index_N_COINS
752760 let $s = size($l)
753761 let $acc0 = nil
754762 func $f0_1 ($a,$i) = if (($i >= $s))
755763 then $a
756764 else fold($a, $l[$i])
757765
758766 func $f0_2 ($a,$i) = if (($i >= $s))
759767 then $a
760768 else throw("List size exceeds 10")
761769
762770 $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)
763771 }
764772
765773 func up_balances (base,payments) = {
766774 let n = size(payments)
767775 if ((1 > n))
768776 then throw("payments size < 1")
769777 else if ((n > N_COINS_MAX))
770778 then throw("payments size > N_COINS_MAX")
771779 else {
772780 func fold (acc,payment) = update_1_balance(acc, coin_index(payment), payment.amount)
773781
774782 let $l = payments
775783 let $s = size($l)
776784 let $acc0 = base
777785 func $f0_1 ($a,$i) = if (($i >= $s))
778786 then $a
779787 else fold($a, $l[$i])
780788
781789 func $f0_2 ($a,$i) = if (($i >= $s))
782790 then $a
783791 else throw("List size exceeds 10")
784792
785793 $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)
786794 }
787795 }
788796
789797 let new_balances = up_balances(balances, msg.payments)
790798 if (if ((token_quantity == 0))
791799 then (min(new_balances) == 0)
792800 else false)
793801 then throw("initial deposit requires all coins")
794802 else {
795- let $t01820918295 = _calc_token_amount(new_balances)
796- let final_balances = $t01820918295._1
797- let mint_amount = $t01820918295._2
798- let fees_actions = $t01820918295._3
803+ let $t01828118367 = _calc_token_amount(new_balances)
804+ let final_balances = $t01828118367._1
805+ let mint_amount = $t01828118367._2
806+ let fees_actions = $t01828118367._3
799807 if (assert((mint_amount >= min_mint_amount)))
800808 then throw("slippage screwed you")
801809 else ([StringEntry("balances", makeString(list_itos(final_balances), ",")), Reissue(token, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, token)] ++ fees_actions)
802810 }
803811 }
804812
805813
806814
807815 @Callable(msg)
808816 func get_dy (i,j,dx) = {
809817 let xp_i = balances[i]
810818 let xp_j = balances[j]
811819 let x = (xp_i + dx)
812- let $t01875518808 = get_y(i, j, x, big_list(balances))
813- let y = $t01875518808._1
814- let D = $t01875518808._2
820+ let $t01882718880 = get_y(i, j, x, big_list(balances))
821+ let y = $t01882718880._1
822+ let D = $t01882718880._2
815823 let _dy = ((xp_j - y) - 1)
816824 let dy_fee = fraction(_dy, fee, FEE_DENOMINATOR)
817825 let dy = (_dy - dy_fee)
818826 $Tuple2(nil, dy)
819827 }
820828
821829
822830
823831 @Callable(msg)
824832 func exchange (j,min_dy) = if (!(allowed(msg.caller)))
825833 then throw("!allowed")
826834 else if (assert(!(is_killed)))
827835 then throw("is killed")
828836 else if ((size(msg.payments) != 1))
829837 then throw("size( payments ) != 1")
830838 else {
831839 let payment = msg.payments[0]
832840 let dx = payment.amount
833841 let i = coin_index(payment)
834842 let xp_i = balances[i]
835843 let xp_j = balances[j]
836844 let x = (xp_i + dx)
837- let $t01937719430 = get_y(i, j, x, big_list(balances))
838- let y = $t01937719430._1
839- let D = $t01937719430._2
845+ let $t01944919502 = get_y(i, j, x, big_list(balances))
846+ let y = $t01944919502._1
847+ let D = $t01944919502._2
840848 let _dy = ((xp_j - y) - 1)
841849 let dy_fee = fraction(_dy, fee, FEE_DENOMINATOR)
842850 let dy = (_dy - dy_fee)
843851 if (assert((dy >= min_dy)))
844852 then throw("exchange resulted in fewer coins than expected")
845853 else {
846854 let dy_admin_fee = fraction(dy_fee, admin_fee, FEE_DENOMINATOR)
847855 func fold (acc,index) = (acc :+ (if ((index == i))
848856 then (balances[index] + dx)
849857 else if ((index == j))
850858 then ((balances[index] - dy) - dy_admin_fee)
851859 else balances[index]))
852860
853861 let final_balances = {
854862 let $l = index_N_COINS
855863 let $s = size($l)
856864 let $acc0 = nil
857865 func $f0_1 ($a,$i) = if (($i >= $s))
858866 then $a
859867 else fold($a, $l[$i])
860868
861869 func $f0_2 ($a,$i) = if (($i >= $s))
862870 then $a
863871 else throw("List size exceeds 10")
864872
865873 $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)
866874 }
867875 let tokenOut = fromBase58String(coins[j])
868876 $Tuple2((([StringEntry("balances", makeString(list_itos(final_balances), ",")), ScriptTransfer(msg.caller, dy, tokenOut)] ++ (if (if (is_auto_fees)
869877 then (dy_admin_fee > 0)
870878 else false)
871879 then [ScriptTransfer(owner, dy_admin_fee, tokenOut)]
872880 else nil)) ++ log_data(D, if ((fee == 0))
873881 then 0
874882 else fraction(fraction(dy_fee, TOKEN_RATE, rates[j]), FEE_DENOMINATOR, fee))), dy)
875883 }
876884 }
877885
878886
879887
880888 @Callable(msg)
881-func remove_liquidity (_min_amounts) = if ((size(msg.payments) != 1))
882- then throw("size( payments ) != 1")
883- else {
884- let payment = msg.payments[0]
885- if ((payment.assetId != token))
886- then throw("unknown token")
887- else {
888- let min_amounts = if ((_min_amounts == "0"))
889- then nil
890- else list_stoi(split(_min_amounts, ","))
891- if (if ((_min_amounts != "0"))
892- then (size(min_amounts) != N_COINS)
893- else false)
894- then throw("min_amounts.size() != N_COINS")
895- else {
896- let amount = payment.amount
897- let caller = msg.caller
898- func fold (acc,index) = {
899- let balance = balances[index]
900- let amount_out = fraction(balance, amount, token_quantity)
901- if (if ((_min_amounts != "0"))
902- then (min_amounts[index] > amount_out)
903- else false)
904- then throw("withdrawal resulted in fewer coins than expected")
905- else $Tuple2((acc._1 :+ ScriptTransfer(caller, amount_out, fromBase58String(coins[index]))), (acc._2 :+ (balance - amount_out)))
889+func remove_liquidity (_min_amounts) = if (!(serialized()))
890+ then throw()
891+ else if ((size(msg.payments) != 1))
892+ then throw("size( payments ) != 1")
893+ else {
894+ let payment = msg.payments[0]
895+ if ((payment.assetId != token))
896+ then throw("unknown token")
897+ else {
898+ let min_amounts = if ((_min_amounts == "0"))
899+ then nil
900+ else list_stoi(split(_min_amounts, ","))
901+ if (if ((_min_amounts != "0"))
902+ then (size(min_amounts) != N_COINS)
903+ else false)
904+ then throw("min_amounts.size() != N_COINS")
905+ else {
906+ let amount = payment.amount
907+ let caller = msg.caller
908+ func fold (acc,index) = {
909+ let balance = balances[index]
910+ let amount_out = fraction(balance, amount, token_quantity)
911+ if (if ((_min_amounts != "0"))
912+ then (min_amounts[index] > amount_out)
913+ else false)
914+ then throw("withdrawal resulted in fewer coins than expected")
915+ else $Tuple2((acc._1 :+ ScriptTransfer(caller, amount_out, fromBase58String(coins[index]))), (acc._2 :+ (balance - amount_out)))
916+ }
917+
918+ let $t02172921808 = {
919+ let $l = index_N_COINS
920+ let $s = size($l)
921+ let $acc0 = $Tuple2(nil, nil)
922+ func $f0_1 ($a,$i) = if (($i >= $s))
923+ then $a
924+ else fold($a, $l[$i])
925+
926+ func $f0_2 ($a,$i) = if (($i >= $s))
927+ then $a
928+ else throw("List size exceeds 10")
929+
930+ $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)
931+ }
932+ let transfers = $t02172921808._1
933+ let final_balances = $t02172921808._2
934+ (transfers ++ [StringEntry("balances", makeString(list_itos(final_balances), ",")), Burn(token, amount)])
906935 }
907-
908- let $t02161521694 = {
909- let $l = index_N_COINS
910- let $s = size($l)
911- let $acc0 = $Tuple2(nil, nil)
912- func $f0_1 ($a,$i) = if (($i >= $s))
913- then $a
914- else fold($a, $l[$i])
915-
916- func $f0_2 ($a,$i) = if (($i >= $s))
917- then $a
918- else throw("List size exceeds 10")
919-
920- $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)
921- }
922- let transfers = $t02161521694._1
923- let final_balances = $t02161521694._2
924- (transfers ++ [StringEntry("balances", makeString(list_itos(final_balances), ",")), Burn(token, amount)])
925- }
926- }
927- }
936+ }
937+ }
928938
929939
930940
931941 @Callable(msg)
932942 func calc_withdraw_one_coin (_token_amount,i) = $Tuple2(nil, _calc_withdraw_one_coin(_token_amount, i)._1)
933943
934944
935945
936946 @Callable(msg)
937947 func remove_liquidity_one_coin (i,min_amount) = if (!(allowed(msg.caller)))
938948 then throw("!allowed")
939949 else if (assert(!(is_killed)))
940950 then throw("is killed")
941951 else if ((size(msg.payments) != 1))
942952 then throw("size( payments ) != 1")
943953 else {
944954 let payment = msg.payments[0]
945955 if ((payment.assetId != token))
946956 then throw("unknown token")
947957 else {
948958 let _token_amount = payment.amount
949- let $t02241822485 = _calc_withdraw_one_coin(_token_amount, i)
950- let dy = $t02241822485._1
951- let dy_fee = $t02241822485._2
952- let D = $t02241822485._3
959+ let $t02253222599 = _calc_withdraw_one_coin(_token_amount, i)
960+ let dy = $t02253222599._1
961+ let dy_fee = $t02253222599._2
962+ let D = $t02253222599._3
953963 if (assert((dy >= min_amount)))
954964 then throw("not enough coins removed")
955965 else {
956966 let dy_admin_fee = fraction(dy_fee, admin_fee, FEE_DENOMINATOR)
957967 let dy_and_fee = (dy + dy_admin_fee)
958968 func fold (acc,index) = (acc :+ (balances[index] - (if ((index == i))
959969 then dy_and_fee
960970 else 0)))
961971
962972 let final_balances = {
963973 let $l = index_N_COINS
964974 let $s = size($l)
965975 let $acc0 = nil
966976 func $f0_1 ($a,$i) = if (($i >= $s))
967977 then $a
968978 else fold($a, $l[$i])
969979
970980 func $f0_2 ($a,$i) = if (($i >= $s))
971981 then $a
972982 else throw("List size exceeds 10")
973983
974984 $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)
975985 }
976986 let tokenOut = fromBase58String(coins[i])
977987 $Tuple2((([StringEntry("balances", makeString(list_itos(final_balances), ",")), ScriptTransfer(msg.caller, dy, tokenOut), Burn(token, _token_amount)] ++ (if (if (is_auto_fees)
978988 then (dy_admin_fee > 0)
979989 else false)
980990 then [ScriptTransfer(owner, dy_admin_fee, tokenOut)]
981991 else nil)) ++ log_data(D, if ((fee == 0))
982992 then 0
983993 else fraction(fraction(dy_fee, TOKEN_RATE, rates[i]), FEE_DENOMINATOR, fee))), dy)
984994 }
985995 }
986996 }
987997
988998
989999
9901000 @Callable(msg)
9911001 func A () = $Tuple2(nil, amp)
9921002
9931003
9941004
9951005 @Callable(msg)
9961006 func get_virtual_price () = {
9971007 let D = get_D(big_list(balances), amp)
9981008 $Tuple2(nil, virtual_price(D))
9991009 }
10001010
10011011
10021012
10031013 @Callable(msg)
10041014 func calc_token_amount (_amounts) = {
10051015 let amounts = list_stoi(split(_amounts, ","))
10061016 if ((size(amounts) != N_COINS))
10071017 then throw("not enought amounts")
10081018 else {
10091019 func fold (acc,index) = (acc :+ (balances[index] + amounts[index]))
10101020
10111021 let new_balances = {
10121022 let $l = index_N_COINS
10131023 let $s = size($l)
10141024 let $acc0 = nil
10151025 func $f0_1 ($a,$i) = if (($i >= $s))
10161026 then $a
10171027 else fold($a, $l[$i])
10181028
10191029 func $f0_2 ($a,$i) = if (($i >= $s))
10201030 then $a
10211031 else throw("List size exceeds 10")
10221032
10231033 $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)
10241034 }
1025- let $t02396324049 = _calc_token_amount(new_balances)
1026- let final_balances = $t02396324049._1
1027- let mint_amount = $t02396324049._2
1028- let fees_actions = $t02396324049._3
1035+ let $t02407724163 = _calc_token_amount(new_balances)
1036+ let final_balances = $t02407724163._1
1037+ let mint_amount = $t02407724163._2
1038+ let fees_actions = $t02407724163._3
10291039 $Tuple2(nil, mint_amount)
10301040 }
10311041 }
10321042
10331043
10341044
10351045 @Callable(msg)
10361046 func ramp_A (_future_A,_future_time) = if (assert((msg.caller == owner)))
10371047 then throw("only owner")
10381048 else if (assert(if ((initial_A_time == 0))
10391049 then true
10401050 else (block_timestamp >= (initial_A_time + MIN_RAMP_TIME))))
10411051 then throw("too often")
10421052 else if (assert((_future_time >= (block_timestamp + MIN_RAMP_TIME))))
10431053 then throw("insufficient time")
10441054 else {
10451055 let _initial_A = amp
10461056 if (assert(if ((_future_A > 0))
10471057 then (MAX_A > _future_A)
10481058 else false))
10491059 then throw("out of base range")
10501060 else if (assert(if (if ((_future_A >= _initial_A))
10511061 then ((_initial_A * MAX_A_CHANGE) >= _future_A)
10521062 else false)
10531063 then true
10541064 else if ((_initial_A > _future_A))
10551065 then ((_future_A * MAX_A_CHANGE) >= _initial_A)
10561066 else false))
10571067 then throw("out of range")
10581068 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _future_A), IntegerEntry("initial_A_time", block_timestamp), IntegerEntry("future_A_time", _future_time)]
10591069 }
10601070
10611071
10621072
10631073 @Callable(msg)
10641074 func stop_ramp_A () = if (assert((msg.caller == owner)))
10651075 then throw("only owner")
10661076 else {
10671077 let current_A = amp
10681078 [IntegerEntry("initial_A", current_A), IntegerEntry("future_A", current_A), IntegerEntry("initial_A_time", block_timestamp), IntegerEntry("future_A_time", block_timestamp)]
10691079 }
10701080
10711081
10721082
10731083 @Callable(msg)
10741084 func commit_new_fee (new_fee,new_admin_fee) = if (assert((msg.caller == owner)))
10751085 then throw("only owner")
10761086 else if (assert((admin_actions_deadline == 0)))
10771087 then throw("active action")
10781088 else if (assert((MAX_FEE >= new_fee)))
10791089 then throw("fee exceeds maximum")
10801090 else if (assert((MAX_ADMIN_FEE >= new_admin_fee)))
10811091 then throw("admin fee exceeds maximum")
10821092 else {
10831093 let _deadline = (block_timestamp + ADMIN_ACTIONS_DELAY)
10841094 [IntegerEntry("admin_actions_deadline", _deadline), IntegerEntry("future_fee", new_fee), IntegerEntry("future_admin_fee", new_admin_fee)]
10851095 }
10861096
10871097
10881098
10891099 @Callable(msg)
10901100 func apply_new_fee () = if (assert((msg.caller == owner)))
10911101 then throw("only owner")
10921102 else if (assert((block_timestamp >= admin_actions_deadline)))
10931103 then throw("insufficient time")
10941104 else if (assert((admin_actions_deadline != 0)))
10951105 then throw("no active action")
10961106 else [IntegerEntry("admin_actions_deadline", 0), IntegerEntry("fee", future_fee), IntegerEntry("admin_fee", future_admin_fee)]
10971107
10981108
10991109
11001110 @Callable(msg)
11011111 func revert_new_parameters () = if (assert((msg.caller == owner)))
11021112 then throw("only owner")
11031113 else [IntegerEntry("admin_actions_deadline", 0)]
11041114
11051115
11061116
11071117 @Callable(msg)
11081118 func commit_transfer_ownership (_owner) = if (assert((msg.caller == owner)))
11091119 then throw("only owner")
11101120 else if (assert((transfer_ownership_deadline == 0)))
11111121 then throw("active transfer")
11121122 else {
11131123 let _deadline = (block_timestamp + ADMIN_ACTIONS_DELAY)
11141124 [IntegerEntry("transfer_ownership_deadline", _deadline), StringEntry("future_owner", checkAddress(_owner))]
11151125 }
11161126
11171127
11181128
11191129 @Callable(msg)
11201130 func apply_transfer_ownership () = if (assert((msg.caller == owner)))
11211131 then throw("only owner")
11221132 else if (assert((block_timestamp >= transfer_ownership_deadline)))
11231133 then throw("insufficient time")
11241134 else if (assert((transfer_ownership_deadline != 0)))
11251135 then throw("no active transfer")
11261136 else [IntegerEntry("transfer_ownership_deadline", 0), StringEntry("owner", future_owner)]
11271137
11281138
11291139
11301140 @Callable(msg)
11311141 func revert_transfer_ownership () = if (assert((msg.caller == owner)))
11321142 then throw("only owner")
11331143 else [IntegerEntry("transfer_ownership_deadline", 0)]
11341144
11351145
11361146
11371147 @Callable(msg)
11381148 func admin_balances (i) = $Tuple2(nil, admin_balance(i))
11391149
11401150
11411151
11421152 @Callable(msg)
11431153 func withdraw_admin_fees () = if (assert((msg.caller == owner)))
11441154 then throw("only owner")
11451155 else {
11461156 func fold (acc,index) = (acc :+ ScriptTransfer(owner, admin_balance(index), fromBase58String(coins[index])))
11471157
11481158 let $l = index_N_COINS
11491159 let $s = size($l)
11501160 let $acc0 = nil
11511161 func $f0_1 ($a,$i) = if (($i >= $s))
11521162 then $a
11531163 else fold($a, $l[$i])
11541164
11551165 func $f0_2 ($a,$i) = if (($i >= $s))
11561166 then $a
11571167 else throw("List size exceeds 10")
11581168
11591169 $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)
11601170 }
11611171
11621172
11631173
11641174 @Callable(msg)
11651175 func donate_admin_fees () = if (assert((msg.caller == owner)))
11661176 then throw("only owner")
11671177 else {
11681178 func fold (acc,index) = (acc :+ (balances[index] + admin_balance(index)))
11691179
11701180 let new_balances = {
11711181 let $l = index_N_COINS
11721182 let $s = size($l)
11731183 let $acc0 = nil
11741184 func $f0_1 ($a,$i) = if (($i >= $s))
11751185 then $a
11761186 else fold($a, $l[$i])
11771187
11781188 func $f0_2 ($a,$i) = if (($i >= $s))
11791189 then $a
11801190 else throw("List size exceeds 10")
11811191
11821192 $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)
11831193 }
11841194 [StringEntry("balances", makeString(list_itos(new_balances), ","))]
11851195 }
11861196
11871197
11881198
11891199 @Callable(msg)
11901200 func set_auto_fees (_is_auto_fees) = if (assert((msg.caller == owner)))
11911201 then throw("only owner")
11921202 else [BooleanEntry("is_auto_fees", _is_auto_fees)]
11931203
11941204
11951205
11961206 @Callable(msg)
11971207 func kill_me () = if (assert((msg.caller == owner)))
11981208 then throw("only owner")
11991209 else if (assert((kill_deadline > block_timestamp)))
12001210 then throw("deadline has passed")
12011211 else [BooleanEntry("is_killed", true)]
12021212
12031213
12041214
12051215 @Callable(msg)
12061216 func unkill_me () = if (assert((msg.caller == owner)))
12071217 then throw("only owner")
12081218 else [BooleanEntry("is_killed", false)]
12091219
12101220
12111221
12121222 @Callable(msg)
1223+func serialize () = if ((msg.caller != this))
1224+ then throw("self only")
1225+ else {
1226+ let id = toBase58String(msg.transactionId)
1227+ if ((getString(this, "serialized") == id))
1228+ then throw("already serialized")
1229+ else [StringEntry("serialized", id)]
1230+ }
1231+
1232+
1233+
1234+@Callable(msg)
12131235 func set_height_address (_heightAddress) = if ((msg.caller != owner))
12141236 then throw("only owner")
12151237 else [StringEntry("heightAddress", checkAddress(_heightAddress))]
12161238
12171239
12181240
12191241 @Callable(i)
12201242 func set_verifier (verifier) = if ((i.caller != this))
12211243 then throw("self call only")
12221244 else {
12231245 let addressOK = match addressFromString(verifier) {
12241246 case a: Address =>
12251247 true
12261248 case _ =>
12271249 false
12281250 }
12291251 if (!(addressOK))
12301252 then throw(("verifier wrong address " + verifier))
12311253 else if (isDefined(getString(this, "verifier")))
12321254 then throw("verifier already defined")
12331255 else [StringEntry("verifier", verifier)]
12341256 }
12351257
12361258
12371259 @Verifier(tx)
12381260 func verify () = match getString(this, "verifier") {
12391261 case verifier: String =>
12401262 valueOrElse(getBoolean(addressFromStringValue(verifier), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
12411263 case _ =>
12421264 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
12431265 }
12441266

github/deemru/w8io/3ef1775 
148.95 ms