tx · EbNGzX2iLaMBNkT8R3b5wE96FLoaZDpuX4z5oZPAXU8K

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.03000000 Waves

2023.05.07 17:59 [2567592] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "EbNGzX2iLaMBNkT8R3b5wE96FLoaZDpuX4z5oZPAXU8K", "fee": 3000000, "feeAssetId": null, "timestamp": 1683471572715, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "2oXaK7cxnfsAimzvWAWqmZc29p4sUaCUaQZVvQHqF1yKwZux5DHaU3UujHXHncSmkWgk375AtKae5B87EiuDEo1B" ], "script": "base64:BgIsCAISAwoBCBIECgIRERIECgIRERIDCgEREgUKAwEBARIECgIICBIFCgMICAhLAANTRVACAl9fAAVNVUxUNgDAhD0ABU1VTFQ4AIDC1y8ABk1VTFQxMACAyK+gJQAFY2hhaW4JAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAC3VzZHRBc3NldElkBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwASCE2nqyCAM/TtG7yo7ui5O8yYLdC136B5ao1CP5qA//uQMJAAACAQFUBQckbWF0Y2gwASBVsdifcoeC7+XjW42sBatl3ppDoS8WuwXzGreHpfHFGAkAAgECDVVua25vd24gY2hhaW4AFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BRQ3V2RmJ2aDRMa1BVbnJuVTF6M2puYkExcDltM1dOaHYDCQAAAgEBVAUHJG1hdGNoMAIjM011bWtHR3p0Q0tBWHBXRHF4a2Rkb2ZxWFNVYnFRa3ZTSnkJAAIBAg1Vbmtub3duIGNoYWluAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAEMZ2V0SW50T3JFbHNlAgNrZXkKZGVmYXVsdFZhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkFCmRlZmF1bHRWYWwAEUlkeENmZ1N0YWtpbmdEYXBwAAEAEUlkeENmZ0Vjb25vbXlEYXBwAAIAFElkeENmZ0dvdmVybmFuY2VEYXBwAAMBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEOa2V5UmVzdEFkZHJlc3MAAgwlc19fcmVzdEFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgdyZXN0Q2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHcmVzdENmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgADHJlc3RDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5UmVzdEFkZHJlc3MABRVkZWZhdWx0UmVzdEFkZHJlc3NTdHIAB3Jlc3RDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDHJlc3RDb250cmFjdAAPc3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnU3Rha2luZ0RhcHAAD0RFRkFVTFRMT0NBVElPTgIPQWZyaWNhX0ZfQWZyaWNhAAZOVU1SRVMABgATRkFDVE9SWU1BWFdBUkVIT1VTRQCAyK+gJQAQUkVTT1VSQ0VQUklDRU1JTgDVtQIACk1JTlBBWU1FTlQAkE4ADlNFTExNVUxUSVBMSUVSAMgBAA1CVVlNVUxUSVBMSUVSAKwCAApMQU5EUFJFRklYAgRMQU5EAApEVUNLUFJFRklYAgREVUNLAAxXSE1VTFRJUExJRVIAgMivoCUACkFVQ1RJT05GRUUAkE4ACHJlc1R5cGVzCQDMCAICA09pbAkAzAgCAgNPcmUJAMwIAgIEV29vZAkAzAgCAgRTYW5kCQDMCAICBENsYXkJAMwIAgIHT3JnYW5pYwUDbmlsAAhtYXRUeXBlcwkAzAgCAgRGdWVsCQDMCAICBU1ldGFsCQDMCAICBVBsYW5rCQDMCAICBUdsYXNzCQDMCAICB1BsYXN0aWMJAMwIAgIHUHJvdGVpbgUDbmlsAAlwcm9kVHlwZXMJAMwIAgINRmlyc3QgQWlkIEtpdAkAzAgCAghCYWNrcGFjawkAzAgCAgtGb29kIFJhdGlvbgkAzAgCAghKZXQgUGFjawkAzAgCAgZTaGllbGQFA25pbAAKY29udGluZW50cwkAzAgCAghBbWVyaWNhcwkAzAgCAgZFdXJvcGUJAMwIAgIEQXNpYQkAzAgCAgZBZnJpY2EJAMwIAgIHT2NlYW5pYQUDbmlsABBwcm9kdWN0aW9uTWF0cml4CQDMCAICEDFfMV8xXzJfMl81XzFfMTAJAMwIAgIRMl81XzVfMl83XzVfMl8xMDAJAMwIAgIQMV8xXzFfMl8yXzVfMV8xMAkAzAgCAhE5XzlfMV81XzVfMV81XzEwMAkAzAgCAhAyXzJfMV8yXzJfMl8xXzEwBQNuaWwAD2NvbnRJZHhBbWVyaWNhcwAAAA1jb250SWR4RXVyb3BlAAEAC2NvbnRJZHhBc2lhAAIADWNvbnRJZHhBZnJpY2EAAwAOY29udElkeE9jZWFuaWEABAEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAglmYWN0b3J5SWQHcmVzVHlwZQkArAICCQCsAgIJAKwCAgIbZmFjdG9yeVdoQnlDb250aW5lbnRBbmRSZXNfBQlmYWN0b3J5SWQCAV8JAKQDAQUHcmVzVHlwZQEOa2V5T3JkZXJCeUxhbmQBC2xhbmRBc3NldElkCQCsAgICCmxhbmRPcmRlcl8FC2xhbmRBc3NldElkARRrZXlTdGFrZWREdWNrQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZER1Y2tCeU93bmVyXwUJb3duZXJBZGRyARFrZXlCYWNrcGFja0J5RHVjawELZHVja0Fzc2V0SWQJAKwCAgIJYmFja1BhY2tfBQtkdWNrQXNzZXRJZAEPa2V5RHVja0xvY2F0aW9uAQtkdWNrQXNzZXRJZAkArAICAg1kdWNrTG9jYXRpb25fBQtkdWNrQXNzZXRJZAEKa2V5QmxvY2tlZAACEGNvbnRyYWN0c0Jsb2NrZWQBFWtleUxhbmRBc3NldElkVG9Pd25lcgEHYXNzZXRJZAkArAICAgluZnRPd25lcl8FB2Fzc2V0SWQBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBB2Fzc2V0SWQJAKwCAgILc3Rha2VkVGltZV8FB2Fzc2V0SWQAD2xvY0lkeENvbnRpbmVudAAAAApsb2NJZHhUeXBlAAEACGxvY0lkeElkAAIACmJwSWR4TGV2ZWwAAAAIYnBJZHhSZXMAAQAIYnBJZHhNYXQAAgAJYnBJZHhQcm9kAAMACHdoSWR4Vm9sAAAACHdoSWR4UmVzAAEACHdoSWR4TWF0AAIACXdoSWR4UHJvZAADAA53aElkeExvY2tlZFZvbAAEAAlvcmRJZHhSZXMAAAAJb3JkSWR4TWF0AAEACm9yZElkeFByb2QAAgEIYXNTdHJpbmcBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQhnZXRPcmRlcgEGb3JkS2V5BAFwCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUGb3JkS2V5AjAwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDowQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDoCAToJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQlvcmRJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQFwBQlvcmRJZHhSZXMCFzBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwCQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUJb3JkSWR4TWF0AgFfBQZOVU1SRVMJAJEDAgUBcAUJb3JkSWR4TWF0AhcwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMAkAzAgCCQCRAwIFAXAFCm9yZElkeFByb2QFA25pbAESZ2V0V2FyZWhvdXNlVm9sdW1lAQl2b2xQcmVmaXgEBXBhcnRzCQC1CQIFCXZvbFByZWZpeAIBXwkAaAIJAGgCBQxXSE1VTFRJUExJRVIJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAQABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAAEZZ2V0V2FyZWhvdXNlQ3VyclJlc1ZvbHVtZQEJY3VycmVudFdoCgEDc3VtAgNhY2MEaXRlbQkAZAIFA2FjYwkBDXBhcnNlSW50VmFsdWUBBQRpdGVtCgACJGwJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNzdW0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUk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Y2UgPSAJAKQDAQUIbWF4UHJpY2UCAywgKAUFbG9jSWQCAiwgCQCRAwIFCG1hdFR5cGVzBQdtYXRUeXBlAgEpCQCVCgMJAQxJbnRlZ2VyRW50cnkCBQV3aEtleQkAZQIFAncwBQFtBQl1c2R0U3BlbnQFAW0BC2dldEJhY2twYWNrAQVicEtleQQBcAkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAUFYnBLZXkCGjA6MF8wXzBfMF8wXzA6MF8wXzBfMF8wXzA6AgE6CQDMCAIJAKQDAQkBC3ZhbHVlT3JFbHNlAgkAtgkBCQCRAwIFAXAFCmJwSWR4TGV2ZWwAAAkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCGJwSWR4UmVzAgFfBQZOVU1SRVMJAJEDAgUBcAUIYnBJZHhSZXMCCzBfMF8wXzBfMF8wCQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhNYXQCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeE1hdAILMF8wXzBfMF8wXzAJAMwIAgkAkQMCBQFwBQlicElkeFByb2QFA25pbAEMY2hlY2tCbG9ja2VkAAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUPc3Rha2luZ0NvbnRyYWN0CQEKa2V5QmxvY2tlZAAHCQACAQIfQ29udHJhY3RzIGFyZSB1bmRlciBtYWludGVuYW5jZQUEdW5pdAEJc2V0Q29tbW9uAgNhY2MEaXRlbQQBaggFA2FjYwJfMQQJaXRlbVBhcnRzCQC1CQIFBGl0ZW0CAUADCQECIT0CCQCQAwEFCWl0ZW1QYXJ0cwACCQACAQIuSW5jb3JyZWN0IG9yZGVyIGZvcm1hdCwgc2hvdWxkIGJlIGFtb3VudEBwcmljZQQIbmV3T3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlpdGVtUGFydHMAAAQIbmV3T3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlpdGVtUGFydHMAAQQJbmV3T3JkVXNkCQBrAwUIbmV3T3JkQW0FCG5ld09yZFByBQVNVUxUOAQDd2hwCQENcGFyc2VJbnRWYWx1ZQEJAJEDAggFA2FjYwJfNQUBagQLY3VyT3JkUGFydHMJALUJAgkAkQMCCAUDYWNjAl82BQFqAgFABAhjdXJPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAAECGN1ck9yZFByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgULY3VyT3JkUGFydHMAAQMJAGYCAAAFCGN1ck9yZFByCQACAQIXUHJpY2UgY2FuJ3QgYmUgbmVnYXRpdmUECWN1ck9yZFVzZAkAawMFCGN1ck9yZEFtBQhjdXJPcmRQcgUFTVVMVDgDCQAAAgUIbmV3T3JkQW0AAAMJAGYCBQhjdXJPcmRBbQAACQCYCgYJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQN3aHAJAGUCCAUDYWNjAl8zBQhjdXJPcmRBbQkAZQIIBQNhY2MCXzQFCWN1ck9yZFVzZAgFA2FjYwJfNQgFA2FjYwJfNgkAmAoGCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFA3docAUIY3VyT3JkQW0JAGQCCAUDYWNjAl8zBQhjdXJPcmRBbQgFA2FjYwJfNAgFA2FjYwJfNQgFA2FjYwJfNgMJAGYCBQhuZXdPcmRBbQAAAwkAZgIAAAUIY3VyT3JkQW0EBmFtRGlmZgkAZAIFCG5ld09yZEFtBQhjdXJPcmRBbQkAmAoGCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFA3docAUIY3VyT3JkQW0JAGQCCAUDYWNjAl8zBQZhbURpZmYJAGQCCAUDYWNjAl80BQluZXdPcmRVc2QIBQNhY2MCXzUIBQNhY2MCXzYJAJgKBgkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEFA3docAkAZQIJAGQCCAUDYWNjAl8zBQhuZXdPcmRBbQUIY3VyT3JkQW0JAGUCCQBkAggFA2FjYwJfNAUJbmV3T3JkVXNkBQljdXJPcmRVc2QIBQNhY2MCXzUIBQNhY2MCXzYDCQBmAgAABQhjdXJPcmRBbQQGYW1EaWZmCQBlAgUIY3VyT3JkQW0FCG5ld09yZEFtAwkAZgIAAAkAZQIFA3docAUGYW1EaWZmCQACAQkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHRha2UgCQCkAwEFBmFtRGlmZgIaIGZyb20gd2FyZWhvdXNlLCBidXQgb25seSAJAKQDAQUDd2hwAgogYXZhaWxhYmxlCQCYCgYJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgUDd2hwBQZhbURpZmYJAGQCCAUDYWNjAl8zBQZhbURpZmYIBQNhY2MCXzQIBQNhY2MCXzUIBQNhY2MCXzYDCQBmAgAACQBkAgUDd2hwBQhuZXdPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBCQEBLQEFCG5ld09yZEFtAhogZnJvbSB3YXJlaG91c2UsIGJ1dCBvbmx5IAkApAMBBQN3aHACCiBhdmFpbGFibGUJAJgKBgkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCBQN3aHAFCG5ld09yZEFtCQBlAgkAZQIIBQNhY2MCXzMFCG5ld09yZEFtBQhjdXJPcmRBbQkAZQIIBQNhY2MCXzQFCWN1ck9yZFVzZAgFA2FjYwJfNQgFA2FjYwJfNgEMYWNjZXB0Q29tbW9uAgNhY2MNYnBPcmRQcm9kSXRlbQQBaggFA2FjYwJfNwQOYnBPcmRQcm9kUGFydHMJALUJAgUNYnBPcmRQcm9kSXRlbQIBQAMJAQIhPQIJAJADAQUOYnBPcmRQcm9kUGFydHMAAgkAAgECLkluY29ycmVjdCBvcmRlciBmb3JtYXQsIHNob3VsZCBiZSBhbW91bnRAcHJpY2UEB2JwT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5icE9yZFByb2RQYXJ0cwAABAdicE9yZFByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOYnBPcmRQcm9kUGFydHMAAQMJAGYCAAAFB2JwT3JkUHIJAAIBAhdQcmljZSBjYW4ndCBiZSBuZWdhdGl2ZQQIYnBPcmRVc2QJAGsDBQdicE9yZEFtBQdicE9yZFByBQVNVUxUOAQDYnBwCQENcGFyc2VJbnRWYWx1ZQEJAJEDAggFA2FjYwJfOAUBagQDd2hwCQENcGFyc2VJbnRWYWx1ZQEJAJEDAggFA2FjYwJfOQUBagQKd2hPcmRQYXJ0cwkAtQkCCQCRAwIIBQNhY2MDXzEwBQFqAgFABAd3aE9yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKd2hPcmRQYXJ0cwAABAd3aE9yZFByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKd2hPcmRQYXJ0cwABAwMJAQIhPQIFB2JwT3JkQW0AAAkBAiE9AgUHYnBPcmRQcgUHd2hPcmRQcgcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIKUHJpY2VzIG9mIAkAkQMCBQlwcm9kVHlwZXMFAWoCFyBkb24ndCBtYXRjaCEgV0ggcHJpY2U9CQCkAwEFB3doT3JkUHICDSwgeW91ciBwcmljZT0JAKQDAQUHYnBPcmRQcgQId2hPcmRVc2QJAGsDBQd3aE9yZEFtBQd3aE9yZFByBQVNVUxUOAMJAAACBQdicE9yZEFtAAAJAJwKCgkAzQgCCAUDYWNjAl8xCQCkAwEFA3docAkAzQgCCAUDYWNjAl8yCQCRAwIIBQNhY2MDXzEwBQFqCQDNCAIIBQNhY2MCXzMJAKQDAQUDYnBwCAUDYWNjAl80CAUDYWNjAl81CAUDYWNjAl82CQBkAggFA2FjYwJfNwABCAUDYWNjAl84CAUDYWNjAl85CAUDYWNjA18xMAMJAGYCBQdicE9yZEFtAAADCQBmAgAABQd3aE9yZEFtAwkAZgIFB2JwT3JkQW0JAQEtAQUHd2hPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BdHRlbXB0IHRvIGJ1eSAJAKQDAQUHYnBPcmRBbQIEIG9mIAkAkQMCBQlwcm9kVHlwZXMFAWoCGywgYnV0IHdhcmVob3VzZSBvbmx5IHNlbGxzIAkApAMBCQEBLQEFB3doT3JkQW0JAJwKCgkAzQgCCAUDYWNjAl8xCQCkAwEFA3docAkAzQgCCAUDYWNjAl8yCQCsAgIJAKwCAgkApAMBCQBkAgUHd2hPcmRBbQUHYnBPcmRBbQIBQAkApAMBBQd3aE9yZFByCQDNCAIIBQNhY2MCXzMJAKQDAQkAZAIFA2JwcAUHYnBPcmRBbQkAZAIIBQNhY2MCXzQFB2JwT3JkQW0IBQNhY2MCXzUJAGQCCAUDYWNjAl82BQhicE9yZFVzZAkAZAIIBQNhY2MCXzcAAQgFA2FjYwJfOAgFA2FjYwJfOQgFA2FjYwNfMTAJAAIBCQCsAgIJAKwCAgIPQXR0ZW1wdCB0byBidXkgCQCRAwIFCXByb2RUeXBlcwUBagIgIHdoaWxlIHdhcmVob3VzZSBkb2Vzbid0IHNlbGwgaXQDCQBmAgUHd2hPcmRBbQAAAwkAZgIJAQEtAQUHYnBPcmRBbQUHd2hPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCkAwEJAQEtAQUHYnBPcmRBbQIEIG9mIAkAkQMCBQlwcm9kVHlwZXMFAWoCGiwgYnV0IHdhcmVob3VzZSBvbmx5IGJ1eXMgCQCkAwEFB3doT3JkQW0DCQBmAgkBAS0BBQdicE9yZEFtBQNicHAJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byBzZWxsIAkApAMBCQEBLQEFB2JwT3JkQW0CFCwgYnV0IHlvdSBvbmx5IGhhdmUgCQCkAwEFA2JwcAIEIG9mIAkAkQMCBQlwcm9kVHlwZXMFAWoJAJwKCgkAzQgCCAUDYWNjAl8xCQCkAwEJAGUCBQN3aHAFB2JwT3JkQW0JAM0IAggFA2FjYwJfMgkArAICCQCsAgIJAKQDAQkAZAIFB3doT3JkQW0FB2JwT3JkQW0CAUAJAKQDAQUHd2hPcmRQcgkAzQgCCAUDYWNjAl8zCQCkAwEJAGQCBQNicHAFB2JwT3JkQW0JAGUCCAUDYWNjAl80BQdicE9yZEFtCQBlAggFA2FjYwJfNQUIYnBPcmRVc2QIBQNhY2MCXzYJAGQCCAUDYWNjAl83AAEIBQNhY2MCXzgIBQNhY2MCXzkIBQNhY2MDXzEwCQACAQkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAJEDAgUJcHJvZFR5cGVzBQFqAh8gd2hpbGUgd2FyZWhvdXNlIGRvZXNuJ3QgYnV5IGl0BwFpAQ1jb25zdHJ1Y3RvclYxAQhyZXN0QWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAFCHJlc3RBZGRyBQNuaWwBaQENc2VsbFJlc291cmNlcwIHYW1vdW50cwltaW5QcmljZXMEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECKnNlbGxSZXNvdXJjZXMgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50cwQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwoBBWFkZGVyAgNhY2MBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkAkQMCBQdyZXNMaXN0BQFqAgQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAhQsIGJ1dCB0cmllZCB0byBzZWxsIAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgAACQCRAwIFB2Ftb3VudHMFAWoJAAIBCQCsAgIJAKwCAgkArAICAiVZb3UgdHJpZWQgdG8gc2VsbCBuZWdhdGl2ZSBhbW91bnQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAgI6IAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgkAkQMCBQdhbW91bnRzBQFqAAAEAWIJAQxzZWxsSW50ZXJuYWwEBQVsb2NJZAUBagkAkQMCBQdhbW91bnRzBQFqCQCRAwIFCW1pblByaWNlcwUBagkAlQoDCQDNCAIIBQNhY2MCXzEIBQFiAl8xCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQCRAwIFB2Ftb3VudHMFAWoJAGQCCAUDYWNjAl8zCAUBYgJfMgkAlQoDCAUDYWNjAl8xCQDNCAIIBQNhY2MCXzIJAJEDAgUHcmVzTGlzdAUBaggFA2FjYwJfMwQGbWVyZ2VkCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwJAJQKAgkAzQgCCAUGbWVyZ2VkAl8xCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIIBQZtZXJnZWQCXzMFC3VzZHRBc3NldElkBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMYnV5TWF0ZXJpYWxzAgdhbW91bnRzCW1heFByaWNlcwQHYmxvY2tlZAkBDGNoZWNrQmxvY2tlZAADCQAAAgUHYmxvY2tlZAUHYmxvY2tlZAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQFbG9jSWQJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8KAQhtVXBkYXRlcgIDYWNjAWoDCQBmAgAACQCRAwIFB2Ftb3VudHMFAWoJAAIBCQCsAgIJAKwCAgkArAICAiRZb3UgdHJpZWQgdG8gYnV5IG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIbWF0VHlwZXMFAWoCAjogCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBC2J1eUludGVybmFsBAUFbG9jSWQFAWoJAJEDAgUHYW1vdW50cwUBagkAkQMCBQltYXhQcmljZXMFAWoJAJUKAwkAzQgCCAUDYWNjAl8xCAUBYgJfMQkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBaggFAWICXzMJAGQCCAUDYWNjAl8zCAUBYgJfMgkAlQoDCAUDYWNjAl8xCQDNCAIIBQNhY2MCXzIJAJEDAgUHbWF0TGlzdAUBaggFA2FjYwJfMwQGbWVyZ2VkCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIbVVwZGF0ZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYDCQBmAggFBm1lcmdlZAJfMwUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkApAMBBQNhbXQCCywgcmVxdWlyZWQ9CQCkAwEIBQZtZXJnZWQCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAgFBm1lcmdlZAJfMwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAgFBm1lcmdlZAJfMwULdXNkdEFzc2V0SWQFA25pbAUDbmlsCQCUCgIJAM4IAggFBm1lcmdlZAJfMQUEcmVzdAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWV4Y2hhbmdlUmVzb3VyY2VzAQdhbW91bnRzBAdibG9ja2VkCQEMY2hlY2tCbG9ja2VkAAMJAAACBQdibG9ja2VkBQdibG9ja2VkBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwoBCWV4Y2hhbmdlcgIDYWNjAWoEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFAWoEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEA2FtagkAkQMCBQdhbW91bnRzBQFqAwkAZgIFA2FtagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCRAwIFB3Jlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCGCwgYnV0IHRyaWVkIHRvIGV4Y2hhbmdlIAkApAMBBQNhbWoDCQBmAgAABQNhbWoJAAIBCQCsAgIJAKwCAgkArAICAilZb3UgdHJpZWQgdG8gZXhjaGFuZ2UgbmVnYXRpdmUgYW1vdW50IG9mIAkAkQMCBQhyZXNUeXBlcwUBagICOiAJAKQDAQUDYW1qAwkAZgIFA2FtagAACQCWCgQJAM0IAggFA2FjYwJfMQkApAMBCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoFA2FtagkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBagUDYW1qCQBkAggFA2FjYwJfMwkAawMFA2FtagUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgJAM0IAggFA2FjYwJfNAkBDEludGVnZXJFbnRyeQIFBXdoS2V5BQJ3MAkAlgoECQDNCAIIBQNhY2MCXzEJAJEDAgUHcmVzTGlzdAUBagkAzQgCCAUDYWNjAl8yCQCRAwIFB21hdExpc3QFAWoIBQNhY2MCXzMIBQNhY2MCXzQEBm1lcmdlZAoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFA25pbAUDbmlsAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZXhjaGFuZ2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAwkAZgIIBQZtZXJnZWQCXzMFA2FtdAkAAgEJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAKQDAQUDYW10AgssIHJlcXVpcmVkPQkApAMBCAUGbWVyZ2VkAl8zBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIIBQZtZXJnZWQCXzECAV8JAMwIAgkAuQkCCAUGbWVyZ2VkAl8yAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQEcmVzdAMJAGYCCQBlAgUDYW10CAUGbWVyZ2VkAl8zAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10CAUGbWVyZ2VkAl8zBQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwJAJQKAgkAzggCBQRyZXN0CAUGbWVyZ2VkAl80BQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY3JhZnRHb29kcwMKcHJvZHVjdElkeAVsZXZlbAhxdWFudGl0eQQHYmxvY2tlZAkBDGNoZWNrQmxvY2tlZAADCQAAAgUHYmxvY2tlZAUHYmxvY2tlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECJWJ1eUdvb2RzIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudHMDCQBmAgAABQhxdWFudGl0eQkAAgECG1F1YW50aXR5IHNob3VsZCBiZSBwb3NpdGl2ZQQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFNCQACAQkArAICAjFEdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIE1hbnVmYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBARjb250CQCRAwIFC2N1ckxvY2F0aW9uBQ9sb2NJZHhDb250aW5lbnQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwMDCQBmAgAABQpwcm9kdWN0SWR4BgkAZwIFCnByb2R1Y3RJZHgJAJADAQUQcHJvZHVjdGlvbk1hdHJpeAkAAgEJAKwCAgIUVW5rbm93biBwcm9kdWN0IGlkeD0JAKQDAQUKcHJvZHVjdElkeAQOcHJvZHVjdENvbnRJZHgJAGoCBQpwcm9kdWN0SWR4CQCQAwEFCmNvbnRpbmVudHMDCQECIT0CCQCRAwIFCmNvbnRpbmVudHMFDnByb2R1Y3RDb250SWR4BQRjb250CQACAQkArAICCQCsAgIJAKwCAgIdVGhpcyBwcm9kdWN0IGlzIGF2YWlsYWJsZSBpbiAJAJEDAgUKY29udGluZW50cwUOcHJvZHVjdENvbnRJZHgCESwgYnV0IHlvdSBhcmUgaW4gBQRjb250BAZyZWNpcGUJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4BQpwcm9kdWN0SWR4AgFfAwkBAiE9AgkAkAMBBQZyZWNpcGUJAGQCBQZOVU1SRVMAAgkAAgEJAKwCAgIXRmF0YWw6IHVua25vd24gcmVjaXBlOiAJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAUKcHJvZHVjdElkeAQIcHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8KAQZmaWxsZXICA2FjYwtpZ25vcmVkSXRlbQQBbggFA2FjYwJfMgQBeAMJAGYCCQCQAwEFCHByb2RMaXN0BQFuCQC1CQIJAJEDAgUIcHJvZExpc3QFAW4CASwJAMwIAgIBMAkAzAgCAgEwCQDMCAICATAFA25pbAQDeDFzCQCRAwIFAXgAAAQCeDEJAQ1wYXJzZUludFZhbHVlAQUDeDFzBAN4MnMJAJEDAgUBeAABBAJ4MgkBDXBhcnNlSW50VmFsdWUBBQN4MnMEA3gzcwkAkQMCBQF4AAIEAngzCQENcGFyc2VJbnRWYWx1ZQEFA3gzcwQGYW1vdW50CQBoAgUIcXVhbnRpdHkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZyZWNpcGUABwQBeQMJAAACBQFuBQpwcm9kdWN0SWR4BAckbWF0Y2gwBQVsZXZlbAMJAAACAAEFByRtYXRjaDAJAKwCAgkArAICCQCsAgIJAKwCAgkApAMBCQBkAgUCeDEFBmFtb3VudAIBLAUDeDJzAgEsBQN4M3MDCQAAAgACBQckbWF0Y2gwCQCsAgIJAKwCAgkArAICCQCsAgIFA3gxcwIBLAkApAMBCQBkAgUCeDIFBmFtb3Vu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Q29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsCQCUCgIFA25pbAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEXNldFdhcmVob3VzZU9yZGVyAgxjYXJnb0xpc3RTdHILbGFuZEFzc2V0SWQEBHVzZXIIBQFpDG9yaWdpbkNhbGxlcgQEYWRkcgkApQgBBQR1c2VyBAZyZXN1bHQDCQECIT0CBQR1c2VyBQxyZXN0Q29udHJhY3QJAQxjaGVja0Jsb2NrZWQABwQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDAwkBAiE9AgUEdXNlcgUMcmVzdENvbnRyYWN0CQECIT0CBQVvd25lcgUEYWRkcgcJAAIBCQCsAgIFCkxBTkRQUkVGSVgCDSBpcyBub3QgeW91cnMECmNhcmdvUGFydHMJALwJAgUMY2FyZ29MaXN0U3RyAgE6AwkBAiE9AgkAkAMBBQpjYXJnb1BhcnRzAAMJAAIBAjRjYXJnb0xpc3RTdHIgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSAyICc6JyBzZXBhcmF0b3JzBAhyZXNQYXJ0cwkAtQkCCQCRAwIFCmNhcmdvUGFydHMAAAIBXwQIbWF0UGFydHMJALUJAgkAkQMCBQpjYXJnb1BhcnRzAAECAV8ECXByb2RQYXJ0cwMJAAACCQCRAwIFCmNhcmdvUGFydHMAAgIABQNuaWwJALUJAgkAkQMCBQpjYXJnb1BhcnRzAAICAV8DCQECIT0CCQCQAwEFCHJlc1BhcnRzBQZOVU1SRVMJAAIBAiBBbGwgNiByZXNvdXJjZXMgc2hvdWxkIGJlIHBhc3NlZAMJAQIhPQIJAJADAQUIbWF0UGFydHMFBk5VTVJFUwkAAgECIEFsbCA2IG1hdGVyaWFscyBzaG91bGQgYmUgcGFzc2VkBAJ3aAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCFGdldFdhcmVob3VzZVJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQJY3VycmVudFdoCQC8CQIFAndoAgE6BAljdXJyV2hSZXMJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfBAljdXJyV2hNYXQJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0AgFfBApjdXJyV2hQcm9kAwkAAAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAAUDbmlsCQC1CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAV8EBXdoVm9sCQESZ2V0V2FyZWhvdXNlVm9sdW1lAQkAkQMCBQljdXJyZW50V2gFCHdoSWR4Vm9sBAZvcmRLZXkJAQ5rZXlPcmRlckJ5TGFuZAEFC2xhbmRBc3NldElkBApjdXJyZW50T3JkCQEIZ2V0T3JkZXIBBQZvcmRLZXkEDWN1cnJlbnRPcmRSZXMJALUJAgkAkQMCBQpjdXJyZW50T3JkBQlvcmRJZHhSZXMCAV8EDWN1cnJlbnRPcmRNYXQJALUJAgkAkQMCBQpjdXJyZW50T3JkBQlvcmRJZHhNYXQCAV8EDmN1cnJlbnRPcmRQcm9kAwkAAAIJAJEDAgUKY3VycmVudE9yZAUKb3JkSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQpjdXJyZW50T3JkBQpvcmRJZHhQcm9kAgFfBA11c2R0TmVlZDJMb2NrAAAEAXIKAAIkbAUIcmVzUGFydHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCYCgYAAAUDbmlsAAAAAAUJY3VycldoUmVzBQ1jdXJyZW50T3JkUmVzCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlzZXRDb21tb24C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ckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUDYW10BQh1c2RTYWxkbwkAAgEJAKwCAgISUGF5bWVudCBuZWVkZWQgaXMgCQCkAwEFCHVzZFNhbGRvCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQUMY2FyZ29MaXN0U3RyBQNuaWwDCQAAAgUIdXNkU2FsZG8AAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAkAzAgCCQELU3RyaW5nRW50cnkCBQZvcmRLZXkFDGNhcmdvTGlzdFN0cgUDbmlsAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQISTm8gcGF5bWVudHMgbmVlZGVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBW93bmVyCQEBLQEFCHVzZFNhbGRvBQt1c2R0QXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQZvcmRLZXkFDGNhcmdvTGlzdFN0cgUDbmlsCQCUCgIFB2FjdGlvbnMFBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARRhY2NlcHRXYXJlaG91c2VPcmRlcgMKYnBPcmRlclN0cgtsYW5kQXNzZXRJZAtkdWNrQXNzZXRJZAQHYmxvY2tlZAkBDGNoZWNrQmxvY2tlZAADCQAAAgUHYmxvY2tlZAUHYmxvY2tlZAQGY2FsbGVyCAUBaQxvcmlnaW5DYWxsZXIECmNhbGxlckFkZHIJAKUIAQUGY2FsbGVyBBFzdGFrZWREdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUKY2FsbGVyQWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQURc3Rha2VkRHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgQDbG9jCQC1CQIJAQV2YWx1ZQEFC2N1ckxvY2F0aW9uAgFfAwkBAiE9AgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAUwJAAIBCQCsAgIJAKwCAgIWRHVjayBsb2NhdGlvbiB0eXBlIGlzIAkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCESwgYnV0IHNob3VsZCBiZSBMAwkBAiE9AgURc3Rha2VkRHVja0Fzc2V0SWQFC2R1Y2tBc3NldElkCQACAQkArAICCQCsAgIJAKwCAgIUWW91ciBzdGFrZWQgZHVjayBpcyAFEXN0YWtlZER1Y2tBc3NldElkAg0sIGJ1dCBwYXNzZWQgBQtkdWNrQXNzZXRJZAQJbGFuZEFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICAgRORlQgCAUJbGFuZEFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAlsYW5kT3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQlsYW5kQXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkAAAIFCWxhbmRPd25lcgUKY2FsbGVyQWRkcgkAAgECHllvdSBjYW5ub3QgdHJhZGUgd2l0aCB5b3Vyc2VsZgQMYnBPcmRlclBhcnRzCQC8CQIFCmJwT3JkZXJTdHICAToDCQECIT0CCQCQAwEFDGJwT3JkZXJQYXJ0cwADCQACAQIyYnBPcmRlclN0ciBzaG91bGQgY29udGFpbiBleGFjdGx5IDIgJzonIHNlcGFyYXRvcnMECGJwT3JkUmVzCQC1CQIJAJEDAgUMYnBPcmRlclBhcnRzAAACAV8ECGJwT3JkTWF0CQC1CQIJAJEDAgUMYnBPcmRlclBhcnRzAAECAV8ECWJwT3JkUHJvZAMJAAACCQCRAwIFDGJwT3JkZXJQYXJ0cwACAgAFA25pbAkAtQkCCQCRAwIFDGJwT3JkZXJQYXJ0cwACAgFfAwkBAiE9AgkAkAMBBQhicE9yZFJlcwUGTlVNUkVTCQACAQIgQWxsIDYgcmVzb3VyY2VzIHNob3VsZCBiZSBwYXNzZWQDCQECIT0CCQCQAwEFCGJwT3JkTWF0BQZOVU1SRVMJAAIBAiBBbGwgNiBtYXRlcmlhbHMgc2hvdWxkIGJlIHBhc3NlZAQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQJY3VycldoUmVzCQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwIBXwQJY3VycldoTWF0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAIBXwQKY3VycldoUHJvZAMJAAACCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgFfBAxjdXJyV2hSZXNWb2wJARlnZXRXYXJlaG91c2VDdXJyUmVzVm9sdW1lAQUJY3VycmVudFdoBAxjdXJyV2hNYXRWb2wJARlnZXRXYXJlaG91c2VDdXJyTWF0Vm9sdW1lAQUJY3VycmVudFdoBA5jdXJyV2hHb29kc1ZvbAkBG2dldFdhcmVob3VzZUN1cnJHb29kc1ZvbHVtZQEFCWN1cnJlbnRXaAQPY3VycldoTG9ja2VkVm9sCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJY3VycmVudFdoBQ53aElkeExvY2tlZFZvbAQLd2hTcGFjZUxlZnQJAGUCCQBlAgkAZQIJAGUCCQESZ2V0V2FyZWhvdXNlVm9sdW1lAQkAkQMCBQljdXJyZW50V2gFCHdoSWR4Vm9sBQxjdXJyV2hSZXNWb2wFDGN1cnJXaE1hdFZvbAUOY3VycldoR29vZHNWb2wFD2N1cnJXaExvY2tlZFZvbAQFYnBL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cFNhbGRvCAUBcAJfNQQIYWN0aW9uczEDCQBmAgUNdXNkV2gyQnBTYWxkbwAACQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgkAZQIIBQFwAl81BQt1c2RXaDJCcEZlZQULdXNkdEFzc2V0SWQFB2FjdGlvbnMEC3VzZEJwMldoRmVlCQBrAwgFAXACXzYFCkFVQ1RJT05GRUUFBU1VTFQ2BA11c2RCcDJXaFNhbGRvCAUBcAJfNgMJAGYCBQ11c2RCcDJXaFNhbGRvAAADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQMJAQIhPQIFA2FtdAUNdXNkQnAyV2hTYWxkbwkAAgEJAKwCAgISUGF5bWVudCBuZWVkZWQgaXMgCQCkAwEFDXVzZEJwMldoU2FsZG8JAM0IAgUIYWN0aW9uczEJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCWxhbmRPd25lcgkAZQIIBQFwAl82BQt1c2RCcDJXaEZlZQULdXNkdEFzc2V0SWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQFCGFjdGlvbnMxCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAOaML4w=", "height": 2567592, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GG5QmcoPMci7LsaazkmLsZNNrfEcXUEqWWyDWMDVRScU Next: GsPVXSCey8cngnE4EpyTcMLJQnfFPxGmaWek3wk5dAbc Diff:
OldNewDifferences
674674
675675
676676 @Callable(i)
677-func acceptServicePayment (service) = {
678- let blocked = checkBlocked()
679- if ((blocked == blocked))
680- then if ((size(i.payments) != 1))
681- then throw("exactly 1 payment must be attached")
682- else {
683- let pmt = i.payments[0]
684- let amt = pmt.amount
685- let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
686- if ((pmtAssetId != usdtAssetId))
687- then throw("USDT payments only!")
688- else {
689- let need = match service {
690- case _ =>
691- if (("LAND_RENAME" == $match0))
692- then 10000000
693- else throw("Unknown service!")
694- }
695- if ((amt != need))
696- then throw((((service + " costs ") + toString(need)) + " USDT"))
697- else $Tuple2(nil, amt)
698- }
699- }
700- else throw("Strict value is not equal to itself.")
701- }
702-
703-
704-
705-@Callable(i)
706677 func setWarehouseOrder (cargoListStr,landAssetId) = {
707678 let user = i.originCaller
708679 let addr = toString(user)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let MULT6 = 1000000
77
88 let MULT8 = 100000000
99
1010 let MULT10 = 10000000000
1111
1212 let chain = take(drop(this.bytes, 1), 1)
1313
1414 let usdtAssetId = match chain {
1515 case _ =>
1616 if ((base58'2W' == $match0))
1717 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
1818 else if ((base58'2T' == $match0))
1919 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
2020 else throw("Unknown chain")
2121 }
2222
2323 let defaultRestAddressStr = match chain {
2424 case _ =>
2525 if ((base58'2W' == $match0))
2626 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
2727 else if ((base58'2T' == $match0))
2828 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
2929 else throw("Unknown chain")
3030 }
3131
3232 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
3333
3434
3535 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
3636
3737
3838 let IdxCfgStakingDapp = 1
3939
4040 let IdxCfgEconomyDapp = 2
4141
4242 let IdxCfgGovernanceDapp = 3
4343
4444 func keyRestCfg () = "%s__restConfig"
4545
4646
4747 func keyRestAddress () = "%s__restAddr"
4848
4949
5050 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
5151
5252
5353 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
5454
5555
5656 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
5757
5858 let restCfg = readRestCfgOrFail(restContract)
5959
6060 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
6161
6262 let DEFAULTLOCATION = "Africa_F_Africa"
6363
6464 let NUMRES = 6
6565
6666 let FACTORYMAXWAREHOUSE = 10000000000
6767
6868 let RESOURCEPRICEMIN = 39637
6969
7070 let MINPAYMENT = 10000
7171
7272 let SELLMULTIPLIER = 200
7373
7474 let BUYMULTIPLIER = 300
7575
7676 let LANDPREFIX = "LAND"
7777
7878 let DUCKPREFIX = "DUCK"
7979
8080 let WHMULTIPLIER = 10000000000
8181
8282 let AUCTIONFEE = 10000
8383
8484 let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
8585
8686 let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
8787
8888 let prodTypes = ["First Aid Kit", "Backpack", "Food Ration", "Jet Pack", "Shield"]
8989
9090 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
9191
9292 let productionMatrix = ["1_1_1_2_2_5_1_10", "2_5_5_2_7_5_2_100", "1_1_1_2_2_5_1_10", "9_9_1_5_5_1_5_100", "2_2_1_2_2_2_1_10"]
9393
9494 let contIdxAmericas = 0
9595
9696 let contIdxEurope = 1
9797
9898 let contIdxAsia = 2
9999
100100 let contIdxAfrica = 3
101101
102102 let contIdxOceania = 4
103103
104104 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
105105
106106
107107 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
108108
109109
110110 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
111111
112112
113113 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
114114
115115
116116 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
117117
118118
119119 func keyBlocked () = "contractsBlocked"
120120
121121
122122 func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
123123
124124
125125 func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
126126
127127
128128 let locIdxContinent = 0
129129
130130 let locIdxType = 1
131131
132132 let locIdxId = 2
133133
134134 let bpIdxLevel = 0
135135
136136 let bpIdxRes = 1
137137
138138 let bpIdxMat = 2
139139
140140 let bpIdxProd = 3
141141
142142 let whIdxVol = 0
143143
144144 let whIdxRes = 1
145145
146146 let whIdxMat = 2
147147
148148 let whIdxProd = 3
149149
150150 let whIdxLockedVol = 4
151151
152152 let ordIdxRes = 0
153153
154154 let ordIdxMat = 1
155155
156156 let ordIdxProd = 2
157157
158158 func asString (v) = match v {
159159 case s: String =>
160160 s
161161 case _ =>
162162 throw("fail to cast into String")
163163 }
164164
165165
166166 func getOrder (ordKey) = {
167167 let p = split(valueOrElse(getString(ordKey), "0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:"), ":")
168168 [if ((size(split(p[ordIdxRes], "_")) == NUMRES))
169169 then p[ordIdxRes]
170170 else "0@0_0@0_0@0_0@0_0@0_0@0", if ((size(split(p[ordIdxMat], "_")) == NUMRES))
171171 then p[ordIdxMat]
172172 else "0@0_0@0_0@0_0@0_0@0_0@0", p[ordIdxProd]]
173173 }
174174
175175
176176 func getWarehouseVolume (volPrefix) = {
177177 let parts = split(volPrefix, "_")
178178 ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
179179 }
180180
181181
182182 func getWarehouseCurrResVolume (currentWh) = {
183183 func sum (acc,item) = (acc + parseIntValue(item))
184184
185185 let $l = split(currentWh[whIdxRes], "_")
186186 let $s = size($l)
187187 let $acc0 = 0
188188 func $f0_1 ($a,$i) = if (($i >= $s))
189189 then $a
190190 else sum($a, $l[$i])
191191
192192 func $f0_2 ($a,$i) = if (($i >= $s))
193193 then $a
194194 else throw("List size exceeds 6")
195195
196196 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
197197 }
198198
199199
200200 func getWarehouseCurrMatVolume (currentWh) = {
201201 func sum (acc,item) = (acc + parseIntValue(item))
202202
203203 let $l = split(currentWh[whIdxMat], "_")
204204 let $s = size($l)
205205 let $acc0 = 0
206206 func $f0_1 ($a,$i) = if (($i >= $s))
207207 then $a
208208 else sum($a, $l[$i])
209209
210210 func $f0_2 ($a,$i) = if (($i >= $s))
211211 then $a
212212 else throw("List size exceeds 6")
213213
214214 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
215215 }
216216
217217
218218 func getWarehouseCurrGoodsVolume (currentWh) = {
219219 let goods = currentWh[whIdxProd]
220220 if ((goods == ""))
221221 then 0
222222 else {
223223 func sum (acc,item) = (acc + parseIntValue(item))
224224
225225 let $l = split_4C(goods, "_")
226226 let $s = size($l)
227227 let $acc0 = 0
228228 func $f0_1 ($a,$i) = if (($i >= $s))
229229 then $a
230230 else sum($a, $l[$i])
231231
232232 func $f0_2 ($a,$i) = if (($i >= $s))
233233 then $a
234234 else throw("List size exceeds 50")
235235
236236 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
237237 }
238238 }
239239
240240
241241 func sellInternal (locId,resType,amount,minPrice) = {
242242 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
243243 let w0 = valueOrElse(getInteger(whKey), 0)
244244 let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
245245 then 0
246246 else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
247247 then (FACTORYMAXWAREHOUSE - w0)
248248 else amount
249249 let usdtReceived = (fraction(r0, ((SELLMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) + (50 * r0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8))
250250 let min99 = (minPrice - (minPrice / 100))
251251 if (((min99 * amount) > (usdtReceived * MULT8)))
252252 then throw((((((((((("Actual price = " + toString(usdtReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")"))
253253 else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdtReceived)
254254 }
255255
256256
257257 func buyInternal (locId,matType,amount,maxPrice) = {
258258 let whKey = keyFactoryWarehouseByIdAndType(locId, matType)
259259 let w0 = valueOrElse(getInteger(whKey), 0)
260260 let m1 = if ((w0 > FACTORYMAXWAREHOUSE))
261261 then min([amount, (w0 - FACTORYMAXWAREHOUSE)])
262262 else 0
263263 let m0 = min([w0, (amount - m1)])
264264 let m = (m0 + m1)
265265 let usdtSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
266266 let max101 = (maxPrice + (maxPrice / 100))
267267 if (((usdtSpent * MULT8) > (max101 * m)))
268268 then throw((((((((((("Actual price = " + toString(usdtSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
269269 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdtSpent, m)
270270 }
271271
272272
273273 func getBackpack (bpKey) = {
274274 let p = split(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
275275 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
276276 then p[bpIdxRes]
277277 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
278278 then p[bpIdxMat]
279279 else "0_0_0_0_0_0", p[bpIdxProd]]
280280 }
281281
282282
283283 func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
284284 then throw("Contracts are under maintenance")
285285 else unit
286286
287287
288288 func setCommon (acc,item) = {
289289 let j = acc._1
290290 let itemParts = split(item, "@")
291291 if ((size(itemParts) != 2))
292292 then throw("Incorrect order format, should be amount@price")
293293 else {
294294 let newOrdAm = parseIntValue(itemParts[0])
295295 let newOrdPr = parseIntValue(itemParts[1])
296296 let newOrdUsd = fraction(newOrdAm, newOrdPr, MULT8)
297297 let whp = parseIntValue(acc._5[j])
298298 let curOrdParts = split(acc._6[j], "@")
299299 let curOrdAm = parseIntValue(curOrdParts[0])
300300 let curOrdPr = parseIntValue(curOrdParts[1])
301301 if ((0 > curOrdPr))
302302 then throw("Price can't be negative")
303303 else {
304304 let curOrdUsd = fraction(curOrdAm, curOrdPr, MULT8)
305305 if ((newOrdAm == 0))
306306 then if ((curOrdAm > 0))
307307 then $Tuple6((j + 1), (acc._2 :+ toString(whp)), (acc._3 - curOrdAm), (acc._4 - curOrdUsd), acc._5, acc._6)
308308 else $Tuple6((j + 1), (acc._2 :+ toString((whp - curOrdAm))), (acc._3 + curOrdAm), acc._4, acc._5, acc._6)
309309 else if ((newOrdAm > 0))
310310 then if ((0 > curOrdAm))
311311 then {
312312 let amDiff = (newOrdAm + curOrdAm)
313313 $Tuple6((j + 1), (acc._2 :+ toString((whp - curOrdAm))), (acc._3 + amDiff), (acc._4 + newOrdUsd), acc._5, acc._6)
314314 }
315315 else $Tuple6((j + 1), (acc._2 :+ toString(whp)), ((acc._3 + newOrdAm) - curOrdAm), ((acc._4 + newOrdUsd) - curOrdUsd), acc._5, acc._6)
316316 else if ((0 > curOrdAm))
317317 then {
318318 let amDiff = (curOrdAm - newOrdAm)
319319 if ((0 > (whp - amDiff)))
320320 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whp)) + " available"))
321321 else $Tuple6((j + 1), (acc._2 :+ toString((whp - amDiff))), (acc._3 + amDiff), acc._4, acc._5, acc._6)
322322 }
323323 else if ((0 > (whp + newOrdAm)))
324324 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whp)) + " available"))
325325 else $Tuple6((j + 1), (acc._2 :+ toString((whp + newOrdAm))), ((acc._3 - newOrdAm) - curOrdAm), (acc._4 - curOrdUsd), acc._5, acc._6)
326326 }
327327 }
328328 }
329329
330330
331331 func acceptCommon (acc,bpOrdProdItem) = {
332332 let j = acc._7
333333 let bpOrdProdParts = split(bpOrdProdItem, "@")
334334 if ((size(bpOrdProdParts) != 2))
335335 then throw("Incorrect order format, should be amount@price")
336336 else {
337337 let bpOrdAm = parseIntValue(bpOrdProdParts[0])
338338 let bpOrdPr = parseIntValue(bpOrdProdParts[1])
339339 if ((0 > bpOrdPr))
340340 then throw("Price can't be negative")
341341 else {
342342 let bpOrdUsd = fraction(bpOrdAm, bpOrdPr, MULT8)
343343 let bpp = parseIntValue(acc._8[j])
344344 let whp = parseIntValue(acc._9[j])
345345 let whOrdParts = split(acc._10[j], "@")
346346 let whOrdAm = parseIntValue(whOrdParts[0])
347347 let whOrdPr = parseIntValue(whOrdParts[1])
348348 if (if ((bpOrdAm != 0))
349349 then (bpOrdPr != whOrdPr)
350350 else false)
351351 then throw(((((("Prices of " + prodTypes[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
352352 else {
353353 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
354354 if ((bpOrdAm == 0))
355355 then $Tuple10((acc._1 :+ toString(whp)), (acc._2 :+ acc._10[j]), (acc._3 :+ toString(bpp)), acc._4, acc._5, acc._6, (acc._7 + 1), acc._8, acc._9, acc._10)
356356 else if ((bpOrdAm > 0))
357357 then if ((0 > whOrdAm))
358358 then if ((bpOrdAm > -(whOrdAm)))
359359 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + prodTypes[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
360360 else $Tuple10((acc._1 :+ toString(whp)), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpp + bpOrdAm))), (acc._4 + bpOrdAm), acc._5, (acc._6 + bpOrdUsd), (acc._7 + 1), acc._8, acc._9, acc._10)
361361 else throw((("Attempt to buy " + prodTypes[j]) + " while warehouse doesn't sell it"))
362362 else if ((whOrdAm > 0))
363363 then if ((-(bpOrdAm) > whOrdAm))
364364 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + prodTypes[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
365365 else if ((-(bpOrdAm) > bpp))
366366 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + toString(bpp)) + " of ") + prodTypes[j]))
367367 else $Tuple10((acc._1 :+ toString((whp - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpp + bpOrdAm))), (acc._4 - bpOrdAm), (acc._5 - bpOrdUsd), acc._6, (acc._7 + 1), acc._8, acc._9, acc._10)
368368 else throw((("Attempt to sell " + prodTypes[j]) + " while warehouse doesn't buy it"))
369369 }
370370 }
371371 }
372372 }
373373
374374
375375 @Callable(i)
376376 func constructorV1 (restAddr) = if ((i.caller != this))
377377 then throw("Permission denied")
378378 else [StringEntry(keyRestAddress(), restAddr)]
379379
380380
381381
382382 @Callable(i)
383383 func sellResources (amounts,minPrices) = {
384384 let blocked = checkBlocked()
385385 if ((blocked == blocked))
386386 then {
387387 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
388388 if ((size(i.payments) != 0))
389389 then throw("sellResources doesn't require any payments")
390390 else {
391391 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
392392 if ((curLocation[locIdxType] != "F"))
393393 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
394394 else {
395395 let locId = curLocation[locIdxId]
396396 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
397397 let resList = split(currentPack[bpIdxRes], "_")
398398 func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
399399 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
400400 else if ((0 > amounts[j]))
401401 then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
402402 else if ((amounts[j] > 0))
403403 then {
404404 let b = sellInternal(locId, j, amounts[j], minPrices[j])
405405 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
406406 }
407407 else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
408408
409409 let merged = {
410410 let $l = [0, 1, 2, 3, 4, 5]
411411 let $s = size($l)
412412 let $acc0 = $Tuple3(nil, nil, 0)
413413 func $f0_1 ($a,$i) = if (($i >= $s))
414414 then $a
415415 else adder($a, $l[$i])
416416
417417 func $f0_2 ($a,$i) = if (($i >= $s))
418418 then $a
419419 else throw("List size exceeds 6")
420420
421421 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
422422 }
423423 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
424424 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
425425 $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdtAssetId)), result)
426426 }
427427 }
428428 }
429429 else throw("Strict value is not equal to itself.")
430430 }
431431
432432
433433
434434 @Callable(i)
435435 func buyMaterials (amounts,maxPrices) = {
436436 let blocked = checkBlocked()
437437 if ((blocked == blocked))
438438 then {
439439 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
440440 if ((size(i.payments) != 1))
441441 then throw("exactly 1 payment must be attached")
442442 else {
443443 let pmt = i.payments[0]
444444 let amt = pmt.amount
445445 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
446446 if ((pmtAssetId != usdtAssetId))
447447 then throw("USDT payments only!")
448448 else {
449449 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
450450 if ((curLocation[locIdxType] != "F"))
451451 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
452452 else {
453453 let locId = curLocation[locIdxId]
454454 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
455455 let matList = split(currentPack[bpIdxMat], "_")
456456 func mUpdater (acc,j) = if ((0 > amounts[j]))
457457 then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
458458 else if ((amounts[j] > 0))
459459 then {
460460 let b = buyInternal(locId, j, amounts[j], maxPrices[j])
461461 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
462462 }
463463 else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
464464
465465 let merged = {
466466 let $l = [0, 1, 2, 3, 4, 5]
467467 let $s = size($l)
468468 let $acc0 = $Tuple3(nil, nil, 0)
469469 func $f0_1 ($a,$i) = if (($i >= $s))
470470 then $a
471471 else mUpdater($a, $l[$i])
472472
473473 func $f0_2 ($a,$i) = if (($i >= $s))
474474 then $a
475475 else throw("List size exceeds 6")
476476
477477 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
478478 }
479479 if ((merged._3 > amt))
480480 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
481481 else {
482482 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
483483 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
484484 let rest = if (((amt - merged._3) > 0))
485485 then [ScriptTransfer(i.caller, (amt - merged._3), usdtAssetId)]
486486 else nil
487487 $Tuple2((merged._1 ++ rest), result)
488488 }
489489 }
490490 }
491491 }
492492 }
493493 else throw("Strict value is not equal to itself.")
494494 }
495495
496496
497497
498498 @Callable(i)
499499 func exchangeResources (amounts) = {
500500 let blocked = checkBlocked()
501501 if ((blocked == blocked))
502502 then {
503503 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
504504 if ((size(i.payments) != 1))
505505 then throw("exactly 1 payment must be attached")
506506 else {
507507 let pmt = i.payments[0]
508508 let amt = pmt.amount
509509 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
510510 if ((pmtAssetId != usdtAssetId))
511511 then throw("USDT payments only!")
512512 else {
513513 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
514514 if ((curLocation[locIdxType] != "F"))
515515 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
516516 else {
517517 let locId = curLocation[locIdxId]
518518 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
519519 let resList = split(currentPack[bpIdxRes], "_")
520520 let matList = split(currentPack[bpIdxMat], "_")
521521 func exchanger (acc,j) = {
522522 let whKey = keyFactoryWarehouseByIdAndType(locId, j)
523523 let w0 = valueOrElse(getInteger(whKey), 0)
524524 let amj = amounts[j]
525525 if ((amj > parseIntValue(resList[j])))
526526 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to exchange ") + toString(amj)))
527527 else if ((0 > amj))
528528 then throw(((("You tried to exchange negative amount of " + resTypes[j]) + ": ") + toString(amj)))
529529 else if ((amj > 0))
530530 then $Tuple4((acc._1 :+ toString((parseIntValue(resList[j]) - amj))), (acc._2 :+ toString((parseIntValue(matList[j]) + amj))), (acc._3 + fraction(amj, RESOURCEPRICEMIN, MULT8)), (acc._4 :+ IntegerEntry(whKey, w0)))
531531 else $Tuple4((acc._1 :+ resList[j]), (acc._2 :+ matList[j]), acc._3, acc._4)
532532 }
533533
534534 let merged = {
535535 let $l = [0, 1, 2, 3, 4, 5]
536536 let $s = size($l)
537537 let $acc0 = $Tuple4(nil, nil, 0, nil)
538538 func $f0_1 ($a,$i) = if (($i >= $s))
539539 then $a
540540 else exchanger($a, $l[$i])
541541
542542 func $f0_2 ($a,$i) = if (($i >= $s))
543543 then $a
544544 else throw("List size exceeds 6")
545545
546546 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
547547 }
548548 if ((merged._3 > amt))
549549 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
550550 else {
551551 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._1, "_"), makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
552552 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
553553 let rest = if (((amt - merged._3) > 0))
554554 then [ScriptTransfer(i.caller, (amt - merged._3), usdtAssetId)]
555555 else nil
556556 $Tuple2((rest ++ merged._4), result)
557557 }
558558 }
559559 }
560560 }
561561 }
562562 else throw("Strict value is not equal to itself.")
563563 }
564564
565565
566566
567567 @Callable(i)
568568 func craftGoods (productIdx,level,quantity) = {
569569 let blocked = checkBlocked()
570570 if ((blocked == blocked))
571571 then if ((size(i.payments) != 0))
572572 then throw("buyGoods doesn't require any payments")
573573 else if ((0 > quantity))
574574 then throw("Quantity should be positive")
575575 else {
576576 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
577577 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
578578 if ((curLocation[locIdxType] != "M"))
579579 then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
580580 else {
581581 let cont = curLocation[locIdxContinent]
582582 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
583583 let matList = split(currentPack[bpIdxMat], "_")
584584 if (if ((0 > productIdx))
585585 then true
586586 else (productIdx >= size(productionMatrix)))
587587 then throw(("Unknown product idx=" + toString(productIdx)))
588588 else {
589589 let productContIdx = (productIdx % size(continents))
590590 if ((continents[productContIdx] != cont))
591591 then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont))
592592 else {
593593 let recipe = split(productionMatrix[productIdx], "_")
594594 if ((size(recipe) != (NUMRES + 2)))
595595 then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
596596 else {
597597 let prodList = if ((currentPack[bpIdxProd] == ""))
598598 then nil
599599 else split(currentPack[bpIdxProd], "_")
600600 func filler (acc,ignoredItem) = {
601601 let n = acc._2
602602 let x = if ((size(prodList) > n))
603603 then split(prodList[n], ",")
604604 else ["0", "0", "0"]
605605 let x1s = x[0]
606606 let x1 = parseIntValue(x1s)
607607 let x2s = x[1]
608608 let x2 = parseIntValue(x2s)
609609 let x3s = x[2]
610610 let x3 = parseIntValue(x3s)
611611 let amount = (quantity * parseIntValue(recipe[7]))
612612 let y = if ((n == productIdx))
613613 then match level {
614614 case _ =>
615615 if ((1 == $match0))
616616 then ((((toString((x1 + amount)) + ",") + x2s) + ",") + x3s)
617617 else if ((2 == $match0))
618618 then ((((x1s + ",") + toString((x2 + amount))) + ",") + x3s)
619619 else if ((3 == $match0))
620620 then ((((x1s + ",") + x2s) + ",") + toString((x3 + amount)))
621621 else throw(("Product level should be 1..3, not " + toString(level)))
622622 }
623623 else ((((x1s + ",") + x2s) + ",") + x3s)
624624 $Tuple2((acc._1 :+ y), (n + 1))
625625 }
626626
627627 let bpProd = ( let $l = productionMatrix
628628 let $s = size($l)
629629 let $acc0 = $Tuple2(nil, 0)
630630 func $f0_1 ($a,$i) = if (($i >= $s))
631631 then $a
632632 else filler($a, $l[$i])
633633
634634 func $f0_2 ($a,$i) = if (($i >= $s))
635635 then $a
636636 else throw("List size exceeds 50")
637637
638638 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._1
639639 func producer (acc,j) = {
640640 let needMat = (parseIntValue(recipe[j]) * quantity)
641641 let haveMat = parseIntValue(matList[j])
642642 if ((needMat > haveMat))
643643 then throw(((((((("You have " + matList[j]) + " of ") + matTypes[j]) + ", but recipe requires ") + toString(needMat)) + " for quantity ") + toString(quantity)))
644644 else if ((needMat > 0))
645645 then (acc :+ toString((haveMat - needMat)))
646646 else (acc :+ matList[j])
647647 }
648648
649649 let merged = {
650650 let $l = [0, 1, 2, 3, 4, 5]
651651 let $s = size($l)
652652 let $acc0 = nil
653653 func $f1_1 ($a,$i) = if (($i >= $s))
654654 then $a
655655 else producer($a, $l[$i])
656656
657657 func $f1_2 ($a,$i) = if (($i >= $s))
658658 then $a
659659 else throw("List size exceeds 6")
660660
661661 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
662662 }
663663 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged, "_"), makeString(bpProd, "_")], ":")
664664 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
665665 $Tuple2(nil, result)
666666 }
667667 }
668668 }
669669 }
670670 }
671671 else throw("Strict value is not equal to itself.")
672672 }
673673
674674
675675
676676 @Callable(i)
677-func acceptServicePayment (service) = {
678- let blocked = checkBlocked()
679- if ((blocked == blocked))
680- then if ((size(i.payments) != 1))
681- then throw("exactly 1 payment must be attached")
682- else {
683- let pmt = i.payments[0]
684- let amt = pmt.amount
685- let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
686- if ((pmtAssetId != usdtAssetId))
687- then throw("USDT payments only!")
688- else {
689- let need = match service {
690- case _ =>
691- if (("LAND_RENAME" == $match0))
692- then 10000000
693- else throw("Unknown service!")
694- }
695- if ((amt != need))
696- then throw((((service + " costs ") + toString(need)) + " USDT"))
697- else $Tuple2(nil, amt)
698- }
699- }
700- else throw("Strict value is not equal to itself.")
701- }
702-
703-
704-
705-@Callable(i)
706677 func setWarehouseOrder (cargoListStr,landAssetId) = {
707678 let user = i.originCaller
708679 let addr = toString(user)
709680 let result = if ((user != restContract))
710681 then checkBlocked()
711682 else false
712683 let asset = value(assetInfo(fromBase58String(landAssetId)))
713684 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
714685 then throw((("NFT " + asset.name) + " is not staked"))
715686 else {
716687 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
717688 if (if ((user != restContract))
718689 then (owner != addr)
719690 else false)
720691 then throw((LANDPREFIX + " is not yours"))
721692 else {
722693 let cargoParts = split_4C(cargoListStr, ":")
723694 if ((size(cargoParts) != 3))
724695 then throw("cargoListStr should contain exactly 2 ':' separators")
725696 else {
726697 let resParts = split(cargoParts[0], "_")
727698 let matParts = split(cargoParts[1], "_")
728699 let prodParts = if ((cargoParts[2] == ""))
729700 then nil
730701 else split(cargoParts[2], "_")
731702 if ((size(resParts) != NUMRES))
732703 then throw("All 6 resources should be passed")
733704 else if ((size(matParts) != NUMRES))
734705 then throw("All 6 materials should be passed")
735706 else {
736707 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
737708 let currentWh = split_4C(wh, ":")
738709 let currWhRes = split(currentWh[whIdxRes], "_")
739710 let currWhMat = split(currentWh[whIdxMat], "_")
740711 let currWhProd = if ((currentWh[whIdxProd] == ""))
741712 then nil
742713 else split(currentWh[whIdxProd], "_")
743714 let whVol = getWarehouseVolume(currentWh[whIdxVol])
744715 let ordKey = keyOrderByLand(landAssetId)
745716 let currentOrd = getOrder(ordKey)
746717 let currentOrdRes = split(currentOrd[ordIdxRes], "_")
747718 let currentOrdMat = split(currentOrd[ordIdxMat], "_")
748719 let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
749720 then nil
750721 else split(currentOrd[ordIdxProd], "_")
751722 let usdtNeed2Lock = 0
752723 let r = {
753724 let $l = resParts
754725 let $s = size($l)
755726 let $acc0 = $Tuple6(0, nil, 0, 0, currWhRes, currentOrdRes)
756727 func $f0_1 ($a,$i) = if (($i >= $s))
757728 then $a
758729 else setCommon($a, $l[$i])
759730
760731 func $f0_2 ($a,$i) = if (($i >= $s))
761732 then $a
762733 else throw("List size exceeds 6")
763734
764735 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
765736 }
766737 let m = {
767738 let $l = matParts
768739 let $s = size($l)
769740 let $acc0 = $Tuple6(0, nil, r._3, r._4, currWhMat, currentOrdMat)
770741 func $f1_1 ($a,$i) = if (($i >= $s))
771742 then $a
772743 else setCommon($a, $l[$i])
773744
774745 func $f1_2 ($a,$i) = if (($i >= $s))
775746 then $a
776747 else throw("List size exceeds 6")
777748
778749 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
779750 }
780751 let p = {
781752 let $l = prodParts
782753 let $s = size($l)
783754 let $acc0 = $Tuple6(0, nil, m._3, m._4, currWhProd, currentOrdProd)
784755 func $f2_1 ($a,$i) = if (($i >= $s))
785756 then $a
786757 else setCommon($a, $l[$i])
787758
788759 func $f2_2 ($a,$i) = if (($i >= $s))
789760 then $a
790761 else throw("List size exceeds 50")
791762
792763 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
793764 }
794765 let volSaldo = p._3
795766 if ((volSaldo > whVol))
796767 then throw((((("Attempt to reserve " + toString(volSaldo)) + " space, but only ") + toString(whVol)) + " warehouse space left"))
797768 else {
798769 let whStr = makeString_2C([currentWh[whIdxVol], makeString(r._2, "_"), makeString(m._2, "_"), makeString(p._2, "_"), toString(volSaldo)], ":")
799770 let whSave = invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil)
800771 if ((whSave == whSave))
801772 then {
802773 let usdSaldo = p._4
803774 let actions = if ((usdSaldo > 0))
804775 then if ((size(i.payments) != 1))
805776 then throw("exactly 1 payment must be attached")
806777 else {
807778 let pmt = i.payments[0]
808779 let amt = pmt.amount
809780 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
810781 if ((pmtAssetId != usdtAssetId))
811782 then throw("USDT payments only!")
812783 else if ((amt != usdSaldo))
813784 then throw(("Payment needed is " + toString(usdSaldo)))
814785 else [StringEntry(ordKey, cargoListStr)]
815786 }
816787 else if ((usdSaldo == 0))
817788 then if ((size(i.payments) != 0))
818789 then throw("No payments needed")
819790 else [StringEntry(ordKey, cargoListStr)]
820791 else if ((size(i.payments) != 0))
821792 then throw("No payments needed")
822793 else [ScriptTransfer(addressFromStringValue(owner), -(usdSaldo), usdtAssetId), StringEntry(ordKey, cargoListStr)]
823794 $Tuple2(actions, result)
824795 }
825796 else throw("Strict value is not equal to itself.")
826797 }
827798 }
828799 }
829800 }
830801 }
831802 }
832803
833804
834805
835806 @Callable(i)
836807 func acceptWarehouseOrder (bpOrderStr,landAssetId,duckAssetId) = {
837808 let blocked = checkBlocked()
838809 if ((blocked == blocked))
839810 then {
840811 let caller = i.originCaller
841812 let callerAddr = toString(caller)
842813 let stakedDuckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
843814 let curLocation = valueOrElse(getString(stakingContract, keyDuckLocation(stakedDuckAssetId)), DEFAULTLOCATION)
844815 let loc = split(value(curLocation), "_")
845816 if ((loc[locIdxType] != "L"))
846817 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
847818 else if ((stakedDuckAssetId != duckAssetId))
848819 then throw(((("Your staked duck is " + stakedDuckAssetId) + ", but passed ") + duckAssetId))
849820 else {
850821 let landAsset = value(assetInfo(fromBase58String(landAssetId)))
851822 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
852823 then throw((("NFT " + landAsset.name) + " is not staked"))
853824 else {
854825 let landOwner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + landAsset.name) + " is orphaned"))
855826 if ((landOwner == callerAddr))
856827 then throw("You cannot trade with yourself")
857828 else {
858829 let bpOrderParts = split_4C(bpOrderStr, ":")
859830 if ((size(bpOrderParts) != 3))
860831 then throw("bpOrderStr should contain exactly 2 ':' separators")
861832 else {
862833 let bpOrdRes = split(bpOrderParts[0], "_")
863834 let bpOrdMat = split(bpOrderParts[1], "_")
864835 let bpOrdProd = if ((bpOrderParts[2] == ""))
865836 then nil
866837 else split(bpOrderParts[2], "_")
867838 if ((size(bpOrdRes) != NUMRES))
868839 then throw("All 6 resources should be passed")
869840 else if ((size(bpOrdMat) != NUMRES))
870841 then throw("All 6 materials should be passed")
871842 else {
872843 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
873844 let currentWh = split_4C(wh, ":")
874845 let currWhRes = split(currentWh[whIdxRes], "_")
875846 let currWhMat = split(currentWh[whIdxMat], "_")
876847 let currWhProd = if ((currentWh[whIdxProd] == ""))
877848 then nil
878849 else split(currentWh[whIdxProd], "_")
879850 let currWhResVol = getWarehouseCurrResVolume(currentWh)
880851 let currWhMatVol = getWarehouseCurrMatVolume(currentWh)
881852 let currWhGoodsVol = getWarehouseCurrGoodsVolume(currentWh)
882853 let currWhLockedVol = parseIntValue(currentWh[whIdxLockedVol])
883854 let whSpaceLeft = ((((getWarehouseVolume(currentWh[whIdxVol]) - currWhResVol) - currWhMatVol) - currWhGoodsVol) - currWhLockedVol)
884855 let bpKey = keyBackpackByDuck(duckAssetId)
885856 let currentPack = getBackpack(bpKey)
886857 let bpResList = split(currentPack[bpIdxRes], "_")
887858 let bpMatList = split(currentPack[bpIdxMat], "_")
888859 let bpProdList = if ((currentPack[bpIdxProd] == ""))
889860 then nil
890861 else split(currentPack[bpIdxProd], "_")
891862 let ordKey = keyOrderByLand(landAssetId)
892863 let whOrd = getOrder(ordKey)
893864 let whOrdRes = split(whOrd[ordIdxRes], "_")
894865 let whOrdMat = split(whOrd[ordIdxMat], "_")
895866 let whOrdProd = if ((whOrd[ordIdxProd] == ""))
896867 then nil
897868 else split(whOrd[ordIdxProd], "_")
898869 let usdtNeed2Lock = 0
899870 let r = {
900871 let $l = bpOrdRes
901872 let $s = size($l)
902873 let $acc0 = $Tuple10(nil, nil, nil, 0, 0, 0, 0, bpResList, currWhRes, whOrdRes)
903874 func $f0_1 ($a,$i) = if (($i >= $s))
904875 then $a
905876 else acceptCommon($a, $l[$i])
906877
907878 func $f0_2 ($a,$i) = if (($i >= $s))
908879 then $a
909880 else throw("List size exceeds 6")
910881
911882 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
912883 }
913884 let m = {
914885 let $l = bpOrdMat
915886 let $s = size($l)
916887 let $acc0 = $Tuple10(nil, nil, nil, r._4, r._5, r._6, 0, bpMatList, currWhMat, whOrdMat)
917888 func $f1_1 ($a,$i) = if (($i >= $s))
918889 then $a
919890 else acceptCommon($a, $l[$i])
920891
921892 func $f1_2 ($a,$i) = if (($i >= $s))
922893 then $a
923894 else throw("List size exceeds 6")
924895
925896 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
926897 }
927898 let p = {
928899 let $l = bpOrdProd
929900 let $s = size($l)
930901 let $acc0 = $Tuple10(nil, nil, nil, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd)
931902 func $f2_1 ($a,$i) = if (($i >= $s))
932903 then $a
933904 else acceptCommon($a, $l[$i])
934905
935906 func $f2_2 ($a,$i) = if (($i >= $s))
936907 then $a
937908 else throw("List size exceeds 50")
938909
939910 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
940911 }
941912 let volSaldo = p._4
942913 let newLockedVol = if ((0 > (currWhLockedVol - volSaldo)))
943914 then 0
944915 else (currWhLockedVol - volSaldo)
945916 let whStr = makeString_2C([currentWh[whIdxVol], makeString(r._1, "_"), makeString(m._1, "_"), makeString(p._1, "_"), toString(newLockedVol)], ":")
946917 let newWhOrdStr = makeString_2C([makeString(r._2, "_"), makeString(m._2, "_"), makeString(p._2, "_")], ":")
947918 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(r._3, "_"), makeString(m._3, "_"), makeString(p._3, "_")], ":")
948919 let whSave = invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil)
949920 if ((whSave == whSave))
950921 then {
951922 let bpSave = invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil)
952923 if ((bpSave == bpSave))
953924 then {
954925 let actions = [StringEntry(ordKey, newWhOrdStr)]
955926 let usdWh2BpFee = fraction(p._5, AUCTIONFEE, MULT6)
956927 let usdWh2BpSaldo = p._5
957928 let actions1 = if ((usdWh2BpSaldo > 0))
958929 then (actions :+ ScriptTransfer(caller, (p._5 - usdWh2BpFee), usdtAssetId))
959930 else actions
960931 let usdBp2WhFee = fraction(p._6, AUCTIONFEE, MULT6)
961932 let usdBp2WhSaldo = p._6
962933 if ((usdBp2WhSaldo > 0))
963934 then if ((size(i.payments) != 1))
964935 then throw("exactly 1 payment must be attached")
965936 else {
966937 let pmt = i.payments[0]
967938 let amt = pmt.amount
968939 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
969940 if ((pmtAssetId != usdtAssetId))
970941 then throw("USDT payments only!")
971942 else if ((amt != usdBp2WhSaldo))
972943 then throw(("Payment needed is " + toString(usdBp2WhSaldo)))
973944 else (actions1 :+ ScriptTransfer(addressFromStringValue(landOwner), (p._6 - usdBp2WhFee), usdtAssetId))
974945 }
975946 else if ((size(i.payments) != 0))
976947 then throw("No payments needed")
977948 else actions1
978949 }
979950 else throw("Strict value is not equal to itself.")
980951 }
981952 else throw("Strict value is not equal to itself.")
982953 }
983954 }
984955 }
985956 }
986957 }
987958 }
988959 else throw("Strict value is not equal to itself.")
989960 }
990961
991962

github/deemru/w8io/c3f4982 
155.98 ms