tx · XY6hGBKpNyBmSgpdyHEkELsYa1mxqM7Gk9RKq32XTzm

3N85YW6NZ9pLYvSdt1ASMQTGxvncnU1vUNx:  -0.10000000 Waves

2022.12.05 07:26 [2346572] smart account 3N85YW6NZ9pLYvSdt1ASMQTGxvncnU1vUNx > SELF 0.00000000 Waves

{ "type": 13, "id": "XY6hGBKpNyBmSgpdyHEkELsYa1mxqM7Gk9RKq32XTzm", "fee": 10000000, "feeAssetId": null, "timestamp": 1670214397132, "version": 2, "chainId": 84, "sender": "3N85YW6NZ9pLYvSdt1ASMQTGxvncnU1vUNx", "senderPublicKey": "EKZmHJ5bK3qKKgRdq8rAamt9qrDbVMLARzRqXoQW258v", "proofs": [ "2eF2LPkoufHobrVEZNFYFRBLUyzKxKj7ecVWSqLmH8Eq549fR3UcNSYF9T7j4XZcmf1SLQDvGGka53juh3LiBAkD" ], "script": "base64:BgI7CAISCwoJCAgICAgBCAgIEgMKAQESBAoCCAgSBgoECAgBARIGCgQICAgIEgUKAwgIARIDCgEIEgMKAQgpAAlzZXBhcmF0b3ICAV8ACGtBdWN0aW9uAgdhdWN0aW9uAAVrU2VsbAIEc2VsbAAIa1RydXN0ZWQCB3RydXN0ZWQABmtQcmljZQIFcHJpY2UBCmdldFNsb3RLZXkCBnByZWZpeAVuZnRJZAkArAICCQCsAgIFBnByZWZpeAUJc2VwYXJhdG9yCQDYBAEFBW5mdElkAQtnZXRQcmljZUtleQEFbmZ0SWQJAKwCAgkArAICBQZrUHJpY2UFCXNlcGFyYXRvcgkA2AQBBQVuZnRJZAEKZ2V0U2VsbEtleQEFbmZ0SWQJAKwCAgkArAICBQVrU2VsbAUJc2VwYXJhdG9yCQDYBAEFBW5mdElkAQ1nZXRBdWN0aW9uS2V5AQVuZnRJZAkArAICCQCsAgIFCGtBdWN0aW9uBQlzZXBhcmF0b3IJANgEAQUFbmZ0SWQBDWdldFRydXN0ZWRLZXkBBmlzc3VlcgkArAICCQCsAgIFCGtUcnVzdGVkBQlzZXBhcmF0b3IJAKUIAQUGaXNzdWVyAQlhZGRUb0xpc3QCBWFjY3VtCW5leHRWYWx1ZQkAzggCBQVhY2N1bQkAzAgCBQluZXh0VmFsdWUFA25pbAEKam9pblN0cmluZwEGcGFyYW1zBAZsZW5ndGgJAJADAQUGcGFyYW1zAwkAAAIFBmxlbmd0aAAACQACAQINRW1wdHkgIHBhcmFtcwMJAAACBQZsZW5ndGgAAQkAuQkCCgACJGwFBnBhcmFtcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJYWRkVG9MaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAxCQEFJGYwXzICCQEFJGYwXzECBQUkYWNjMAAAAAEFCXNlcGFyYXRvcgMJAAACBQZsZW5ndGgAAgkAuQkCCgACJGwFBnBhcmFtcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJYWRkVG9MaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgUJc2VwYXJhdG9yAwkAAAIFBmxlbmd0aAADCQC5CQIKAAIkbAUGcGFyYW1zCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlhZGRUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMFCXNlcGFyYXRvcgMJAAACBQZsZW5ndGgABAkAuQkCCgACJGwFBnBhcmFtcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJYWRkVG9MaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA0CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQFCXNlcGFyYXRvcgMJAAACBQZsZW5ndGgABQkAuQkCCgACJGwFBnBhcmFtcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJYWRkVG9MaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQUJc2VwYXJhdG9yCQACAQIhTWF4IG51bWJlciBvZiBwYXJhbWV0ZXJzIGV4Y2VlZGVkAQ5wYXJzZUFzQXVjdGlvbgEHZGV0YWlscwQDcmVzCQC1CQIFB2RldGFpbHMFCXNlcGFyYXRvcgkAlwoFCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFA3JlcwAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDcmVzAAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNyZXMAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA3JlcwADCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDcmVzAAQBC3BhcnNlQXNTZWxsAQdkZXRhaWxzBANyZXMJALUJAgUHZGV0YWlscwUJc2VwYXJhdG9yCQCUCgIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUDcmVzAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNyZXMAAQEKam9pblN0cnVjdAEGcGFyYW1zBAckbWF0Y2gwBQZwYXJhbXMDCQABAgUHJG1hdGNoMAIeKEFkZHJlc3MsIEludCwgU3RyaW5nLCBTdHJpbmcpBAdhdWN0aW9uBQckbWF0Y2gwCQEKam9pblN0cmluZwEJAMwIAgkApQgBCAUHYXVjdGlvbgJfMQkAzAgCCQCkAwEIBQdhdWN0aW9uAl8yCQDMCAIIBQdhdWN0aW9uAl8zCQDMCAIIBQdhdWN0aW9uAl80BQNuaWwDCQABAgUHJG1hdGNoMAIOKEFkZHJlc3MsIEludCkEBHNlbGwFByRtYXRjaDAJAQpqb2luU3RyaW5nAQkAzAgCCQClCAEIBQRzZWxsAl8xCQDMCAIJAKQDAQgFBHNlbGwCXzIFA25pbAkAAgECE1dyb25nIHBhcmFtcyB0dXBwbGUBCnNldEF1Y3Rpb24FBnNlbGxlcgVuZnRJZApzdGFydFByaWNlBXN0YXJ0A2VuZAkBC1N0cmluZ0VudHJ5AgkBDWdldEF1Y3Rpb25LZXkBBQVuZnRJZAkBCmpvaW5TdHJ1Y3QBCQCWCgQFBnNlbGxlcgUKc3RhcnRQcmljZQUFc3RhcnQFA2VuZAEHc2V0U2VsbAMFbmZ0SWQGY2VsbGVyBXByaWNlCQELU3RyaW5nRW50cnkCCQEKZ2V0U2VsbEtleQEFBW5mdElkCQEKam9pblN0cnVjdAEJAJQKAgUGY2VsbGVyBQVwcmljZQEKZ2V0QXVjdGlvbgEFbmZ0SWQJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkBDWdldEF1Y3Rpb25LZXkBBQVuZnRJZAEHZ2V0U2VsbAEFbmZ0SWQJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkBCmdldFNlbGxLZXkBBQVuZnRJZAEYY2FsY1ByaWNlQXRDdXJyZW50TW9tZW50Agdhc3NldElkBm1vbWVudAQHZGV0YWlscwkBCmdldEF1Y3Rpb24BBQdhc3NldElkBAskdDAyNzU1Mjg1OQkBDnBhcnNlQXNBdWN0aW9uAQUHZGV0YWlscwQGc2VsbGVyCAULJHQwMjc1NTI4NTkCXzEED3N0YXJ0UHJpY2VWYWx1ZQgFCyR0MDI3NTUyODU5Al8yBA1lbmRQcmljZVZhbHVlCAULJHQwMjc1NTI4NTkCXzMEEHN0YXJ0UGVyaW9kVmFsdWUIBQskdDAyNzU1Mjg1OQJfNAQOZW5kUGVyaW9kVmFsdWUIBQskdDAyNzU1Mjg1OQJfNQMJAGcCBQZtb21lbnQFDmVuZFBlcmlvZFZhbHVlCQCUCgIFBnNlbGxlcgUNZW5kUHJpY2VWYWx1ZQQKZGVsdGFQcmljZQkAZQIFD3N0YXJ0UHJpY2VWYWx1ZQUNZW5kUHJpY2VWYWx1ZQQGcGVyaW9kCQBlAgUOZW5kUGVyaW9kVmFsdWUFEHN0YXJ0UGVyaW9kVmFsdWUEB3NwZW5kZWQJAGUCBQZtb21lbnQFEHN0YXJ0UGVyaW9kVmFsdWUJAJQKAgUGc2VsbGVyCQBlAgUPc3RhcnRQcmljZVZhbHVlCQBrAwUHc3BlbmRlZAUKZGVsdGFQcmljZQUGcGVyaW9kAQVpc05mdAEHYXNzZXRJZAQHJG1hdGNoMAkA7AcBBQdhc3NldElkAwkAAQIFByRtYXRjaDACBUFzc2V0BAV0b2tlbgUHJG1hdGNoMAMDCQAAAggFBXRva2VuCGRlY2ltYWxzAAAJAAACCAUFdG9rZW4IcXVhbnRpdHkAAQcJAAACCAUFdG9rZW4KcmVpc3N1YWJsZQcHBwEMaXNUcnVzdGVkTmZ0AQdhc3NldElkBAZpc3N1ZXIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQGaXNzdWVyCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAQ1nZXRUcnVzdGVkS2V5AQUGaXNzdWVyBwELaXNTZWxsRXhpc3QBB2Fzc2V0SWQJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAQpnZXRTZWxsS2V5AQUHYXNzZXRJZAEOaXNBdWN0aW9uRXhpc3QBB2Fzc2V0SWQJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAQ1nZXRBdWN0aW9uS2V5AQUHYXNzZXRJZAESaXNDb3JyZWN0U2VsbFByaWNlAQVwcmljZQkAZgIFBXByaWNlAAABFmlzQ29ycmVjdEF1Y3Rpb25QcmljZXMCCnN0YXJ0UHJpY2UIZW5kUHJpY2UJAGYCBQpzdGFydFByaWNlBQhlbmRQcmljZQEHaXNBZG1pbgEGY2FsbGVyCQAAAgUGY2FsbGVyBQR0aGlzAQ1pc1ZhbGlkQ2FsbGVyAgZjYWxsZXIGc2VsbGVyAwkAAAIFBmNhbGxlcgUEdGhpcwYJAAACBQZjYWxsZXIFBnNlbGxlcgEOaXNBdWN0aW9uRW5kZWQCA25vdwNlbmQJAGYCBQNub3cFA2VuZAENaXNFbm91Z2hGdW5kcwIHcGF5bWVudBJjdXJyZW50TW9tZW50UHJpY2UJAGcCBQdwYXltZW50BRJjdXJyZW50TW9tZW50UHJpY2UBB2lzV2F3ZXMBB2Fzc2V0SWQJAAACBQdhc3NldElkBQR1bml0AQxpc0NvcnJlY3ROZnQBBW5mdElkAwkBASEBCQEFaXNOZnQBBQVuZnRJZAkAAgECEFRva2VuIGlzIG5vdCBOZnQDCQELaXNTZWxsRXhpc3QBBQVuZnRJZAkAAgECE1NlbGwgYWxyZWFkeSBleGlzdHMDCQEOaXNBdWN0aW9uRXhpc3QBBQVuZnRJZAkAAgECFkF1Y3Rpb24gYWxyZWFkeSBleGlzdHMFBHVuaXQBEWlzQ29ycmVjdFBheW1lbnRzAwxwYXltZW50QXNzZXQNcGF5bWVudEFtb3VudAVwcmljZQMJAQEhAQkBB2lzV2F3ZXMBBQxwYXltZW50QXNzZXQJAAIBAhhQYXltZW50IG11c3QgYmUgYXQgV0FWRVMDCQEBIQEJAQ1pc0Vub3VnaEZ1bmRzAgUNcGF5bWVudEFtb3VudAUFcHJpY2UJAAIBAhBOb3QgZW5vdWdoIGZ1bmRzBQR1bml0AQdjYWxjRmVlAAAAAQ5jYWxjVHJ1c3RlZEZlZQAAAAEScmVzdWx0RnVuZHNBbW91bnRzAwlpc1RydXN0ZWQNcGF5bWVudEFtb3VudAthY3R1YWxQcmljZQMFCWlzVHJ1c3RlZAkAlAoCCQBlAgULYWN0dWFsUHJpY2UJAQ5jYWxjVHJ1c3RlZEZlZQAJAGUCBQ1wYXltZW50QW1vdW50BQthY3R1YWxQcmljZQkAlAoCCQBlAgULYWN0dWFsUHJpY2UJAQdjYWxjRmVlAAkAZQIFDXBheW1lbnRBbW91bnQFC2FjdHVhbFByaWNlAQdnZXRTbG90AQVuZnRJZAMJAQtpc1NlbGxFeGlzdAEFBW5mdElkCQCUCgIFBWtTZWxsCQEHZ2V0U2VsbAEFBW5mdElkAwkBDmlzQXVjdGlvbkV4aXN0AQUFbmZ0SWQJAJQKAgUIa0F1Y3Rpb24JAQpnZXRBdWN0aW9uAQUFbmZ0SWQJAAIBAhJTbG90IGRvZXNuYHQgZXhpc3QABGtCdXkCA2J1eQAEa0JpZAIDYmlkAAxzdGF0dXNGb3JORlQJAJYKBAIET1BFTgIGQ0xPU0VEAghSRVdBUkRFRAIIQ0FOQ0VMRUQAC2RBcHBBZGRyZXNzARoBVEq4T2zewtqT7fSO6Uo2+NVPf5XVVVtdoAgBaQEJY3JlYXRlTmZ0CQhuZnRfbmFtZQluZnRfb3duZXIPbmZ0X2RBcHBBZGRyZXNzCG5mdF90eXBlCG5mdF90YWdzEW5mdF9zZWxsaW5nX3ByaWNlD25mdF9kZXNjcmlwdGlvbgpuZnRfb25TZWxsCG5mdF9kYXRhBAhuZXdUb2tlbgkAwggFBQhuZnRfbmFtZQUPbmZ0X2Rlc2NyaXB0aW9uAAEAAAcEB2lzc3VlSWQJALgIAQUIbmV3VG9rZW4EBHR4SWQIBQFpDXRyYW5zYWN0aW9uSWQJAMwIAgUIbmV3VG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEFB2lzc3VlSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJANgEAQUHaXNzdWVJZAUJc2VwYXJhdG9yAgVPd25lcgkApQgBCAUBaQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJANgEAQUHaXNzdWVJZAUJc2VwYXJhdG9yAghuZnRfdHlwZQUIbmZ0X3R5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJANgEAQUHaXNzdWVJZAUJc2VwYXJhdG9yAghuZnRfdGFncwUIbmZ0X3RhZ3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJANgEAQUHaXNzdWVJZAUJc2VwYXJhdG9yAg9uZnRfZEFwcEFkZHJlc3MFD25mdF9kQXBwQWRkcmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJANgEAQUHaXNzdWVJZAUJc2VwYXJhdG9yAhFuZnRfc2VsbGluZ19wcmljZQURbmZ0X3NlbGxpbmdfcHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJANgEAQUHaXNzdWVJZAUJc2VwYXJhdG9yAgpuZnRfb25TZWxsBQpuZnRfb25TZWxsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQDYBAEFB2lzc3VlSWQFCXNlcGFyYXRvcgIIbmZ0X2RhdGEFCG5mdF9kYXRhCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQDYBAEFBHR4SWQFCXNlcGFyYXRvcgIJaXNzdWVfbmZ0CQDYBAEFB2lzc3VlSWQFA25pbAFpAQdzZWxsTkZUAQVwcmljZQQEdHhJZAgFAWkNdHJhbnNhY3Rpb25JZAQGc2VsbGVyCAgFAWkGY2FsbGVyBWJ5dGVzBAskdDA2NjA1NjY5MAkAlAoCCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAZ0b2tlbjAIBQskdDA2NjA1NjY5MAJfMQQHYW1vdW50MAgFCyR0MDY2MDU2NjkwAl8yAwkBASEBCQEFaXNOZnQBBQZ0b2tlbjAJAAIBAhBUb2tlbiBpcyBub3QgTkZUCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQZrUHJpY2UFCXNlcGFyYXRvcgkA2AQBCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJAKQDAQUFcHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyBQlzZXBhcmF0b3IFBWtTZWxsCQCsAgIJAKwCAgkA2AQBBQZ0b2tlbjAFCXNlcGFyYXRvcgkApAMBBQdhbW91bnQwBQNuaWwBaQEGYnV5TkZUAgVuZnRJRBFjdXJyZW50X25mdF9vd25lcgQHYXNzZXRJZAkA2QQBBQVuZnRJRAQGYW1vdW50CQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQQY2hlY2tPd25lcklzU2FtZQQHJG1hdGNoMAkAnQgCBQR0aGlzCQCsAgIJAKwCAgIEbmZ0XwURY3VycmVudF9uZnRfb3duZXICBl9vd25lcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWEHBAVwcmljZQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQCsAgIJAKwCAgkArAICBQZrUHJpY2UFCXNlcGFyYXRvcgUFbmZ0SUQCAV8FEWN1cnJlbnRfbmZ0X293bmVyBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAKwCAgUFbmZ0SUQFCXNlcGFyYXRvcgIFT3duZXICCE5vIG93bmVyAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0CQACAQIMUGF5IGluIHdhdmVzAwkAAAIFEGNoZWNrT3duZXJJc1NhbWUJAKUIAQgFAWkGY2FsbGVyCQACAQIhT3duZXIgb2YgTkZUIG5vdCBhYmxlIHRvIHB1cmNoYXNlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQVvd25lcgUGYW1vdW50BQR1bml0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgUJc2VwYXJhdG9yBQRrQnV5CQCsAgIJAKwCAgUFbmZ0SUQFCXNlcGFyYXRvcgkApAMBBQZhbW91bnQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FEWN1cnJlbnRfbmZ0X293bmVyAgZfb3duZXIFA25pbAFpAQphZGRBdWN0aW9uBAVzdGFydANlbmQKc3RhcnRQcmljZQhkdXJhdGlvbgQEdHhJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAVuZnRJZAkBBXZhbHVlAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAVwcmljZQkBBXZhbHVlAQUKc3RhcnRQcmljZQQGY2FsbGVyCAgFAWkGY2FsbGVyBWJ5dGVzBBFjaGVja05mdEF1Y3Rpb25lZAQHJG1hdGNoMAkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQDYBAEFBW5mdElkBQlzZXBhcmF0b3ICC25mdF9zdGF0dXNfCQDYBAEFBmNhbGxlcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAGBwMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFBHVuaXQJAAIBAhBORlQgbm90IGF0dGFjaGVkAwkAAAIFEWNoZWNrTmZ0QXVjdGlvbmVkBgkAAgECF0FscmVhZHkgaW4gYXVjdGlvbiBsaXN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQR0eElkAhhfbmZ0X3N0YXJ0X2F1Y3Rpb25fZGF0ZV8JANgEAQUGY2FsbGVyBQVzdGFydAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUEdHhJZAIWX25mdF9lbmRfYXVjdGlvbl9kYXRlXwkA2AQBBQZjYWxsZXIFA2VuZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR0eElkAhBfbmZ0X3N0YXJ0X3ByaWNlBQpzdGFydFByaWNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAIKX25mdF9vd25lcgkApQgBCAUBaQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAg9fbmZ0X29uX2F1Y3Rpb24JANgEAQUFbmZ0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAhBfcHJldmlvdXNfYmlkZGVyAgRub25lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAIMX2hpZ2hlc3RfYmlkCQCkAwEFCnN0YXJ0UHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAg5fd2lubmVyX29mX25mdAIBMAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBHR4SWQCDV9iaWRkZXJfY291bnQCATAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIFBHR4SWQCC19uZnRfc3RhdHVzCQDYBAEFBmNhbGxlcgIET1BFTgUDbmlsAWkBCHBsYWNlQmlkBAlhdWN0aW9uSWQFbmZ0SWQJbmZ0X293bmVyCWJpZF9wcmljZQQEdHhJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAZjYWxsZXIICAUBaQZjYWxsZXIFYnl0ZXMEB2Fzc2V0SWQJANkEAQUFbmZ0SWQED2N1cnJlbnRCaWRQcmljZQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEFWdldExhc3RXaW5uZXJCaWRQcmljZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCDF9oaWdoZXN0X2JpZAQYZ2V0UHJldmlvdXNCaWRkZXJBZGRyZXNzCQCdCAIFBHRoaXMJAKwCAgUJYXVjdGlvbklkAhBfcHJldmlvdXNfYmlkZGVyBA9jdXJyZW50QmlkQ291bnQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUJYXVjdGlvbklkAg1fYmlkZGVyX2NvdW50BBRnZXRMYXN0V2lubmVyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCDl93aW5uZXJfb2ZfbmZ0BBFjaGVja05mdEF1Y3Rpb25lZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCC19uZnRfc3RhdHVzAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0CQACAQIMUGF5IGluIHdhdmVzAwkBAiE9AgURY2hlY2tOZnRBdWN0aW9uZWQCBE9QRU4JAAIBAhROb3Qgb3BlbiBmb3IgYXVjdGlvbgMJAGcCCQENcGFyc2VJbnRWYWx1ZQEFFWdldExhc3RXaW5uZXJCaWRQcmljZQUPY3VycmVudEJpZFByaWNlCQACAQIlQmlkIGlzIGxlc3MgdGhlbiBzdGFydGluZy9oaWdoZXN0IEJpZAMJAAACBRVnZXRMYXN0V2lubmVyQmlkUHJpY2UCATAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQlhdWN0aW9uSWQCDF9oaWdoZXN0X2JpZAkApAMBBQ9jdXJyZW50QmlkUHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQlhdWN0aW9uSWQCDl93aW5uZXJfb2ZfbmZ0CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQlhdWN0aW9uSWQCDV9iaWRkZXJfY291bnQJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQUPY3VycmVudEJpZENvdW50AAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQlhdWN0aW9uSWQCB19uZnRfaWQJANgEAQUHYXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAIKX25mdF9vd25lcgUJbmZ0X293bmVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFBHR4SWQCAV8FCWF1Y3Rpb25JZAIMX2hpZ2hlc3RfYmlkCQCkAwEFD2N1cnJlbnRCaWRQcmljZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQR0eElkAgFfBQlhdWN0aW9uSWQCB193aW5uZXIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQR0eElkAgFfBQlhdWN0aW9uSWQCDV9iaWRkZXJfY291bnQJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQUPY3VycmVudEJpZENvdW50AAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdHhJZAIBXwUJYXVjdGlvbklkAgdfbmZ0X2lkCQDYBAEFB2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdHhJZAIBXwUJYXVjdGlvbklkAgpfbmZ0X293bmVyBQluZnRfb3duZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAg9fYmlkX2Zvcl9uZnRfYnkJANgEAQUGY2FsbGVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAIQX2JpZF9wcmljZV9wbGFjZQUJYmlkX3ByaWNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAImX3ByZXZpb3VzX2JpZF9hbW91bnRfcmVmdW5kX3RvX2FkZHJlc3MFFGdldExhc3RXaW5uZXJBZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAIbX3ByZXZvaXVzX2JpZF9hbW91bnRfcmVmdW5kBRVnZXRMYXN0V2lubmVyQmlkUHJpY2UFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAIMX2hpZ2hlc3RfYmlkCQCkAwEFD2N1cnJlbnRCaWRQcmljZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAIOX3dpbm5lcl9vZl9uZnQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAINX2JpZGRlcl9jb3VudAkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBBQ9jdXJyZW50QmlkQ291bnQAAQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAIHX25mdF9pZAkA2AQBBQdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUJYXVjdGlvbklkAgpfbmZ0X293bmVyBQluZnRfb3duZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdHhJZAIBXwUJYXVjdGlvbklkAgxfaGlnaGVzdF9iaWQJAKQDAQUPY3VycmVudEJpZFByaWNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFBHR4SWQCAV8FCWF1Y3Rpb25JZAIHX3dpbm5lcgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFBHR4SWQCAV8FCWF1Y3Rpb25JZAINX2JpZGRlcl9jb3VudAkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBBQ9jdXJyZW50QmlkQ291bnQAAQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQR0eElkAgFfBQlhdWN0aW9uSWQCB19uZnRfaWQJANgEAQUHYXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQR0eElkAgFfBQlhdWN0aW9uSWQCCl9uZnRfb3duZXIFCW5mdF9vd25lcgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBHR4SWQCD19iaWRfZm9yX25mdF9ieQkA2AQBBQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAhBfYmlkX3ByaWNlX3BsYWNlBQliaWRfcHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAiZfcHJldmlvdXNfYmlkX2Ftb3VudF9yZWZ1bmRfdG9fYWRkcmVzcwUUZ2V0TGFzdFdpbm5lckFkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAhtfcHJldm9pdXNfYmlkX2Ftb3VudF9yZWZ1bmQFFWdldExhc3RXaW5uZXJCaWRQcmljZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUUZ2V0TGFzdFdpbm5lckFkZHJlc3MJAQ1wYXJzZUludFZhbHVlAQUVZ2V0TGFzdFdpbm5lckJpZFByaWNlBQR1bml0BQNuaWwBaQEOYWNjZXB0QmlkT2ZmZXIDCWF1Y3Rpb25JZAVuZnRJZBRiaWRfYW1vdW50X2Zyb21fdXNlcgQEdHhJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAZjYWxsZXIICAUBaQZjYWxsZXIFYnl0ZXMEB2Fzc2V0SWQJANkEAQUFbmZ0SWQEEmdldE5mdFdpbm5pbmdQcmljZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCDF9oaWdoZXN0X2JpZAQQZ2V0QXVjdGlvbldpbm5lcgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCDl93aW5uZXJfb2ZfbmZ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUGY2FsbGVyCQENcGFyc2VJbnRWYWx1ZQEFEmdldE5mdFdpbm5pbmdQcmljZQUEdW5pdAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUQZ2V0QXVjdGlvbldpbm5lcgABBQdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAIVX2Ftb3VudF9wYWlkX3RvX293bmVyBRJnZXROZnRXaW5uaW5nUHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAhBfbmZ0X3RyYW5zZmVyX3RvBRBnZXRBdWN0aW9uV2lubmVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAILX25mdF9zdGF0dXMCCFJFV0FSREVECQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUJYXVjdGlvbklkAhVfYW1vdW50X3BhaWRfdG9fb3duZXIFEmdldE5mdFdpbm5pbmdQcmljZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAIQX25mdF90cmFuc2Zlcl90bwUQZ2V0QXVjdGlvbldpbm5lcgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAILX25mdF9zdGF0dXMCCFJFV0FSREVEBQNuaWwBaQENY2FuY2VsQXVjdGlvbgEJYXVjdGlvbklkBAR0eElkCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQEBmNhbGxlcggIBQFpBmNhbGxlcgVieXRlcwQNYXVjdGlvblN0YXR1cwkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCC19uZnRfc3RhdHVzBA1iaWRkaW5nV2lubmVyCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFCWF1Y3Rpb25JZAIOX3dpbm5lcl9vZl9uZnQECG5mdE93bmVyCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFCWF1Y3Rpb25JZAIKX25mdF9vd25lcgQFbmZ0SWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUJYXVjdGlvbklkAg9fbmZ0X29uX2F1Y3Rpb24EDGJpZGRpbmdQcmljZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCDF9oaWdoZXN0X2JpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAILX25mdF9zdGF0dXMCCENBTkNFTEVECQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUJYXVjdGlvbklkAiZfcHJldmlvdXNfYmlkX2Ftb3VudF9yZWZ1bmRfdG9fYWRkcmVzcwUNYmlkZGluZ1dpbm5lcgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAIbX3ByZXZvaXVzX2JpZF9hbW91bnRfcmVmdW5kBQxiaWRkaW5nUHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAgtfbmZ0X3N0YXR1cwIIQ0FOQ0VMRUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAiZfcHJldmlvdXNfYmlkX2Ftb3VudF9yZWZ1bmRfdG9fYWRkcmVzcwUNYmlkZGluZ1dpbm5lcgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBHR4SWQCG19wcmV2b2l1c19iaWRfYW1vdW50X3JlZnVuZAUMYmlkZGluZ1ByaWNlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQhuZnRPd25lcgABCQDZBAEFBW5mdElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQ1iaWRkaW5nV2lubmVyCQENcGFyc2VJbnRWYWx1ZQEFDGJpZGRpbmdQcmljZQUEdW5pdAUDbmlsAWkBC3dpdGhkcmF3QmlkAQdiaWRUeElkBAZjYWxsZXIICAUBaQZjYWxsZXIFYnl0ZXMECGJpZFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFB2JpZFR4SWQCDF9oaWdoZXN0X2JpZAQIYXNCaWRkZXIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUHYmlkVHhJZAIHX3dpbm5lcgQJYmlkRm9yTkZUCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFB2JpZFR4SWQCB19uZnRfaWQDCQECIT0CCQDYBAEFBmNhbGxlcgUIYXNCaWRkZXIJAAIBAgZObyBiaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdiaWRUeElkAghfbmZ0X2JpZAIIV0lUSERSQVcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdiaWRUeElkAgdfbmZ0X2lkBQliaWRGb3JORlQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdiaWRUeElkAhxfYmlkZGluZ19wcmljZV9yZWZ1bmRfYW1vdW50BQhiaWRQcmljZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAQ1wYXJzZUludFZhbHVlAQUIYmlkUHJpY2UFBHVuaXQFA25pbAD1hdQb", "height": 2346572, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: G8ThLkwZBdn2Msaejm82aH2rv7uGkT9F4SLFoUq8hsbf Next: EDZ4q1W1wkiWUbNoj5RyaE4EbdVqxtjfQzGQMn9bxox Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "_"
55
6-func joinPairStruct (token0,token1,reserve0,reserve1) = makeString([token0, token1, toString(reserve0), toString(reserve1)], separator)
6+let kAuction = "auction"
7+
8+let kSell = "sell"
9+
10+let kTrusted = "trusted"
11+
12+let kPrice = "price"
13+
14+func getSlotKey (prefix,nftId) = ((prefix + separator) + toBase58String(nftId))
715
816
9-func setPairDetails (lpTokenId,token0,token1,reserve0,reserve1) = StringEntry(lpTokenId, joinPairStruct(token0, token1, reserve0, reserve1))
17+func getPriceKey (nftId) = ((kPrice + separator) + toBase58String(nftId))
1018
1119
12-func calcAmountOut (amountIn,reserveIn,reserveOut) = {
13- let amountInWithFee = (amountIn * 970)
14- let numerator = (amountInWithFee * reserveOut)
15- let denominator = ((reserveIn * 1000) + amountInWithFee)
16- fraction(1, numerator, denominator, HALFEVEN)
20+func getSellKey (nftId) = ((kSell + separator) + toBase58String(nftId))
21+
22+
23+func getAuctionKey (nftId) = ((kAuction + separator) + toBase58String(nftId))
24+
25+
26+func getTrustedKey (issuer) = ((kTrusted + separator) + toString(issuer))
27+
28+
29+func addToList (accum,nextValue) = (accum ++ [nextValue])
30+
31+
32+func joinString (params) = {
33+ let length = size(params)
34+ if ((length == 0))
35+ then throw("Empty params")
36+ else if ((length == 1))
37+ then makeString({
38+ let $l = params
39+ let $s = size($l)
40+ let $acc0 = nil
41+ func $f0_1 ($a,$i) = if (($i >= $s))
42+ then $a
43+ else addToList($a, $l[$i])
44+
45+ func $f0_2 ($a,$i) = if (($i >= $s))
46+ then $a
47+ else throw("List size exceeds 1")
48+
49+ $f0_2($f0_1($acc0, 0), 1)
50+ }, separator)
51+ else if ((length == 2))
52+ then makeString({
53+ let $l = params
54+ let $s = size($l)
55+ let $acc0 = nil
56+ func $f0_1 ($a,$i) = if (($i >= $s))
57+ then $a
58+ else addToList($a, $l[$i])
59+
60+ func $f0_2 ($a,$i) = if (($i >= $s))
61+ then $a
62+ else throw("List size exceeds 2")
63+
64+ $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
65+ }, separator)
66+ else if ((length == 3))
67+ then makeString({
68+ let $l = params
69+ let $s = size($l)
70+ let $acc0 = nil
71+ func $f0_1 ($a,$i) = if (($i >= $s))
72+ then $a
73+ else addToList($a, $l[$i])
74+
75+ func $f0_2 ($a,$i) = if (($i >= $s))
76+ then $a
77+ else throw("List size exceeds 3")
78+
79+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
80+ }, separator)
81+ else if ((length == 4))
82+ then makeString({
83+ let $l = params
84+ let $s = size($l)
85+ let $acc0 = nil
86+ func $f0_1 ($a,$i) = if (($i >= $s))
87+ then $a
88+ else addToList($a, $l[$i])
89+
90+ func $f0_2 ($a,$i) = if (($i >= $s))
91+ then $a
92+ else throw("List size exceeds 4")
93+
94+ $f0_2($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4)
95+ }, separator)
96+ else if ((length == 5))
97+ then makeString({
98+ let $l = params
99+ let $s = size($l)
100+ let $acc0 = nil
101+ func $f0_1 ($a,$i) = if (($i >= $s))
102+ then $a
103+ else addToList($a, $l[$i])
104+
105+ func $f0_2 ($a,$i) = if (($i >= $s))
106+ then $a
107+ else throw("List size exceeds 5")
108+
109+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
110+ }, separator)
111+ else throw("Max number of parameters exceeded")
17112 }
18113
19114
20-func getPairKey (token0,token1) = {
21- let token0BV = toInt(fromBase58String(token0))
22- let token1BV = toInt(fromBase58String(token1))
23- if ((token1BV > token0BV))
24- then makeString([token0, token1], separator)
25- else makeString([token1, token0], separator)
115+func parseAsAuction (details) = {
116+ let res = split(details, separator)
117+ $Tuple5(addressFromStringValue(res[0]), parseIntValue(res[1]), parseIntValue(res[2]), parseIntValue(res[3]), parseIntValue(res[4]))
26118 }
27119
28120
29-func getPairTokenId (token0,token1) = valueOrErrorMessage(getString(this, getPairKey(token0, token1)), "Pair doesn`t exist")
30-
31-
32-func getPairDetails (lpTokenId) = {
33- let details = split(valueOrElse(getString(this, lpTokenId), "assetId0_assetId1_0_0"), separator)
34- $Tuple4(details[0], details[1], parseIntValue(details[2]), parseIntValue(details[3]))
121+func parseAsSell (details) = {
122+ let res = split(details, separator)
123+ $Tuple2(addressFromStringValue(res[0]), parseIntValue(res[1]))
35124 }
36125
37126
127+func joinStruct (params) = match params {
128+ case auction: (Address, Int, String, String) =>
129+ joinString([toString(auction._1), toString(auction._2), auction._3, auction._4])
130+ case sell: (Address, Int) =>
131+ joinString([toString(sell._1), toString(sell._2)])
132+ case _ =>
133+ throw("Wrong params tupple")
134+}
135+
136+
137+func setAuction (seller,nftId,startPrice,start,end) = StringEntry(getAuctionKey(nftId), joinStruct($Tuple4(seller, startPrice, start, end)))
138+
139+
140+func setSell (nftId,celler,price) = StringEntry(getSellKey(nftId), joinStruct($Tuple2(celler, price)))
141+
142+
143+func getAuction (nftId) = value(getString(this, getAuctionKey(nftId)))
144+
145+
146+func getSell (nftId) = value(getString(this, getSellKey(nftId)))
147+
148+
149+func calcPriceAtCurrentMoment (assetId,moment) = {
150+ let details = getAuction(assetId)
151+ let $t027552859 = parseAsAuction(details)
152+ let seller = $t027552859._1
153+ let startPriceValue = $t027552859._2
154+ let endPriceValue = $t027552859._3
155+ let startPeriodValue = $t027552859._4
156+ let endPeriodValue = $t027552859._5
157+ if ((moment >= endPeriodValue))
158+ then $Tuple2(seller, endPriceValue)
159+ else {
160+ let deltaPrice = (startPriceValue - endPriceValue)
161+ let period = (endPeriodValue - startPeriodValue)
162+ let spended = (moment - startPeriodValue)
163+ $Tuple2(seller, (startPriceValue - fraction(spended, deltaPrice, period)))
164+ }
165+ }
166+
167+
168+func isNft (assetId) = match assetInfo(assetId) {
169+ case token: Asset =>
170+ if (if ((token.decimals == 0))
171+ then (token.quantity == 1)
172+ else false)
173+ then (token.reissuable == false)
174+ else false
175+ case _ =>
176+ false
177+}
178+
179+
180+func isTrustedNft (assetId) = {
181+ let issuer = value(assetInfo(assetId)).issuer
182+ valueOrElse(getBoolean(this, getTrustedKey(issuer)), false)
183+ }
184+
185+
186+func isSellExist (assetId) = isDefined(getString(this, getSellKey(assetId)))
187+
188+
189+func isAuctionExist (assetId) = isDefined(getString(this, getAuctionKey(assetId)))
190+
191+
192+func isCorrectSellPrice (price) = (price > 0)
193+
194+
195+func isCorrectAuctionPrices (startPrice,endPrice) = (startPrice > endPrice)
196+
197+
198+func isAdmin (caller) = (caller == this)
199+
200+
201+func isValidCaller (caller,seller) = if ((caller == this))
202+ then true
203+ else (caller == seller)
204+
205+
206+func isAuctionEnded (now,end) = (now > end)
207+
208+
209+func isEnoughFunds (payment,currentMomentPrice) = (payment >= currentMomentPrice)
210+
211+
212+func isWawes (assetId) = (assetId == unit)
213+
214+
215+func isCorrectNft (nftId) = if (!(isNft(nftId)))
216+ then throw("Token is not Nft")
217+ else if (isSellExist(nftId))
218+ then throw("Sell already exists")
219+ else if (isAuctionExist(nftId))
220+ then throw("Auction already exists")
221+ else unit
222+
223+
224+func isCorrectPayments (paymentAsset,paymentAmount,price) = if (!(isWawes(paymentAsset)))
225+ then throw("Payment must be at WAVES")
226+ else if (!(isEnoughFunds(paymentAmount, price)))
227+ then throw("Not enough funds")
228+ else unit
229+
230+
231+func calcFee () = 0
232+
233+
234+func calcTrustedFee () = 0
235+
236+
237+func resultFundsAmounts (isTrusted,paymentAmount,actualPrice) = if (isTrusted)
238+ then $Tuple2((actualPrice - calcTrustedFee()), (paymentAmount - actualPrice))
239+ else $Tuple2((actualPrice - calcFee()), (paymentAmount - actualPrice))
240+
241+
242+func getSlot (nftId) = if (isSellExist(nftId))
243+ then $Tuple2(kSell, getSell(nftId))
244+ else if (isAuctionExist(nftId))
245+ then $Tuple2(kAuction, getAuction(nftId))
246+ else throw("Slot doesn`t exist")
247+
248+
249+let kBuy = "buy"
250+
251+let kBid = "bid"
252+
253+let statusForNFT = $Tuple4("OPEN", "CLOSED", "REWARDED", "CANCELED")
254+
255+let dAppAddress = base58'3MvjAaDYHpS4A5K4CV3kZMMEH9m9JdBSvbq'
256+
38257 @Callable(i)
39-func swap (tokenOut,amountOutMin) = {
40- let $t014441548 = $Tuple2(toBase58String(value(i.payments[0].assetId)), value(i.payments[0].amount))
41- let tokenIn = $t014441548._1
42- let amountIn = $t014441548._2
43- let lpToken = getPairTokenId(tokenIn, tokenOut)
44- let $t016011683 = getPairDetails(lpToken)
45- let pairToken0 = $t016011683._1
46- let pairToken1 = $t016011683._2
47- let pairReserve0 = $t016011683._3
48- let pairReserve1 = $t016011683._4
49- let amountOut = calcAmountOut(amountIn, pairReserve0, pairReserve1)
50- if ((amountOutMin > amountOut))
51- then throw("Insufficient output amount")
52- else [ScriptTransfer(i.caller, amountOut, fromBase58String(pairToken1)), setPairDetails(lpToken, tokenIn, tokenOut, (pairReserve0 + amountIn), (pairReserve1 - amountOut))]
258+func createNft (nft_name,nft_owner,nft_dAppAddress,nft_type,nft_tags,nft_selling_price,nft_description,nft_onSell,nft_data) = {
259+ let newToken = Issue(nft_name, nft_description, 1, 0, false)
260+ let issueId = calculateAssetId(newToken)
261+ let txId = i.transactionId
262+[newToken, ScriptTransfer(i.caller, 1, issueId), StringEntry(((toBase58String(issueId) + separator) + "Owner"), toString(i.caller)), StringEntry(((toBase58String(issueId) + separator) + "nft_type"), nft_type), StringEntry(((toBase58String(issueId) + separator) + "nft_tags"), nft_tags), StringEntry(((toBase58String(issueId) + separator) + "nft_dAppAddress"), nft_dAppAddress), IntegerEntry(((toBase58String(issueId) + separator) + "nft_selling_price"), nft_selling_price), StringEntry(((toBase58String(issueId) + separator) + "nft_onSell"), nft_onSell), StringEntry(((toBase58String(issueId) + separator) + "nft_data"), nft_data), StringEntry(((toBase58String(txId) + separator) + "issue_nft"), toBase58String(issueId))]
263+ }
264+
265+
266+
267+@Callable(i)
268+func sellNFT (price) = {
269+ let txId = i.transactionId
270+ let seller = i.caller.bytes
271+ let $t066056690 = $Tuple2(value(i.payments[0].assetId), value(i.payments[0].amount))
272+ let token0 = $t066056690._1
273+ let amount0 = $t066056690._2
274+ if (!(isNft(token0)))
275+ then throw("Token is not NFT")
276+ else [StringEntry(((kPrice + separator) + toBase58String(value(i.payments[0].assetId))), toString(price)), StringEntry(((toString(i.caller) + separator) + kSell), ((toBase58String(token0) + separator) + toString(amount0)))]
277+ }
278+
279+
280+
281+@Callable(i)
282+func buyNFT (nftID,current_nft_owner) = {
283+ let assetId = fromBase58String(nftID)
284+ let amount = value(i.payments[0].amount)
285+ let checkOwnerIsSame = match getString(this, (("nft_" + current_nft_owner) + "_owner")) {
286+ case a: String =>
287+ a
288+ case _ =>
289+ false
290+ }
291+ let price = getStringValue(((((kPrice + separator) + nftID) + "_") + current_nft_owner))
292+ let owner = valueOrErrorMessage(getStringValue(((nftID + separator) + "Owner")), "No owner")
293+ if ((i.payments[0].assetId != unit))
294+ then throw("Pay in waves")
295+ else if ((checkOwnerIsSame == toString(i.caller)))
296+ then throw("Owner of NFT not able to purchase")
297+ else [ScriptTransfer(i.caller, 1, assetId), ScriptTransfer(Address(fromBase58String(owner)), amount, unit), StringEntry(((toString(i.caller) + separator) + kBuy), ((nftID + separator) + toString(amount))), DeleteEntry((("nft_" + current_nft_owner) + "_owner"))]
298+ }
299+
300+
301+
302+@Callable(i)
303+func addAuction (start,end,startPrice,duration) = {
304+ let txId = toBase58String(i.transactionId)
305+ let nftId = value(i.payments[0].assetId)
306+ let price = value(startPrice)
307+ let caller = i.caller.bytes
308+ let checkNftAuctioned = match getString(this, (((toBase58String(nftId) + separator) + "nft_status_") + toBase58String(caller))) {
309+ case a: String =>
310+ true
311+ case _ =>
312+ false
313+ }
314+ if ((i.payments[0].assetId == unit))
315+ then throw("NFT not attached")
316+ else if ((checkNftAuctioned == true))
317+ then throw("Already in auction list")
318+ else [StringEntry(((txId + "_nft_start_auction_date_") + toBase58String(caller)), start), StringEntry(((txId + "_nft_end_auction_date_") + toBase58String(caller)), end), IntegerEntry((txId + "_nft_start_price"), startPrice), StringEntry((txId + "_nft_owner"), toString(i.caller)), StringEntry((txId + "_nft_on_auction"), toBase58String(nftId)), StringEntry((txId + "_previous_bidder"), "none"), StringEntry((txId + "_highest_bid"), toString(startPrice)), StringEntry((txId + "_winner_of_nft"), "0"), StringEntry((txId + "_bidder_count"), "0"), StringEntry(((txId + "_nft_status") + toBase58String(caller)), "OPEN")]
319+ }
320+
321+
322+
323+@Callable(i)
324+func placeBid (auctionId,nftId,nft_owner,bid_price) = {
325+ let txId = toBase58String(i.transactionId)
326+ let caller = i.caller.bytes
327+ let assetId = fromBase58String(nftId)
328+ let currentBidPrice = i.payments[0].amount
329+ let getLastWinnerBidPrice = getStringValue(this, (auctionId + "_highest_bid"))
330+ let getPreviousBidderAddress = getString(this, (auctionId + "_previous_bidder"))
331+ let currentBidCount = getStringValue(this, (auctionId + "_bidder_count"))
332+ let getLastWinnerAddress = getStringValue(this, (auctionId + "_winner_of_nft"))
333+ let checkNftAuctioned = getStringValue(this, (auctionId + "_nft_status"))
334+ if ((i.payments[0].assetId != unit))
335+ then throw("Pay in waves")
336+ else if ((checkNftAuctioned != "OPEN"))
337+ then throw("Not open for auction")
338+ else if ((parseIntValue(getLastWinnerBidPrice) >= currentBidPrice))
339+ then throw("Bid is less then starting/highest Bid")
340+ else if ((getLastWinnerBidPrice == "0"))
341+ then [StringEntry((auctionId + "_highest_bid"), toString(currentBidPrice)), StringEntry((auctionId + "_winner_of_nft"), toBase58String(i.caller.bytes)), StringEntry((auctionId + "_bidder_count"), toString((parseIntValue(currentBidCount) + 1))), StringEntry((auctionId + "_nft_id"), toBase58String(assetId)), StringEntry((auctionId + "_nft_owner"), nft_owner), StringEntry((((txId + "_") + auctionId) + "_highest_bid"), toString(currentBidPrice)), StringEntry((((txId + "_") + auctionId) + "_winner"), toBase58String(i.caller.bytes)), StringEntry((((txId + "_") + auctionId) + "_bidder_count"), toString((parseIntValue(currentBidCount) + 1))), StringEntry((((txId + "_") + auctionId) + "_nft_id"), toBase58String(assetId)), StringEntry((((txId + "_") + auctionId) + "_nft_owner"), nft_owner), StringEntry((txId + "_bid_for_nft_by"), toBase58String(caller)), StringEntry((txId + "_bid_price_place"), bid_price), StringEntry((txId + "_previous_bid_amount_refund_to_address"), getLastWinnerAddress), StringEntry((txId + "_prevoius_bid_amount_refund"), getLastWinnerBidPrice)]
342+ else [StringEntry((auctionId + "_highest_bid"), toString(currentBidPrice)), StringEntry((auctionId + "_winner_of_nft"), toBase58String(i.caller.bytes)), StringEntry((auctionId + "_bidder_count"), toString((parseIntValue(currentBidCount) + 1))), StringEntry((auctionId + "_nft_id"), toBase58String(assetId)), StringEntry((auctionId + "_nft_owner"), nft_owner), StringEntry((((txId + "_") + auctionId) + "_highest_bid"), toString(currentBidPrice)), StringEntry((((txId + "_") + auctionId) + "_winner"), toBase58String(i.caller.bytes)), StringEntry((((txId + "_") + auctionId) + "_bidder_count"), toString((parseIntValue(currentBidCount) + 1))), StringEntry((((txId + "_") + auctionId) + "_nft_id"), toBase58String(assetId)), StringEntry((((txId + "_") + auctionId) + "_nft_owner"), nft_owner), StringEntry((txId + "_bid_for_nft_by"), toBase58String(caller)), StringEntry((txId + "_bid_price_place"), bid_price), StringEntry((txId + "_previous_bid_amount_refund_to_address"), getLastWinnerAddress), StringEntry((txId + "_prevoius_bid_amount_refund"), getLastWinnerBidPrice), ScriptTransfer(Address(fromBase58String(getLastWinnerAddress)), parseIntValue(getLastWinnerBidPrice), unit)]
343+ }
344+
345+
346+
347+@Callable(i)
348+func acceptBidOffer (auctionId,nftId,bid_amount_from_user) = {
349+ let txId = toBase58String(i.transactionId)
350+ let caller = i.caller.bytes
351+ let assetId = fromBase58String(nftId)
352+ let getNftWinningPrice = getStringValue(this, (auctionId + "_highest_bid"))
353+ let getAuctionWinner = getStringValue(this, (auctionId + "_winner_of_nft"))
354+[ScriptTransfer(Address(caller), parseIntValue(getNftWinningPrice), unit), ScriptTransfer(Address(fromBase58String(getAuctionWinner)), 1, assetId), StringEntry((txId + "_amount_paid_to_owner"), getNftWinningPrice), StringEntry((txId + "_nft_transfer_to"), getAuctionWinner), StringEntry((txId + "_nft_status"), "REWARDED"), StringEntry((auctionId + "_amount_paid_to_owner"), getNftWinningPrice), StringEntry((auctionId + "_nft_transfer_to"), getAuctionWinner), StringEntry((auctionId + "_nft_status"), "REWARDED")]
355+ }
356+
357+
358+
359+@Callable(i)
360+func cancelAuction (auctionId) = {
361+ let txId = toBase58String(i.transactionId)
362+ let caller = i.caller.bytes
363+ let auctionStatus = getStringValue(this, (auctionId + "_nft_status"))
364+ let biddingWinner = getStringValue(this, (auctionId + "_winner_of_nft"))
365+ let nftOwner = getStringValue(this, (auctionId + "_nft_owner"))
366+ let nftId = getStringValue(this, (auctionId + "_nft_on_auction"))
367+ let biddingPrice = getStringValue(this, (auctionId + "_highest_bid"))
368+[StringEntry((auctionId + "_nft_status"), "CANCELED"), StringEntry((auctionId + "_previous_bid_amount_refund_to_address"), biddingWinner), StringEntry((auctionId + "_prevoius_bid_amount_refund"), biddingPrice), StringEntry((txId + "_nft_status"), "CANCELED"), StringEntry((txId + "_previous_bid_amount_refund_to_address"), biddingWinner), StringEntry((txId + "_prevoius_bid_amount_refund"), biddingPrice), ScriptTransfer(Address(fromBase58String(nftOwner)), 1, fromBase58String(nftId)), ScriptTransfer(Address(fromBase58String(biddingWinner)), parseIntValue(biddingPrice), unit)]
369+ }
370+
371+
372+
373+@Callable(i)
374+func withdrawBid (bidTxId) = {
375+ let caller = i.caller.bytes
376+ let bidPrice = getStringValue(this, (bidTxId + "_highest_bid"))
377+ let asBidder = getStringValue(this, (bidTxId + "_winner"))
378+ let bidForNFT = getStringValue(this, (bidTxId + "_nft_id"))
379+ if ((toBase58String(caller) != asBidder))
380+ then throw("No bid")
381+ else [StringEntry((bidTxId + "_nft_bid"), "WITHDRAW"), StringEntry((bidTxId + "_nft_id"), bidForNFT), StringEntry((bidTxId + "_bidding_price_refund_amount"), bidPrice), ScriptTransfer(i.caller, parseIntValue(bidPrice), unit)]
53382 }
54383
55384

github/deemru/w8io/169f3d6 
42.05 ms