tx · HdkmyngesycDaLJw2uAZkdgF1MFAXHCjDEo7B938N63H

3N85YW6NZ9pLYvSdt1ASMQTGxvncnU1vUNx:  -0.10000000 Waves

2022.12.26 11:00 [2376988] smart account 3N85YW6NZ9pLYvSdt1ASMQTGxvncnU1vUNx > SELF 0.00000000 Waves

{ "type": 13, "id": "HdkmyngesycDaLJw2uAZkdgF1MFAXHCjDEo7B938N63H", "fee": 10000000, "feeAssetId": null, "timestamp": 1672041647329, "version": 2, "chainId": 84, "sender": "3N85YW6NZ9pLYvSdt1ASMQTGxvncnU1vUNx", "senderPublicKey": "EKZmHJ5bK3qKKgRdq8rAamt9qrDbVMLARzRqXoQW258v", "proofs": [ "24mATc299Ya8YX4nErVP9GJjSm8gaTySR6HCmg7hDRvGoeznCFTwhk4gDLPNMfyGpCXGcWLVDgQgCAg3KJUhxk2F" ], "script": "base64:BgI9CAISCAoGCAgBCAgIEgMKAQESBAoCCAgSBgoECAgIARIGCgQICAgIEgUKAwgICBIDCgEIEgMKAQgSAwoBCCkACXNlcGFyYXRvcgIBXwAIa0F1Y3Rpb24CB2F1Y3Rpb24ABWtTZWxsAgRzZWxsAAhrVHJ1c3RlZAIHdHJ1c3RlZAAGa1ByaWNlAgVwcmljZQEKZ2V0U2xvdEtleQIGcHJlZml4BW5mdElkCQCsAgIJAKwCAgUGcHJlZml4BQlzZXBhcmF0b3IJANgEAQUFbmZ0SWQBC2dldFByaWNlS2V5AQVuZnRJZAkArAICCQCsAgIFBmtQcmljZQUJc2VwYXJhdG9yCQDYBAEFBW5mdElkAQpnZXRTZWxsS2V5AQVuZnRJZAkArAICCQCsAgIFBWtTZWxsBQlzZXBhcmF0b3IJANgEAQUFbmZ0SWQBDWdldEF1Y3Rpb25LZXkBBW5mdElkCQCsAgIJAKwCAgUIa0F1Y3Rpb24FCXNlcGFyYXRvcgkA2AQBBQVuZnRJZAENZ2V0VHJ1c3RlZEtleQEGaXNzdWVyCQCsAgIJAKwCAgUIa1RydXN0ZWQFCXNlcGFyYXRvcgkApQgBBQZpc3N1ZXIBCWFkZFRvTGlzdAIFYWNjdW0JbmV4dFZhbHVlCQDOCAIFBWFjY3VtCQDMCAIFCW5leHRWYWx1ZQUDbmlsAQpqb2luU3RyaW5nAQZwYXJhbXMEBmxlbmd0aAkAkAMBBQZwYXJhbXMDCQAAAgUGbGVuZ3RoAAAJAAIBAg1FbXB0eSAgcGFyYW1zAwkAAAIFBmxlbmd0aAABCQC5CQIKAAIkbAUGcGFyYW1zCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlhZGRUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDEJAQUkZjBfMgIJAQUkZjBfMQIFBSRhY2MwAAAAAQUJc2VwYXJhdG9yAwkAAAIFBmxlbmd0aAACCQC5CQIKAAIkbAUGcGFyYW1zCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlhZGRUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACBQlzZXBhcmF0b3IDCQAAAgUGbGVuZ3RoAAMJALkJAgoAAiRsBQZwYXJhbXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWFkZFRvTGlzdAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwUJc2VwYXJhdG9yAwkAAAIFBmxlbmd0aAAECQC5CQIKAAIkbAUGcGFyYW1zCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlhZGRUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDQJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAUJc2VwYXJhdG9yAwkAAAIFBmxlbmd0aAAFCQC5CQIKAAIkbAUGcGFyYW1zCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlhZGRUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBQlzZXBhcmF0b3IJAAIBAiFNYXggbnVtYmVyIG9mIHBhcmFtZXRlcnMgZXhjZWVkZWQBDnBhcnNlQXNBdWN0aW9uAQdkZXRhaWxzBANyZXMJALUJAgUHZGV0YWlscwUJc2VwYXJhdG9yCQCXCgUJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUDcmVzAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNyZXMAAQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA3JlcwACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDcmVzAAMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNyZXMABAELcGFyc2VBc1NlbGwBB2RldGFpbHMEA3JlcwkAtQkCBQdkZXRhaWxzBQlzZXBhcmF0b3IJAJQKAgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQNyZXMAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA3JlcwABAQpqb2luU3RydWN0AQZwYXJhbXMEByRtYXRjaDAFBnBhcmFtcwMJAAECBQckbWF0Y2gwAh4oQWRkcmVzcywgSW50LCBTdHJpbmcsIFN0cmluZykEB2F1Y3Rpb24FByRtYXRjaDAJAQpqb2luU3RyaW5nAQkAzAgCCQClCAEIBQdhdWN0aW9uAl8xCQDMCAIJAKQDAQgFB2F1Y3Rpb24CXzIJAMwIAggFB2F1Y3Rpb24CXzMJAMwIAggFB2F1Y3Rpb24CXzQFA25pbAMJAAECBQckbWF0Y2gwAg4oQWRkcmVzcywgSW50KQQEc2VsbAUHJG1hdGNoMAkBCmpvaW5TdHJpbmcBCQDMCAIJAKUIAQgFBHNlbGwCXzEJAMwIAgkApAMBCAUEc2VsbAJfMgUDbmlsCQACAQITV3JvbmcgcGFyYW1zIHR1cHBsZQEKc2V0QXVjdGlvbgUGc2VsbGVyBW5mdElkCnN0YXJ0UHJpY2UFc3RhcnQDZW5kCQELU3RyaW5nRW50cnkCCQENZ2V0QXVjdGlvbktleQEFBW5mdElkCQEKam9pblN0cnVjdAEJAJYKBAUGc2VsbGVyBQpzdGFydFByaWNlBQVzdGFydAUDZW5kAQdzZXRTZWxsAwVuZnRJZAZjZWxsZXIFcHJpY2UJAQtTdHJpbmdFbnRyeQIJAQpnZXRTZWxsS2V5AQUFbmZ0SWQJAQpqb2luU3RydWN0AQkAlAoCBQZjZWxsZXIFBXByaWNlAQpnZXRBdWN0aW9uAQVuZnRJZAkBBXZhbHVlAQkAnQgCBQR0aGlzCQENZ2V0QXVjdGlvbktleQEFBW5mdElkAQdnZXRTZWxsAQVuZnRJZAkBBXZhbHVlAQkAnQgCBQR0aGlzCQEKZ2V0U2VsbEtleQEFBW5mdElkARhjYWxjUHJpY2VBdEN1cnJlbnRNb21lbnQCB2Fzc2V0SWQGbW9tZW50BAdkZXRhaWxzCQEKZ2V0QXVjdGlvbgEFB2Fzc2V0SWQECyR0MDI3NTUyODU5CQEOcGFyc2VBc0F1Y3Rpb24BBQdkZXRhaWxzBAZzZWxsZXIIBQskdDAyNzU1Mjg1OQJfMQQPc3RhcnRQcmljZVZhbHVlCAULJHQwMjc1NTI4NTkCXzIEDWVuZFByaWNlVmFsdWUIBQskdDAyNzU1Mjg1OQJfMwQQc3RhcnRQZXJpb2RWYWx1ZQgFCyR0MDI3NTUyODU5Al80BA5lbmRQZXJpb2RWYWx1ZQgFCyR0MDI3NTUyODU5Al81AwkAZwIFBm1vbWVudAUOZW5kUGVyaW9kVmFsdWUJAJQKAgUGc2VsbGVyBQ1lbmRQcmljZVZhbHVlBApkZWx0YVByaWNlCQBlAgUPc3RhcnRQcmljZVZhbHVlBQ1lbmRQcmljZVZhbHVlBAZwZXJpb2QJAGUCBQ5lbmRQZXJpb2RWYWx1ZQUQc3RhcnRQZXJpb2RWYWx1ZQQHc3BlbmRlZAkAZQIFBm1vbWVudAUQc3RhcnRQZXJpb2RWYWx1ZQkAlAoCBQZzZWxsZXIJAGUCBQ9zdGFydFByaWNlVmFsdWUJAGsDBQdzcGVuZGVkBQpkZWx0YVByaWNlBQZwZXJpb2QBBWlzTmZ0AQdhc3NldElkBAckbWF0Y2gwCQDsBwEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBXRva2VuBQckbWF0Y2gwAwMJAAACCAUFdG9rZW4IZGVjaW1hbHMAAAkAAAIIBQV0b2tlbghxdWFudGl0eQABBwkAAAIIBQV0b2tlbgpyZWlzc3VhYmxlBwcHAQxpc1RydXN0ZWROZnQBB2Fzc2V0SWQEBmlzc3VlcggJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAZpc3N1ZXIJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkBDWdldFRydXN0ZWRLZXkBBQZpc3N1ZXIHAQtpc1NlbGxFeGlzdAEHYXNzZXRJZAkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkBCmdldFNlbGxLZXkBBQdhc3NldElkAQ5pc0F1Y3Rpb25FeGlzdAEHYXNzZXRJZAkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkBDWdldEF1Y3Rpb25LZXkBBQdhc3NldElkARJpc0NvcnJlY3RTZWxsUHJpY2UBBXByaWNlCQBmAgUFcHJpY2UAAAEWaXNDb3JyZWN0QXVjdGlvblByaWNlcwIKc3RhcnRQcmljZQhlbmRQcmljZQkAZgIFCnN0YXJ0UHJpY2UFCGVuZFByaWNlAQdpc0FkbWluAQZjYWxsZXIJAAACBQZjYWxsZXIFBHRoaXMBDWlzVmFsaWRDYWxsZXICBmNhbGxlcgZzZWxsZXIDCQAAAgUGY2FsbGVyBQR0aGlzBgkAAAIFBmNhbGxlcgUGc2VsbGVyAQ5pc0F1Y3Rpb25FbmRlZAIDbm93A2VuZAkAZgIFA25vdwUDZW5kAQ1pc0Vub3VnaEZ1bmRzAgdwYXltZW50EmN1cnJlbnRNb21lbnRQcmljZQkAZwIFB3BheW1lbnQFEmN1cnJlbnRNb21lbnRQcmljZQEHaXNXYXdlcwEHYXNzZXRJZAkAAAIFB2Fzc2V0SWQFBHVuaXQBDGlzQ29ycmVjdE5mdAEFbmZ0SWQDCQEBIQEJAQVpc05mdAEFBW5mdElkCQACAQIQVG9rZW4gaXMgbm90IE5mdAMJAQtpc1NlbGxFeGlzdAEFBW5mdElkCQACAQITU2VsbCBhbHJlYWR5IGV4aXN0cwMJAQ5pc0F1Y3Rpb25FeGlzdAEFBW5mdElkCQACAQIWQXVjdGlvbiBhbHJlYWR5IGV4aXN0cwUEdW5pdAERaXNDb3JyZWN0UGF5bWVudHMDDHBheW1lbnRBc3NldA1wYXltZW50QW1vdW50BXByaWNlAwkBASEBCQEHaXNXYXdlcwEFDHBheW1lbnRBc3NldAkAAgECGFBheW1lbnQgbXVzdCBiZSBhdCBXQVZFUwMJAQEhAQkBDWlzRW5vdWdoRnVuZHMCBQ1wYXltZW50QW1vdW50BQVwcmljZQkAAgECEE5vdCBlbm91Z2ggZnVuZHMFBHVuaXQBB2NhbGNGZWUAAAABDmNhbGNUcnVzdGVkRmVlAAAAARJyZXN1bHRGdW5kc0Ftb3VudHMDCWlzVHJ1c3RlZA1wYXltZW50QW1vdW50C2FjdHVhbFByaWNlAwUJaXNUcnVzdGVkCQCUCgIJAGUCBQthY3R1YWxQcmljZQkBDmNhbGNUcnVzdGVkRmVlAAkAZQIFDXBheW1lbnRBbW91bnQFC2FjdHVhbFByaWNlCQCUCgIJAGUCBQthY3R1YWxQcmljZQkBB2NhbGNGZWUACQBlAgUNcGF5bWVudEFtb3VudAULYWN0dWFsUHJpY2UBB2dldFNsb3QBBW5mdElkAwkBC2lzU2VsbEV4aXN0AQUFbmZ0SWQJAJQKAgUFa1NlbGwJAQdnZXRTZWxsAQUFbmZ0SWQDCQEOaXNBdWN0aW9uRXhpc3QBBQVuZnRJZAkAlAoCBQhrQXVjdGlvbgkBCmdldEF1Y3Rpb24BBQVuZnRJZAkAAgECElNsb3QgZG9lc25gdCBleGlzdAAEa0J1eQIDYnV5AARrQmlkAgNiaWQADHN0YXR1c0Zvck5GVAkAlgoEAgRPUEVOAgZDTE9TRUQCCFJFV0FSREVEAghDQU5DRUxFRAALZEFwcEFkZHJlc3MBGgFUxzxRhTzn7zpFD3u1hi2wEGdc4tvmboWtCQFpAQljcmVhdGVOZnQGCG5mdF9uYW1lD25mdF9kQXBwQWRkcmVzcxFuZnRfc2VsbGluZ19wcmljZQ9uZnRfZGVzY3JpcHRpb24KbmZ0X29uU2VsbAhuZnRfZGF0YQQIbmV3VG9rZW4JAMIIBQUIbmZ0X25hbWUFD25mdF9kZXNjcmlwdGlvbgABAAAHBAdpc3N1ZUlkCQC4CAEFCG5ld1Rva2VuBAR0eElkCAUBaQ10cmFuc2FjdGlvbklkCQDMCAIFCG5ld1Rva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdpc3N1ZUlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQDYBAEFB2lzc3VlSWQFCXNlcGFyYXRvcgIPbmZ0X2RBcHBBZGRyZXNzBQ9uZnRfZEFwcEFkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQDYBAEFB2lzc3VlSWQFCXNlcGFyYXRvcgIRbmZ0X3NlbGxpbmdfcHJpY2UFEW5mdF9zZWxsaW5nX3ByaWNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQDYBAEFB2lzc3VlSWQFCXNlcGFyYXRvcgIKbmZ0X29uU2VsbAUKbmZ0X29uU2VsbAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkA2AQBBQdpc3N1ZUlkBQlzZXBhcmF0b3ICCG5mdF9kYXRhBQhuZnRfZGF0YQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkA2AQBBQR0eElkBQlzZXBhcmF0b3ICCWlzc3VlX25mdAkA2AQBBQdpc3N1ZUlkBQNuaWwBaQEHc2VsbE5GVAEFcHJpY2UEBHR4SWQIBQFpDXRyYW5zYWN0aW9uSWQECyR0MDYyNzk2MzY0CQCUCgIJAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkBBXZhbHVlAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEBnRva2VuMAgFCyR0MDYyNzk2MzY0Al8xBAdhbW91bnQwCAULJHQwNjI3OTYzNjQCXzIDCQEFaXNOZnQBBQZ0b2tlbjAJAAIBAhBUb2tlbiBpcyBub3QgTkZUCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQZrUHJpY2UFCXNlcGFyYXRvcgkA2AQBCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJAKQDAQUFcHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyBQlzZXBhcmF0b3IFBWtTZWxsCQCsAgIJAKwCAgkA2AQBBQZ0b2tlbjAFCXNlcGFyYXRvcgkApAMBBQdhbW91bnQwBQNuaWwBaQEGYnV5TkZUAgVuZnRJRBFjdXJyZW50X25mdF9vd25lcgQHYXNzZXRJZAkA2QQBBRFjdXJyZW50X25mdF9vd25lcgQGYW1vdW50CQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQQY2hlY2tPd25lcklzU2FtZQQHJG1hdGNoMAkAnQgCBQR0aGlzCQCsAgIJAKwCAgIEbmZ0XwURY3VycmVudF9uZnRfb3duZXICBl9vd25lcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWEGBAVwcmljZQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQCsAgIJAKwCAgkArAICBQZrUHJpY2UFCXNlcGFyYXRvcgUFbmZ0SUQCAV8FEWN1cnJlbnRfbmZ0X293bmVyBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFCXNlcGFyYXRvcgIFT3duZXICCE5vIG93bmVyAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0CQACAQIMUGF5IGluIHdhdmVzAwkAAAIFEGNoZWNrT3duZXJJc1NhbWUJAKUIAQgFAWkGY2FsbGVyCQACAQIhT3duZXIgb2YgTkZUIG5vdCBhYmxlIHRvIHB1cmNoYXNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgUJc2VwYXJhdG9yBQRrQnV5CQCsAgIFBW5mdElEBQlzZXBhcmF0b3IJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FEWN1cnJlbnRfbmZ0X293bmVyAgZfb3duZXIFA25pbAFpAQtzZWxsYXVjdGlvbgQFc3RhcnQDZW5kCnN0YXJ0UHJpY2UIZHVyYXRpb24EBHR4SWQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAQFbmZ0SWQJAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAEHYXNzZXRJZAQFcHJpY2UJAQV2YWx1ZQEFCnN0YXJ0UHJpY2UEBmNhbGxlcggIBQFpBmNhbGxlcgVieXRlcwQRY2hlY2tOZnRBdWN0aW9uZWQEByRtYXRjaDAJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgkA2AQBBQVuZnRJZAUJc2VwYXJhdG9yAgtuZnRfc3RhdHVzXwkA2AQBBQZjYWxsZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBgcDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0CQACAQIQTkZUIG5vdCBhdHRhY2hlZAMJAAACBRFjaGVja05mdEF1Y3Rpb25lZAYJAAIBAhdBbHJlYWR5IGluIGF1Y3Rpb24gbGlzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUEdHhJZAIYX25mdF9zdGFydF9hdWN0aW9uX2RhdGVfCQDYBAEFBmNhbGxlcgUFc3RhcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIFBHR4SWQCFl9uZnRfZW5kX2F1Y3Rpb25fZGF0ZV8JANgEAQUGY2FsbGVyBQNlbmQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAhBfbmZ0X3N0YXJ0X3ByaWNlBQpzdGFydFByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHR4SWQCE2R1cmF0aW9uX29mX2F1Y3Rpb24FCGR1cmF0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAIKX25mdF9vd25lcgkApQgBCAUBaQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAg9fbmZ0X29uX2F1Y3Rpb24JANgEAQUFbmZ0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAhBfcHJldmlvdXNfYmlkZGVyAgRub25lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAIMX2hpZ2hlc3RfYmlkAgEwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAIOX3dpbm5lcl9vZl9uZnQCATAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAg1fYmlkZGVyX2NvdW50AgEwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAILX25mdF9zdGF0dXMCBE9QRU4FA25pbAFpAQdpcXBsYWNlBAlhdWN0aW9uSWQFbmZ0SWQJbmZ0X293bmVyCWJpZF9wcmljZQQEdHhJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAZjYWxsZXIICAUBaQZjYWxsZXIFYnl0ZXMEB2Fzc2V0SWQJANsEAQUFbmZ0SWQED2N1cnJlbnRCaWRQcmljZQgJAJEDAggFAWkIcGF5bWVudHMAAQZhbW91bnQEFWdldExhc3RXaW5uZXJCaWRQcmljZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCDF9oaWdoZXN0X2JpZAQYZ2V0UHJldmlvdXNCaWRkZXJBZGRyZXNzCQCdCAIFBHRoaXMJAKwCAgUJYXVjdGlvbklkAhBfcHJldmlvdXNfYmlkZGVyBA9jdXJyZW50QmlkQ291bnQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUJYXVjdGlvbklkAg1fYmlkZGVyX2NvdW50BBRnZXRMYXN0V2lubmVyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCDl93aW5uZXJfb2ZfbmZ0BBFjaGVja05mdEF1Y3Rpb25lZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCC19uZnRfc3RhdHVzAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0CQACAQIMUGF5IGluIHdhdmVzAwkBAiE9AgURY2hlY2tOZnRBdWN0aW9uZWQCBE9QRU4JAAIBAhROb3Qgb3BlbiBmb3IgYXVjdGlvbgMJAGcCCQENcGFyc2VJbnRWYWx1ZQEFFWdldExhc3RXaW5uZXJCaWRQcmljZQUPY3VycmVudEJpZFByaWNlCQACAQIlQmlkIGlzIGxlc3MgdGhlbiBzdGFydGluZy9oaWdoZXN0IEJpZAMJAAACBRVnZXRMYXN0V2lubmVyQmlkUHJpY2UCATMJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQlhdWN0aW9uSWQCDF9oaWdoZXN0X2JpZAkApAMBBQ9jdXJyZW50QmlkUHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQlhdWN0aW9uSWQCDl93aW5uZXJfb2ZfbmZ0CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQlhdWN0aW9uSWQCDV9iaWRkZXJfY291bnQJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQUPY3VycmVudEJpZENvdW50AAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQlhdWN0aW9uSWQCB19uZnRfaWQJANgEAQUHYXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAIKX25mdF9vd25lcgUJbmZ0X293bmVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFBHR4SWQCAV8FCWF1Y3Rpb25JZAIMX2hpZ2hlc3RfYmlkCQCkAwEFD2N1cnJlbnRCaWRQcmljZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQR0eElkAgFfBQlhdWN0aW9uSWQCB193aW5uZXIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQR0eElkAgFfBQlhdWN0aW9uSWQCDV9iaWRkZXJfY291bnQJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQUPY3VycmVudEJpZENvdW50AAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdHhJZAIBXwUJYXVjdGlvbklkAgdfbmZ0X2lkCQDYBAEFB2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdHhJZAIBXwUJYXVjdGlvbklkAgpfbmZ0X293bmVyBQluZnRfb3duZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAg9fYmlkX2Zvcl9uZnRfYnkJANgEAQUGY2FsbGVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAIQX2JpZF9wcmljZV9wbGFjZQUJYmlkX3ByaWNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAImX3ByZXZpb3VzX2JpZF9hbW91bnRfcmVmdW5kX3RvX2FkZHJlc3MFFGdldExhc3RXaW5uZXJBZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAIbX3ByZXZvaXVzX2JpZF9hbW91bnRfcmVmdW5kBRVnZXRMYXN0V2lubmVyQmlkUHJpY2UFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAIMX2hpZ2hlc3RfYmlkCQCkAwEFD2N1cnJlbnRCaWRQcmljZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAIOX3dpbm5lcl9vZl9uZnQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAINX2JpZGRlcl9jb3VudAkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBBQ9jdXJyZW50QmlkQ291bnQAAQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAIHX25mdF9pZAkA2AQBBQdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUJYXVjdGlvbklkAgpfbmZ0X293bmVyBQluZnRfb3duZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdHhJZAIBXwUJYXVjdGlvbklkAgxfaGlnaGVzdF9iaWQJAKQDAQUPY3VycmVudEJpZFByaWNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFBHR4SWQCAV8FCWF1Y3Rpb25JZAIHX3dpbm5lcgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFBHR4SWQCAV8FCWF1Y3Rpb25JZAINX2JpZGRlcl9jb3VudAkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBBQ9jdXJyZW50QmlkQ291bnQAAQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQR0eElkAgFfBQlhdWN0aW9uSWQCB19uZnRfaWQJANgEAQUHYXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQR0eElkAgFfBQlhdWN0aW9uSWQCCl9uZnRfb3duZXIFCW5mdF9vd25lcgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBHR4SWQCD19iaWRfZm9yX25mdF9ieQkA2AQBBQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAhBfYmlkX3ByaWNlX3BsYWNlBQliaWRfcHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAiZfcHJldmlvdXNfYmlkX2Ftb3VudF9yZWZ1bmRfdG9fYWRkcmVzcwUUZ2V0TGFzdFdpbm5lckFkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQR0eElkAhtfcHJldm9pdXNfYmlkX2Ftb3VudF9yZWZ1bmQFFWdldExhc3RXaW5uZXJCaWRQcmljZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUUZ2V0TGFzdFdpbm5lckFkZHJlc3MJAQ1wYXJzZUludFZhbHVlAQUVZ2V0TGFzdFdpbm5lckJpZFByaWNlBQR1bml0BQNuaWwBaQEOYWNjZXB0QmlkT2ZmZXIDCWF1Y3Rpb25JZAVuZnRJZBRiaWRfYW1vdW50X2Zyb21fdXNlcgQEdHhJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAZjYWxsZXIICAUBaQZjYWxsZXIFYnl0ZXMEB2Fzc2V0SWQJANkEAQUFbmZ0SWQEEmdldE5mdFdpbm5pbmdQcmljZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCDF9oaWdoZXN0X2JpZAQQZ2V0QXVjdGlvbldpbm5lcgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCDl93aW5uZXJfb2ZfbmZ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUGY2FsbGVyCQENcGFyc2VJbnRWYWx1ZQEFEmdldE5mdFdpbm5pbmdQcmljZQUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBHR4SWQCFV9hbW91bnRfcGFpZF90b19vd25lcgUSZ2V0TmZ0V2lubmluZ1ByaWNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAILX25mdF9zdGF0dXMCCFJFV0FSREVECQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUJYXVjdGlvbklkAhVfYW1vdW50X3BhaWRfdG9fb3duZXIFEmdldE5mdFdpbm5pbmdQcmljZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAIQX25mdF90cmFuc2Zlcl90bwUQZ2V0QXVjdGlvbldpbm5lcgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCWF1Y3Rpb25JZAILX25mdF9zdGF0dXMCCFJFV0FSREVEBQNuaWwBaQEOY2FuY2VsMUF1Y3Rpb24BCWF1Y3Rpb25JZAQEdHhJZAkA2gQBCAUBaQ10cmFuc2FjdGlvbklkBAZjYWxsZXIICAUBaQZjYWxsZXIFYnl0ZXMEDWF1Y3Rpb25TdGF0dXMJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUJYXVjdGlvbklkAgtfbmZ0X3N0YXR1cwQNYmlkZGluZ1dpbm5lcgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCDl93aW5uZXJfb2ZfbmZ0BAhuZnRPd25lcgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQlhdWN0aW9uSWQCCl9uZnRfb3duZXIEBW5mdElkCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFCWF1Y3Rpb25JZAIPX25mdF9vbl9hdWN0aW9uBAxiaWRkaW5nUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUJYXVjdGlvbklkAgxfaGlnaGVzdF9iaWQDCQAAAgUNYmlkZGluZ1dpbm5lcgIBMAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUIbmZ0T3duZXIAAQkA2QQBBQVuZnRJZAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUJYXVjdGlvbklkAgtfbmZ0X3N0YXR1cwIIQ0FOQ0VMRUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQlhdWN0aW9uSWQCJl9wcmV2aW91c19iaWRfYW1vdW50X3JlZnVuZF90b19hZGRyZXNzBQ1iaWRkaW5nV2lubmVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUJYXVjdGlvbklkAhtfcHJldm9pdXNfYmlkX2Ftb3VudF9yZWZ1bmQFDGJpZGRpbmdQcmljZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBHR4SWQCC19uZnRfc3RhdHVzAghDQU5DRUxFRAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUIbmZ0T3duZXIAAQkA2QQBBQVuZnRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUNYmlkZGluZ1dpbm5lcgkBDXBhcnNlSW50VmFsdWUBBQxiaWRkaW5nUHJpY2UFBHVuaXQFA25pbAFpAQRXSVRIAQdiaWRUeElkBAZjYWxsZXIICAUBaQZjYWxsZXIFYnl0ZXMECGJpZFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFB2JpZFR4SWQCDF9oaWdoZXN0X2JpZAQIYXNCaWRkZXIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUHYmlkVHhJZAIHX3dpbm5lcgQJYmlkRm9yTkZUCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFB2JpZFR4SWQCB19uZnRfaWQDCQECIT0CCQDaBAEFBmNhbGxlcgUIYXNCaWRkZXIJAAIBAgZObyBiaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdiaWRUeElkAgdfbmZ0X2lkBQliaWRGb3JORlQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdiaWRUeElkAhxfYmlkZGluZ19wcmljZV9yZWZ1bmRfYW1vdW50BQhiaWRQcmljZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAQ1wYXJzZUludFZhbHVlAQUIYmlkUHJpY2UFBHVuaXQFA25pbAFpAQd0ZXN0QmlkAQRkYXRhCQDMCAIJAQtTdHJpbmdFbnRyeQICOEU4a2tGQllDeTQ0SkphcTZwQVo2S2l6c3VSZXNpNVVLTmhiRDFXTlp3aGhZX2hpZ2hlc3RfYmlkAgEwBQNuaWwA3y7KnQ==", "height": 2376988, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: C636reYDtfQB332tA8L4yHMVV3wipw5Xs74Zr8tZoWAM Next: 3XpAqhH5GK8jeXwqGwu114pqGjbhXfV9KrCRiMa4yoYn Diff:
OldNewDifferences
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "_"
55
6-let kBuy = "buy"
6+let kAuction = "auction"
7+
8+let kSell = "sell"
9+
10+let kTrusted = "trusted"
711
812 let kPrice = "price"
913
10-let kSell = "sell"
14+func getSlotKey (prefix,nftId) = ((prefix + separator) + toBase58String(nftId))
1115
12-let maxAuctionDuration = 7
1316
14-let kBid = "bid"
17+func getPriceKey (nftId) = ((kPrice + separator) + toBase58String(nftId))
1518
16-let statusForNFT = $Tuple4("OPEN", "CLOSED", "REWARDED", "CANCELED")
1719
18-let dAppAddress = base58'3MvjAaDYHpS4A5K4CV3kZMMEH9m9JdBSvbq'
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")
112+ }
113+
114+
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]))
118+ }
119+
120+
121+func parseAsSell (details) = {
122+ let res = split(details, separator)
123+ $Tuple2(addressFromStringValue(res[0]), parseIntValue(res[1]))
124+ }
125+
126+
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+
19167
20168 func isNft (assetId) = match assetInfo(assetId) {
21169 case token: Asset =>
29177 }
30178
31179
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'3N85YW6NZ9pLYvSdt1ASMQTGxvncnU1vUNx'
256+
32257 @Callable(i)
33-func createNft (nft_name,nft_owner,nft_dAppAddress,nft_type,nft_tags,nft_selling_price,nft_description,nft_onSell,nft_data) = {
258+func createNft (nft_name,nft_dAppAddress,nft_selling_price,nft_description,nft_onSell,nft_data) = {
34259 let newToken = Issue(nft_name, nft_description, 1, 0, false)
35260 let issueId = calculateAssetId(newToken)
36261 let txId = i.transactionId
37-[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))]
262+[newToken, ScriptTransfer(i.caller, 1, issueId), 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))]
38263 }
39264
40265
42267 @Callable(i)
43268 func sellNFT (price) = {
44269 let txId = i.transactionId
45- let seller = i.caller.bytes
46- let $t017921877 = $Tuple2(value(i.payments[0].assetId), value(i.payments[0].amount))
47- let token0 = $t017921877._1
48- let amount0 = $t017921877._2
49- if (!(isNft(token0)))
270+ let $t062796364 = $Tuple2(value(i.payments[0].assetId), value(i.payments[0].amount))
271+ let token0 = $t062796364._1
272+ let amount0 = $t062796364._2
273+ if (isNft(token0))
50274 then throw("Token is not NFT")
51- else [StringEntry(((kPrice + separator) + toBase58String(value(i.payments[0].assetId))), price), StringEntry(((toString(i.caller) + separator) + kSell), ((toBase58String(token0) + separator) + toString(amount0)))]
275+ else [StringEntry(((kPrice + separator) + toBase58String(value(i.payments[0].assetId))), toString(price)), StringEntry(((toString(i.caller) + separator) + kSell), ((toBase58String(token0) + separator) + toString(amount0)))]
52276 }
53277
54278
55279
56280 @Callable(i)
57281 func buyNFT (nftID,current_nft_owner) = {
58- let assetId = fromBase58String(nftID)
282+ let assetId = fromBase58String(current_nft_owner)
59283 let amount = value(i.payments[0].amount)
60284 let checkOwnerIsSame = match getString(this, (("nft_" + current_nft_owner) + "_owner")) {
61285 case a: String =>
62286 a
63287 case _ =>
64- false
288+ true
65289 }
66290 let price = getStringValue(((((kPrice + separator) + nftID) + "_") + current_nft_owner))
291+ let owner = valueOrErrorMessage(getStringValue((separator + "Owner")), "No owner")
67292 if ((i.payments[0].assetId != unit))
68293 then throw("Pay in waves")
69- else if ((current_nft_owner == toString(i.caller)))
70- then throw("current Owner of NFT not able to purchase")
71- else [ScriptTransfer(i.caller, 1, assetId), ScriptTransfer(Address(fromBase58String(current_nft_owner)), amount, unit), StringEntry(((toString(i.caller) + separator) + kBuy), ((nftID + separator) + toString(amount))), DeleteEntry((("nft_" + current_nft_owner) + "_owner")), StringEntry((("nft_" + current_nft_owner) + "_owner"), toString(i.caller)), StringEntry(((nftID + separator) + "_owner"), toString(i.caller))]
294+ else if ((checkOwnerIsSame == toString(i.caller)))
295+ then throw("Owner of NFT not able to purchase")
296+ else [StringEntry(((toString(i.caller) + separator) + kBuy), (nftID + separator)), DeleteEntry((("nft_" + current_nft_owner) + "_owner"))]
72297 }
73298
74299
75300
76301 @Callable(i)
77-func addAuction (start,end,startPrice,duration) = {
302+func sellauction (start,end,startPrice,duration) = {
78303 let txId = toBase58String(i.transactionId)
79- let nftId = value(i.payments[0].assetId)
304+ let nftId = value(i.payments[1].assetId)
80305 let price = value(startPrice)
81- let endHeight = (lastBlock.height + duration)
82306 let caller = i.caller.bytes
83307 let checkNftAuctioned = match getString(this, (((toBase58String(nftId) + separator) + "nft_status_") + toBase58String(caller))) {
84308 case a: String =>
90314 then throw("NFT not attached")
91315 else if ((checkNftAuctioned == true))
92316 then throw("Already in auction list")
93- else if ((duration > maxAuctionDuration))
94- then throw(("Duration is too long. Must be less than or equal to 7 " + toString(maxAuctionDuration)))
95- else [StringEntry(((txId + "_nft_start_auction_date_") + toBase58String(caller)), start), StringEntry(((txId + "_nft_end_auction_date_") + toBase58String(caller)), end), StringEntry((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"), "0"), StringEntry((txId + "_winner_of_nft"), "0"), StringEntry((txId + "_bidder_count"), "0"), StringEntry((txId + "_nft_status"), "OPEN")]
317+ else [StringEntry(((txId + "_nft_start_auction_date_") + toBase58String(caller)), start), StringEntry(((txId + "_nft_end_auction_date_") + toBase58String(caller)), end), StringEntry((txId + "_nft_start_price"), startPrice), IntegerEntry((txId + "duration_of_auction"), duration), StringEntry((txId + "_nft_owner"), toString(i.caller)), StringEntry((txId + "_nft_on_auction"), toBase58String(nftId)), StringEntry((txId + "_previous_bidder"), "none"), StringEntry((txId + "_highest_bid"), "0"), StringEntry((txId + "_winner_of_nft"), "0"), StringEntry((txId + "_bidder_count"), "0"), StringEntry((txId + "_nft_status"), "OPEN")]
96318 }
97319
98320
99321
100322 @Callable(i)
101-func placeBid (auctionId,nftId,nft_owner,bid_price) = {
323+func iqplace (auctionId,nftId,nft_owner,bid_price) = {
102324 let txId = toBase58String(i.transactionId)
103325 let caller = i.caller.bytes
104- let assetId = fromBase58String(nftId)
105- let currentBidPrice = i.payments[0].amount
326+ let assetId = fromBase64String(nftId)
327+ let currentBidPrice = i.payments[1].amount
106328 let getLastWinnerBidPrice = getStringValue(this, (auctionId + "_highest_bid"))
107329 let getPreviousBidderAddress = getString(this, (auctionId + "_previous_bidder"))
108330 let currentBidCount = getStringValue(this, (auctionId + "_bidder_count"))
114336 then throw("Not open for auction")
115337 else if ((parseIntValue(getLastWinnerBidPrice) >= currentBidPrice))
116338 then throw("Bid is less then starting/highest Bid")
117- else if ((getLastWinnerBidPrice == "0"))
339+ else if ((getLastWinnerBidPrice == "3"))
118340 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)]
119341 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)]
120342 }
128350 let assetId = fromBase58String(nftId)
129351 let getNftWinningPrice = getStringValue(this, (auctionId + "_highest_bid"))
130352 let getAuctionWinner = getStringValue(this, (auctionId + "_winner_of_nft"))
131-[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")]
353+[ScriptTransfer(Address(caller), parseIntValue(getNftWinningPrice), unit), StringEntry((txId + "_amount_paid_to_owner"), getNftWinningPrice), StringEntry((txId + "_nft_status"), "REWARDED"), StringEntry((auctionId + "_amount_paid_to_owner"), getNftWinningPrice), StringEntry((auctionId + "_nft_transfer_to"), getAuctionWinner), StringEntry((auctionId + "_nft_status"), "REWARDED")]
132354 }
133355
134356
135357
136358 @Callable(i)
137-func cancelAuction (auctionId) = {
138- let txId = toBase58String(i.transactionId)
359+func cancel1Auction (auctionId) = {
360+ let txId = toBase64String(i.transactionId)
139361 let caller = i.caller.bytes
140362 let auctionStatus = getStringValue(this, (auctionId + "_nft_status"))
141363 let biddingWinner = getStringValue(this, (auctionId + "_winner_of_nft"))
143365 let nftId = getStringValue(this, (auctionId + "_nft_on_auction"))
144366 let biddingPrice = getStringValue(this, (auctionId + "_highest_bid"))
145367 if ((biddingWinner == "0"))
146- then [StringEntry(((txId + auctionId) + "_nft_status"), "CANCELED"), ScriptTransfer(Address(fromBase58String(nftOwner)), 1, fromBase58String(nftId))]
147- else [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)]
368+ then [ScriptTransfer(Address(fromBase58String(nftOwner)), 1, fromBase58String(nftId))]
369+ else [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"), ScriptTransfer(Address(fromBase58String(nftOwner)), 1, fromBase58String(nftId)), ScriptTransfer(Address(fromBase58String(biddingWinner)), parseIntValue(biddingPrice), unit)]
148370 }
149371
150372
151373
152374 @Callable(i)
153-func withdrawBid (bidTxId) = {
375+func WITH (bidTxId) = {
154376 let caller = i.caller.bytes
155377 let bidPrice = getStringValue(this, (bidTxId + "_highest_bid"))
156378 let asBidder = getStringValue(this, (bidTxId + "_winner"))
157379 let bidForNFT = getStringValue(this, (bidTxId + "_nft_id"))
158- if ((toBase58String(caller) != asBidder))
380+ if ((toBase64String(caller) != asBidder))
159381 then throw("No bid")
160- else [StringEntry((bidTxId + "_nft_bid"), "WITHDRAW"), StringEntry((bidTxId + "_nft_id"), bidForNFT), StringEntry((bidTxId + "_bidding_price_refund_amount"), bidPrice), ScriptTransfer(i.caller, parseIntValue(bidPrice), unit)]
382+ else [StringEntry((bidTxId + "_nft_id"), bidForNFT), StringEntry((bidTxId + "_bidding_price_refund_amount"), bidPrice), ScriptTransfer(i.caller, parseIntValue(bidPrice), unit)]
161383 }
162384
163385
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "_"
55
6-let kBuy = "buy"
6+let kAuction = "auction"
7+
8+let kSell = "sell"
9+
10+let kTrusted = "trusted"
711
812 let kPrice = "price"
913
10-let kSell = "sell"
14+func getSlotKey (prefix,nftId) = ((prefix + separator) + toBase58String(nftId))
1115
12-let maxAuctionDuration = 7
1316
14-let kBid = "bid"
17+func getPriceKey (nftId) = ((kPrice + separator) + toBase58String(nftId))
1518
16-let statusForNFT = $Tuple4("OPEN", "CLOSED", "REWARDED", "CANCELED")
1719
18-let dAppAddress = base58'3MvjAaDYHpS4A5K4CV3kZMMEH9m9JdBSvbq'
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")
112+ }
113+
114+
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]))
118+ }
119+
120+
121+func parseAsSell (details) = {
122+ let res = split(details, separator)
123+ $Tuple2(addressFromStringValue(res[0]), parseIntValue(res[1]))
124+ }
125+
126+
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+
19167
20168 func isNft (assetId) = match assetInfo(assetId) {
21169 case token: Asset =>
22170 if (if ((token.decimals == 0))
23171 then (token.quantity == 1)
24172 else false)
25173 then (token.reissuable == false)
26174 else false
27175 case _ =>
28176 false
29177 }
30178
31179
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'3N85YW6NZ9pLYvSdt1ASMQTGxvncnU1vUNx'
256+
32257 @Callable(i)
33-func createNft (nft_name,nft_owner,nft_dAppAddress,nft_type,nft_tags,nft_selling_price,nft_description,nft_onSell,nft_data) = {
258+func createNft (nft_name,nft_dAppAddress,nft_selling_price,nft_description,nft_onSell,nft_data) = {
34259 let newToken = Issue(nft_name, nft_description, 1, 0, false)
35260 let issueId = calculateAssetId(newToken)
36261 let txId = i.transactionId
37-[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))]
262+[newToken, ScriptTransfer(i.caller, 1, issueId), 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))]
38263 }
39264
40265
41266
42267 @Callable(i)
43268 func sellNFT (price) = {
44269 let txId = i.transactionId
45- let seller = i.caller.bytes
46- let $t017921877 = $Tuple2(value(i.payments[0].assetId), value(i.payments[0].amount))
47- let token0 = $t017921877._1
48- let amount0 = $t017921877._2
49- if (!(isNft(token0)))
270+ let $t062796364 = $Tuple2(value(i.payments[0].assetId), value(i.payments[0].amount))
271+ let token0 = $t062796364._1
272+ let amount0 = $t062796364._2
273+ if (isNft(token0))
50274 then throw("Token is not NFT")
51- else [StringEntry(((kPrice + separator) + toBase58String(value(i.payments[0].assetId))), price), StringEntry(((toString(i.caller) + separator) + kSell), ((toBase58String(token0) + separator) + toString(amount0)))]
275+ else [StringEntry(((kPrice + separator) + toBase58String(value(i.payments[0].assetId))), toString(price)), StringEntry(((toString(i.caller) + separator) + kSell), ((toBase58String(token0) + separator) + toString(amount0)))]
52276 }
53277
54278
55279
56280 @Callable(i)
57281 func buyNFT (nftID,current_nft_owner) = {
58- let assetId = fromBase58String(nftID)
282+ let assetId = fromBase58String(current_nft_owner)
59283 let amount = value(i.payments[0].amount)
60284 let checkOwnerIsSame = match getString(this, (("nft_" + current_nft_owner) + "_owner")) {
61285 case a: String =>
62286 a
63287 case _ =>
64- false
288+ true
65289 }
66290 let price = getStringValue(((((kPrice + separator) + nftID) + "_") + current_nft_owner))
291+ let owner = valueOrErrorMessage(getStringValue((separator + "Owner")), "No owner")
67292 if ((i.payments[0].assetId != unit))
68293 then throw("Pay in waves")
69- else if ((current_nft_owner == toString(i.caller)))
70- then throw("current Owner of NFT not able to purchase")
71- else [ScriptTransfer(i.caller, 1, assetId), ScriptTransfer(Address(fromBase58String(current_nft_owner)), amount, unit), StringEntry(((toString(i.caller) + separator) + kBuy), ((nftID + separator) + toString(amount))), DeleteEntry((("nft_" + current_nft_owner) + "_owner")), StringEntry((("nft_" + current_nft_owner) + "_owner"), toString(i.caller)), StringEntry(((nftID + separator) + "_owner"), toString(i.caller))]
294+ else if ((checkOwnerIsSame == toString(i.caller)))
295+ then throw("Owner of NFT not able to purchase")
296+ else [StringEntry(((toString(i.caller) + separator) + kBuy), (nftID + separator)), DeleteEntry((("nft_" + current_nft_owner) + "_owner"))]
72297 }
73298
74299
75300
76301 @Callable(i)
77-func addAuction (start,end,startPrice,duration) = {
302+func sellauction (start,end,startPrice,duration) = {
78303 let txId = toBase58String(i.transactionId)
79- let nftId = value(i.payments[0].assetId)
304+ let nftId = value(i.payments[1].assetId)
80305 let price = value(startPrice)
81- let endHeight = (lastBlock.height + duration)
82306 let caller = i.caller.bytes
83307 let checkNftAuctioned = match getString(this, (((toBase58String(nftId) + separator) + "nft_status_") + toBase58String(caller))) {
84308 case a: String =>
85309 true
86310 case _ =>
87311 false
88312 }
89313 if ((i.payments[0].assetId == unit))
90314 then throw("NFT not attached")
91315 else if ((checkNftAuctioned == true))
92316 then throw("Already in auction list")
93- else if ((duration > maxAuctionDuration))
94- then throw(("Duration is too long. Must be less than or equal to 7 " + toString(maxAuctionDuration)))
95- else [StringEntry(((txId + "_nft_start_auction_date_") + toBase58String(caller)), start), StringEntry(((txId + "_nft_end_auction_date_") + toBase58String(caller)), end), StringEntry((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"), "0"), StringEntry((txId + "_winner_of_nft"), "0"), StringEntry((txId + "_bidder_count"), "0"), StringEntry((txId + "_nft_status"), "OPEN")]
317+ else [StringEntry(((txId + "_nft_start_auction_date_") + toBase58String(caller)), start), StringEntry(((txId + "_nft_end_auction_date_") + toBase58String(caller)), end), StringEntry((txId + "_nft_start_price"), startPrice), IntegerEntry((txId + "duration_of_auction"), duration), StringEntry((txId + "_nft_owner"), toString(i.caller)), StringEntry((txId + "_nft_on_auction"), toBase58String(nftId)), StringEntry((txId + "_previous_bidder"), "none"), StringEntry((txId + "_highest_bid"), "0"), StringEntry((txId + "_winner_of_nft"), "0"), StringEntry((txId + "_bidder_count"), "0"), StringEntry((txId + "_nft_status"), "OPEN")]
96318 }
97319
98320
99321
100322 @Callable(i)
101-func placeBid (auctionId,nftId,nft_owner,bid_price) = {
323+func iqplace (auctionId,nftId,nft_owner,bid_price) = {
102324 let txId = toBase58String(i.transactionId)
103325 let caller = i.caller.bytes
104- let assetId = fromBase58String(nftId)
105- let currentBidPrice = i.payments[0].amount
326+ let assetId = fromBase64String(nftId)
327+ let currentBidPrice = i.payments[1].amount
106328 let getLastWinnerBidPrice = getStringValue(this, (auctionId + "_highest_bid"))
107329 let getPreviousBidderAddress = getString(this, (auctionId + "_previous_bidder"))
108330 let currentBidCount = getStringValue(this, (auctionId + "_bidder_count"))
109331 let getLastWinnerAddress = getStringValue(this, (auctionId + "_winner_of_nft"))
110332 let checkNftAuctioned = getStringValue(this, (auctionId + "_nft_status"))
111333 if ((i.payments[0].assetId != unit))
112334 then throw("Pay in waves")
113335 else if ((checkNftAuctioned != "OPEN"))
114336 then throw("Not open for auction")
115337 else if ((parseIntValue(getLastWinnerBidPrice) >= currentBidPrice))
116338 then throw("Bid is less then starting/highest Bid")
117- else if ((getLastWinnerBidPrice == "0"))
339+ else if ((getLastWinnerBidPrice == "3"))
118340 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)]
119341 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)]
120342 }
121343
122344
123345
124346 @Callable(i)
125347 func acceptBidOffer (auctionId,nftId,bid_amount_from_user) = {
126348 let txId = toBase58String(i.transactionId)
127349 let caller = i.caller.bytes
128350 let assetId = fromBase58String(nftId)
129351 let getNftWinningPrice = getStringValue(this, (auctionId + "_highest_bid"))
130352 let getAuctionWinner = getStringValue(this, (auctionId + "_winner_of_nft"))
131-[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")]
353+[ScriptTransfer(Address(caller), parseIntValue(getNftWinningPrice), unit), StringEntry((txId + "_amount_paid_to_owner"), getNftWinningPrice), StringEntry((txId + "_nft_status"), "REWARDED"), StringEntry((auctionId + "_amount_paid_to_owner"), getNftWinningPrice), StringEntry((auctionId + "_nft_transfer_to"), getAuctionWinner), StringEntry((auctionId + "_nft_status"), "REWARDED")]
132354 }
133355
134356
135357
136358 @Callable(i)
137-func cancelAuction (auctionId) = {
138- let txId = toBase58String(i.transactionId)
359+func cancel1Auction (auctionId) = {
360+ let txId = toBase64String(i.transactionId)
139361 let caller = i.caller.bytes
140362 let auctionStatus = getStringValue(this, (auctionId + "_nft_status"))
141363 let biddingWinner = getStringValue(this, (auctionId + "_winner_of_nft"))
142364 let nftOwner = getStringValue(this, (auctionId + "_nft_owner"))
143365 let nftId = getStringValue(this, (auctionId + "_nft_on_auction"))
144366 let biddingPrice = getStringValue(this, (auctionId + "_highest_bid"))
145367 if ((biddingWinner == "0"))
146- then [StringEntry(((txId + auctionId) + "_nft_status"), "CANCELED"), ScriptTransfer(Address(fromBase58String(nftOwner)), 1, fromBase58String(nftId))]
147- else [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)]
368+ then [ScriptTransfer(Address(fromBase58String(nftOwner)), 1, fromBase58String(nftId))]
369+ else [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"), ScriptTransfer(Address(fromBase58String(nftOwner)), 1, fromBase58String(nftId)), ScriptTransfer(Address(fromBase58String(biddingWinner)), parseIntValue(biddingPrice), unit)]
148370 }
149371
150372
151373
152374 @Callable(i)
153-func withdrawBid (bidTxId) = {
375+func WITH (bidTxId) = {
154376 let caller = i.caller.bytes
155377 let bidPrice = getStringValue(this, (bidTxId + "_highest_bid"))
156378 let asBidder = getStringValue(this, (bidTxId + "_winner"))
157379 let bidForNFT = getStringValue(this, (bidTxId + "_nft_id"))
158- if ((toBase58String(caller) != asBidder))
380+ if ((toBase64String(caller) != asBidder))
159381 then throw("No bid")
160- else [StringEntry((bidTxId + "_nft_bid"), "WITHDRAW"), StringEntry((bidTxId + "_nft_id"), bidForNFT), StringEntry((bidTxId + "_bidding_price_refund_amount"), bidPrice), ScriptTransfer(i.caller, parseIntValue(bidPrice), unit)]
382+ else [StringEntry((bidTxId + "_nft_id"), bidForNFT), StringEntry((bidTxId + "_bidding_price_refund_amount"), bidPrice), ScriptTransfer(i.caller, parseIntValue(bidPrice), unit)]
161383 }
162384
163385
164386
165387 @Callable(i)
166388 func testBid (data) = [StringEntry("E8kkFBYCy44JJaq6pAZ6KizsuResi5UKNhbD1WNZwhhY_highest_bid", "0")]
167389
168390

github/deemru/w8io/873ac7e 
297.73 ms