tx · HvnDBPr2Uz7iotQjRea6oMgUxLfwQXVcF754iKwGrGFH

3P5E9xamcWoymiqLx8ZdmR7o4fJSRMGp1WR:  -0.01700000 Waves

2023.03.25 17:42 [3571254] smart account 3P5E9xamcWoymiqLx8ZdmR7o4fJSRMGp1WR > SELF 0.00000000 Waves

{ "type": 13, "id": "HvnDBPr2Uz7iotQjRea6oMgUxLfwQXVcF754iKwGrGFH", "fee": 1700000, "feeAssetId": null, "timestamp": 1679755354439, "version": 2, "chainId": 87, "sender": "3P5E9xamcWoymiqLx8ZdmR7o4fJSRMGp1WR", "senderPublicKey": "6DknLGEJHLXmZB6ni3tGa8M3gccMMmc3uaaPhvCSuKvM", "proofs": [ "3KKDgd8wSdJGUwyF68j5tonvaxL66d886tSjzXwwmYnvhDuYxLVonQF8XrqMSvCUZUoWRkh9WRx9wLrucv6k6DVh" ], "script": "base64:BgJYCAISAwoBCBIECgIBCBIECgIBCBIDCgEIEgMKAQgSBAoCCAgSBQoDCAEBEgMKAQgSABIAEgASBAoCCAgSAwoBARIAEgoKCAEIAQQIAQEBEgMKAQESAwoBCC0BF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAIUc3RhdGljX29yYWNsZUFkZHJlc3MBGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwACFXN0YXRpY19icmVlZGVyQWRkcmVzcwEUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAAhFzdGF0aWNfZWdnQXNzZXRJZAEac3RhdGljS2V5X3RydXN0ZWRDb250cmFjdHMAAhdzdGF0aWNfdHJ1c3RlZENvbnRyYWN0cwEYc3RhdGljS2V5X3JlYmlydGhBZGRyZXNzAAIVc3RhdGljX3JlYmlydGhBZGRyZXNzARZzdGF0aWNLZXlfcGlwZWxpbmVVc2VyAAITc3RhdGljX3BpcGVsaW5lVXNlcgERa2V5X2FydGVmYWN0T3duZXICDGFydGVmYWN0TmFtZQVvd25lcgkArAICCQCsAgIJAKwCAgUMYXJ0ZWZhY3ROYW1lAgFfBQVvd25lcgIGX293bmVyARFrZXlfdW5zdGFrZUhlaWdodAIMYXJ0ZWZhY3ROYW1lCmFydGVmYWN0SWQJAKwCAgkArAICCQCsAgIFDGFydGVmYWN0TmFtZQIBXwUKYXJ0ZWZhY3RJZAIPX3Vuc3Rha2VfaGVpZ2h0ARVrZXlfZXh0ZXJuYWxCb29zdER1Y2sBBmR1Y2tJZAkArAICBQZkdWNrSWQCFF9kdWNrX2V4dGVybmFsX2Jvb3N0ARhrZXlfZXh0ZXJuYWxCb29zdEFkZHJlc3MBB2FkZHJlc3MJAKwCAgUHYWRkcmVzcwIUX3VzZXJfZXh0ZXJuYWxfYm9vc3QBEWtleV9wcmljZUNvc21ldGljAQRpdGVtCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0BFGtleV9tYXhTYWxlc0Nvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQIKX21heF9zYWxlcwEQa2V5X3NhbGVDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CBV9zYWxlARZrZXlfcHJpY2VBc3NldENvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQILX3ByaWNlQXNzZXQBGmtleV9ncm93UGVyY2VudGFnZUNvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQITX2dyb3dpbmdfcGVyY2VudGFnZQEQa2V5X3NvbGRDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CBV9zb2xkARVrZXlfbGFzdFByaWNlQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAgtfbGFzdF9wcmljZQETa2V5X3N0YXJ0VHNDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CCF9zdGFydFRzARFrZXlfZW5kVHNDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CBl9lbmRUcwEXa2V5X3Byb2Nlc3NGaW5pc2hIZWlnaHQCB2FkZHJlc3MEdHhJZAkArAICCQCsAgIJAKwCAgUHYWRkcmVzcwIBXwkA2AQBBQR0eElkAgNfZmgACmRldkFkZHJlc3MBGgFXF3fYQk8hOgpGT8vir4YiaxOc51un3nx7AAplZ2dzTmVlZGVkCQBoAgADAIDC1y8ADmFydGVmYWN0c0xpbWl0CQBkAgCtAgDYBAAJZnJlZUdlbmVzCQDMCAICAUEJAMwIAgIBQgkAzAgCAgFDCQDMCAICAUQJAMwIAgIBRQkAzAgCAgFGBQNuaWwADG9sZEFydGVmYWN0cwkAzAgCAghBUlQtTEFLRQkAzAgCAglBUlQtSE9VU0UJAMwIAgIMQVJULUJJR0hPVVNFCQDMCAICC0FSVC1GSVhHRU5FCQDMCAICDEFSVC1GUkVFR0VORQkAzAgCAgpBUlQtTUlSUk9SCQDMCAICCEFSVC1QT01QCQDMCAICCEFSVC1DQVBFCQDMCAICB0FSVC1IQVQJAMwIAgIOQVJULUNVU1RPTURVQ0sFA25pbAAJYXJ0ZWZhY3RzCQDMCAICCkFSVC1YTUlTVEwJAMwIAgIIQVJULVhIQVQJAMwIAgIKQVJULVhTQ0FSRgkAzAgCAgxBUlQtWFNXRUFURVIJAMwIAgIJQVJULVhTT0NLCQDMCAICCUFSVC1YVFJFRQUDbmlsAAthbGxBcnRlZmFjdAkAzggCBQlhcnRlZmFjdHMFDG9sZEFydGVmYWN0cwENdHJ5R2V0Qm9vbGVhbgEDa2V5BAckbWF0Y2gwCQCbCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwEMdHJ5R2V0U3RyaW5nAQNrZXkEByRtYXRjaDAJAJ0IAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQ9nZXRSYW5kb21OdW1iZXIECHZhcmlhbnRzBHR4SWQMZmluaXNoSGVpZ2h0Bm9mZnNldAQPcmFuZG9tU2VlZEJsb2NrCQEFdmFsdWUBCQDtBwEJAGUCBQxmaW5pc2hIZWlnaHQAAQQKcmFuZG9tSGFzaAkA9wMBCQDLAQIJAMsBAgEEHEF95gUEdHhJZAkBBXZhbHVlAQgFD3JhbmRvbVNlZWRCbG9jawN2cmYJAGoCCQCyCQIFCnJhbmRvbUhhc2gFBm9mZnNldAUIdmFyaWFudHMBEWdldFJhbmRvbUFydGVmYWN0AgVib3hJZAFoBAxyYW5kb21OdW1iZXIJAQ9nZXRSYW5kb21OdW1iZXIEAAYFBWJveElkBQFoAAEJAJEDAgUJYXJ0ZWZhY3RzBQxyYW5kb21OdW1iZXIBDmdldFJhbmRvbUdlbmVzAgR0eElkAWgEDHJhbmRvbU51bWJlcgkBD2dldFJhbmRvbU51bWJlcgQABgUEdHhJZAUBaAACCQCRAwIFCWZyZWVHZW5lcwUMcmFuZG9tTnVtYmVyARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJ0IAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABEWdldEJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAENZ2V0RWdnQXNzZXRJZAAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARRzdGF0aWNLZXlfZWdnQXNzZXRJZAABE2dldFRydXN0ZWRDb250cmFjdHMACQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGnN0YXRpY0tleV90cnVzdGVkQ29udHJhY3RzAAERZ2V0UmViaXJ0aEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfcmViaXJ0aEFkZHJlc3MAARd0cnlHZXRDb3NtZXRpY0l0ZW1QcmljZQEEaXRlbQQDa2V5CQERa2V5X3ByaWNlQ29zbWV0aWMBBQRpdGVtBAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEJAAIBAjBJVEdDSVA6IFRoaXMgaXRlbSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBzdG9yZSEBCGFzU3RyaW5nAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAFBnN0cmluZwkAAgECHHdyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcBBWFzSW50AQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIDSW50BANpbnQFByRtYXRjaDAFA2ludAkAAgECGXdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQBDm1hbmlwdWxhdGVOYW1lAwlhc3NldE5hbWUIcG9zaXRpb24EY2hhcgkArAICCQCsAgIJAK8CAgUJYXNzZXROYW1lCQBlAgUIcG9zaXRpb24AAQUEY2hhcgkAsgICBQlhc3NldE5hbWUJAGUCABAFCHBvc2l0aW9uARBpdGVtSXNJbkNvb2xEb3duAgxhcnRlZmFjdE5hbWUKYXJ0ZWZhY3RJZAQRdW5zdGFrZUhlaWdodExhc3QJAQ10cnlHZXRJbnRlZ2VyAQkBEWtleV91bnN0YWtlSGVpZ2h0AgUMYXJ0ZWZhY3ROYW1lBQphcnRlZmFjdElkBA5jb29sZG93blBlcmlvZADwAQMJAGYCBQZoZWlnaHQJAGQCBRF1bnN0YWtlSGVpZ2h0TGFzdAUOY29vbGRvd25QZXJpb2QHBgEJaXNUZXN0RW52AAkBDXRyeUdldEJvb2xlYW4BAgdURVNURU5WEQFpAQ1kaXJlY3RCdXlJdGVtAQhpdGVtTmFtZQQJYmFzZVByaWNlCQEXdHJ5R2V0Q29zbWV0aWNJdGVtUHJpY2UBBQhpdGVtTmFtZQQEZ3JvdwkBDXRyeUdldEludGVnZXIBCQEaa2V5X2dyb3dQZXJjZW50YWdlQ29zbWV0aWMBBQhpdGVtTmFtZQQHc3RhcnRUcwkBDXRyeUdldEludGVnZXIBCQETa2V5X3N0YXJ0VHNDb3NtZXRpYwEFCGl0ZW1OYW1lBAVlbmRUcwkBDXRyeUdldEludGVnZXIBCQERa2V5X2VuZFRzQ29zbWV0aWMBBQhpdGVtTmFtZQMDCQECIT0CBQdzdGFydFRzAAAJAGYCBQdzdGFydFRzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAcJAAIBAiFJREJJOiBUaGUgc2FsZSBkaWQgbm90IHN0YXJ0IHlldCEDAwkBAiE9AgUFZW5kVHMAAAkAZgIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQVlbmRUcwcJAAIBAiRJREJJOiBUaGUgc2FsZSBoYXMgYWxyZWFkeSBmaW5pc2hlZCEDCQEBIQEJAQ10cnlHZXRCb29sZWFuAQkBEGtleV9zYWxlQ29zbWV0aWMBBQhpdGVtTmFtZQkAAgEJAKwCAgIfSURCSTogSXRlbSBub3QgZm9yIHNhbGUgYW55bW9yZQkBEGtleV9zYWxlQ29zbWV0aWMBBQhpdGVtTmFtZQQNbWF4U2FsZXNWYWx1ZQkBDXRyeUdldEludGVnZXIBCQEUa2V5X21heFNhbGVzQ29zbWV0aWMBBQhpdGVtTmFtZQQJc29sZFZhbHVlCQENdHJ5R2V0SW50ZWdlcgEJARBrZXlfc29sZENvc21ldGljAQUIaXRlbU5hbWUEBXByaWNlAwkAAAIFBGdyb3cAAAUJYmFzZVByaWNlCQBkAgUJYmFzZVByaWNlCQBoAgkAaQIFCWJhc2VQcmljZQBkCQBoAgUJc29sZFZhbHVlBQRncm93AwMJAQIhPQIFDW1heFNhbGVzVmFsdWUAAAkAZwIFCXNvbGRWYWx1ZQUNbWF4U2FsZXNWYWx1ZQcJAAIBAhhJREJJOiBNYXggZWRpdGlvbnMgc29sZCEEB2Fzc2V0SWQDCQAAAgkBDHRyeUdldFN0cmluZwEJARZrZXlfcHJpY2VBc3NldENvc21ldGljAQUIaXRlbU5hbWUCAAkBDWdldEVnZ0Fzc2V0SWQACQDZBAEJAQx0cnlHZXRTdHJpbmcBCQEWa2V5X3ByaWNlQXNzZXRDb3NtZXRpYwEFCGl0ZW1OYW1lBBNhbW91bnRQYWlkQnlDb3Vwb25zAAAECWxlZnRUb1BheQkAZQIFBXByaWNlBRNhbW91bnRQYWlkQnlDb3Vwb25zBAdwYXltZW50AwkBAiE9AgUJbGVmdFRvUGF5AAAEDGZpcnN0UGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQIBQxmaXJzdFBheW1lbnQGYW1vdW50AwkBAiE9AggFDGZpcnN0UGF5bWVudAdhc3NldElkBQdhc3NldElkCQACAQkArAICAj5JREJJOiBZb3UgY2FuIGF0dGFjaCBvbmx5IHRva2VucyB3aXRoIHRoZSBmb2xsb3dpbmcgYXNzZXQgaWQ6IAkA2AQBBQdhc3NldElkAwkBAiE9AgUGYW1vdW50BQlsZWZ0VG9QYXkJAAIBCQCsAgICKklEQkk6IFBsZWFzZSBhdHRhY2ggdGhlIGV4YWN0IGFzc2V0IGFtb3VudAkApAMBBQVwcmljZQUJbGVmdFRvUGF5AAADCQAAAgUHcGF5bWVudAUHcGF5bWVudAQHdHhJZFN0cgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAdhZGRyZXNzCAUBaQxvcmlnaW5DYWxsZXIECGFydGVmYWN0CQDDCAcFCGl0ZW1OYW1lCQCsAgICIk5GVCBhcnRlZmFjdCBvZiBXYXZlcyBEdWNrcyBnYW1lOiAFCGl0ZW1OYW1lAAEAAAcFBHVuaXQAAAQKYXJ0ZWZhY3RJZAkAuAgBBQhhcnRlZmFjdAkAlAoCCQDMCAIFCGFydGVmYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAglhcnRlZmFjdF8JANgEAQUKYXJ0ZWZhY3RJZAIFX3R5cGUFCGl0ZW1OYW1lCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEVa2V5X2xhc3RQcmljZUNvc21ldGljAQUIaXRlbU5hbWUFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQa2V5X3NvbGRDb3NtZXRpYwEFCGl0ZW1OYW1lCQBkAgUJc29sZFZhbHVlAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUHYWRkcmVzcwABBQphcnRlZmFjdElkBQNuaWwJANgEAQUKYXJ0ZWZhY3RJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ9tYW5pcHVsYXRlQm9vc3QCBWJvb3N0BmR1Y2tJZAQQYWxsb3dlZENvbnRyYWN0cwkBE2dldFRydXN0ZWRDb250cmFjdHMABBRhbGxvd2VkQ29udHJhY3RzTGlzdAkAtQkCBRBhbGxvd2VkQ29udHJhY3RzAgE7BApkYXBwVG9DYWxsCQClCAEIBQFpBmNhbGxlcgMJAAACCQDPCAIFFGFsbG93ZWRDb250cmFjdHNMaXN0BQpkYXBwVG9DYWxsBQR1bml0CQACAQI0SU1COiBUaGlzIHNtYXJ0IGNvbnRyYWN0IGNhbid0IG1hbmlwdWxhdGUgdGhlIGJvb3N0IQQDa2V5CQEVa2V5X2V4dGVybmFsQm9vc3REdWNrAQUGZHVja0lkBAthY3RpdmVCb29zdAkBDXRyeUdldEludGVnZXIBBQNrZXkECG5ld0Jvb3N0CQBkAgULYWN0aXZlQm9vc3QFBWJvb3N0AwkAZgIAAAUIbmV3Qm9vc3QJAAIBAkBJTUI6IFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggYm9vc3QsIHBsZWFzZSBjb250YWN0IHRoZSBhZG1pbnMhCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQNrZXkFCG5ld0Jvb3N0BQNuaWwBaQEWbWFuaXB1bGF0ZUJvb3N0QWNjb3VudAIFYm9vc3QHYWRkcmVzcwQQYWxsb3dlZENvbnRyYWN0cwkBE2dldFRydXN0ZWRDb250cmFjdHMABBRhbGxvd2VkQ29udHJhY3RzTGlzdAkAtQkCBRBhbGxvd2VkQ29udHJhY3RzAgE7BApkYXBwVG9DYWxsCQClCAEIBQFpBmNhbGxlcgMJAAACCQDPCAIFFGFsbG93ZWRDb250cmFjdHNMaXN0BQpkYXBwVG9DYWxsBQR1bml0CQACAQI1SU1CQTogVGhpcyBzbWFydCBjb250cmFjdCBjYW4ndCBtYW5pcHVsYXRlIHRoZSBib29zdCEEA2tleQkBGGtleV9leHRlcm5hbEJvb3N0QWRkcmVzcwEFB2FkZHJlc3MEC2FjdGl2ZUJvb3N0CQENdHJ5R2V0SW50ZWdlcgEFA2tleQQIbmV3Qm9vc3QJAGQCBQthY3RpdmVCb29zdAUFYm9vc3QDCQBmAgAABQhuZXdCb29zdAkAAgECQUlNQkE6IFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggYm9vc3QsIHBsZWFzZSBjb250YWN0IHRoZSBhZG1pbnMhCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQNrZXkFCG5ld0Jvb3N0BQNuaWwBaQEUY2hlY2tBcnRlZmFjdERldGFpbHMBB2Fzc2V0SWQEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQUHYXNzZXRJZAQJYXNzZXROYW1lCQEFdmFsdWUBCAUFYXNzZXQEbmFtZQMDAwkBD2NvbnRhaW5zRWxlbWVudAIFC2FsbEFydGVmYWN0BQlhc3NldE5hbWUGCQEJaXNEZWZpbmVkAQkBF3RyeUdldENvc21ldGljSXRlbVByaWNlAQUJYXNzZXROYW1lCQAAAggFBWFzc2V0Bmlzc3VlcgUEdGhpcwcJAJQKAgUDbmlsBQlhc3NldE5hbWUJAAIBAhBJbnZhbGlkIGFydGVmYWN0AWkBD2NvbmZpZ3VyZU9yYWNsZQEGb3JhY2xlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCCQEXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MABQZvcmFjbGUFA25pbAFpARpjYWxjdWxhdGVGYXJtaW5nUG93ZXJCb29zdAIGZHVja0lkB2FkZHJlc3MEEWV4dGVybmFsQm9vc3REdWNrCQENdHJ5R2V0SW50ZWdlcgEJARVrZXlfZXh0ZXJuYWxCb29zdER1Y2sBBQZkdWNrSWQEFGV4dGVybmFsQm9vc3RBZGRyZXNzCQENdHJ5R2V0SW50ZWdlcgEJARhrZXlfZXh0ZXJuYWxCb29zdEFkZHJlc3MBBQdhZGRyZXNzBAp0b3RhbEJvb3N0CQBkAgURZXh0ZXJuYWxCb29zdER1Y2sFFGV4dGVybmFsQm9vc3RBZGRyZXNzCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUGZHVja0lkAgtfbGFzdF9ib29zdAUKdG90YWxCb29zdAUDbmlsBQp0b3RhbEJvb3N0AWkBCWZpeGVkR2VuZQMHdHhJZFN0cg9wYXJlbnRGaXhlZEdlbmURcG9zaXRpb25GaXhlZEdlbmUEDGZpcnN0UGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAxmaXJzdEFzc2V0SWQJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIFDGZpcnN0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwkBAiE9AgUIYXJ0ZWZhY3QCC0FSVC1GSVhHRU5FCQACAQIpWW91IG5lZWQgdG8gYXR0YWNoIGEgQVJULUZJWEdFTkUgYXJ0ZWZhY3QEBHR4SWQJANkEAQUHdHhJZFN0cgQPZmluaXNoSGVpZ2h0S2V5CQEXa2V5X3Byb2Nlc3NGaW5pc2hIZWlnaHQCCQClCAEIBQFpBmNhbGxlcgUEdHhJZAQTcHJvY2Vzc0ZpbmlzaEhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgkBEWdldEJyZWVkZXJBZGRyZXNzAAUPZmluaXNoSGVpZ2h0S2V5BA9kdWNrR2VuZXNTdHJpbmcJAQhhc1N0cmluZwEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIMZ2VuZXJhdGVEdWNrCQDMCAIFBHR4SWQJAMwIAgUTcHJvY2Vzc0ZpbmlzaEhlaWdodAkAzAgCBQ9wYXJlbnRGaXhlZEdlbmUJAMwIAgURcG9zaXRpb25GaXhlZEdlbmUJAMwIAgIACQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUPZHVja0dlbmVzU3RyaW5nBQ9kdWNrR2VuZXNTdHJpbmcEBGNhbGwJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIXZmluaXNoRHVja0hhdGNoaW5nSXRlbXMJAMwIAgUHdHhJZFN0cgkAzAgCBQ9kdWNrR2VuZXNTdHJpbmcFA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGZyZWVHZW5lAQd0eElkU3RyBAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQMZmlyc3RBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAMJAQIhPQIIBQxmaXJzdFBheW1lbnQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBAhhcnRlZmFjdAkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBQxmaXJzdEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFCGFydGVmYWN0BQhhcnRlZmFjdAMJAQIhPQIFCGFydGVmYWN0AgxBUlQtRlJFRUdFTkUJAAIBAipZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtRlJFRUdFTkUgYXJ0ZWZhY3QEBHR4SWQJANkEAQUHdHhJZFN0cgQPZmluaXNoSGVpZ2h0S2V5CQEXa2V5X3Byb2Nlc3NGaW5pc2hIZWlnaHQCCQClCAEIBQFpBmNhbGxlcgUEdHhJZAQTcHJvY2Vzc0ZpbmlzaEhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgkBEWdldEJyZWVkZXJBZGRyZXNzAAUPZmluaXNoSGVpZ2h0S2V5BAxzZWxlY3RlZEdlbmUJAQ5nZXRSYW5kb21HZW5lcwIFBHR4SWQFE3Byb2Nlc3NGaW5pc2hIZWlnaHQEDnJhbmRvbVBvc2l0aW9uCQEPZ2V0UmFuZG9tTnVtYmVyBAAHBQR0eElkBRNwcm9jZXNzRmluaXNoSGVpZ2h0AAMED2R1Y2tHZW5lc1N0cmluZwkBCGFzU3RyaW5nAQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAgxnZW5lcmF0ZUR1Y2sJAMwIAgUEdHhJZAkAzAgCBRNwcm9jZXNzRmluaXNoSGVpZ2h0CQDMCAIAAAkAzAgCAAAJAMwIAgUMc2VsZWN0ZWRHZW5lCQDMCAIFDnJhbmRvbVBvc2l0aW9uBQNuaWwFA25pbAMJAAACBQ9kdWNrR2VuZXNTdHJpbmcFD2R1Y2tHZW5lc1N0cmluZwQEY2FsbAkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhdmaW5pc2hEdWNrSGF0Y2hpbmdJdGVtcwkAzAgCBQd0eElkU3RyCQDMCAIFD2R1Y2tHZW5lc1N0cmluZwUDbmlsBQNuaWwDCQAAAgUEY2FsbAUEY2FsbAkAzAgCCQEEQnVybgIJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIY29weUR1Y2sABAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQNc2Vjb25kUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBAxmaXJzdEFzc2V0SWQJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkBAhjaGlsZHJlbgkBBWFzSW50AQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQDMCAIFDGZpcnN0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIY2hpbGRyZW4FCGNoaWxkcmVuAwMJAQIhPQIIBQxmaXJzdFBheW1lbnQGYW1vdW50AAEGCQECIT0CCAUNc2Vjb25kUGF5bWVudAZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIJANgEAQkBBXZhbHVlAQgFDXNlY29uZFBheW1lbnQHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwkBAiE9AgUIYXJ0ZWZhY3QCCkFSVC1NSVJST1IJAAIBAihZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtTUlSUk9SIGFydGVmYWN0BAduZnRJbmZvCQEFdmFsdWUBCQDsBwEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAQJYXNzZXQxR2VuCQC1CQIIBQduZnRJbmZvBG5hbWUCAAMDCQAAAgkAkQMCBQlhc3NldDFHZW4ADgIBRwYJAAACCQCRAwIFCWFzc2V0MUdlbgAOAgFKCQACAQIaWW91IGNhbid0IG1pcnJvciB0aGlzIGR1Y2sEB2R1Y2tHZW4IBQduZnRJbmZvBG5hbWUEBGNhbGwJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWY3JlYXRlRHVja1NwZWNpYWxHZW5lcwkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIFB2R1Y2tHZW4JAMwIAgUIY2hpbGRyZW4FA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAkAzAgCCQEEQnVybgIJAQV2YWx1ZQEIBQ1zZWNvbmRQYXltZW50B2Fzc2V0SWQAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWFkZEFydGVGYWN0VG9EdWNrAAQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEDXNlY29uZFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQQMZmlyc3RBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAMDCQECIT0CCAUMZmlyc3RQYXltZW50BmFtb3VudAABBgkBAiE9AggFDXNlY29uZFBheW1lbnQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBAhjaGlsZHJlbgkBBWFzSW50AQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQDMCAIFDGZpcnN0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIY2hpbGRyZW4FCGNoaWxkcmVuAwkAAAIFCGNoaWxkcmVuAAAJAAIBAiRZb3UgY2FuIG9ubHkgcGljayBhIHN0ZXJpbGUgTkZULWR1Y2sECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIJANgEAQkBBXZhbHVlAQgFDXNlY29uZFBheW1lbnQHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwMJAQIhPQIFCGFydGVmYWN0AghBUlQtWEhBVAkBAiE9AgUIYXJ0ZWZhY3QCCEFSVC1QT01QBwkAAgECMllvdSBuZWVkIHRvIGF0dGFjaCBhIEFSVC1YSEFUIG9yIEFSVC1QT01QIGFydGVmYWN0BAduZnRJbmZvCQEFdmFsdWUBCQDsBwEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAQJYXNzZXQxR2VuCQC1CQIIBQduZnRJbmZvBG5hbWUCAAMDCQAAAgkAkQMCBQlhc3NldDFHZW4ADgIBRwYJAAACCQCRAwIFCWFzc2V0MUdlbgAOAgFKCQACAQIaWW91IGNhbid0IG1pcnJvciB0aGlzIGR1Y2sDAwkAAAIJAJEDAgUJYXNzZXQxR2VuAAUCAVMGCQAAAgkAkQMCBQlhc3NldDFHZW4ABQIBVAkAAgECH3lvdSBhbHJlYWR5IGF0dGFjaGVkIGEgYXJ0ZWZhY3QEBGNoYXIDCQAAAgUIYXJ0ZWZhY3QCCEFSVC1YSEFUAgFUAwkAAAIFCGFydGVmYWN0AghBUlQtUE9NUAIBUwkAAgECD05vIGNoYXIgZGVmaW5lZAQKb2xkRHVja0dlbggFB25mdEluZm8EbmFtZQQKb2xkRmFybUdlbgkBCGFzU3RyaW5nAQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAg5nZXRHZW5Gcm9tTmFtZQkAzAgCBQpvbGREdWNrR2VuBQNuaWwFA25pbAMJAAACBQpvbGRGYXJtR2VuBQpvbGRGYXJtR2VuBAdkdWNrR2VuCQEObWFuaXB1bGF0ZU5hbWUDBQpvbGREdWNrR2VuAAYFBGNoYXIEBGNhbGwJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWY3JlYXRlRHVja1NwZWNpYWxHZW5lcwkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIFB2R1Y2tHZW4JAMwIAgUIY2hpbGRyZW4FA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwECmNhbGxSZWR1Y2UJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIMcmVkdWNlUmFyaXR5CQDMCAIFDGZpcnN0QXNzZXRJZAkAzAgCBQpvbGRGYXJtR2VuBQNuaWwFA25pbAMJAAACBQpjYWxsUmVkdWNlBQpjYWxsUmVkdWNlCQDMCAIJAQRCdXJuAgkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkAAEJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUNc2Vjb25kUGF5bWVudAdhc3NldElkAAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdwcmVJbml0AAkAzAgCCQEMSW50ZWdlckVudHJ5AgIcc3RhdGljX0FSVC1MQUtFX2Zhcm1pbmdTbG90cwDIAQkAzAgCCQEMSW50ZWdlckVudHJ5AgIcc3RhdGljX0FSVC1MQUtFX2Zhcm1pbmdCb29zdAACCQDMCAIJAQxJbnRlZ2VyRW50cnkCAh1zdGF0aWNfQVJULUhPVVNFX2Zhcm1pbmdTbG90cwAECQDMCAIJAQxJbnRlZ2VyRW50cnkCAh1zdGF0aWNfQVJULUhPVVNFX2Zhcm1pbmdCb29zdAAeCQDMCAIJAQxJbnRlZ2VyRW50cnkCAiBzdGF0aWNfQVJULUJJR0hPVVNFX2Zhcm1pbmdTbG90cwAKCQDMCAIJAQxJbnRlZ2VyRW50cnkCAiBzdGF0aWNfQVJULUJJR0hPVVNFX2Zhcm1pbmdCb29zdAAPBQNuaWwBaQENaXNzdWVBcnRlZmFjdAIEdHlwZQhyZWNlaXZlcgMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAQIhPQIIBQFpBmNhbGxlcgkBEWdldFJlYmlydGhBZGRyZXNzAAcJAAIBAgphZG1pbiBvbmx5BAd0eElkU3RyCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQEB2FkZHJlc3MJAQdBZGRyZXNzAQkA2QQBBQhyZWNlaXZlcgQIYXJ0ZWZhY3QJAMMIBwUEdHlwZQIqTkZUIGFydGVmYWN0IG9mIFdhdmVzIER1Y2tzIGdhbWUuIERyb3AgIzIuAAEAAAcFBHVuaXQAAAQKYXJ0ZWZhY3RJZAkAuAgBBQhhcnRlZmFjdAkAlAoCCQDMCAIFCGFydGVmYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAglhcnRlZmFjdF8JANgEAQUKYXJ0ZWZhY3RJZAIFX3R5cGUFBHR5cGUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUHYWRkcmVzcwABBQphcnRlZmFjdElkBQNuaWwJANgEAQUKYXJ0ZWZhY3RJZAFpAQdzZXRMb2NrAQFuAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwkAzAgCCQEMSW50ZWdlckVudHJ5AgINZ2xvYmFsX2xvY2tlZAUBbgUDbmlsCQACAQIKYWRtaW4gb25seQFpAQtidXlBcnRlZmFjdAADCQBmAggFCWxhc3RCbG9jawl0aW1lc3RhbXAAgMyNwtwvCQACAQIhVGhlcmUgYXJlIG5vIGFjdGl2ZSBzYWxlcyBub3cuLi4gAwkAZgIJAQ10cnlHZXRJbnRlZ2VyAQINZ2xvYmFsX2xvY2tlZAAACQACAQIeY29udHJhY3QgaXMgdGVtcG9yYXJpbHkgbG9ja2VkAwkAZwIJAQ10cnlHZXRJbnRlZ2VyAQIQZ2xvYmFsX2FydEFtb3VudAUOYXJ0ZWZhY3RzTGltaXQJAAIBAhJTT0xET1VUISEhIEh1cnJheSEDAwkAZgIAgP7vgNwvCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkBAiE9AggFAWkGY2FsbGVyCQEHQWRkcmVzcwEFCmRldkFkZHJlc3MHCQACAQIMVG9vIGVhcmx5Li4uBAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAMJAQIhPQIIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAkBDWdldEVnZ0Fzc2V0SWQACQACAQkArAICAjxZb3UgY2FuIGF0dGFjaCBvbmx5IEVHRyB0b2tlbnMgd2l0aCB0aGUgZm9sbG93aW5nIGFzc2V0IGlkOiAJANgEAQkBDWdldEVnZ0Fzc2V0SWQAAwkAZgIFCmVnZ3NOZWVkZWQIBQxmaXJzdFBheW1lbnQGYW1vdW50CQACAQkArAICAkRUbyBoYXRjaCBhIGR1Y2sgeW91IGN1cnJlbnRseSBuZWVkIHRoZSBmb2xsb3dpbmcgYW1vdW50IG9mIEVHR2xldHM6IAkApAMBBQplZ2dzTmVlZGVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQCB19zdGF0dXMCB3N0YXJ0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQCDV9maW5pc2hIZWlnaHQJAGQCBQZoZWlnaHQAAgkAzAgCCQEMSW50ZWdlckVudHJ5AgIQZ2xvYmFsX2FydEFtb3VudAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQIQZ2xvYmFsX2FydEFtb3VudAABBQNuaWwBaQEOYWRkSXRlbVRvU3RvcmUIBXByaWNlBGl0ZW0IbWF4U2FsZXMEc2FsZQlwcmljZXNzZXQQZ3Jvd3RoUGVyY2VudGFnZQdzdGFydFRzBWVuZFRzAwkBAiE9AggFAWkGY2FsbGVyCQERQGV4dHJOYXRpdmUoMTA2MikBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFnN0YXRpY0tleV9waXBlbGluZVVzZXIACQACAQIeSUFJVFM6IE9ubHkgZm9yIHRydXN0ZWQgdXNlcnMhCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERa2V5X3ByaWNlQ29zbWV0aWMBBQRpdGVtBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleV9tYXhTYWxlc0Nvc21ldGljAQUEaXRlbQUIbWF4U2FsZXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIJARBrZXlfc2FsZUNvc21ldGljAQUEaXRlbQUEc2FsZQkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5X3ByaWNlQXNzZXRDb3NtZXRpYwEFBGl0ZW0FCXByaWNlc3NldAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmtleV9ncm93UGVyY2VudGFnZUNvc21ldGljAQUEaXRlbQUQZ3Jvd3RoUGVyY2VudGFnZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE2tleV9zdGFydFRzQ29zbWV0aWMBBQRpdGVtBQdzdGFydFRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERa2V5X2VuZFRzQ29zbWV0aWMBBQRpdGVtBQVlbmRUcwUDbmlsAWkBEnNldEdsb2JhbEFydEFtb3VudAEJbmV3QW1vdW50AwMJAAACCAUBaQZjYWxsZXIFBHRoaXMGCQAAAggFAWkGY2FsbGVyCQEHQWRkcmVzcwEFCmRldkFkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQICEGdsb2JhbF9hcnRBbW91bnQFCW5ld0Ftb3VudAUDbmlsCQACAQIRUGVybWlzc2lvbiBkZW5pZWQBaQENY2xhaW1BcnRlZmFjdAEIYm94SWRTdHIEBHR4SWQJANkEAQUIYm94SWRTdHIECXN0YXR1c0tleQkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8FCGJveElkU3RyAgdfc3RhdHVzBAloZWlnaHRLZXkJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfBQhib3hJZFN0cgINX2ZpbmlzaEhlaWdodAMJAQIhPQIJARFAZXh0ck5hdGl2ZSgxMDU4KQEFCXN0YXR1c0tleQIHc3RhcnRlZAkAAgECD2NsYWltZWQgYWxyZWFkeQMJAGYCCQERQGV4dHJOYXRpdmUoMTA1NSkBBQloZWlnaHRLZXkFBmhlaWdodAkAAgECFHlvdSBjYW5ub3QgY2xhaW0geWV0BAdhcnRUeXBlCQERZ2V0UmFuZG9tQXJ0ZWZhY3QCBQR0eElkCQERQGV4dHJOYXRpdmUoMTA1NSkBBQloZWlnaHRLZXkEBWFzc2V0CQDDCAcFB2FydFR5cGUCIkFydGVmYWN0IG9mIFdhdmVzIER1Y2tzIG1ldGF2ZXJzZS4AAQAABwUEdW5pdAkBEUBleHRyTmF0aXZlKDEwNTUpAQUJaGVpZ2h0S2V5BAdhc3NldElkCQC4CAEFBWFzc2V0CQDMCAIJAQtTdHJpbmdFbnRyeQIFCXN0YXR1c0tleQUHYXJ0VHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwUIYm94SWRTdHICC19hcnRlZmFjdElkCQDYBAEFB2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQDYBAEFB2Fzc2V0SWQCBV90eXBlBQdhcnRUeXBlCQDMCAIFBWFzc2V0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkBQNuaWwBAnR4AQZ2ZXJpZnkAAwkBCWlzVGVzdEVudgAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECWZpcnN0VXNlcgEg3tbGUeRTFtBlgOsBmioL0PeXUfocdpF+m44GQ3cXvSUECnNlY29uZFVzZXIBIMFs347t041zj4ui+fqJD/R1zUQbVHJSo7Sc0lakLeB1BAl0aGlyZFVzZXIBIOdb9I6q0vlJnm6EJrj5fh/cZ6h93Cu41Op7zfJoCsElBA9maXJzdFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJZmlyc3RVc2VyAAEAAAQQc2Vjb25kVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCnNlY29uZFVzZXIAAQAABA90aGlyZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJdGhpcmRVc2VyAAEAAAQPc2lnbmF0dXJlc0NvdW50CQBkAgkAZAIFD2ZpcnN0VXNlclNpZ25lZAUQc2Vjb25kVXNlclNpZ25lZAUPdGhpcmRVc2VyU2lnbmVkBAckbWF0Y2gwBQJ0eAkAZwIFD3NpZ25hdHVyZXNDb3VudAAC+iGIKw==", "height": 3571254, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GxMPn3WhSTJVB8ycsSbTVX26JEWPsUoyP5gngHysPYNV Next: T51BRMYhF1KvnSSyD5Mkz1Suatxs3KHJxsm2EMQVoVu Diff:
OldNewDifferences
1414
1515
1616 func staticKey_rebirthAddress () = "static_rebirthAddress"
17+
18+
19+func staticKey_pipelineUser () = "static_pipelineUser"
1720
1821
1922 func key_artefactOwner (artefactName,owner) = (((artefactName + "_") + owner) + "_owner")
175178 then false
176179 else true
177180 }
181+
182+
183+func isTestEnv () = tryGetBoolean("TESTENV")
178184
179185
180186 @Callable(i)
521527
522528
523529 @Callable(i)
530+func addItemToStore (price,item,maxSales,sale,pricesset,growthPercentage,startTs,endTs) = if ((i.caller != addressFromStringValue(tryGetStringExternal(getOracle(), staticKey_pipelineUser()))))
531+ then throw("IAITS: Only for trusted users!")
532+ else [IntegerEntry(key_priceCosmetic(item), price), IntegerEntry(key_maxSalesCosmetic(item), maxSales), BooleanEntry(key_saleCosmetic(item), sale), StringEntry(key_priceAssetCosmetic(item), pricesset), IntegerEntry(key_growPercentageCosmetic(item), growthPercentage), IntegerEntry(key_startTsCosmetic(item), startTs), IntegerEntry(key_endTsCosmetic(item), endTs)]
533+
534+
535+
536+@Callable(i)
524537 func setGlobalArtAmount (newAmount) = if (if ((i.caller == this))
525538 then true
526539 else (i.caller == Address(devAddress)))
548561
549562
550563 @Verifier(tx)
551-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
564+func verify () = if (isTestEnv())
565+ then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
566+ else {
567+ let firstUser = base58'FzsTVRXqD46KW5yj6qGNVrsouvWjpCQvD1446A96iGt4'
568+ let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
569+ let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
570+ let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
571+ then 1
572+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
573+ then 1
574+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
575+ then 1
576+ else 0
577+ let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
578+ then 1
579+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
580+ then 1
581+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
582+ then 1
583+ else 0
584+ let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
585+ then 1
586+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
587+ then 1
588+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
589+ then 1
590+ else 0
591+ let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
592+ match tx {
593+ case _ =>
594+ (signaturesCount >= 2)
595+ }
596+ }
552597
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func staticKey_oracleAddress () = "static_oracleAddress"
55
66
77 func staticKey_breederAddress () = "static_breederAddress"
88
99
1010 func staticKey_eggAssetId () = "static_eggAssetId"
1111
1212
1313 func staticKey_trustedContracts () = "static_trustedContracts"
1414
1515
1616 func staticKey_rebirthAddress () = "static_rebirthAddress"
17+
18+
19+func staticKey_pipelineUser () = "static_pipelineUser"
1720
1821
1922 func key_artefactOwner (artefactName,owner) = (((artefactName + "_") + owner) + "_owner")
2023
2124
2225 func key_unstakeHeight (artefactName,artefactId) = (((artefactName + "_") + artefactId) + "_unstake_height")
2326
2427
2528 func key_externalBoostDuck (duckId) = (duckId + "_duck_external_boost")
2629
2730
2831 func key_externalBoostAddress (address) = (address + "_user_external_boost")
2932
3033
3134 func key_priceCosmetic (item) = ("direct_cosmetic_" + item)
3235
3336
3437 func key_maxSalesCosmetic (item) = (("direct_cosmetic_" + item) + "_max_sales")
3538
3639
3740 func key_saleCosmetic (item) = (("direct_cosmetic_" + item) + "_sale")
3841
3942
4043 func key_priceAssetCosmetic (item) = (("direct_cosmetic_" + item) + "_priceAsset")
4144
4245
4346 func key_growPercentageCosmetic (item) = (("direct_cosmetic_" + item) + "_growing_percentage")
4447
4548
4649 func key_soldCosmetic (item) = (("direct_cosmetic_" + item) + "_sold")
4750
4851
4952 func key_lastPriceCosmetic (item) = (("direct_cosmetic_" + item) + "_last_price")
5053
5154
5255 func key_startTsCosmetic (item) = (("direct_cosmetic_" + item) + "_startTs")
5356
5457
5558 func key_endTsCosmetic (item) = (("direct_cosmetic_" + item) + "_endTs")
5659
5760
5861 func key_processFinishHeight (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
5962
6063
6164 let devAddress = base58'3P44yqcpfhPF2iC1nptm2ZJCTaN7VYhz9og'
6265
6366 let eggsNeeded = (3 * 100000000)
6467
6568 let artefactsLimit = (301 + 600)
6669
6770 let freeGenes = ["A", "B", "C", "D", "E", "F"]
6871
6972 let oldArtefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-POMP", "ART-CAPE", "ART-HAT", "ART-CUSTOMDUCK"]
7073
7174 let artefacts = ["ART-XMISTL", "ART-XHAT", "ART-XSCARF", "ART-XSWEATER", "ART-XSOCK", "ART-XTREE"]
7275
7376 let allArtefact = (artefacts ++ oldArtefacts)
7477
7578 func tryGetBoolean (key) = match getBoolean(this, key) {
7679 case b: Boolean =>
7780 b
7881 case _ =>
7982 false
8083 }
8184
8285
8386 func tryGetString (key) = match getString(this, key) {
8487 case a: String =>
8588 a
8689 case _ =>
8790 ""
8891 }
8992
9093
9194 func tryGetInteger (key) = match getInteger(this, key) {
9295 case a: Int =>
9396 a
9497 case _ =>
9598 0
9699 }
97100
98101
99102 func getRandomNumber (variants,txId,finishHeight,offset) = {
100103 let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1)))
101104 let randomHash = sha256(((base58'items' + txId) + value(randomSeedBlock.vrf)))
102105 (toInt(randomHash, offset) % variants)
103106 }
104107
105108
106109 func getRandomArtefact (boxId,h) = {
107110 let randomNumber = getRandomNumber(6, boxId, h, 1)
108111 artefacts[randomNumber]
109112 }
110113
111114
112115 func getRandomGenes (txId,h) = {
113116 let randomNumber = getRandomNumber(6, txId, h, 2)
114117 freeGenes[randomNumber]
115118 }
116119
117120
118121 func tryGetStringExternal (address,key) = match getString(address, key) {
119122 case a: String =>
120123 a
121124 case _ =>
122125 ""
123126 }
124127
125128
126129 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
127130
128131
129132 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
130133
131134
132135 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
133136
134137
135138 func getTrustedContracts () = tryGetStringExternal(getOracle(), staticKey_trustedContracts())
136139
137140
138141 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rebirthAddress())))
139142
140143
141144 func tryGetCosmeticItemPrice (item) = {
142145 let key = key_priceCosmetic(item)
143146 match getInteger(this, key) {
144147 case a: Int =>
145148 a
146149 case _ =>
147150 throw("ITGCIP: This item is not available in the store!")
148151 }
149152 }
150153
151154
152155 func asString (value) = match value {
153156 case string: String =>
154157 string
155158 case _ =>
156159 throw("wrong type, expected: String")
157160 }
158161
159162
160163 func asInt (value) = match value {
161164 case int: Int =>
162165 int
163166 case _ =>
164167 throw("wrong type, expected: Int")
165168 }
166169
167170
168171 func manipulateName (assetName,position,char) = ((take(assetName, (position - 1)) + char) + takeRight(assetName, (16 - position)))
169172
170173
171174 func itemIsInCoolDown (artefactName,artefactId) = {
172175 let unstakeHeightLast = tryGetInteger(key_unstakeHeight(artefactName, artefactId))
173176 let cooldownPeriod = 240
174177 if ((height > (unstakeHeightLast + cooldownPeriod)))
175178 then false
176179 else true
177180 }
181+
182+
183+func isTestEnv () = tryGetBoolean("TESTENV")
178184
179185
180186 @Callable(i)
181187 func directBuyItem (itemName) = {
182188 let basePrice = tryGetCosmeticItemPrice(itemName)
183189 let grow = tryGetInteger(key_growPercentageCosmetic(itemName))
184190 let startTs = tryGetInteger(key_startTsCosmetic(itemName))
185191 let endTs = tryGetInteger(key_endTsCosmetic(itemName))
186192 if (if ((startTs != 0))
187193 then (startTs > lastBlock.timestamp)
188194 else false)
189195 then throw("IDBI: The sale did not start yet!")
190196 else if (if ((endTs != 0))
191197 then (lastBlock.timestamp > endTs)
192198 else false)
193199 then throw("IDBI: The sale has already finished!")
194200 else if (!(tryGetBoolean(key_saleCosmetic(itemName))))
195201 then throw(("IDBI: Item not for sale anymore" + key_saleCosmetic(itemName)))
196202 else {
197203 let maxSalesValue = tryGetInteger(key_maxSalesCosmetic(itemName))
198204 let soldValue = tryGetInteger(key_soldCosmetic(itemName))
199205 let price = if ((grow == 0))
200206 then basePrice
201207 else (basePrice + ((basePrice / 100) * (soldValue * grow)))
202208 if (if ((maxSalesValue != 0))
203209 then (soldValue >= maxSalesValue)
204210 else false)
205211 then throw("IDBI: Max editions sold!")
206212 else {
207213 let assetId = if ((tryGetString(key_priceAssetCosmetic(itemName)) == ""))
208214 then getEggAssetId()
209215 else fromBase58String(tryGetString(key_priceAssetCosmetic(itemName)))
210216 let amountPaidByCoupons = 0
211217 let leftToPay = (price - amountPaidByCoupons)
212218 let payment = if ((leftToPay != 0))
213219 then {
214220 let firstPayment = value(i.payments[0])
215221 let amount = firstPayment.amount
216222 if ((firstPayment.assetId != assetId))
217223 then throw(("IDBI: You can attach only tokens with the following asset id: " + toBase58String(assetId)))
218224 else if ((amount != leftToPay))
219225 then throw(("IDBI: Please attach the exact asset amount" + toString(price)))
220226 else leftToPay
221227 }
222228 else 0
223229 if ((payment == payment))
224230 then {
225231 let txIdStr = toBase58String(i.transactionId)
226232 let address = i.originCaller
227233 let artefact = Issue(itemName, ("NFT artefact of Waves Ducks game: " + itemName), 1, 0, false, unit, 0)
228234 let artefactId = calculateAssetId(artefact)
229235 $Tuple2([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), itemName), IntegerEntry(key_lastPriceCosmetic(itemName), price), IntegerEntry(key_soldCosmetic(itemName), (soldValue + 1)), ScriptTransfer(address, 1, artefactId)], toBase58String(artefactId))
230236 }
231237 else throw("Strict value is not equal to itself.")
232238 }
233239 }
234240 }
235241
236242
237243
238244 @Callable(i)
239245 func manipulateBoost (boost,duckId) = {
240246 let allowedContracts = getTrustedContracts()
241247 let allowedContractsList = split(allowedContracts, ";")
242248 let dappToCall = toString(i.caller)
243249 if ((indexOf(allowedContractsList, dappToCall) == unit))
244250 then throw("IMB: This smart contract can't manipulate the boost!")
245251 else {
246252 let key = key_externalBoostDuck(duckId)
247253 let activeBoost = tryGetInteger(key)
248254 let newBoost = (activeBoost + boost)
249255 if ((0 > newBoost))
250256 then throw("IMB: Something went wrong with boost, please contact the admins!")
251257 else [IntegerEntry(key, newBoost)]
252258 }
253259 }
254260
255261
256262
257263 @Callable(i)
258264 func manipulateBoostAccount (boost,address) = {
259265 let allowedContracts = getTrustedContracts()
260266 let allowedContractsList = split(allowedContracts, ";")
261267 let dappToCall = toString(i.caller)
262268 if ((indexOf(allowedContractsList, dappToCall) == unit))
263269 then throw("IMBA: This smart contract can't manipulate the boost!")
264270 else {
265271 let key = key_externalBoostAddress(address)
266272 let activeBoost = tryGetInteger(key)
267273 let newBoost = (activeBoost + boost)
268274 if ((0 > newBoost))
269275 then throw("IMBA: Something went wrong with boost, please contact the admins!")
270276 else [IntegerEntry(key, newBoost)]
271277 }
272278 }
273279
274280
275281
276282 @Callable(i)
277283 func checkArtefactDetails (assetId) = {
278284 let asset = value(assetInfo(fromBase58String(assetId)))
279285 let assetName = value(asset.name)
280286 if (if (if (containsElement(allArtefact, assetName))
281287 then true
282288 else isDefined(tryGetCosmeticItemPrice(assetName)))
283289 then (asset.issuer == this)
284290 else false)
285291 then $Tuple2(nil, assetName)
286292 else throw("Invalid artefact")
287293 }
288294
289295
290296
291297 @Callable(i)
292298 func configureOracle (oracle) = if ((i.caller != this))
293299 then throw("admin only")
294300 else [StringEntry(staticKey_oracleAddress(), oracle)]
295301
296302
297303
298304 @Callable(i)
299305 func calculateFarmingPowerBoost (duckId,address) = {
300306 let externalBoostDuck = tryGetInteger(key_externalBoostDuck(duckId))
301307 let externalBoostAddress = tryGetInteger(key_externalBoostAddress(address))
302308 let totalBoost = (externalBoostDuck + externalBoostAddress)
303309 $Tuple2([IntegerEntry((duckId + "_last_boost"), totalBoost)], totalBoost)
304310 }
305311
306312
307313
308314 @Callable(i)
309315 func fixedGene (txIdStr,parentFixedGene,positionFixedGene) = {
310316 let firstPayment = value(i.payments[0])
311317 let firstAssetId = toBase58String(value(firstPayment.assetId))
312318 if ((firstPayment.amount != 1))
313319 then throw("NFT is not attached")
314320 else {
315321 let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
316322 if ((artefact == artefact))
317323 then if ((artefact != "ART-FIXGENE"))
318324 then throw("You need to attach a ART-FIXGENE artefact")
319325 else {
320326 let txId = fromBase58String(txIdStr)
321327 let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
322328 let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
323329 let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
324330 if ((duckGenesString == duckGenesString))
325331 then {
326332 let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil)
327333 if ((call == call))
328334 then [Burn(value(firstPayment.assetId), 1)]
329335 else throw("Strict value is not equal to itself.")
330336 }
331337 else throw("Strict value is not equal to itself.")
332338 }
333339 else throw("Strict value is not equal to itself.")
334340 }
335341 }
336342
337343
338344
339345 @Callable(i)
340346 func freeGene (txIdStr) = {
341347 let firstPayment = value(i.payments[0])
342348 let firstAssetId = toBase58String(value(firstPayment.assetId))
343349 if ((firstPayment.amount != 1))
344350 then throw("NFT is not attached")
345351 else {
346352 let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
347353 if ((artefact == artefact))
348354 then if ((artefact != "ART-FREEGENE"))
349355 then throw("You need to attach a ART-FREEGENE artefact")
350356 else {
351357 let txId = fromBase58String(txIdStr)
352358 let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
353359 let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
354360 let selectedGene = getRandomGenes(txId, processFinishHeight)
355361 let randomPosition = getRandomNumber(7, txId, processFinishHeight, 3)
356362 let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, 0, 0, selectedGene, randomPosition], nil))
357363 if ((duckGenesString == duckGenesString))
358364 then {
359365 let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil)
360366 if ((call == call))
361367 then [Burn(value(firstPayment.assetId), 1)]
362368 else throw("Strict value is not equal to itself.")
363369 }
364370 else throw("Strict value is not equal to itself.")
365371 }
366372 else throw("Strict value is not equal to itself.")
367373 }
368374 }
369375
370376
371377
372378 @Callable(i)
373379 func copyDuck () = {
374380 let firstPayment = value(i.payments[0])
375381 let secondPayment = value(i.payments[1])
376382 let firstAssetId = toBase58String(value(firstPayment.assetId))
377383 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
378384 if ((children == children))
379385 then if (if ((firstPayment.amount != 1))
380386 then true
381387 else (secondPayment.amount != 1))
382388 then throw("NFT is not attached")
383389 else {
384390 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
385391 if ((artefact == artefact))
386392 then if ((artefact != "ART-MIRROR"))
387393 then throw("You need to attach a ART-MIRROR artefact")
388394 else {
389395 let nftInfo = value(assetInfo(value(firstPayment.assetId)))
390396 let asset1Gen = split(nftInfo.name, "")
391397 if (if ((asset1Gen[14] == "G"))
392398 then true
393399 else (asset1Gen[14] == "J"))
394400 then throw("You can't mirror this duck")
395401 else {
396402 let duckGen = nftInfo.name
397403 let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
398404 if ((call == call))
399405 then [ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)]
400406 else throw("Strict value is not equal to itself.")
401407 }
402408 }
403409 else throw("Strict value is not equal to itself.")
404410 }
405411 else throw("Strict value is not equal to itself.")
406412 }
407413
408414
409415
410416 @Callable(i)
411417 func addArteFactToDuck () = {
412418 let firstPayment = value(i.payments[0])
413419 let secondPayment = value(i.payments[1])
414420 let firstAssetId = toBase58String(value(firstPayment.assetId))
415421 if (if ((firstPayment.amount != 1))
416422 then true
417423 else (secondPayment.amount != 1))
418424 then throw("NFT is not attached")
419425 else {
420426 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
421427 if ((children == children))
422428 then if ((children == 0))
423429 then throw("You can only pick a sterile NFT-duck")
424430 else {
425431 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
426432 if ((artefact == artefact))
427433 then if (if ((artefact != "ART-XHAT"))
428434 then (artefact != "ART-POMP")
429435 else false)
430436 then throw("You need to attach a ART-XHAT or ART-POMP artefact")
431437 else {
432438 let nftInfo = value(assetInfo(value(firstPayment.assetId)))
433439 let asset1Gen = split(nftInfo.name, "")
434440 if (if ((asset1Gen[14] == "G"))
435441 then true
436442 else (asset1Gen[14] == "J"))
437443 then throw("You can't mirror this duck")
438444 else if (if ((asset1Gen[5] == "S"))
439445 then true
440446 else (asset1Gen[5] == "T"))
441447 then throw("you already attached a artefact")
442448 else {
443449 let char = if ((artefact == "ART-XHAT"))
444450 then "T"
445451 else if ((artefact == "ART-POMP"))
446452 then "S"
447453 else throw("No char defined")
448454 let oldDuckGen = nftInfo.name
449455 let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil))
450456 if ((oldFarmGen == oldFarmGen))
451457 then {
452458 let duckGen = manipulateName(oldDuckGen, 6, char)
453459 let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
454460 if ((call == call))
455461 then {
456462 let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil)
457463 if ((callReduce == callReduce))
458464 then [Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)]
459465 else throw("Strict value is not equal to itself.")
460466 }
461467 else throw("Strict value is not equal to itself.")
462468 }
463469 else throw("Strict value is not equal to itself.")
464470 }
465471 }
466472 else throw("Strict value is not equal to itself.")
467473 }
468474 else throw("Strict value is not equal to itself.")
469475 }
470476 }
471477
472478
473479
474480 @Callable(i)
475481 func preInit () = [IntegerEntry("static_ART-LAKE_farmingSlots", 200), IntegerEntry("static_ART-LAKE_farmingBoost", 2), IntegerEntry("static_ART-HOUSE_farmingSlots", 4), IntegerEntry("static_ART-HOUSE_farmingBoost", 30), IntegerEntry("static_ART-BIGHOUSE_farmingSlots", 10), IntegerEntry("static_ART-BIGHOUSE_farmingBoost", 15)]
476482
477483
478484
479485 @Callable(i)
480486 func issueArtefact (type,receiver) = if (if ((i.caller != this))
481487 then (i.caller != getRebirthAddress())
482488 else false)
483489 then throw("admin only")
484490 else {
485491 let txIdStr = toBase58String(i.transactionId)
486492 let address = Address(fromBase58String(receiver))
487493 let artefact = Issue(type, "NFT artefact of Waves Ducks game. Drop #2.", 1, 0, false, unit, 0)
488494 let artefactId = calculateAssetId(artefact)
489495 $Tuple2([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), type), ScriptTransfer(address, 1, artefactId)], toBase58String(artefactId))
490496 }
491497
492498
493499
494500 @Callable(i)
495501 func setLock (n) = if ((i.caller == this))
496502 then [IntegerEntry("global_locked", n)]
497503 else throw("admin only")
498504
499505
500506
501507 @Callable(i)
502508 func buyArtefact () = if ((lastBlock.timestamp > 1639742400000))
503509 then throw("There are no active sales now... ")
504510 else if ((tryGetInteger("global_locked") > 0))
505511 then throw("contract is temporarily locked")
506512 else if ((tryGetInteger("global_artAmount") >= artefactsLimit))
507513 then throw("SOLDOUT!!! Hurray!")
508514 else if (if ((1639605600000 > lastBlock.timestamp))
509515 then (i.caller != Address(devAddress))
510516 else false)
511517 then throw("Too early...")
512518 else {
513519 let firstPayment = value(i.payments[0])
514520 if ((firstPayment.assetId != getEggAssetId()))
515521 then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
516522 else if ((eggsNeeded > firstPayment.amount))
517523 then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded)))
518524 else [StringEntry((((toString(i.caller) + "_") + toBase58String(i.transactionId)) + "_status"), "started"), IntegerEntry((((toString(i.caller) + "_") + toBase58String(i.transactionId)) + "_finishHeight"), (height + 2)), IntegerEntry("global_artAmount", (tryGetInteger("global_artAmount") + 1))]
519525 }
520526
521527
522528
523529 @Callable(i)
530+func addItemToStore (price,item,maxSales,sale,pricesset,growthPercentage,startTs,endTs) = if ((i.caller != addressFromStringValue(tryGetStringExternal(getOracle(), staticKey_pipelineUser()))))
531+ then throw("IAITS: Only for trusted users!")
532+ else [IntegerEntry(key_priceCosmetic(item), price), IntegerEntry(key_maxSalesCosmetic(item), maxSales), BooleanEntry(key_saleCosmetic(item), sale), StringEntry(key_priceAssetCosmetic(item), pricesset), IntegerEntry(key_growPercentageCosmetic(item), growthPercentage), IntegerEntry(key_startTsCosmetic(item), startTs), IntegerEntry(key_endTsCosmetic(item), endTs)]
533+
534+
535+
536+@Callable(i)
524537 func setGlobalArtAmount (newAmount) = if (if ((i.caller == this))
525538 then true
526539 else (i.caller == Address(devAddress)))
527540 then [IntegerEntry("global_artAmount", newAmount)]
528541 else throw("Permission denied")
529542
530543
531544
532545 @Callable(i)
533546 func claimArtefact (boxIdStr) = {
534547 let txId = fromBase58String(boxIdStr)
535548 let statusKey = (((toString(i.caller) + "_") + boxIdStr) + "_status")
536549 let heightKey = (((toString(i.caller) + "_") + boxIdStr) + "_finishHeight")
537550 if ((getStringValue(statusKey) != "started"))
538551 then throw("claimed already")
539552 else if ((getIntegerValue(heightKey) > height))
540553 then throw("you cannot claim yet")
541554 else {
542555 let artType = getRandomArtefact(txId, getIntegerValue(heightKey))
543556 let asset = Issue(artType, "Artefact of Waves Ducks metaverse.", 1, 0, false, unit, getIntegerValue(heightKey))
544557 let assetId = calculateAssetId(asset)
545558 [StringEntry(statusKey, artType), StringEntry((((toString(i.caller) + "_") + boxIdStr) + "_artefactId"), toBase58String(assetId)), StringEntry((toBase58String(assetId) + "_type"), artType), asset, ScriptTransfer(i.caller, 1, assetId)]
546559 }
547560 }
548561
549562
550563 @Verifier(tx)
551-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
564+func verify () = if (isTestEnv())
565+ then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
566+ else {
567+ let firstUser = base58'FzsTVRXqD46KW5yj6qGNVrsouvWjpCQvD1446A96iGt4'
568+ let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
569+ let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
570+ let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
571+ then 1
572+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
573+ then 1
574+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
575+ then 1
576+ else 0
577+ let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
578+ then 1
579+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
580+ then 1
581+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
582+ then 1
583+ else 0
584+ let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
585+ then 1
586+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
587+ then 1
588+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
589+ then 1
590+ else 0
591+ let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
592+ match tx {
593+ case _ =>
594+ (signaturesCount >= 2)
595+ }
596+ }
552597

github/deemru/w8io/6500d08 
63.54 ms