tx · A11yc5TjvDq3vzdyfsLa3NZ2b2qNvncictQsbkErze1R

3P7Job1QorQJYPzEnmBnGaCqtpcB4ohiz5p:  -0.02900000 Waves

2022.12.05 17:39 [3412642] smart account 3P7Job1QorQJYPzEnmBnGaCqtpcB4ohiz5p > SELF 0.00000000 Waves

{ "type": 13, "id": "A11yc5TjvDq3vzdyfsLa3NZ2b2qNvncictQsbkErze1R", "fee": 2900000, "feeAssetId": null, "timestamp": 1670251154157, "version": 1, "sender": "3P7Job1QorQJYPzEnmBnGaCqtpcB4ohiz5p", "senderPublicKey": "9hjWnJ9WvGatiYbxGGQMEnifVHCK6ZmwUbzH8EXcuPYv", "proofs": [ "3744MyJjqzrtoswAZ82MVZWZsyVATjNWY3WjgioV7PqM15957r4PWCcyWje9re2LPueLWi83foLmysxL2hH9MPbZ" ], "script": "base64:BgJvCAISCAoGCAgIAQEBEgMKAQESBQoDAQEBEgQKAgEBEgMKAQgSBAoCAQESBAoCAQESABIAEgMKAQgSBAoCAQESABIECgIBARIAEgASAwoBCBIAEgASAwoBARIAEgASAwoBBBIAEgASAwoBCBIDCgEIRwAHTl9DT0lOUwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIHTl9DT0lOUwALTl9DT0lOU19iaWcJALYCAQUHTl9DT0lOUwALTl9DT0lOU19NQVgACgAOVE9LRU5fREVDSU1BTFMABgAKVE9LRU5fUkFURQDAhD0AD0ZFRV9ERU5PTUlOQVRPUgCAyK+gJQAJUFJFQ0lTSU9OAMCEPQAIREVDSU1BTFMABgANTUFYX0FETUlOX0ZFRQCAyK+gJQAHTUFYX0ZFRQCA5JfQEgAFTUFYX0EAwIQ9AAxNQVhfQV9DSEFOR0UACgATQURNSU5fQUNUSU9OU19ERUxBWQkAaQIJAGgCAAMAgKMFADwADU1JTl9SQU1QX1RJTUUJAGkCAICjBQA8AA1WUF9MT0dfUEVSSU9EAIC4mSkADFZQX1BSRUNJU0lPTgCAoJSljR0ABWNvaW5zCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCBWNvaW5zAgEsAANmZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCA2ZlZQAHTl9mZWVfNAkAaQIJAGgCBQNmZWUFB05fQ09JTlMJAGgCAAQJAGUCBQdOX0NPSU5TAAEACWFkbWluX2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIJYWRtaW5fZmVlAAxpc19hdXRvX2ZlZXMJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBHRoaXMCDGlzX2F1dG9fZmVlcwAFb3duZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCBW93bmVyAAV0b2tlbgkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgV0b2tlbgAOdG9rZW5fcXVhbnRpdHkICQEFdmFsdWUBCQDsBwEFBXRva2VuCHF1YW50aXR5AAlpbml0aWFsX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCWluaXRpYWxfQQAIZnV0dXJlX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCGZ1dHVyZV9BAA5pbml0aWFsX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg5pbml0aWFsX0FfdGltZQAAAA1mdXR1cmVfQV90aW1lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCDWZ1dHVyZV9BX3RpbWUAAAAWYWRtaW5fYWN0aW9uc19kZWFkbGluZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAhZhZG1pbl9hY3Rpb25zX2RlYWRsaW5lAAAAG3RyYW5zZmVyX293bmVyc2hpcF9kZWFkbGluZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAht0cmFuc2Zlcl9vd25lcnNoaXBfZGVhZGxpbmUAAAAKZnV0dXJlX2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIKZnV0dXJlX2ZlZQAQZnV0dXJlX2FkbWluX2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIQZnV0dXJlX2FkbWluX2ZlZQAMZnV0dXJlX293bmVyCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgxmdXR1cmVfb3duZXIACWlzX2tpbGxlZAkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwIJaXNfa2lsbGVkAA1raWxsX2RlYWRsaW5lCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAg1raWxsX2RlYWRsaW5lABBLSUxMX0RFQURMSU5FX0RUCQBpAgkAaAIJAGgCAAIAHgCAowUAPAAEYmlnMAkAtgIBAAAABGJpZzEJALYCAQABAARiaWcyCQC2AgEAAgANaGVpZ2h0QWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzAg1oZWlnaHRBZGRyZXNzAhNubyBzZXR0aW5ncyBkZWZpbmVkAhRiYWQgc2V0dGluZ3MgYWRkcmVzcwAGSEVJR0hUBQZoZWlnaHQAD2Jsb2NrX3RpbWVzdGFtcAUGSEVJR0hUAQdhbGxvd2VkAQZjYWxsZXIJAAACBQVvd25lcgUGY2FsbGVyAQZhc3NlcnQB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APv//////////wEJAMwIAgD6//////////8BCQDMCAIA+f//////////AQkAzAgCAPj//////////wEJAMwIAgD3//////////8BCQDMCAIA9v//////////AQkAzAgCAPX//////////wEJAMwIAgD0//////////8BCQDMCAIA8///////////AQkAzAgCAPL//////////wEJAMwIAgDx//////////8BCQDMCAIA8P//////////AQkAzAgCAO///////////wEJAMwIAgDu//////////8BCQDMCAIA7f//////////AQkAzAgCAOz//////////wEJAMwIAgDr//////////8BCQDMCAIA6v//////////AQkAzAgCAOn//////////wEJAMwIAgDo//////////8BCQDMCAIA5///////////AQkAzAgCAOb//////////wEJAMwIAgDl//////////8BCQDMCAIA5P//////////AQkAzAgCAOP//////////wEJAMwIAgDi//////////8BBQNuaWwECHZhbHVlMzBwCgACJGwFB2xpc3QzMHAKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDMwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAwkBAiE9AgUIdmFsdWUzMHACAAUIdmFsdWUzMHAKAAIkbAUHbGlzdDMwbQoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMzAJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4BFmdldF92aXJ0dWFsX3ByaWNlX2RpZmYBA190MAQDdnAxCQENdmlydHVhbF9wcmljZQEJAQVnZXRfRAIJAQhiaWdfbGlzdAEFCGJhbGFuY2VzBQNhbXAEDXZwMV90aW1lc3RhbXAIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAJ0MAMJAGcCAAAFA190MAkAZAIFDXZwMV90aW1lc3RhbXAFA190MAUDX3QwBAl0MF9wZXJpb2QJAGkCBQJ0MAUNVlBfTE9HX1BFUklPRAQJbG9nX3ZhbHVlCQEPZ2V0X25lYXJlc3RfbG9nAQUJdDBfcGVyaW9kAwkAAAIFCWxvZ192YWx1ZQIACQCVCgMFA3ZwMQUDdnAxAAAECGxvZ19saXN0CQC1CQIFCWxvZ192YWx1ZQIBXwQDdnAwCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIbG9nX2xpc3QAAAQNdnAwX3RpbWVzdGFtcAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGxvZ19saXN0AAIJAJUKAwUDdnAxBQN2cDAJAGUCBQ12cDFfdGltZXN0YW1wBQ12cDBfdGltZXN0YW1wAQ9nZXRfdm9sdW1lX2RpZmYBA190MAQEdm9sMQkApwMBCQELdmFsdWVPckVsc2UCCQCiCAECA3ZvbAIBMAQOdm9sMV90aW1lc3RhbXAIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAJ0MAMJAGcCAAAFA190MAkAZAIFDnZvbDFfdGltZXN0YW1wBQNfdDAFA190MAQJdDBfcGVyaW9kCQBpAgUCdDAFDVZQX0xPR19QRVJJT0QECWxvZ192YWx1ZQkBD2dldF9uZWFyZXN0X2xvZwEFCXQwX3BlcmlvZAMJAAACBQlsb2dfdmFsdWUCAAkAlQoDBQR2b2wxBQR2b2wxAAAECGxvZ19saXN0CQC1CQIFCWxvZ192YWx1ZQIBXwQEdm9sMAkApwMBCQCRAwIFCGxvZ19saXN0AAEEDnZvbDBfdGltZXN0YW1wCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIbG9nX2xpc3QAAgkAlQoDBQR2b2wxBQR2b2wwCQBlAgUOdm9sMV90aW1lc3RhbXAFDnZvbDBfdGltZXN0YW1wARJfY2FsY190b2tlbl9hbW91bnQBDG5ld19iYWxhbmNlcwQCRDADCQAAAgUOdG9rZW5fcXVhbnRpdHkAAAAACQEFZ2V0X0QCCQEIYmlnX2xpc3QBBQhiYWxhbmNlcwUDYW1wBAJEMQkBBWdldF9EAgkBCGJpZ19saXN0AQUMbmV3X2JhbGFuY2VzBQNhbXADCQEGYXNzZXJ0AQkAZgIFAkQxBQJEMAkAAgECB0QxID4gRDAEDSR0MDEyOTU5MTQ5MDkDCQBmAgUOdG9rZW5fcXVhbnRpdHkAAAoBDGZlZV9iYWxhbmNlcwIDb2xkA25ldwoBBGZvbGQCA2FjYwVpbmRleAQLb2xkX2JhbGFuY2UJAJEDAgUDb2xkBQVpbmRleAQLbmV3X2JhbGFuY2UJAJEDAgUDbmV3BQVpbmRleAQNaWRlYWxfYmFsYW5jZQkAawMFAkQxBQtvbGRfYmFsYW5jZQUCRDAECmRpZmZlcmVuY2UDCQBmAgUNaWRlYWxfYmFsYW5jZQULbmV3X2JhbGFuY2UJAGUCBQ1pZGVhbF9iYWxhbmNlBQtuZXdfYmFsYW5jZQkAZQIFC25ld19iYWxhbmNlBQ1pZGVhbF9iYWxhbmNlBAphbW91bnRfZmVlCQBrAwUHTl9mZWVfNAUKZGlmZmVyZW5jZQUPRkVFX0RFTk9NSU5BVE9SBBBhbW91bnRfYWRtaW5fZmVlCQBrAwUKYW1vdW50X2ZlZQUJYWRtaW5fZmVlBQ9GRUVfREVOT01JTkFUT1IJAJYKBAkAzQgCCAUDYWNjAl8xCQBlAgULbmV3X2JhbGFuY2UFEGFtb3VudF9hZG1pbl9mZWUJAM0IAggFA2FjYwJfMgkAZQIFC25ld19iYWxhbmNlBQphbW91bnRfZmVlAwMFDGlzX2F1dG9fZmVlcwkAZgIFEGFtb3VudF9hZG1pbl9mZWUAAAcJAM0IAggFA2FjYwJfMwkBDlNjcmlwdFRyYW5zZmVyAwUFb3duZXIFEGFtb3VudF9hZG1pbl9mZWUJANkEAQkAkQMCBQVjb2lucwUFaW5kZXgIBQNhY2MCXzMJAGQCCAUDYWNjAl80CQBrAwUKYW1vdW50X2ZlZQUKVE9LRU5fUkFURQkAkQMCBQVyYXRlcwUFaW5kZXgKAAIkbAUNaW5kZXhfTl9DT0lOUwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAUDbmlsBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA0kdDAxNDQzMzE0NTE1CQEMZmVlX2JhbGFuY2VzAgUIYmFsYW5jZXMFDG5ld19iYWxhbmNlcwQGZmluYWxzCAUNJHQwMTQ0MzMxNDUxNQJfMQQHbm9fZmVlcwgFDSR0MDE0NDMzMTQ1MTUCXzIEB2FjdGlvbnMIBQ0kdDAxNDQzMzE0NTE1Al8zBAdmZWVfc3VtCAUNJHQwMTQ0MzMxNDUxNQJfNAkAlQoDBQZmaW5hbHMJAQVnZXRfRAIJAQhiaWdfbGlzdAEFB25vX2ZlZXMFA2FtcAkAzggCBQdhY3Rpb25zCQEIbG9nX2RhdGECBQJEMAMJAAACBQNmZWUAAAAACQBrAwUHZmVlX3N1bQUPRkVFX0RFTk9NSU5BVE9SBQNmZWUJAJUKAwUMbmV3X2JhbGFuY2VzBQJEMQUDbmlsBA5maW5hbF9iYWxhbmNlcwgFDSR0MDEyOTU5MTQ5MDkCXzEEAkQyCAUNJHQwMTI5NTkxNDkwOQJfMgQMZmVlc19hY3Rpb25zCAUNJHQwMTI5NTkxNDkwOQJfMwQLbWludF9hbW91bnQDCQAAAgUOdG9rZW5fcXVhbnRpdHkAAAUCRDEJAGsDBQ50b2tlbl9xdWFudGl0eQkAZQIFAkQyBQJEMAUCRDAJAJUKAwUOZmluYWxfYmFsYW5jZXMFC21pbnRfYW1vdW50BQxmZWVzX2FjdGlvbnMaA21zZwEEaW5pdAYGX293bmVyBl9jb2lucwtfcG9vbF90b2tlbgJfQQRfZmVlCl9hZG1pbl9mZWUDCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzAgV0b2tlbgkAAgECE2FscmVhZHkgaW5pdGlhbGl6ZWQDCQECIT0CCAUDbXNnBmNhbGxlcgUEdGhpcwkAAgECGHNlbGYgaW5pdGlhbGl6YXRpb24gb25seQQKY29pbnNfbGlzdAkAtQkCBQZfY29pbnMCASwEAW4JAJADAQUKY29pbnNfbGlzdAMJAGYCAAIFAW4JAAIBAg90b28gc21hbGwgY29pbnMDCQBmAgUBbgULTl9DT0lOU19NQVgJAAIBAg50b28gbWFueSBjb2lucwoBCmR1cGxpY2F0ZXMCA2FjYwVpbmRleAMDCQBnAgUFaW5kZXgFAW4GCQAAAgUDYWNjBwUDYWNjCQAAAgkAzwgCBQpjb2luc19saXN0CQCRAwIFCmNvaW5zX2xpc3QFBWluZGV4BQVpbmRleAMJAAACBwoAAiRsBRFpbmRleF9OX0NPSU5TX01BWAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpkdXBsaWNhdGVzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQACAQIXZHVwbGljYXRlIGNvaW4gZGV0ZWN0ZWQKAQhkZWNpbWFscwEEY29pbggJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJANkEAQUEY29pbgkArAICAhJmcm9tQmFzZTU4U3RyaW5nOiAFBGNvaW4JAKwCAgILYXNzZXRJbmZvOiAFBGNvaW4IZGVjaW1hbHMKAQRmb2xkAgNhY2MEY29pbgkAlQoDCQBkAggFA2FjYwJfMQABCQDNCAIIBQNhY2MCXzIAAAkAzQgCCAUDYWNjAl8zCQBsBgAKAAAJAQhkZWNpbWFscwEFBGNvaW4AAAAABQRET1dOBA0kdDAxNjE3MDE2MjY1CgACJGwFCmNvaW5zX2xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoECF9OX0NPSU5TCAUNJHQwMTYxNzAxNjI2NQJfMQQFemVyb3MIBQ0kdDAxNjE3MDE2MjY1Al8yBAZfcmF0ZXMIBQ0kdDAxNjE3MDE2MjY1Al8zBAppc3N1ZVRva2VuCQDCCAUFC19wb29sX3Rva2VuCQCsAgICDUxQIHRva2VuIGZvciAFBl9jb2lucwAABQ5UT0tFTl9ERUNJTUFMUwYEB3Rva2VuSWQJANgEAQkAuAgBBQppc3N1ZVRva2VuCQDMCAIJAQtTdHJpbmdFbnRyeQICBWNvaW5zBQZfY29pbnMJAMwIAgkBC1N0cmluZ0VudHJ5AgIFcmF0ZXMJALkJAgkBCWxpc3RfaXRvcwEFBl9yYXRlcwIBLAkAzAgCCQELU3RyaW5nRW50cnkCAghiYWxhbmNlcwkAuQkCCQEJbGlzdF9pdG9zAQUFemVyb3MCASwJAMwIAgkBDEludGVnZXJFbnRyeQICB05fQ09JTlMFCF9OX0NPSU5TCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFAl9BCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQICA2ZlZQUEX2ZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgIJYWRtaW5fZmVlBQpfYWRtaW5fZmVlCQDMCAIJAQtTdHJpbmdFbnRyeQICBW93bmVyCQEMY2hlY2tBZGRyZXNzAQUGX293bmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1raWxsX2RlYWRsaW5lCQBkAgUGaGVpZ2h0BRBLSUxMX0RFQURMSU5FX0RUCQDMCAIJAQtTdHJpbmdFbnRyeQICBXRva2VuBQd0b2tlbklkCQDMCAIJAQxCb29sZWFuRW50cnkCAglpc19raWxsZWQHCQDMCAIJAQxCb29sZWFuRW50cnkCAgxpc19hdXRvX2ZlZXMGCQDMCAIFCmlzc3VlVG9rZW4FA25pbANtc2cBDWFkZF9saXF1aWRpdHkBD21pbl9taW50X2Ftb3VudAMJAQEhAQkBB2FsbG93ZWQBCAUDbXNnBmNhbGxlcgkAAgECCCFhbGxvd2VkAwkBBmFzc2VydAEJAQEhAQUJaXNfa2lsbGVkCQACAQIJaXMga2lsbGVkCgEQdXBkYXRlXzFfYmFsYW5jZQMEYmFzZQZ0YXJnZXQGYW1vdW50CgEEZm9sZAIDYWNjBWluZGV4CQDNCAIFA2FjYwkAZAIJAJEDAgUEYmFzZQUFaW5kZXgDCQAAAgUFaW5kZXgFBnRhcmdldAUGYW1vdW50AAAKAAIkbAUNaW5kZXhfTl9DT0lOUwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgoBC3VwX2JhbGFuY2VzAgRiYXNlCHBheW1lbnRzBAFuCQCQAwEFCHBheW1lbnRzAwkAZgIAAQUBbgkAAgECEXBheW1lbnRzIHNpemUgPCAxAwkAZgIFAW4FC05fQ09JTlNfTUFYCQACAQIbcGF5bWVudHMgc2l6ZSA+IE5fQ09JTlNfTUFYCgEEZm9sZAIDYWNjB3BheW1lbnQJARB1cGRhdGVfMV9iYWxhbmNlAwUDYWNjCQEKY29pbl9pbmRleAEFB3BheW1lbnQIBQdwYXltZW50BmFtb3VudAoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFBGJhc2UKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEDG5ld19iYWxhbmNlcwkBC3VwX2JhbGFuY2VzAgUIYmFsYW5jZXMIBQNtc2cIcGF5bWVudHMDAwkAAAIFDnRva2VuX3F1YW50aXR5AAAJAAACCQCXAwEFDG5ld19iYWxhbmNlcwAABwkAAgECImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMEDSR0MDE4MjA5MTgyOTUJARJfY2FsY190b2tlbl9hbW91bnQBBQxuZXdfYmFsYW5jZXMEDmZpbmFsX2JhbGFuY2VzCAUNJHQwMTgyMDkxODI5NQJfMQQLbWludF9hbW91bnQIBQ0kdDAxODIwOTE4Mjk1Al8yBAxmZWVzX2FjdGlvbnMIBQ0kdDAxODIwOTE4Mjk1Al8zAwkBBmFzc2VydAEJAGcCBQttaW50X2Ftb3VudAUPbWluX21pbnRfYW1vdW50CQACAQIUc2xpcHBhZ2Ugc2NyZXdlZCB5b3UJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCAghiYWxhbmNlcwkAuQkCCQEJbGlzdF9pdG9zAQUOZmluYWxfYmFsYW5jZXMCASwJAMwIAgkBB1JlaXNzdWUDBQV0b2tlbgULbWludF9hbW91bnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQttaW50X2Ftb3VudAUFdG9rZW4FA25pbAUMZmVlc19hY3Rpb25zA21zZwEGZ2V0X2R5AwFpAWoCZHgEBHhwX2kJAJEDAgUIYmFsYW5jZXMFAWkEBHhwX2oJAJEDAgUIYmFsYW5jZXMFAWoEAXgJAGQCBQR4cF9pBQJkeAQNJHQwMTg3NTUxODgwOAkBBWdldF95BAUBaQUBagUBeAkBCGJpZ19saXN0AQUIYmFsYW5jZXMEAXkIBQ0kdDAxODc1NTE4ODA4Al8xBAFECAUNJHQwMTg3NTUxODgwOAJfMgQDX2R5CQBlAgkAZQIFBHhwX2oFAXkAAQQGZHlfZmVlCQBrAwUDX2R5BQNmZWUFD0ZFRV9ERU5PTUlOQVRPUgQCZHkJAGUCBQNfZHkFBmR5X2ZlZQkAlAoCBQNuaWwFAmR5A21zZwEIZXhjaGFuZ2UCAWoGbWluX2R5AwkBASEBCQEHYWxsb3dlZAEIBQNtc2cGY2FsbGVyCQACAQIIIWFsbG93ZWQDCQEGYXNzZXJ0AQkBASEBBQlpc19raWxsZWQJAAIBAglpcyBraWxsZWQDCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECFXNpemUoIHBheW1lbnRzICkgIT0gMQQHcGF5bWVudAkAkQMCCAUDbXNnCHBheW1lbnRzAAAEAmR4CAUHcGF5bWVudAZhbW91bnQEAWkJAQpjb2luX2luZGV4AQUHcGF5bWVudAQEeHBfaQkAkQMCBQhiYWxhbmNlcwUBaQQEeHBfagkAkQMCBQhiYWxhbmNlcwUBagQBeAkAZAIFBHhwX2kFAmR4BA0kdDAxOTM3NzE5NDMwCQEFZ2V0X3kEBQFpBQFqBQF4CQEIYmlnX2xpc3QBBQhiYWxhbmNlcwQBeQgFDSR0MDE5Mzc3MTk0MzACXzEEAUQIBQ0kdDAxOTM3NzE5NDMwAl8yBANfZHkJAGUCCQBlAgUEeHBfagUBeQABBAZkeV9mZWUJAGsDBQNfZHkFA2ZlZQUPRkVFX0RFTk9NSU5BVE9SBAJkeQkAZQIFA19keQUGZHlfZmVlAwkBBmFzc2VydAEJAGcCBQJkeQUGbWluX2R5CQACAQIuZXhjaGFuZ2UgcmVzdWx0ZWQgaW4gZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAQMZHlfYWRtaW5fZmVlCQBrAwUGZHlfZmVlBQlhZG1pbl9mZWUFD0ZFRV9ERU5PTUlOQVRPUgoBBGZvbGQCA2FjYwVpbmRleAkAzQgCBQNhY2MDCQAAAgUFaW5kZXgFAWkJAGQCCQCRAwIFCGJhbGFuY2VzBQVpbmRleAUCZHgDCQAAAgUFaW5kZXgFAWoJAGUCCQBlAgkAkQMCBQhiYWxhbmNlcwUFaW5kZXgFAmR5BQxkeV9hZG1pbl9mZWUJAJEDAgUIYmFsYW5jZXMFBWluZGV4BA5maW5hbF9iYWxhbmNlcwoAAiRsBQ1pbmRleF9OX0NPSU5TCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAh0b2tlbk91dAkA2QQBCQCRAwIFBWNvaW5zBQFqCQCUCgIJAM4IAgkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQICCGJhbGFuY2VzCQC5CQIJAQlsaXN0X2l0b3MBBQ5maW5hbF9iYWxhbmNlcwIBLAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgUCZHkFCHRva2VuT3V0BQNuaWwDAwUMaXNfYXV0b19mZWVzCQBmAgUMZHlfYWRtaW5fZmVlAAAHCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBW93bmVyBQxkeV9hZG1pbl9mZWUFCHRva2VuT3V0BQNuaWwFA25pbAkBCGxvZ19kYXRhAgUBRAMJAAACBQNmZWUAAAAACQBrAwkAawMFBmR5X2ZlZQUKVE9LRU5fUkFURQkAkQMCBQVyYXRlcwUBagUPRkVFX0RFTk9NSU5BVE9SBQNmZWUFAmR5A21zZwEQcmVtb3ZlX2xpcXVpZGl0eQEMX21pbl9hbW91bnRzAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhVzaXplKCBwYXltZW50cyApICE9IDEEB3BheW1lbnQJAJEDAggFA21zZwhwYXltZW50cwAAAwkBAiE9AggFB3BheW1lbnQHYXNzZXRJZAUFdG9rZW4JAAIBAg11bmtub3duIHRva2VuBAttaW5fYW1vdW50cwMJAAACBQxfbWluX2Ftb3VudHMCATAFA25pbAkBCWxpc3Rfc3RvaQEJALUJAgUMX21pbl9hbW91bnRzAgEsAwMJAQIhPQIFDF9taW5fYW1vdW50cwIBMAkBAiE9AgkAkAMBBQttaW5fYW1vdW50cwUHTl9DT0lOUwcJAAIBAh1taW5fYW1vdW50cy5zaXplKCkgIT0gTl9DT0lOUwQGYW1vdW50CAUHcGF5bWVudAZhbW91bnQEBmNhbGxlcggFA21zZwZjYWxsZXIKAQRmb2xkAgNhY2MFaW5kZXgEB2JhbGFuY2UJAJEDAgUIYmFsYW5jZXMFBWluZGV4BAphbW91bnRfb3V0CQBrAwUHYmFsYW5jZQUGYW1vdW50BQ50b2tlbl9xdWFudGl0eQMDCQECIT0CBQxfbWluX2Ftb3VudHMCATAJAGYCCQCRAwIFC21pbl9hbW91bnRzBQVpbmRleAUKYW1vdW50X291dAcJAAIBAjB3aXRoZHJhd2FsIHJlc3VsdGVkIGluIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQJAJQKAgkAzQgCCAUDYWNjAl8xCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCmFtb3VudF9vdXQJANkEAQkAkQMCBQVjb2lucwUFaW5kZXgJAM0IAggFA2FjYwJfMgkAZQIFB2JhbGFuY2UFCmFtb3VudF9vdXQEDSR0MDIxNjE1MjE2OTQKAAIkbAUNaW5kZXhfTl9DT0lOUwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoECXRyYW5zZmVycwgFDSR0MDIxNjE1MjE2OTQCXzEEDmZpbmFsX2JhbGFuY2VzCAUNJHQwMjE2MTUyMTY5NAJfMgkAzggCBQl0cmFuc2ZlcnMJAMwIAgkBC1N0cmluZ0VudHJ5AgIIYmFsYW5jZXMJALkJAgkBCWxpc3RfaXRvcwEFDmZpbmFsX2JhbGFuY2VzAgEsCQDMCAIJAQRCdXJuAgUFdG9rZW4FBmFtb3VudAUDbmlsA21zZwEWY2FsY193aXRoZHJhd19vbmVfY29pbgINX3Rva2VuX2Ftb3VudAFpCQCUCgIFA25pbAgJARdfY2FsY193aXRoZHJhd19vbmVfY29pbgIFDV90b2tlbl9hbW91bnQFAWkCXzEDbXNnARlyZW1vdmVfbGlxdWlkaXR5X29uZV9jb2luAgFpCm1pbl9hbW91bnQDCQEBIQEJAQdhbGxvd2VkAQgFA21zZwZjYWxsZXIJAAIBAgghYWxsb3dlZAMJAQZhc3NlcnQBCQEBIQEFCWlzX2tpbGxlZAkAAgECCWlzIGtpbGxlZAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQIVc2l6ZSggcGF5bWVudHMgKSAhPSAxBAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAMJAQIhPQIIBQdwYXltZW50B2Fzc2V0SWQFBXRva2VuCQACAQINdW5rbm93biB0b2tlbgQNX3Rva2VuX2Ftb3VudAgFB3BheW1lbnQGYW1vdW50BA0kdDAyMjQxODIyNDg1CQEXX2NhbGNfd2l0aGRyYXdfb25lX2NvaW4CBQ1fdG9rZW5fYW1vdW50BQFpBAJkeQgFDSR0MDIyNDE4MjI0ODUCXzEEBmR5X2ZlZQgFDSR0MDIyNDE4MjI0ODUCXzIEAUQIBQ0kdDAyMjQxODIyNDg1Al8zAwkBBmFzc2VydAEJAGcCBQJkeQUKbWluX2Ftb3VudAkAAgECGG5vdCBlbm91Z2ggY29pbnMgcmVtb3ZlZAQMZHlfYWRtaW5fZmVlCQBrAwUGZHlfZmVlBQlhZG1pbl9mZWUFD0ZFRV9ERU5PTUlOQVRPUgQKZHlfYW5kX2ZlZQkAZAIFAmR5BQxkeV9hZG1pbl9mZWUKAQRmb2xkAgNhY2MFaW5kZXgJAM0IAgUDYWNjCQBlAgkAkQMCBQhiYWxhbmNlcwUFaW5kZXgDCQAAAgUFaW5kZXgFAWkFCmR5X2FuZF9mZWUAAAQOZmluYWxfYmFsYW5jZXMKAAIkbAUNaW5kZXhfTl9DT0lOUwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQIdG9rZW5PdXQJANkEAQkAkQMCBQVjb2lucwUBaQkAlAoCCQDOCAIJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCAghiYWxhbmNlcwkAuQkCCQEJbGlzdF9pdG9zAQUOZmluYWxfYmFsYW5jZXMCASwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwZjYWxsZXIFAmR5BQh0b2tlbk91dAkAzAgCCQEEQnVybgIFBXRva2VuBQ1fdG9rZW5fYW1vdW50BQNuaWwDAwUMaXNfYXV0b19mZWVzCQBmAgUMZHlfYWRtaW5fZmVlAAAHCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBW93bmVyBQxkeV9hZG1pbl9mZWUFCHRva2VuT3V0BQNuaWwFA25pbAkBCGxvZ19kYXRhAgUBRAMJAAACBQNmZWUAAAAACQBrAwkAawMFBmR5X2ZlZQUKVE9LRU5fUkFURQkAkQMCBQVyYXRlcwUBaQUPRkVFX0RFTk9NSU5BVE9SBQNmZWUFAmR5A21zZwEBQQAJAJQKAgUDbmlsBQNhbXADbXNnARFnZXRfdmlydHVhbF9wcmljZQAEAUQJAQVnZXRfRAIJAQhiaWdfbGlzdAEFCGJhbGFuY2VzBQNhbXAJAJQKAgUDbmlsCQENdmlydHVhbF9wcmljZQEFAUQDbXNnARFjYWxjX3Rva2VuX2Ftb3VudAEIX2Ftb3VudHMEB2Ftb3VudHMJAQlsaXN0X3N0b2kBCQC1CQIFCF9hbW91bnRzAgEsAwkBAiE9AgkAkAMBBQdhbW91bnRzBQdOX0NPSU5TCQACAQITbm90IGVub3VnaHQgYW1vdW50cwoBBGZvbGQCA2FjYwVpbmRleAkAzQgCBQNhY2MJAGQCCQCRAwIFCGJhbGFuY2VzBQVpbmRleAkAkQMCBQdhbW91bnRzBQVpbmRleAQMbmV3X2JhbGFuY2VzCgACJGwFDWluZGV4X05fQ09JTlMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEDSR0MDIzOTYzMjQwNDkJARJfY2FsY190b2tlbl9hbW91bnQBBQxuZXdfYmFsYW5jZXMEDmZpbmFsX2JhbGFuY2VzCAUNJHQwMjM5NjMyNDA0OQJfMQQLbWludF9hbW91bnQIBQ0kdDAyMzk2MzI0MDQ5Al8yBAxmZWVzX2FjdGlvbnMIBQ0kdDAyMzk2MzI0MDQ5Al8zCQCUCgIFA25pbAULbWludF9hbW91bnQDbXNnAQZyYW1wX0ECCV9mdXR1cmVfQQxfZnV0dXJlX3RpbWUDCQEGYXNzZXJ0AQkAAAIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCm9ubHkgb3duZXIDCQEGYXNzZXJ0AQMJAAACBQ5pbml0aWFsX0FfdGltZQAABgkAZwIFD2Jsb2NrX3RpbWVzdGFtcAkAZAIFDmluaXRpYWxfQV90aW1lBQ1NSU5fUkFNUF9USU1FCQACAQIJdG9vIG9mdGVuAwkBBmFzc2VydAEJAGcCBQxfZnV0dXJlX3RpbWUJAGQCBQ9ibG9ja190aW1lc3RhbXAFDU1JTl9SQU1QX1RJTUUJAAIBAhFpbnN1ZmZpY2llbnQgdGltZQQKX2luaXRpYWxfQQUDYW1wAwkBBmFzc2VydAEDCQBmAgUJX2Z1dHVyZV9BAAAJAGYCBQVNQVhfQQUJX2Z1dHVyZV9BBwkAAgECEW91dCBvZiBiYXNlIHJhbmdlAwkBBmFzc2VydAEDAwkAZwIFCV9mdXR1cmVfQQUKX2luaXRpYWxfQQkAZwIJAGgCBQpfaW5pdGlhbF9BBQxNQVhfQV9DSEFOR0UFCV9mdXR1cmVfQQcGAwkAZgIFCl9pbml0aWFsX0EFCV9mdXR1cmVfQQkAZwIJAGgCBQlfZnV0dXJlX0EFDE1BWF9BX0NIQU5HRQUKX2luaXRpYWxfQQcJAAIBAgxvdXQgb2YgcmFuZ2UJAMwIAgkBDEludGVnZXJFbnRyeQICCWluaXRpYWxfQQUKX2luaXRpYWxfQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFCV9mdXR1cmVfQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFD2Jsb2NrX3RpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgINZnV0dXJlX0FfdGltZQUMX2Z1dHVyZV90aW1lBQNuaWwDbXNnAQtzdG9wX3JhbXBfQQADCQEGYXNzZXJ0AQkAAAIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCm9ubHkgb3duZXIECWN1cnJlbnRfQQUDYW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFCWN1cnJlbnRfQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFCWN1cnJlbnRfQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFD2Jsb2NrX3RpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgINZnV0dXJlX0FfdGltZQUPYmxvY2tfdGltZXN0YW1wBQNuaWwDbXNnAQ5jb21taXRfbmV3X2ZlZQIHbmV3X2ZlZQ1uZXdfYWRtaW5fZmVlAwkBBmFzc2VydAEJAAACCAUDbXNnBmNhbGxlcgUFb3duZXIJAAIBAgpvbmx5IG93bmVyAwkBBmFzc2VydAEJAAACBRZhZG1pbl9hY3Rpb25zX2RlYWRsaW5lAAAJAAIBAg1hY3RpdmUgYWN0aW9uAwkBBmFzc2VydAEJAGcCBQdNQVhfRkVFBQduZXdfZmVlCQACAQITZmVlIGV4Y2VlZHMgbWF4aW11bQMJAQZhc3NlcnQBCQBnAgUNTUFYX0FETUlOX0ZFRQUNbmV3X2FkbWluX2ZlZQkAAgECGWFkbWluIGZlZSBleGNlZWRzIG1heGltdW0ECV9kZWFkbGluZQkAZAIFD2Jsb2NrX3RpbWVzdGFtcAUTQURNSU5fQUNUSU9OU19ERUxBWQkAzAgCCQEMSW50ZWdlckVudHJ5AgIWYWRtaW5fYWN0aW9uc19kZWFkbGluZQUJX2RlYWRsaW5lCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgpmdXR1cmVfZmVlBQduZXdfZmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhBmdXR1cmVfYWRtaW5fZmVlBQ1uZXdfYWRtaW5fZmVlBQNuaWwDbXNnAQ1hcHBseV9uZXdfZmVlAAMJAQZhc3NlcnQBCQAAAggFA21zZwZjYWxsZXIFBW93bmVyCQACAQIKb25seSBvd25lcgMJAQZhc3NlcnQBCQBnAgUPYmxvY2tfdGltZXN0YW1wBRZhZG1pbl9hY3Rpb25zX2RlYWRsaW5lCQACAQIRaW5zdWZmaWNpZW50IHRpbWUDCQEGYXNzZXJ0AQkBAiE9AgUWYWRtaW5fYWN0aW9uc19kZWFkbGluZQAACQACAQIQbm8gYWN0aXZlIGFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgIWYWRtaW5fYWN0aW9uc19kZWFkbGluZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCAgNmZWUFCmZ1dHVyZV9mZWUJAMwIAgkBDEludGVnZXJFbnRyeQICCWFkbWluX2ZlZQUQZnV0dXJlX2FkbWluX2ZlZQUDbmlsA21zZwEVcmV2ZXJ0X25ld19wYXJhbWV0ZXJzAAMJAQZhc3NlcnQBCQAAAggFA21zZwZjYWxsZXIFBW93bmVyCQACAQIKb25seSBvd25lcgkAzAgCCQEMSW50ZWdlckVudHJ5AgIWYWRtaW5fYWN0aW9uc19kZWFkbGluZQAABQNuaWwDbXNnARljb21taXRfdHJhbnNmZXJfb3duZXJzaGlwAQZfb3duZXIDCQEGYXNzZXJ0AQkAAAIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCm9ubHkgb3duZXIDCQEGYXNzZXJ0AQkAAAIFG3RyYW5zZmVyX293bmVyc2hpcF9kZWFkbGluZQAACQACAQIPYWN0aXZlIHRyYW5zZmVyBAlfZGVhZGxpbmUJAGQCBQ9ibG9ja190aW1lc3RhbXAFE0FETUlOX0FDVElPTlNfREVMQVkJAMwIAgkBDEludGVnZXJFbnRyeQICG3RyYW5zZmVyX293bmVyc2hpcF9kZWFkbGluZQUJX2RlYWRsaW5lCQDMCAIJAQtTdHJpbmdFbnRyeQICDGZ1dHVyZV9vd25lcgkBDGNoZWNrQWRkcmVzcwEFBl9vd25lcgUDbmlsA21zZwEYYXBwbHlfdHJhbnNmZXJfb3duZXJzaGlwAAMJAQZhc3NlcnQBCQAAAggFA21zZwZjYWxsZXIFBW93bmVyCQACAQIKb25seSBvd25lcgMJAQZhc3NlcnQBCQBnAgUPYmxvY2tfdGltZXN0YW1wBRt0cmFuc2Zlcl9vd25lcnNoaXBfZGVhZGxpbmUJAAIBAhFpbnN1ZmZpY2llbnQgdGltZQMJAQZhc3NlcnQBCQECIT0CBRt0cmFuc2Zlcl9vd25lcnNoaXBfZGVhZGxpbmUAAAkAAgECEm5vIGFjdGl2ZSB0cmFuc2ZlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgIbdHJhbnNmZXJfb3duZXJzaGlwX2RlYWRsaW5lAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgIFb3duZXIFDGZ1dHVyZV9vd25lcgUDbmlsA21zZwEZcmV2ZXJ0X3RyYW5zZmVyX293bmVyc2hpcAADCQEGYXNzZXJ0AQkAAAIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCm9ubHkgb3duZXIJAMwIAgkBDEludGVnZXJFbnRyeQICG3RyYW5zZmVyX293bmVyc2hpcF9kZWFkbGluZQAABQNuaWwDbXNnAQ5hZG1pbl9iYWxhbmNlcwEBaQkAlAoCBQNuaWwJAQ1hZG1pbl9iYWxhbmNlAQUBaQNtc2cBE3dpdGhkcmF3X2FkbWluX2ZlZXMAAwkBBmFzc2VydAEJAAACCAUDbXNnBmNhbGxlcgUFb3duZXIJAAIBAgpvbmx5IG93bmVyCgEEZm9sZAIDYWNjBWluZGV4CQDNCAIFA2FjYwkBDlNjcmlwdFRyYW5zZmVyAwUFb3duZXIJAQ1hZG1pbl9iYWxhbmNlAQUFaW5kZXgJANkEAQkAkQMCBQVjb2lucwUFaW5kZXgKAAIkbAUNaW5kZXhfTl9DT0lOUwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgNtc2cBEWRvbmF0ZV9hZG1pbl9mZWVzAAMJAQZhc3NlcnQBCQAAAggFA21zZwZjYWxsZXIFBW93bmVyCQACAQIKb25seSBvd25lcgoBBGZvbGQCA2FjYwVpbmRleAkAzQgCBQNhY2MJAGQCCQCRAwIFCGJhbGFuY2VzBQVpbmRleAkBDWFkbWluX2JhbGFuY2UBBQVpbmRleAQMbmV3X2JhbGFuY2VzCgACJGwFDWluZGV4X05fQ09JTlMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAMwIAgkBC1N0cmluZ0VudHJ5AgIIYmFsYW5jZXMJALkJAgkBCWxpc3RfaXRvcwEFDG5ld19iYWxhbmNlcwIBLAUDbmlsA21zZwENc2V0X2F1dG9fZmVlcwENX2lzX2F1dG9fZmVlcwMJAQZhc3NlcnQBCQAAAggFA21zZwZjYWxsZXIFBW93bmVyCQACAQIKb25seSBvd25lcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgIMaXNfYXV0b19mZWVzBQ1faXNfYXV0b19mZWVzBQNuaWwDbXNnAQdraWxsX21lAAMJAQZhc3NlcnQBCQAAAggFA21zZwZjYWxsZXIFBW93bmVyCQACAQIKb25seSBvd25lcgMJAQZhc3NlcnQBCQBmAgUNa2lsbF9kZWFkbGluZQUPYmxvY2tfdGltZXN0YW1wCQACAQITZGVhZGxpbmUgaGFzIHBhc3NlZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgIJaXNfa2lsbGVkBgUDbmlsA21zZwEJdW5raWxsX21lAAMJAQZhc3NlcnQBCQAAAggFA21zZwZjYWxsZXIFBW93bmVyCQACAQIKb25seSBvd25lcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgIJaXNfa2lsbGVkBwUDbmlsA21zZwESc2V0X2hlaWdodF9hZGRyZXNzAQ5faGVpZ2h0QWRkcmVzcwMJAQIhPQIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCm9ubHkgb3duZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgINaGVpZ2h0QWRkcmVzcwkBDGNoZWNrQWRkcmVzcwEFDl9oZWlnaHRBZGRyZXNzBQNuaWwBaQEMc2V0X3ZlcmlmaWVyAQh2ZXJpZmllcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECDnNlbGYgY2FsbCBvbmx5BAlhZGRyZXNzT0sEByRtYXRjaDAJAKYIAQUIdmVyaWZpZXIDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYHAwkBASEBBQlhZGRyZXNzT0sJAAIBCQCsAgICF3ZlcmlmaWVyIHdyb25nIGFkZHJlc3MgBQh2ZXJpZmllcgMJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMCCHZlcmlmaWVyCQACAQIYdmVyaWZpZXIgYWxyZWFkeSBkZWZpbmVkCQDMCAIJAQtTdHJpbmdFbnRyeQICCHZlcmlmaWVyBQh2ZXJpZmllcgUDbmlsAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAkAnQgCBQR0aGlzAgh2ZXJpZmllcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcECHZlcmlmaWVyBQckbWF0Y2gwCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCHZlcmlmaWVyCQCsAgIJAKwCAgkArAICAgdzdGF0dXNfCQClCAEFBHRoaXMCAV8JANgEAQgFAnR4AmlkBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleZqnSy4=", "chainId": 87, "height": 3412642, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 8kkD6eEkMENyEuKTuhqWkJZcuLEEkDdThFiMS5PT1j1j Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let N_COINS = getIntegerValue(this, "N_COINS")
5+
6+let N_COINS_big = toBigInt(N_COINS)
7+
8+let N_COINS_MAX = 10
9+
10+let TOKEN_DECIMALS = 6
11+
12+let TOKEN_RATE = 1000000
13+
14+let FEE_DENOMINATOR = 10000000000
15+
16+let PRECISION = 1000000
17+
18+let DECIMALS = 6
19+
20+let MAX_ADMIN_FEE = 10000000000
21+
22+let MAX_FEE = 5000000000
23+
24+let MAX_A = 1000000
25+
26+let MAX_A_CHANGE = 10
27+
28+let ADMIN_ACTIONS_DELAY = ((3 * 86400) / 60)
29+
30+let MIN_RAMP_TIME = (86400 / 60)
31+
32+let VP_LOG_PERIOD = 86400000
33+
34+let VP_PRECISION = 1000000000000
35+
36+let coins = split(getStringValue(this, "coins"), ",")
37+
38+let fee = getIntegerValue(this, "fee")
39+
40+let N_fee_4 = ((fee * N_COINS) / (4 * (N_COINS - 1)))
41+
42+let admin_fee = getIntegerValue(this, "admin_fee")
43+
44+let is_auto_fees = getBooleanValue(this, "is_auto_fees")
45+
46+let owner = addressFromStringValue(getStringValue(this, "owner"))
47+
48+let token = fromBase58String(getStringValue(this, "token"))
49+
50+let token_quantity = value(assetInfo(token)).quantity
51+
52+let initial_A = getIntegerValue(this, "initial_A")
53+
54+let future_A = getIntegerValue(this, "future_A")
55+
56+let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
57+
58+let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
59+
60+let admin_actions_deadline = valueOrElse(getInteger(this, "admin_actions_deadline"), 0)
61+
62+let transfer_ownership_deadline = valueOrElse(getInteger(this, "transfer_ownership_deadline"), 0)
63+
64+let future_fee = getIntegerValue(this, "future_fee")
65+
66+let future_admin_fee = getIntegerValue(this, "future_admin_fee")
67+
68+let future_owner = getStringValue(this, "future_owner")
69+
70+let is_killed = getBooleanValue(this, "is_killed")
71+
72+let kill_deadline = getIntegerValue(this, "kill_deadline")
73+
74+let KILL_DEADLINE_DT = (((2 * 30) * 86400) / 60)
75+
76+let big0 = toBigInt(0)
77+
78+let big1 = toBigInt(1)
79+
80+let big2 = toBigInt(2)
81+
82+let heightAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, "heightAddress"), "no settings defined")), "bad settings address")
83+
84+let HEIGHT = height
85+
86+let block_timestamp = HEIGHT
87+
88+func allowed (caller) = (owner == caller)
89+
90+
91+func assert (a) = if (a)
92+ then false
93+ else true
94+
95+
96+func list_itos (list) = if ((size(list) > N_COINS_MAX))
97+ then throw("list_itos: list.size() > N_COINS_MAX")
98+ else {
99+ func fold (acc,val) = (acc :+ toString(val))
100+
101+ let $l = list
102+ let $s = size($l)
103+ let $acc0 = nil
104+ func $f0_1 ($a,$i) = if (($i >= $s))
105+ then $a
106+ else fold($a, $l[$i])
107+
108+ func $f0_2 ($a,$i) = if (($i >= $s))
109+ then $a
110+ else throw("List size exceeds 10")
111+
112+ $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)
113+ }
114+
115+
116+func list_stoi (list) = if ((size(list) > N_COINS_MAX))
117+ then throw("list_stoi: list.size() > N_COINS_MAX")
118+ else {
119+ func fold (acc,val) = (acc :+ parseIntValue(val))
120+
121+ let $l = list
122+ let $s = size($l)
123+ let $acc0 = nil
124+ func $f0_1 ($a,$i) = if (($i >= $s))
125+ then $a
126+ else fold($a, $l[$i])
127+
128+ func $f0_2 ($a,$i) = if (($i >= $s))
129+ then $a
130+ else throw("List size exceeds 10")
131+
132+ $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)
133+ }
134+
135+
136+let balances = list_stoi(split(getStringValue(this, "balances"), ","))
137+
138+let rates = list_stoi(split(getStringValue(this, "rates"), ","))
139+
140+let rates_size = size(rates)
141+
142+let index_N_COINS_MAX = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
143+
144+func index_n (n) = if ((n > N_COINS_MAX))
145+ then throw("index_n: n > N_COINS_MAX")
146+ else {
147+ func fold (acc,index) = if ((n > index))
148+ then (acc :+ index)
149+ else acc
150+
151+ let $l = index_N_COINS_MAX
152+ let $s = size($l)
153+ let $acc0 = nil
154+ func $f0_1 ($a,$i) = if (($i >= $s))
155+ then $a
156+ else fold($a, $l[$i])
157+
158+ func $f0_2 ($a,$i) = if (($i >= $s))
159+ then $a
160+ else throw("List size exceeds 10")
161+
162+ $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)
163+ }
164+
165+
166+let index_N_COINS = index_n(N_COINS)
167+
168+let index_N_COINS_1 = (index_N_COINS :+ N_COINS)
169+
170+func big_list (list) = if ((size(list) != N_COINS))
171+ then throw("big_list: list.size() != N_COINS")
172+ else {
173+ func fold (acc,index) = (acc :+ toBigInt(fraction(list[index], TOKEN_RATE, rates[index])))
174+
175+ let $l = index_N_COINS
176+ let $s = size($l)
177+ let $acc0 = nil
178+ func $f0_1 ($a,$i) = if (($i >= $s))
179+ then $a
180+ else fold($a, $l[$i])
181+
182+ func $f0_2 ($a,$i) = if (($i >= $s))
183+ then $a
184+ else throw("List size exceeds 10")
185+
186+ $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)
187+ }
188+
189+
190+func coin_index (payment) = match payment.assetId {
191+ case assetId: ByteVector =>
192+ valueOrErrorMessage(indexOf(coins, toBase58String(assetId)), (toBase58String(assetId) + " out of pool"))
193+ case _ =>
194+ throw("unsupported assetId")
195+}
196+
197+
198+func admin_balance (i) = if (if ((0 > i))
199+ then true
200+ else (i > N_COINS))
201+ then throw("i out of index")
202+ else (assetBalance(this, fromBase58String(coins[i])) - balances[i])
203+
204+
205+func checkAddress (a58) = {
206+ let a = addressFromStringValue(a58)
207+ toString(a)
208+ }
209+
210+
211+let amp = {
212+ let t1 = future_A_time
213+ let A1 = future_A
214+ if ((t1 > block_timestamp))
215+ then {
216+ let A0 = initial_A
217+ let t0 = initial_A_time
218+ if ((A1 > A0))
219+ then (A0 + (((A1 - A0) * (block_timestamp - t0)) / (t1 - t0)))
220+ else (A0 - (((A0 - A1) * (block_timestamp - t0)) / (t1 - t0)))
221+ }
222+ else A1
223+ }
224+
225+func list_sum (list) = {
226+ func fold (acc,val) = (acc + val)
227+
228+ let $l = list
229+ let $s = size($l)
230+ let $acc0 = big0
231+ func $f0_1 ($a,$i) = if (($i >= $s))
232+ then $a
233+ else fold($a, $l[$i])
234+
235+ func $f0_2 ($a,$i) = if (($i >= $s))
236+ then $a
237+ else throw("List size exceeds 10")
238+
239+ $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)
240+ }
241+
242+
243+func list_mult (list) = {
244+ func fold (acc,val) = fraction(fraction(acc, val, big1), N_COINS_big, big1)
245+
246+ let $l = list
247+ let $s = size($l)
248+ let $acc0 = big1
249+ func $f0_1 ($a,$i) = if (($i >= $s))
250+ then $a
251+ else fold($a, $l[$i])
252+
253+ func $f0_2 ($a,$i) = if (($i >= $s))
254+ then $a
255+ else throw("List size exceeds 10")
256+
257+ $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)
258+ }
259+
260+
261+let list16 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
262+
263+func get_D (xp,amp) = {
264+ let S = list_sum(xp)
265+ if ((toInt(S) == 0))
266+ then 0
267+ else {
268+ let Ann = (amp * N_COINS)
269+ let AnnS = fraction(toBigInt(Ann), S, big1)
270+ let Ann1 = toBigInt((Ann - 1))
271+ let xd = list_mult(xp)
272+ let N_COINS_1 = (N_COINS + 1)
273+ let N_COINS_1_big = toBigInt(N_COINS_1)
274+ func D_mult (val) = {
275+ func fold (acc,index) = fraction(acc, val, big1)
276+
277+ let $l = index_N_COINS_1
278+ let $s = size($l)
279+ let $acc0 = big1
280+ func $f0_1 ($a,$i) = if (($i >= $s))
281+ then $a
282+ else fold($a, $l[$i])
283+
284+ func $f0_2 ($a,$i) = if (($i >= $s))
285+ then $a
286+ else throw("List size exceeds 11")
287+
288+ $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)
289+ }
290+
291+ func D_proc (acc,unused) = if ((acc._2 == true))
292+ then acc
293+ else {
294+ let Dprev = acc._1
295+ let D_P = fraction(D_mult(Dprev), big1, xd)
296+ let D = fraction((AnnS + fraction(N_COINS_big, D_P, big1)), Dprev, (fraction(Ann1, Dprev, big1) + fraction(N_COINS_1_big, D_P, big1)))
297+ if ((D > Dprev))
298+ then if ((1 >= toInt((D - Dprev))))
299+ then $Tuple2(D, true)
300+ else $Tuple2(D, false)
301+ else if ((1 >= toInt((Dprev - D))))
302+ then $Tuple2(D, true)
303+ else $Tuple2(D, false)
304+ }
305+
306+ let $t061556217 = {
307+ let $l = list16
308+ let $s = size($l)
309+ let $acc0 = $Tuple2(S, false)
310+ func $f0_1 ($a,$i) = if (($i >= $s))
311+ then $a
312+ else D_proc($a, $l[$i])
313+
314+ func $f0_2 ($a,$i) = if (($i >= $s))
315+ then $a
316+ else throw("List size exceeds 16")
317+
318+ $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)
319+ }
320+ let D = $t061556217._1
321+ let finished = $t061556217._2
322+ if ((finished == false))
323+ then throw(("D_proc() not finished with " + toString(D)))
324+ else toInt(D)
325+ }
326+ }
327+
328+
329+func get_y (i,j,x,xp) = if (assert((i != j)))
330+ then throw("same coin")
331+ else if (assert(if ((j >= 0))
332+ then (i >= 0)
333+ else false))
334+ then throw("below zero")
335+ else if (assert(if ((N_COINS > j))
336+ then (N_COINS > i)
337+ else false))
338+ then throw("above N_COINS")
339+ else {
340+ let D = get_D(xp, amp)
341+ let D_big = toBigInt(D)
342+ let Ann_big = toBigInt((amp * N_COINS))
343+ func S_c (acc,index) = {
344+ let $t068106829 = acc
345+ let S_ = $t068106829._1
346+ let c = $t068106829._2
347+ let x_ = if ((index == i))
348+ then toBigInt(fraction(x, TOKEN_RATE, rates[index]))
349+ else xp[index]
350+ if ((index != j))
351+ then $Tuple2((S_ + x_), fraction(c, D_big, fraction(x_, N_COINS_big, big1)))
352+ else $Tuple2(S_, c)
353+ }
354+
355+ let $t071057169 = {
356+ let $l = index_N_COINS
357+ let $s = size($l)
358+ let $acc0 = $Tuple2(big0, D_big)
359+ func $f0_1 ($a,$i) = if (($i >= $s))
360+ then $a
361+ else S_c($a, $l[$i])
362+
363+ func $f0_2 ($a,$i) = if (($i >= $s))
364+ then $a
365+ else throw("List size exceeds 10")
366+
367+ $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)
368+ }
369+ let S_ = $t071057169._1
370+ let c_ = $t071057169._2
371+ let c = fraction(c_, D_big, fraction(Ann_big, N_COINS_big, big1))
372+ let bD = ((S_ + fraction(D_big, big1, Ann_big)) - D_big)
373+ func y_proc (acc,unused) = if ((acc._2 == true))
374+ then acc
375+ else {
376+ let y_prev = acc._1
377+ let y = fraction((fraction(y_prev, y_prev, big1) + c), big1, (fraction(big2, y_prev, big1) + bD))
378+ if ((y > y_prev))
379+ then if ((1 >= toInt((y - y_prev))))
380+ then $Tuple2(y, true)
381+ else $Tuple2(y, false)
382+ else if ((1 >= toInt((y_prev - y))))
383+ then $Tuple2(y, true)
384+ else $Tuple2(y, false)
385+ }
386+
387+ let $t077497815 = {
388+ let $l = list16
389+ let $s = size($l)
390+ let $acc0 = $Tuple2(D_big, false)
391+ func $f1_1 ($a,$i) = if (($i >= $s))
392+ then $a
393+ else y_proc($a, $l[$i])
394+
395+ func $f1_2 ($a,$i) = if (($i >= $s))
396+ then $a
397+ else throw("List size exceeds 16")
398+
399+ $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)
400+ }
401+ let y = $t077497815._1
402+ let finished = $t077497815._2
403+ if ((finished == false))
404+ then throw(("y_proc() not finished with " + toString(y)))
405+ else $Tuple2(fraction(toInt(y), rates[j], TOKEN_RATE), D)
406+ }
407+
408+
409+func get_y_D (amp,i,xp,D) = if (assert((i >= 0)))
410+ then throw("i below zero")
411+ else if (assert((N_COINS > i)))
412+ then throw("i above N_COINS")
413+ else {
414+ let D_big = toBigInt(D)
415+ let Ann_big = toBigInt((amp * N_COINS))
416+ func S_c (acc,index) = {
417+ let $t083208339 = acc
418+ let S_ = $t083208339._1
419+ let c = $t083208339._2
420+ let x_ = if ((index == i))
421+ then big0
422+ else xp[index]
423+ if ((index != i))
424+ then $Tuple2((S_ + x_), fraction(c, D_big, fraction(x_, N_COINS_big, big1)))
425+ else $Tuple2(S_, c)
426+ }
427+
428+ let $t085698633 = {
429+ let $l = index_N_COINS
430+ let $s = size($l)
431+ let $acc0 = $Tuple2(big0, D_big)
432+ func $f0_1 ($a,$i) = if (($i >= $s))
433+ then $a
434+ else S_c($a, $l[$i])
435+
436+ func $f0_2 ($a,$i) = if (($i >= $s))
437+ then $a
438+ else throw("List size exceeds 10")
439+
440+ $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)
441+ }
442+ let S_ = $t085698633._1
443+ let c_ = $t085698633._2
444+ let c = fraction(c_, D_big, fraction(Ann_big, N_COINS_big, big1))
445+ let bD = ((S_ + fraction(D_big, big1, Ann_big)) - D_big)
446+ func y_proc (acc,unused) = if ((acc._2 == true))
447+ then acc
448+ else {
449+ let y_prev = acc._1
450+ let y = fraction((fraction(y_prev, y_prev, big1) + c), big1, (fraction(big2, y_prev, big1) + bD))
451+ if ((y > y_prev))
452+ then if ((1 >= toInt((y - y_prev))))
453+ then $Tuple2(y, true)
454+ else $Tuple2(y, false)
455+ else if ((1 >= toInt((y_prev - y))))
456+ then $Tuple2(y, true)
457+ else $Tuple2(y, false)
458+ }
459+
460+ let $t092139279 = {
461+ let $l = list16
462+ let $s = size($l)
463+ let $acc0 = $Tuple2(D_big, false)
464+ func $f1_1 ($a,$i) = if (($i >= $s))
465+ then $a
466+ else y_proc($a, $l[$i])
467+
468+ func $f1_2 ($a,$i) = if (($i >= $s))
469+ then $a
470+ else throw("List size exceeds 16")
471+
472+ $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)
473+ }
474+ let y = $t092139279._1
475+ let finished = $t092139279._2
476+ if ((finished == false))
477+ then throw(("y_proc() not finished with " + toString(y)))
478+ else fraction(toInt(y), rates[i], TOKEN_RATE)
479+ }
480+
481+
482+func _calc_withdraw_one_coin (_token_amount,i) = {
483+ let xp = big_list(balances)
484+ let D0 = get_D(xp, amp)
485+ let D1 = (D0 - fraction(_token_amount, D0, token_quantity))
486+ let new_y = get_y_D(amp, i, xp, D1)
487+ let dy_0 = (balances[i] - new_y)
488+ func fold (acc,index) = {
489+ let xp_j = balances[index]
490+ let dx_expected = if ((index == i))
491+ then (fraction(xp_j, D1, D0) - new_y)
492+ else (xp_j - fraction(xp_j, D1, D0))
493+ (acc :+ (xp_j - fraction(N_fee_4, dx_expected, FEE_DENOMINATOR)))
494+ }
495+
496+ let xp_reduced = {
497+ let $l = index_N_COINS
498+ let $s = size($l)
499+ let $acc0 = nil
500+ func $f0_1 ($a,$i) = if (($i >= $s))
501+ then $a
502+ else fold($a, $l[$i])
503+
504+ func $f0_2 ($a,$i) = if (($i >= $s))
505+ then $a
506+ else throw("List size exceeds 10")
507+
508+ $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)
509+ }
510+ let xp_reduced_i = xp_reduced[i]
511+ let dy = ((xp_reduced_i - get_y_D(amp, i, big_list(xp_reduced), D1)) - 1)
512+ $Tuple3(dy, (dy_0 - dy), D0)
513+ }
514+
515+
516+func virtual_price (D) = fraction(D, VP_PRECISION, token_quantity)
517+
518+
519+func log_data (D,add) = {
520+ let total_vol = (parseBigIntValue(valueOrElse(getString("vol"), "0")) + toBigInt(add))
521+ let total_vol_string = toString(total_vol)
522+ ([StringEntry("vol", total_vol_string)] ++ {
523+ let log_period = toString((lastBlock.timestamp / VP_LOG_PERIOD))
524+ let log_key = ("log_" + log_period)
525+ if (isDefined(getString(log_key)))
526+ then nil
527+ else [StringEntry(log_key, ((((toString(virtual_price(D)) + "_") + total_vol_string) + "_") + toString(lastBlock.timestamp)))]
528+ })
529+ }
530+
531+
532+func get_nearest_log (period) = {
533+ func fold (log_value,step) = if ((log_value != ""))
534+ then log_value
535+ else {
536+ let log_key = ("log_" + toString((period - step)))
537+ valueOrElse(getString(log_key), "")
538+ }
539+
540+ 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]
541+ 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]
542+ let value30p = {
543+ let $l = list30p
544+ let $s = size($l)
545+ let $acc0 = ""
546+ func $f0_1 ($a,$i) = if (($i >= $s))
547+ then $a
548+ else fold($a, $l[$i])
549+
550+ func $f0_2 ($a,$i) = if (($i >= $s))
551+ then $a
552+ else throw("List size exceeds 30")
553+
554+ $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)
555+ }
556+ if ((value30p != ""))
557+ then value30p
558+ else {
559+ let $l = list30m
560+ let $s = size($l)
561+ let $acc0 = ""
562+ func $f1_1 ($a,$i) = if (($i >= $s))
563+ then $a
564+ else fold($a, $l[$i])
565+
566+ func $f1_2 ($a,$i) = if (($i >= $s))
567+ then $a
568+ else throw("List size exceeds 30")
569+
570+ $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)
571+ }
572+ }
573+
574+
575+func get_virtual_price_diff (_t0) = {
576+ let vp1 = virtual_price(get_D(big_list(balances), amp))
577+ let vp1_timestamp = lastBlock.timestamp
578+ let t0 = if ((0 >= _t0))
579+ then (vp1_timestamp + _t0)
580+ else _t0
581+ let t0_period = (t0 / VP_LOG_PERIOD)
582+ let log_value = get_nearest_log(t0_period)
583+ if ((log_value == ""))
584+ then $Tuple3(vp1, vp1, 0)
585+ else {
586+ let log_list = split(log_value, "_")
587+ let vp0 = parseIntValue(log_list[0])
588+ let vp0_timestamp = parseIntValue(log_list[2])
589+ $Tuple3(vp1, vp0, (vp1_timestamp - vp0_timestamp))
590+ }
591+ }
592+
593+
594+func get_volume_diff (_t0) = {
595+ let vol1 = parseBigIntValue(valueOrElse(getString("vol"), "0"))
596+ let vol1_timestamp = lastBlock.timestamp
597+ let t0 = if ((0 >= _t0))
598+ then (vol1_timestamp + _t0)
599+ else _t0
600+ let t0_period = (t0 / VP_LOG_PERIOD)
601+ let log_value = get_nearest_log(t0_period)
602+ if ((log_value == ""))
603+ then $Tuple3(vol1, vol1, 0)
604+ else {
605+ let log_list = split(log_value, "_")
606+ let vol0 = parseBigIntValue(log_list[1])
607+ let vol0_timestamp = parseIntValue(log_list[2])
608+ $Tuple3(vol1, vol0, (vol1_timestamp - vol0_timestamp))
609+ }
610+ }
611+
612+
613+func _calc_token_amount (new_balances) = {
614+ let D0 = if ((token_quantity == 0))
615+ then 0
616+ else get_D(big_list(balances), amp)
617+ let D1 = get_D(big_list(new_balances), amp)
618+ if (assert((D1 > D0)))
619+ then throw("D1 > D0")
620+ else {
621+ let $t01295914909 = if ((token_quantity > 0))
622+ then {
623+ func fee_balances (old,new) = {
624+ func fold (acc,index) = {
625+ let old_balance = old[index]
626+ let new_balance = new[index]
627+ let ideal_balance = fraction(D1, old_balance, D0)
628+ let difference = if ((ideal_balance > new_balance))
629+ then (ideal_balance - new_balance)
630+ else (new_balance - ideal_balance)
631+ let amount_fee = fraction(N_fee_4, difference, FEE_DENOMINATOR)
632+ let amount_admin_fee = fraction(amount_fee, admin_fee, FEE_DENOMINATOR)
633+ $Tuple4((acc._1 :+ (new_balance - amount_admin_fee)), (acc._2 :+ (new_balance - amount_fee)), if (if (is_auto_fees)
634+ then (amount_admin_fee > 0)
635+ else false)
636+ then (acc._3 :+ ScriptTransfer(owner, amount_admin_fee, fromBase58String(coins[index])))
637+ else acc._3, (acc._4 + fraction(amount_fee, TOKEN_RATE, rates[index])))
638+ }
639+
640+ let $l = index_N_COINS
641+ let $s = size($l)
642+ let $acc0 = $Tuple4(nil, nil, nil, 0)
643+ func $f0_1 ($a,$i) = if (($i >= $s))
644+ then $a
645+ else fold($a, $l[$i])
646+
647+ func $f0_2 ($a,$i) = if (($i >= $s))
648+ then $a
649+ else throw("List size exceeds 10")
650+
651+ $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)
652+ }
653+
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
659+ $Tuple3(finals, get_D(big_list(no_fees), amp), (actions ++ log_data(D0, if ((fee == 0))
660+ then 0
661+ else fraction(fee_sum, FEE_DENOMINATOR, fee))))
662+ }
663+ else $Tuple3(new_balances, D1, nil)
664+ let final_balances = $t01295914909._1
665+ let D2 = $t01295914909._2
666+ let fees_actions = $t01295914909._3
667+ let mint_amount = if ((token_quantity == 0))
668+ then D1
669+ else fraction(token_quantity, (D2 - D0), D0)
670+ $Tuple3(final_balances, mint_amount, fees_actions)
671+ }
672+ }
673+
674+
675+@Callable(msg)
676+func init (_owner,_coins,_pool_token,_A,_fee,_admin_fee) = if (isDefined(getString(this, "token")))
677+ then throw("already initialized")
678+ else if ((msg.caller != this))
679+ then throw("self initialization only")
680+ else {
681+ let coins_list = split(_coins, ",")
682+ let n = size(coins_list)
683+ if ((2 > n))
684+ then throw("too small coins")
685+ else if ((n > N_COINS_MAX))
686+ then throw("too many coins")
687+ else {
688+ func duplicates (acc,index) = if (if ((index >= n))
689+ then true
690+ else (acc == false))
691+ then acc
692+ else (indexOf(coins_list, coins_list[index]) == index)
693+
694+ if ((false == {
695+ let $l = index_N_COINS_MAX
696+ let $s = size($l)
697+ let $acc0 = true
698+ func $f0_1 ($a,$i) = if (($i >= $s))
699+ then $a
700+ else duplicates($a, $l[$i])
701+
702+ func $f0_2 ($a,$i) = if (($i >= $s))
703+ then $a
704+ else throw("List size exceeds 10")
705+
706+ $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)
707+ }))
708+ then throw("duplicate coin detected")
709+ else {
710+ func decimals (coin) = valueOrErrorMessage(assetInfo(valueOrErrorMessage(fromBase58String(coin), ("fromBase58String: " + coin))), ("assetInfo: " + coin)).decimals
711+
712+ func fold (acc,coin) = $Tuple3((acc._1 + 1), (acc._2 :+ 0), (acc._3 :+ pow(10, 0, decimals(coin), 0, 0, DOWN)))
713+
714+ let $t01617016265 = {
715+ let $l = coins_list
716+ let $s = size($l)
717+ let $acc0 = $Tuple3(0, nil, nil)
718+ func $f0_1 ($a,$i) = if (($i >= $s))
719+ then $a
720+ else fold($a, $l[$i])
721+
722+ func $f0_2 ($a,$i) = if (($i >= $s))
723+ then $a
724+ else throw("List size exceeds 10")
725+
726+ $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)
727+ }
728+ let _N_COINS = $t01617016265._1
729+ let zeros = $t01617016265._2
730+ let _rates = $t01617016265._3
731+ let issueToken = Issue(_pool_token, ("LP token for " + _coins), 0, TOKEN_DECIMALS, true)
732+ let tokenId = toBase58String(calculateAssetId(issueToken))
733+[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]
734+ }
735+ }
736+ }
737+
738+
739+
740+@Callable(msg)
741+func add_liquidity (min_mint_amount) = if (!(allowed(msg.caller)))
742+ then throw("!allowed")
743+ else if (assert(!(is_killed)))
744+ then throw("is killed")
745+ else {
746+ func update_1_balance (base,target,amount) = {
747+ func fold (acc,index) = (acc :+ (base[index] + (if ((index == target))
748+ then amount
749+ else 0)))
750+
751+ let $l = index_N_COINS
752+ let $s = size($l)
753+ let $acc0 = nil
754+ func $f0_1 ($a,$i) = if (($i >= $s))
755+ then $a
756+ else fold($a, $l[$i])
757+
758+ func $f0_2 ($a,$i) = if (($i >= $s))
759+ then $a
760+ else throw("List size exceeds 10")
761+
762+ $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)
763+ }
764+
765+ func up_balances (base,payments) = {
766+ let n = size(payments)
767+ if ((1 > n))
768+ then throw("payments size < 1")
769+ else if ((n > N_COINS_MAX))
770+ then throw("payments size > N_COINS_MAX")
771+ else {
772+ func fold (acc,payment) = update_1_balance(acc, coin_index(payment), payment.amount)
773+
774+ let $l = payments
775+ let $s = size($l)
776+ let $acc0 = base
777+ func $f0_1 ($a,$i) = if (($i >= $s))
778+ then $a
779+ else fold($a, $l[$i])
780+
781+ func $f0_2 ($a,$i) = if (($i >= $s))
782+ then $a
783+ else throw("List size exceeds 10")
784+
785+ $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)
786+ }
787+ }
788+
789+ let new_balances = up_balances(balances, msg.payments)
790+ if (if ((token_quantity == 0))
791+ then (min(new_balances) == 0)
792+ else false)
793+ then throw("initial deposit requires all coins")
794+ 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
799+ if (assert((mint_amount >= min_mint_amount)))
800+ then throw("slippage screwed you")
801+ else ([StringEntry("balances", makeString(list_itos(final_balances), ",")), Reissue(token, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, token)] ++ fees_actions)
802+ }
803+ }
804+
805+
806+
807+@Callable(msg)
808+func get_dy (i,j,dx) = {
809+ let xp_i = balances[i]
810+ let xp_j = balances[j]
811+ 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
815+ let _dy = ((xp_j - y) - 1)
816+ let dy_fee = fraction(_dy, fee, FEE_DENOMINATOR)
817+ let dy = (_dy - dy_fee)
818+ $Tuple2(nil, dy)
819+ }
820+
821+
822+
823+@Callable(msg)
824+func exchange (j,min_dy) = if (!(allowed(msg.caller)))
825+ then throw("!allowed")
826+ else if (assert(!(is_killed)))
827+ then throw("is killed")
828+ else if ((size(msg.payments) != 1))
829+ then throw("size( payments ) != 1")
830+ else {
831+ let payment = msg.payments[0]
832+ let dx = payment.amount
833+ let i = coin_index(payment)
834+ let xp_i = balances[i]
835+ let xp_j = balances[j]
836+ 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
840+ let _dy = ((xp_j - y) - 1)
841+ let dy_fee = fraction(_dy, fee, FEE_DENOMINATOR)
842+ let dy = (_dy - dy_fee)
843+ if (assert((dy >= min_dy)))
844+ then throw("exchange resulted in fewer coins than expected")
845+ else {
846+ let dy_admin_fee = fraction(dy_fee, admin_fee, FEE_DENOMINATOR)
847+ func fold (acc,index) = (acc :+ (if ((index == i))
848+ then (balances[index] + dx)
849+ else if ((index == j))
850+ then ((balances[index] - dy) - dy_admin_fee)
851+ else balances[index]))
852+
853+ let final_balances = {
854+ let $l = index_N_COINS
855+ let $s = size($l)
856+ let $acc0 = nil
857+ func $f0_1 ($a,$i) = if (($i >= $s))
858+ then $a
859+ else fold($a, $l[$i])
860+
861+ func $f0_2 ($a,$i) = if (($i >= $s))
862+ then $a
863+ else throw("List size exceeds 10")
864+
865+ $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)
866+ }
867+ let tokenOut = fromBase58String(coins[j])
868+ $Tuple2((([StringEntry("balances", makeString(list_itos(final_balances), ",")), ScriptTransfer(msg.caller, dy, tokenOut)] ++ (if (if (is_auto_fees)
869+ then (dy_admin_fee > 0)
870+ else false)
871+ then [ScriptTransfer(owner, dy_admin_fee, tokenOut)]
872+ else nil)) ++ log_data(D, if ((fee == 0))
873+ then 0
874+ else fraction(fraction(dy_fee, TOKEN_RATE, rates[j]), FEE_DENOMINATOR, fee))), dy)
875+ }
876+ }
877+
878+
879+
880+@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)))
906+ }
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+ }
928+
929+
930+
931+@Callable(msg)
932+func calc_withdraw_one_coin (_token_amount,i) = $Tuple2(nil, _calc_withdraw_one_coin(_token_amount, i)._1)
933+
934+
935+
936+@Callable(msg)
937+func remove_liquidity_one_coin (i,min_amount) = if (!(allowed(msg.caller)))
938+ then throw("!allowed")
939+ else if (assert(!(is_killed)))
940+ then throw("is killed")
941+ else if ((size(msg.payments) != 1))
942+ then throw("size( payments ) != 1")
943+ else {
944+ let payment = msg.payments[0]
945+ if ((payment.assetId != token))
946+ then throw("unknown token")
947+ else {
948+ 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
953+ if (assert((dy >= min_amount)))
954+ then throw("not enough coins removed")
955+ else {
956+ let dy_admin_fee = fraction(dy_fee, admin_fee, FEE_DENOMINATOR)
957+ let dy_and_fee = (dy + dy_admin_fee)
958+ func fold (acc,index) = (acc :+ (balances[index] - (if ((index == i))
959+ then dy_and_fee
960+ else 0)))
961+
962+ let final_balances = {
963+ let $l = index_N_COINS
964+ let $s = size($l)
965+ let $acc0 = nil
966+ func $f0_1 ($a,$i) = if (($i >= $s))
967+ then $a
968+ else fold($a, $l[$i])
969+
970+ func $f0_2 ($a,$i) = if (($i >= $s))
971+ then $a
972+ else throw("List size exceeds 10")
973+
974+ $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)
975+ }
976+ let tokenOut = fromBase58String(coins[i])
977+ $Tuple2((([StringEntry("balances", makeString(list_itos(final_balances), ",")), ScriptTransfer(msg.caller, dy, tokenOut), Burn(token, _token_amount)] ++ (if (if (is_auto_fees)
978+ then (dy_admin_fee > 0)
979+ else false)
980+ then [ScriptTransfer(owner, dy_admin_fee, tokenOut)]
981+ else nil)) ++ log_data(D, if ((fee == 0))
982+ then 0
983+ else fraction(fraction(dy_fee, TOKEN_RATE, rates[i]), FEE_DENOMINATOR, fee))), dy)
984+ }
985+ }
986+ }
987+
988+
989+
990+@Callable(msg)
991+func A () = $Tuple2(nil, amp)
992+
993+
994+
995+@Callable(msg)
996+func get_virtual_price () = {
997+ let D = get_D(big_list(balances), amp)
998+ $Tuple2(nil, virtual_price(D))
999+ }
1000+
1001+
1002+
1003+@Callable(msg)
1004+func calc_token_amount (_amounts) = {
1005+ let amounts = list_stoi(split(_amounts, ","))
1006+ if ((size(amounts) != N_COINS))
1007+ then throw("not enought amounts")
1008+ else {
1009+ func fold (acc,index) = (acc :+ (balances[index] + amounts[index]))
1010+
1011+ let new_balances = {
1012+ let $l = index_N_COINS
1013+ let $s = size($l)
1014+ let $acc0 = nil
1015+ func $f0_1 ($a,$i) = if (($i >= $s))
1016+ then $a
1017+ else fold($a, $l[$i])
1018+
1019+ func $f0_2 ($a,$i) = if (($i >= $s))
1020+ then $a
1021+ else throw("List size exceeds 10")
1022+
1023+ $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)
1024+ }
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
1029+ $Tuple2(nil, mint_amount)
1030+ }
1031+ }
1032+
1033+
1034+
1035+@Callable(msg)
1036+func ramp_A (_future_A,_future_time) = if (assert((msg.caller == owner)))
1037+ then throw("only owner")
1038+ else if (assert(if ((initial_A_time == 0))
1039+ then true
1040+ else (block_timestamp >= (initial_A_time + MIN_RAMP_TIME))))
1041+ then throw("too often")
1042+ else if (assert((_future_time >= (block_timestamp + MIN_RAMP_TIME))))
1043+ then throw("insufficient time")
1044+ else {
1045+ let _initial_A = amp
1046+ if (assert(if ((_future_A > 0))
1047+ then (MAX_A > _future_A)
1048+ else false))
1049+ then throw("out of base range")
1050+ else if (assert(if (if ((_future_A >= _initial_A))
1051+ then ((_initial_A * MAX_A_CHANGE) >= _future_A)
1052+ else false)
1053+ then true
1054+ else if ((_initial_A > _future_A))
1055+ then ((_future_A * MAX_A_CHANGE) >= _initial_A)
1056+ else false))
1057+ then throw("out of range")
1058+ else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _future_A), IntegerEntry("initial_A_time", block_timestamp), IntegerEntry("future_A_time", _future_time)]
1059+ }
1060+
1061+
1062+
1063+@Callable(msg)
1064+func stop_ramp_A () = if (assert((msg.caller == owner)))
1065+ then throw("only owner")
1066+ else {
1067+ let current_A = amp
1068+[IntegerEntry("initial_A", current_A), IntegerEntry("future_A", current_A), IntegerEntry("initial_A_time", block_timestamp), IntegerEntry("future_A_time", block_timestamp)]
1069+ }
1070+
1071+
1072+
1073+@Callable(msg)
1074+func commit_new_fee (new_fee,new_admin_fee) = if (assert((msg.caller == owner)))
1075+ then throw("only owner")
1076+ else if (assert((admin_actions_deadline == 0)))
1077+ then throw("active action")
1078+ else if (assert((MAX_FEE >= new_fee)))
1079+ then throw("fee exceeds maximum")
1080+ else if (assert((MAX_ADMIN_FEE >= new_admin_fee)))
1081+ then throw("admin fee exceeds maximum")
1082+ else {
1083+ let _deadline = (block_timestamp + ADMIN_ACTIONS_DELAY)
1084+[IntegerEntry("admin_actions_deadline", _deadline), IntegerEntry("future_fee", new_fee), IntegerEntry("future_admin_fee", new_admin_fee)]
1085+ }
1086+
1087+
1088+
1089+@Callable(msg)
1090+func apply_new_fee () = if (assert((msg.caller == owner)))
1091+ then throw("only owner")
1092+ else if (assert((block_timestamp >= admin_actions_deadline)))
1093+ then throw("insufficient time")
1094+ else if (assert((admin_actions_deadline != 0)))
1095+ then throw("no active action")
1096+ else [IntegerEntry("admin_actions_deadline", 0), IntegerEntry("fee", future_fee), IntegerEntry("admin_fee", future_admin_fee)]
1097+
1098+
1099+
1100+@Callable(msg)
1101+func revert_new_parameters () = if (assert((msg.caller == owner)))
1102+ then throw("only owner")
1103+ else [IntegerEntry("admin_actions_deadline", 0)]
1104+
1105+
1106+
1107+@Callable(msg)
1108+func commit_transfer_ownership (_owner) = if (assert((msg.caller == owner)))
1109+ then throw("only owner")
1110+ else if (assert((transfer_ownership_deadline == 0)))
1111+ then throw("active transfer")
1112+ else {
1113+ let _deadline = (block_timestamp + ADMIN_ACTIONS_DELAY)
1114+[IntegerEntry("transfer_ownership_deadline", _deadline), StringEntry("future_owner", checkAddress(_owner))]
1115+ }
1116+
1117+
1118+
1119+@Callable(msg)
1120+func apply_transfer_ownership () = if (assert((msg.caller == owner)))
1121+ then throw("only owner")
1122+ else if (assert((block_timestamp >= transfer_ownership_deadline)))
1123+ then throw("insufficient time")
1124+ else if (assert((transfer_ownership_deadline != 0)))
1125+ then throw("no active transfer")
1126+ else [IntegerEntry("transfer_ownership_deadline", 0), StringEntry("owner", future_owner)]
1127+
1128+
1129+
1130+@Callable(msg)
1131+func revert_transfer_ownership () = if (assert((msg.caller == owner)))
1132+ then throw("only owner")
1133+ else [IntegerEntry("transfer_ownership_deadline", 0)]
1134+
1135+
1136+
1137+@Callable(msg)
1138+func admin_balances (i) = $Tuple2(nil, admin_balance(i))
1139+
1140+
1141+
1142+@Callable(msg)
1143+func withdraw_admin_fees () = if (assert((msg.caller == owner)))
1144+ then throw("only owner")
1145+ else {
1146+ func fold (acc,index) = (acc :+ ScriptTransfer(owner, admin_balance(index), fromBase58String(coins[index])))
1147+
1148+ let $l = index_N_COINS
1149+ let $s = size($l)
1150+ let $acc0 = nil
1151+ func $f0_1 ($a,$i) = if (($i >= $s))
1152+ then $a
1153+ else fold($a, $l[$i])
1154+
1155+ func $f0_2 ($a,$i) = if (($i >= $s))
1156+ then $a
1157+ else throw("List size exceeds 10")
1158+
1159+ $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)
1160+ }
1161+
1162+
1163+
1164+@Callable(msg)
1165+func donate_admin_fees () = if (assert((msg.caller == owner)))
1166+ then throw("only owner")
1167+ else {
1168+ func fold (acc,index) = (acc :+ (balances[index] + admin_balance(index)))
1169+
1170+ let new_balances = {
1171+ let $l = index_N_COINS
1172+ let $s = size($l)
1173+ let $acc0 = nil
1174+ func $f0_1 ($a,$i) = if (($i >= $s))
1175+ then $a
1176+ else fold($a, $l[$i])
1177+
1178+ func $f0_2 ($a,$i) = if (($i >= $s))
1179+ then $a
1180+ else throw("List size exceeds 10")
1181+
1182+ $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)
1183+ }
1184+[StringEntry("balances", makeString(list_itos(new_balances), ","))]
1185+ }
1186+
1187+
1188+
1189+@Callable(msg)
1190+func set_auto_fees (_is_auto_fees) = if (assert((msg.caller == owner)))
1191+ then throw("only owner")
1192+ else [BooleanEntry("is_auto_fees", _is_auto_fees)]
1193+
1194+
1195+
1196+@Callable(msg)
1197+func kill_me () = if (assert((msg.caller == owner)))
1198+ then throw("only owner")
1199+ else if (assert((kill_deadline > block_timestamp)))
1200+ then throw("deadline has passed")
1201+ else [BooleanEntry("is_killed", true)]
1202+
1203+
1204+
1205+@Callable(msg)
1206+func unkill_me () = if (assert((msg.caller == owner)))
1207+ then throw("only owner")
1208+ else [BooleanEntry("is_killed", false)]
1209+
1210+
1211+
1212+@Callable(msg)
1213+func set_height_address (_heightAddress) = if ((msg.caller != owner))
1214+ then throw("only owner")
1215+ else [StringEntry("heightAddress", checkAddress(_heightAddress))]
1216+
1217+
1218+
1219+@Callable(i)
1220+func set_verifier (verifier) = if ((i.caller != this))
1221+ then throw("self call only")
1222+ else {
1223+ let addressOK = match addressFromString(verifier) {
1224+ case a: Address =>
1225+ true
1226+ case _ =>
1227+ false
1228+ }
1229+ if (!(addressOK))
1230+ then throw(("verifier wrong address " + verifier))
1231+ else if (isDefined(getString(this, "verifier")))
1232+ then throw("verifier already defined")
1233+ else [StringEntry("verifier", verifier)]
1234+ }
1235+
1236+
1237+@Verifier(tx)
1238+func verify () = match getString(this, "verifier") {
1239+ case verifier: String =>
1240+ valueOrElse(getBoolean(addressFromStringValue(verifier), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
1241+ case _ =>
1242+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
1243+}
1244+

github/deemru/w8io/3ef1775 
228.21 ms