tx · B8QHBaRBWSFrQMA1v3n2fqcwq3q4D4YYKBey7eLnCYfs

3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks:  -0.02300000 Waves

2023.09.16 00:29 [3822807] smart account 3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks > SELF 0.00000000 Waves

{ "type": 13, "id": "B8QHBaRBWSFrQMA1v3n2fqcwq3q4D4YYKBey7eLnCYfs", "fee": 2300000, "feeAssetId": null, "timestamp": 1694813369357, "version": 2, "chainId": 87, "sender": "3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks", "senderPublicKey": "XrNmTusDFaLSz3wAjmdfcyC5h6uYyVbpdh18758UpFv", "proofs": [ "XnxPN3DEfKNZnfx1ajBBfAweZihNC5YHtHTp13Nau8E6kiUeqZTT1k1CeaqJPHVJWJqramEquyY8ZhiLp5mu73T" ], "script": "base64:BgJYCAISAwoBCBIECgIBCBIECgIBCBIDCgEIEgMKAQgSBAoCCAgSBQoDCAEBEgMKAQgSABIAEgASBAoCCAgSAwoBARIAEgoKCAEIAQQIAQEBEgMKAQESAwoBCDUBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAIUc3RhdGljX29yYWNsZUFkZHJlc3MBGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwACFXN0YXRpY19icmVlZGVyQWRkcmVzcwEUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAAhFzdGF0aWNfZWdnQXNzZXRJZAEac3RhdGljS2V5X3RydXN0ZWRDb250cmFjdHMAAhdzdGF0aWNfdHJ1c3RlZENvbnRyYWN0cwEYc3RhdGljS2V5X3JlYmlydGhBZGRyZXNzAAIVc3RhdGljX3JlYmlydGhBZGRyZXNzAR5zdGF0aWNLZXlfdHVydGxlUmViaXJ0aEFkZHJlc3MAAhtzdGF0aWNfdHVydGxlUmViaXJ0aEFkZHJlc3MBFnN0YXRpY0tleV9waXBlbGluZVVzZXIAAhNzdGF0aWNfcGlwZWxpbmVVc2VyARJzdGF0aWNLZXlfZXh0cmFGZWUAAg9zdGF0aWNfZXh0cmFGZWUBF3N0YXRpY0tleV9mZWVBZ2dyZWdhdG9yAAIUc3RhdGljX2ZlZUFnZ3JlZ2F0b3IBG3N0YXRpY0tleV9odW50RGlzdHJvQWRkcmVzcwACGHN0YXRpY19odW50RGlzdHJvQWRkcmVzcwERa2V5X2FydGVmYWN0T3duZXICDGFydGVmYWN0TmFtZQVvd25lcgkArAICCQCsAgIJAKwCAgUMYXJ0ZWZhY3ROYW1lAgFfBQVvd25lcgIGX293bmVyARFrZXlfdW5zdGFrZUhlaWdodAIMYXJ0ZWZhY3ROYW1lCmFydGVmYWN0SWQJAKwCAgkArAICCQCsAgIFDGFydGVmYWN0TmFtZQIBXwUKYXJ0ZWZhY3RJZAIPX3Vuc3Rha2VfaGVpZ2h0ARVrZXlfZXh0ZXJuYWxCb29zdER1Y2sBBmR1Y2tJZAkArAICBQZkdWNrSWQCFF9kdWNrX2V4dGVybmFsX2Jvb3N0ARhrZXlfZXh0ZXJuYWxCb29zdEFkZHJlc3MBB2FkZHJlc3MJAKwCAgUHYWRkcmVzcwIUX3VzZXJfZXh0ZXJuYWxfYm9vc3QBEWtleV9wcmljZUNvc21ldGljAQRpdGVtCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0BFGtleV9tYXhTYWxlc0Nvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQIKX21heF9zYWxlcwEQa2V5X3NhbGVDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CBV9zYWxlARZrZXlfcHJpY2VBc3NldENvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQILX3ByaWNlQXNzZXQBGmtleV9ncm93UGVyY2VudGFnZUNvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQITX2dyb3dpbmdfcGVyY2VudGFnZQEQa2V5X3NvbGRDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CBV9zb2xkARVrZXlfbGFzdFByaWNlQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAgtfbGFzdF9wcmljZQETa2V5X3N0YXJ0VHNDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CCF9zdGFydFRzARFrZXlfZW5kVHNDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CBl9lbmRUcwEXa2V5X3Byb2Nlc3NGaW5pc2hIZWlnaHQCB2FkZHJlc3MEdHhJZAkArAICCQCsAgIJAKwCAgUHYWRkcmVzcwIBXwkA2AQBBQR0eElkAgNfZmgACmRldkFkZHJlc3MBGgFXF3fYQk8hOgpGT8vir4YiaxOc51un3nx7AAplZ2dzTmVlZGVkCQBoAgADAIDC1y8ADmFydGVmYWN0c0xpbWl0CQBkAgCtAgDYBAAJZnJlZUdlbmVzCQDMCAICAUEJAMwIAgIBQgkAzAgCAgFDCQDMCAICAUQJAMwIAgIBRQkAzAgCAgFGCQDMCAICAUcJAMwIAgIBSAkAzAgCAgFJBQNuaWwADG9sZEFydGVmYWN0cwkAzAgCAghBUlQtTEFLRQkAzAgCAglBUlQtSE9VU0UJAMwIAgIMQVJULUJJR0hPVVNFCQDMCAICC0FSVC1GSVhHRU5FCQDMCAICDEFSVC1GUkVFR0VORQkAzAgCAgpBUlQtTUlSUk9SCQDMCAICCEFSVC1QT01QCQDMCAICCEFSVC1DQVBFCQDMCAICB0FSVC1IQVQJAMwIAgIOQVJULUNVU1RPTURVQ0sFA25pbAAJYXJ0ZWZhY3RzCQDMCAICCkFSVC1YTUlTVEwJAMwIAgIIQVJULVhIQVQJAMwIAgIKQVJULVhTQ0FSRgkAzAgCAgxBUlQtWFNXRUFURVIJAMwIAgIJQVJULVhTT0NLCQDMCAICCUFSVC1YVFJFRQUDbmlsAAthbGxBcnRlZmFjdAkAzggCBQlhcnRlZmFjdHMFDG9sZEFydGVmYWN0cwENdHJ5R2V0Qm9vbGVhbgEDa2V5BAckbWF0Y2gwCQCbCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwEMdHJ5R2V0U3RyaW5nAQNrZXkEByRtYXRjaDAJAJ0IAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQ9nZXRSYW5kb21OdW1iZXIECHZhcmlhbnRzBHR4SWQMZmluaXNoSGVpZ2h0Bm9mZnNldAQPcmFuZG9tU2VlZEJsb2NrCQEFdmFsdWUBCQDtBwEJAGUCBQxmaW5pc2hIZWlnaHQAAQQKcmFuZG9tSGFzaAkA9wMBCQDLAQIJAMsBAgEEHEF95gUEdHhJZAkBBXZhbHVlAQgFD3JhbmRvbVNlZWRCbG9jawN2cmYJAGoCCQCyCQIFCnJhbmRvbUhhc2gFBm9mZnNldAUIdmFyaWFudHMBEWdldFJhbmRvbUFydGVmYWN0AgVib3hJZAFoBAxyYW5kb21OdW1iZXIJAQ9nZXRSYW5kb21OdW1iZXIEAAYFBWJveElkBQFoAAEJAJEDAgUJYXJ0ZWZhY3RzBQxyYW5kb21OdW1iZXIBDmdldFJhbmRvbUdlbmVzAgR0eElkAWgEDHJhbmRvbU51bWJlcgkBD2dldFJhbmRvbU51bWJlcgQABgUEdHhJZAUBaAACCQCRAwIFCWZyZWVHZW5lcwUMcmFuZG9tTnVtYmVyARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJ0IAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABEWdldEJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAENZ2V0RWdnQXNzZXRJZAAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARRzdGF0aWNLZXlfZWdnQXNzZXRJZAABE2dldFRydXN0ZWRDb250cmFjdHMACQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGnN0YXRpY0tleV90cnVzdGVkQ29udHJhY3RzAAERZ2V0UmViaXJ0aEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfcmViaXJ0aEFkZHJlc3MAARdnZXRUdXJ0bGVSZWJpcnRoQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHnN0YXRpY0tleV90dXJ0bGVSZWJpcnRoQWRkcmVzcwABEGdldEZlZUFnZ3JlZ2F0b3IACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgABFGdldEh1bnREaXN0cm9BZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEbc3RhdGljS2V5X2h1bnREaXN0cm9BZGRyZXNzAAEXdHJ5R2V0Q29zbWV0aWNJdGVtUHJpY2UBBGl0ZW0EA2tleQkBEWtleV9wcmljZUNvc21ldGljAQUEaXRlbQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhCQACAQIwSVRHQ0lQOiBUaGlzIGl0ZW0gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgc3RvcmUhAQhhc1N0cmluZwEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwBQZzdHJpbmcJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQ5tYW5pcHVsYXRlTmFtZQMJYXNzZXROYW1lCHBvc2l0aW9uBGNoYXIJAKwCAgkArAICCQCvAgIFCWFzc2V0TmFtZQkAZQIFCHBvc2l0aW9uAAEFBGNoYXIJALICAgUJYXNzZXROYW1lCQBlAgAQBQhwb3NpdGlvbgEQaXRlbUlzSW5Db29sRG93bgIMYXJ0ZWZhY3ROYW1lCmFydGVmYWN0SWQEEXVuc3Rha2VIZWlnaHRMYXN0CQENdHJ5R2V0SW50ZWdlcgEJARFrZXlfdW5zdGFrZUhlaWdodAIFDGFydGVmYWN0TmFtZQUKYXJ0ZWZhY3RJZAQOY29vbGRvd25QZXJpb2QA8AEDCQBmAgUGaGVpZ2h0CQBkAgURdW5zdGFrZUhlaWdodExhc3QFDmNvb2xkb3duUGVyaW9kBwYBCWlzVGVzdEVudgAJAQ10cnlHZXRCb29sZWFuAQIHVEVTVEVOVgEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEHcGF5bWVudAMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIZV0NBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQJZmVlQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxXQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsEQFpAQ1kaXJlY3RCdXlJdGVtAQhpdGVtTmFtZQQJYmFzZVByaWNlCQEXdHJ5R2V0Q29zbWV0aWNJdGVtUHJpY2UBBQhpdGVtTmFtZQQEZ3JvdwkBDXRyeUdldEludGVnZXIBCQEaa2V5X2dyb3dQZXJjZW50YWdlQ29zbWV0aWMBBQhpdGVtTmFtZQQHc3RhcnRUcwkBDXRyeUdldEludGVnZXIBCQETa2V5X3N0YXJ0VHNDb3NtZXRpYwEFCGl0ZW1OYW1lBAVlbmRUcwkBDXRyeUdldEludGVnZXIBCQERa2V5X2VuZFRzQ29zbWV0aWMBBQhpdGVtTmFtZQMDCQECIT0CBQdzdGFydFRzAAAJAGYCBQdzdGFydFRzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAcJAAIBAiFJREJJOiBUaGUgc2FsZSBkaWQgbm90IHN0YXJ0IHlldCEDAwkBAiE9AgUFZW5kVHMAAAkAZgIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQVlbmRUcwcJAAIBAiRJREJJOiBUaGUgc2FsZSBoYXMgYWxyZWFkeSBmaW5pc2hlZCEDCQEBIQEJAQ10cnlHZXRCb29sZWFuAQkBEGtleV9zYWxlQ29zbWV0aWMBBQhpdGVtTmFtZQkAAgEJAKwCAgIfSURCSTogSXRlbSBub3QgZm9yIHNhbGUgYW55bW9yZQkBEGtleV9zYWxlQ29zbWV0aWMBBQhpdGVtTmFtZQQNbWF4U2FsZXNWYWx1ZQkBDXRyeUdldEludGVnZXIBCQEUa2V5X21heFNhbGVzQ29zbWV0aWMBBQhpdGVtTmFtZQQJc29sZFZhbHVlCQENdHJ5R2V0SW50ZWdlcgEJARBrZXlfc29sZENvc21ldGljAQUIaXRlbU5hbWUEBXByaWNlAwkAAAIFBGdyb3cAAAUJYmFzZVByaWNlCQBkAgUJYmFzZVByaWNlCQBoAgkAaQIFCWJhc2VQcmljZQBkCQBoAgUJc29sZFZhbHVlBQRncm93AwMJAQIhPQIFDW1heFNhbGVzVmFsdWUAAAkAZwIFCXNvbGRWYWx1ZQUNbWF4U2FsZXNWYWx1ZQcJAAIBAhhJREJJOiBNYXggZWRpdGlvbnMgc29sZCEEB2Fzc2V0SWQDCQAAAgkBDHRyeUdldFN0cmluZwEJARZrZXlfcHJpY2VBc3NldENvc21ldGljAQUIaXRlbU5hbWUCAAkBDWdldEVnZ0Fzc2V0SWQAAwkAAAIJAQx0cnlHZXRTdHJpbmcBCQEWa2V5X3ByaWNlQXNzZXRDb3NtZXRpYwEFCGl0ZW1OYW1lAgVXQVZFUwUEdW5pdAkA2QQBCQEMdHJ5R2V0U3RyaW5nAQkBFmtleV9wcmljZUFzc2V0Q29zbWV0aWMBBQhpdGVtTmFtZQQTYW1vdW50UGFpZEJ5Q291cG9ucwAABAlsZWZ0VG9QYXkJAGUCBQVwcmljZQUTYW1vdW50UGFpZEJ5Q291cG9ucwQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAAQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEBmFtb3VudAgFDGZpcnN0UGF5bWVudAZhbW91bnQDCQECIT0CCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQFB2Fzc2V0SWQJAAIBAjpJREJJOiBZb3UgY2FuIGF0dGFjaCBvbmx5IHRva2VucyB3aXRoIHRoZSBjb3JyZWN0IHBheW1lbnQgAwkBAiE9AgUGYW1vdW50BQlsZWZ0VG9QYXkJAAIBCQCsAgICKklEQkk6IFBsZWFzZSBhdHRhY2ggdGhlIGV4YWN0IGFzc2V0IGFtb3VudAkApAMBBQVwcmljZQQHdHhJZFN0cgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAdhZGRyZXNzCAUBaQxvcmlnaW5DYWxsZXIECGFydGVmYWN0CQDDCAcFCGl0ZW1OYW1lCQCsAgICIk5GVCBhcnRlZmFjdCBvZiBXYXZlcyBEdWNrcyBnYW1lOiAFCGl0ZW1OYW1lAAEAAAcFBHVuaXQAAAQKYXJ0ZWZhY3RJZAkAuAgBBQhhcnRlZmFjdAkAlAoCCQDOCAIJAMwIAgUIYXJ0ZWZhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICCWFydGVmYWN0XwkA2AQBBQphcnRlZmFjdElkAgVfdHlwZQUIaXRlbU5hbWUJAMwIAgkBDEludGVnZXJFbnRyeQIJARVrZXlfbGFzdFByaWNlQ29zbWV0aWMBBQhpdGVtTmFtZQUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlfc29sZENvc21ldGljAQUIaXRlbU5hbWUJAGQCBQlzb2xkVmFsdWUAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQdhZGRyZXNzAAEFCmFydGVmYWN0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEGdldEZlZUFnZ3JlZ2F0b3IABQZhbW91bnQFB2Fzc2V0SWQFA25pbAUMdmFsaWRQYXltZW50CQDYBAEFCmFydGVmYWN0SWQBaQEPbWFuaXB1bGF0ZUJvb3N0AgVib29zdAZkdWNrSWQEEGFsbG93ZWRDb250cmFjdHMJARNnZXRUcnVzdGVkQ29udHJhY3RzAAQUYWxsb3dlZENvbnRyYWN0c0xpc3QJALUJAgUQYWxsb3dlZENvbnRyYWN0cwIBOwQKZGFwcFRvQ2FsbAkApQgBCAUBaQZjYWxsZXIDCQAAAgkAzwgCBRRhbGxvd2VkQ29udHJhY3RzTGlzdAUKZGFwcFRvQ2FsbAUEdW5pdAkAAgECNElNQjogVGhpcyBzbWFydCBjb250cmFjdCBjYW4ndCBtYW5pcHVsYXRlIHRoZSBib29zdCEEA2tleQkBFWtleV9leHRlcm5hbEJvb3N0RHVjawEFBmR1Y2tJZAQLYWN0aXZlQm9vc3QJAQ10cnlHZXRJbnRlZ2VyAQUDa2V5BAhuZXdCb29zdAkAZAIFC2FjdGl2ZUJvb3N0BQVib29zdAMJAGYCAAAFCG5ld0Jvb3N0CQACAQJASU1COiBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIGJvb3N0LCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW5zIQkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQhuZXdCb29zdAUDbmlsAWkBFm1hbmlwdWxhdGVCb29zdEFjY291bnQCBWJvb3N0B2FkZHJlc3MEEGFsbG93ZWRDb250cmFjdHMJARNnZXRUcnVzdGVkQ29udHJhY3RzAAQUYWxsb3dlZENvbnRyYWN0c0xpc3QJALUJAgUQYWxsb3dlZENvbnRyYWN0cwIBOwQKZGFwcFRvQ2FsbAkApQgBCAUBaQZjYWxsZXIDCQAAAgkAzwgCBRRhbGxvd2VkQ29udHJhY3RzTGlzdAUKZGFwcFRvQ2FsbAUEdW5pdAkAAgECNUlNQkE6IFRoaXMgc21hcnQgY29udHJhY3QgY2FuJ3QgbWFuaXB1bGF0ZSB0aGUgYm9vc3QhBANrZXkJARhrZXlfZXh0ZXJuYWxCb29zdEFkZHJlc3MBBQdhZGRyZXNzBAthY3RpdmVCb29zdAkBDXRyeUdldEludGVnZXIBBQNrZXkECG5ld0Jvb3N0CQBkAgULYWN0aXZlQm9vc3QFBWJvb3N0AwkAZgIAAAUIbmV3Qm9vc3QJAAIBAkFJTUJBOiBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIGJvb3N0LCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW5zIQkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQhuZXdCb29zdAUDbmlsAWkBFGNoZWNrQXJ0ZWZhY3REZXRhaWxzAQdhc3NldElkBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFB2Fzc2V0SWQECWFzc2V0TmFtZQkBBXZhbHVlAQgFBWFzc2V0BG5hbWUDAwMJAQ9jb250YWluc0VsZW1lbnQCBQthbGxBcnRlZmFjdAUJYXNzZXROYW1lBgkBCWlzRGVmaW5lZAEJARd0cnlHZXRDb3NtZXRpY0l0ZW1QcmljZQEFCWFzc2V0TmFtZQkAAAIIBQVhc3NldAZpc3N1ZXIFBHRoaXMHCQCUCgIFA25pbAUJYXNzZXROYW1lCQACAQIQSW52YWxpZCBhcnRlZmFjdAFpAQ9jb25maWd1cmVPcmFjbGUBBm9yYWNsZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCmFkbWluIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAUGb3JhY2xlBQNuaWwBaQEaY2FsY3VsYXRlRmFybWluZ1Bvd2VyQm9vc3QCBmR1Y2tJZAdhZGRyZXNzBBFleHRlcm5hbEJvb3N0RHVjawkBDXRyeUdldEludGVnZXIBCQEVa2V5X2V4dGVybmFsQm9vc3REdWNrAQUGZHVja0lkBBRleHRlcm5hbEJvb3N0QWRkcmVzcwkBDXRyeUdldEludGVnZXIBCQEYa2V5X2V4dGVybmFsQm9vc3RBZGRyZXNzAQUHYWRkcmVzcwQKdG90YWxCb29zdAkAZAIFEWV4dGVybmFsQm9vc3REdWNrBRRleHRlcm5hbEJvb3N0QWRkcmVzcwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBmR1Y2tJZAILX2xhc3RfYm9vc3QFCnRvdGFsQm9vc3QFA25pbAUKdG90YWxCb29zdAFpAQlmaXhlZEdlbmUDB3R4SWRTdHIPcGFyZW50Rml4ZWRHZW5lEXBvc2l0aW9uRml4ZWRHZW5lBAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAQQMZmlyc3RBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAMJAQIhPQIIBQxmaXJzdFBheW1lbnQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBAhhcnRlZmFjdAkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBQxmaXJzdEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFCGFydGVmYWN0BQhhcnRlZmFjdAMJAQIhPQIFCGFydGVmYWN0AgtBUlQtRklYR0VORQkAAgECKVlvdSBuZWVkIHRvIGF0dGFjaCBhIEFSVC1GSVhHRU5FIGFydGVmYWN0BAR0eElkCQDZBAEFB3R4SWRTdHIED2ZpbmlzaEhlaWdodEtleQkBF2tleV9wcm9jZXNzRmluaXNoSGVpZ2h0AgkApQgBCAUBaQZjYWxsZXIFBHR4SWQEE3Byb2Nlc3NGaW5pc2hIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIJARFnZXRCcmVlZGVyQWRkcmVzcwAFD2ZpbmlzaEhlaWdodEtleQQPZHVja0dlbmVzU3RyaW5nCQEIYXNTdHJpbmcBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACDGdlbmVyYXRlRHVjawkAzAgCBQR0eElkCQDMCAIFE3Byb2Nlc3NGaW5pc2hIZWlnaHQJAMwIAgUPcGFyZW50Rml4ZWRHZW5lCQDMCAIFEXBvc2l0aW9uRml4ZWRHZW5lCQDMCAICAAkAzAgCAAAFA25pbAUDbmlsAwkAAAIFD2R1Y2tHZW5lc1N0cmluZwUPZHVja0dlbmVzU3RyaW5nBARjYWxsCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACF2ZpbmlzaER1Y2tIYXRjaGluZ0l0ZW1zCQDMCAIFB3R4SWRTdHIJAMwIAgUPZHVja0dlbmVzU3RyaW5nBQNuaWwFA25pbAMJAAACBQRjYWxsBQRjYWxsCQDOCAIJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQAAQUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIZnJlZUdlbmUBB3R4SWRTdHIEDGZpcnN0UGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAxmaXJzdEFzc2V0SWQJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIFDGZpcnN0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwkBAiE9AgUIYXJ0ZWZhY3QCDEFSVC1GUkVFR0VORQkAAgECKllvdSBuZWVkIHRvIGF0dGFjaCBhIEFSVC1GUkVFR0VORSBhcnRlZmFjdAQEdHhJZAkA2QQBBQd0eElkU3RyBA9maW5pc2hIZWlnaHRLZXkJARdrZXlfcHJvY2Vzc0ZpbmlzaEhlaWdodAIJAKUIAQgFAWkGY2FsbGVyBQR0eElkBBNwcm9jZXNzRmluaXNoSGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCCQERZ2V0QnJlZWRlckFkZHJlc3MABQ9maW5pc2hIZWlnaHRLZXkEDHNlbGVjdGVkR2VuZQkBDmdldFJhbmRvbUdlbmVzAgUEdHhJZAUTcHJvY2Vzc0ZpbmlzaEhlaWdodAQOcmFuZG9tUG9zaXRpb24JAQ9nZXRSYW5kb21OdW1iZXIEAAcFBHR4SWQFE3Byb2Nlc3NGaW5pc2hIZWlnaHQAAwQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAQQPZHVja0dlbmVzU3RyaW5nCQEIYXNTdHJpbmcBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACDGdlbmVyYXRlRHVjawkAzAgCBQR0eElkCQDMCAIFE3Byb2Nlc3NGaW5pc2hIZWlnaHQJAMwIAgAACQDMCAIAAAkAzAgCBQxzZWxlY3RlZEdlbmUJAMwIAgUOcmFuZG9tUG9zaXRpb24FA25pbAUDbmlsAwkAAAIFD2R1Y2tHZW5lc1N0cmluZwUPZHVja0dlbmVzU3RyaW5nBARjYWxsCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACF2ZpbmlzaER1Y2tIYXRjaGluZ0l0ZW1zCQDMCAIFB3R4SWRTdHIJAMwIAgUPZHVja0dlbmVzU3RyaW5nBQNuaWwFA25pbAMJAAACBQRjYWxsBQRjYWxsCQDOCAIJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQAAQUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIY29weUR1Y2sABAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQNc2Vjb25kUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBAx2YWxpZFBheW1lbnQJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwACBAxmaXJzdEFzc2V0SWQJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkBAhjaGlsZHJlbgkBBWFzSW50AQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQDMCAIFDGZpcnN0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIY2hpbGRyZW4FCGNoaWxkcmVuAwMJAQIhPQIIBQxmaXJzdFBheW1lbnQGYW1vdW50AAEGCQECIT0CCAUNc2Vjb25kUGF5bWVudAZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIJANgEAQkBBXZhbHVlAQgFDXNlY29uZFBheW1lbnQHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwkBAiE9AgUIYXJ0ZWZhY3QCCkFSVC1NSVJST1IJAAIBAihZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtTUlSUk9SIGFydGVmYWN0BAduZnRJbmZvCQEFdmFsdWUBCQDsBwEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAQJYXNzZXQxR2VuCQC1CQIIBQduZnRJbmZvBG5hbWUCAAMDCQAAAgkAkQMCBQlhc3NldDFHZW4ADgIBRwYJAAACCQCRAwIFCWFzc2V0MUdlbgAOAgFKCQACAQIaWW91IGNhbid0IG1pcnJvciB0aGlzIGR1Y2sEB2R1Y2tHZW4IBQduZnRJbmZvBG5hbWUEBGNhbGwJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWY3JlYXRlRHVja1NwZWNpYWxHZW5lcwkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIFB2R1Y2tHZW4JAMwIAgUIY2hpbGRyZW4FA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQgFDGZpcnN0UGF5bWVudAdhc3NldElkCQDMCAIJAQRCdXJuAgkBBXZhbHVlAQgFDXNlY29uZFBheW1lbnQHYXNzZXRJZAABBQNuaWwFDHZhbGlkUGF5bWVudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFhZGRBcnRlRmFjdFRvRHVjawAEDGZpcnN0UGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABA1zZWNvbmRQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAIEDGZpcnN0QXNzZXRJZAkA2AQBCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQDAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQYJAQIhPQIIBQ1zZWNvbmRQYXltZW50BmFtb3VudAABCQACAQITTkZUIGlzIG5vdCBhdHRhY2hlZAQIY2hpbGRyZW4JAQVhc0ludAEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWdmFsaWRhdGVBbmRHZXRDaGlsZHJlbgkAzAgCBQxmaXJzdEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFCGNoaWxkcmVuBQhjaGlsZHJlbgMJAAACBQhjaGlsZHJlbgAACQACAQIkWW91IGNhbiBvbmx5IHBpY2sgYSBzdGVyaWxlIE5GVC1kdWNrBAhhcnRlZmFjdAkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCCQDYBAEJAQV2YWx1ZQEIBQ1zZWNvbmRQYXltZW50B2Fzc2V0SWQFA25pbAUDbmlsAwkAAAIFCGFydGVmYWN0BQhhcnRlZmFjdAMDCQECIT0CBQhhcnRlZmFjdAIIQVJULVhIQVQJAQIhPQIFCGFydGVmYWN0AghBUlQtUE9NUAcJAAIBAjJZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtWEhBVCBvciBBUlQtUE9NUCBhcnRlZmFjdAQHbmZ0SW5mbwkBBXZhbHVlAQkA7AcBCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQECWFzc2V0MUdlbgkAtQkCCAUHbmZ0SW5mbwRuYW1lAgADAwkAAAIJAJEDAgUJYXNzZXQxR2VuAA4CAUcGCQAAAgkAkQMCBQlhc3NldDFHZW4ADgIBSgkAAgECGllvdSBjYW4ndCBtaXJyb3IgdGhpcyBkdWNrAwMJAAACCQCRAwIFCWFzc2V0MUdlbgAFAgFTBgkAAAIJAJEDAgUJYXNzZXQxR2VuAAUCAVQJAAIBAh95b3UgYWxyZWFkeSBhdHRhY2hlZCBhIGFydGVmYWN0BARjaGFyAwkAAAIFCGFydGVmYWN0AghBUlQtWEhBVAIBVAMJAAACBQhhcnRlZmFjdAIIQVJULVBPTVACAVMJAAIBAg9ObyBjaGFyIGRlZmluZWQECm9sZER1Y2tHZW4IBQduZnRJbmZvBG5hbWUECm9sZEZhcm1HZW4JAQhhc1N0cmluZwEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIOZ2V0R2VuRnJvbU5hbWUJAMwIAgUKb2xkRHVja0dlbgUDbmlsBQNuaWwDCQAAAgUKb2xkRmFybUdlbgUKb2xkRmFybUdlbgQHZHVja0dlbgkBDm1hbmlwdWxhdGVOYW1lAwUKb2xkRHVja0dlbgAGBQRjaGFyBARjYWxsCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACFmNyZWF0ZUR1Y2tTcGVjaWFsR2VuZXMJAMwIAggIBQFpBmNhbGxlcgVieXRlcwkAzAgCBQdkdWNrR2VuCQDMCAIFCGNoaWxkcmVuBQNuaWwFA25pbAMJAAACBQRjYWxsBQRjYWxsBApjYWxsUmVkdWNlCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACDHJlZHVjZVJhcml0eQkAzAgCBQxmaXJzdEFzc2V0SWQJAMwIAgUKb2xkRmFybUdlbgUDbmlsBQNuaWwDCQAAAgUKY2FsbFJlZHVjZQUKY2FsbFJlZHVjZQkAzggCCQDMCAIJAQRCdXJuAgkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkAAEJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUNc2Vjb25kUGF5bWVudAdhc3NldElkAAEFA25pbAUMdmFsaWRQYXltZW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3ByZUluaXQACQDMCAIJAQxJbnRlZ2VyRW50cnkCAhxzdGF0aWNfQVJULUxBS0VfZmFybWluZ1Nsb3RzAMgBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhxzdGF0aWNfQVJULUxBS0VfZmFybWluZ0Jvb3N0AAIJAMwIAgkBDEludGVnZXJFbnRyeQICHXN0YXRpY19BUlQtSE9VU0VfZmFybWluZ1Nsb3RzAAQJAMwIAgkBDEludGVnZXJFbnRyeQICHXN0YXRpY19BUlQtSE9VU0VfZmFybWluZ0Jvb3N0AB4JAMwIAgkBDEludGVnZXJFbnRyeQICIHN0YXRpY19BUlQtQklHSE9VU0VfZmFybWluZ1Nsb3RzAAoJAMwIAgkBDEludGVnZXJFbnRyeQICIHN0YXRpY19BUlQtQklHSE9VU0VfZmFybWluZ0Jvb3N0AA8FA25pbAFpAQ1pc3N1ZUFydGVmYWN0AgR0eXBlCHJlY2VpdmVyAwMDAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQECIT0CCAUBaQZjYWxsZXIJARFnZXRSZWJpcnRoQWRkcmVzcwAHCQECIT0CCAUBaQZjYWxsZXIJARdnZXRUdXJ0bGVSZWJpcnRoQWRkcmVzcwAHCQECIT0CCAUBaQZjYWxsZXIJARRnZXRIdW50RGlzdHJvQWRkcmVzcwAHCQACAQIKYWRtaW4gb25seQMDCQAAAggFAWkGY2FsbGVyCQEUZ2V0SHVudERpc3Ryb0FkZHJlc3MACQEBIQEJAQhjb250YWlucwIFBHR5cGUCCUFSVC1GSVJFXwcJAAIBAg9GSVJFIElURU0gT05MWSEEB3R4SWRTdHIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAQHYWRkcmVzcwkBB0FkZHJlc3MBCQDZBAEFCHJlY2VpdmVyBAhhcnRlZmFjdAkAwwgHBQR0eXBlAipORlQgYXJ0ZWZhY3Qgb2YgV2F2ZXMgRHVja3MgZ2FtZS4gRHJvcCAjMi4AAQAABwUEdW5pdAAABAphcnRlZmFjdElkCQC4CAEFCGFydGVmYWN0CQCUCgIJAMwIAgUIYXJ0ZWZhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICCWFydGVmYWN0XwkA2AQBBQphcnRlZmFjdElkAgVfdHlwZQUEdHlwZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQdhZGRyZXNzAAEFCmFydGVmYWN0SWQFA25pbAkA2AQBBQphcnRlZmFjdElkAWkBB3NldExvY2sBAW4DCQAAAggFAWkGY2FsbGVyBQR0aGlzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1nbG9iYWxfbG9ja2VkBQFuBQNuaWwJAAIBAgphZG1pbiBvbmx5AWkBC2J1eUFydGVmYWN0AAMJAGYCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcACAzI3C3C8JAAIBAiFUaGVyZSBhcmUgbm8gYWN0aXZlIHNhbGVzIG5vdy4uLiADCQBmAgkBDXRyeUdldEludGVnZXIBAg1nbG9iYWxfbG9ja2VkAAAJAAIBAh5jb250cmFjdCBpcyB0ZW1wb3JhcmlseSBsb2NrZWQDCQBnAgkBDXRyeUdldEludGVnZXIBAhBnbG9iYWxfYXJ0QW1vdW50BQ5hcnRlZmFjdHNMaW1pdAkAAgECElNPTERPVVQhISEgSHVycmF5IQMDCQBmAgCA/u+A3C8IBQlsYXN0QmxvY2sJdGltZXN0YW1wCQECIT0CCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQUKZGV2QWRkcmVzcwcJAAIBAgxUb28gZWFybHkuLi4EDGZpcnN0UGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFDGZpcnN0UGF5bWVudAdhc3NldElkCQENZ2V0RWdnQXNzZXRJZAAJAAIBCQCsAgICPFlvdSBjYW4gYXR0YWNoIG9ubHkgRUdHIHRva2VucyB3aXRoIHRoZSBmb2xsb3dpbmcgYXNzZXQgaWQ6IAkA2AQBCQENZ2V0RWdnQXNzZXRJZAADCQBmAgUKZWdnc05lZWRlZAgFDGZpcnN0UGF5bWVudAZhbW91bnQJAAIBCQCsAgICRFRvIGhhdGNoIGEgZHVjayB5b3UgY3VycmVudGx5IG5lZWQgdGhlIGZvbGxvd2luZyBhbW91bnQgb2YgRUdHbGV0czogCQCkAwEFCmVnZ3NOZWVkZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JANgEAQgFAWkNdHJhbnNhY3Rpb25JZAIHX3N0YXR1cwIHc3RhcnRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JANgEAQgFAWkNdHJhbnNhY3Rpb25JZAINX2ZpbmlzaEhlaWdodAkAZAIFBmhlaWdodAACCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhBnbG9iYWxfYXJ0QW1vdW50CQBkAgkBDXRyeUdldEludGVnZXIBAhBnbG9iYWxfYXJ0QW1vdW50AAEFA25pbAFpAQ5hZGRJdGVtVG9TdG9yZQgFcHJpY2UEaXRlbQhtYXhTYWxlcwRzYWxlCXByaWNlc3NldBBncm93dGhQZXJjZW50YWdlB3N0YXJ0VHMFZW5kVHMDCQECIT0CCAUBaQZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEWc3RhdGljS2V5X3BpcGVsaW5lVXNlcgAJAAIBAh5JQUlUUzogT25seSBmb3IgdHJ1c3RlZCB1c2VycyEJAMwIAgkBDEludGVnZXJFbnRyeQIJARFrZXlfcHJpY2VDb3NtZXRpYwEFBGl0ZW0FBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5X21heFNhbGVzQ29zbWV0aWMBBQRpdGVtBQhtYXhTYWxlcwkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBEGtleV9zYWxlQ29zbWV0aWMBBQRpdGVtBQRzYWxlCQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlfcHJpY2VBc3NldENvc21ldGljAQUEaXRlbQUJcHJpY2Vzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaa2V5X2dyb3dQZXJjZW50YWdlQ29zbWV0aWMBBQRpdGVtBRBncm93dGhQZXJjZW50YWdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETa2V5X3N0YXJ0VHNDb3NtZXRpYwEFBGl0ZW0FB3N0YXJ0VHMJAMwIAgkBDEludGVnZXJFbnRyeQIJARFrZXlfZW5kVHNDb3NtZXRpYwEFBGl0ZW0FBWVuZFRzBQNuaWwBaQESc2V0R2xvYmFsQXJ0QW1vdW50AQluZXdBbW91bnQDAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYJAAACCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQUKZGV2QWRkcmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgIQZ2xvYmFsX2FydEFtb3VudAUJbmV3QW1vdW50BQNuaWwJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAFpAQ1jbGFpbUFydGVmYWN0AQhib3hJZFN0cgQEdHhJZAkA2QQBBQhib3hJZFN0cgQJc3RhdHVzS2V5CQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwUIYm94SWRTdHICB19zdGF0dXMECWhlaWdodEtleQkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8FCGJveElkU3RyAg1fZmluaXNoSGVpZ2h0AwkBAiE9AgkBEUBleHRyTmF0aXZlKDEwNTgpAQUJc3RhdHVzS2V5AgdzdGFydGVkCQACAQIPY2xhaW1lZCBhbHJlYWR5AwkAZgIJARFAZXh0ck5hdGl2ZSgxMDU1KQEFCWhlaWdodEtleQUGaGVpZ2h0CQACAQIUeW91IGNhbm5vdCBjbGFpbSB5ZXQEB2FydFR5cGUJARFnZXRSYW5kb21BcnRlZmFjdAIFBHR4SWQJARFAZXh0ck5hdGl2ZSgxMDU1KQEFCWhlaWdodEtleQQFYXNzZXQJAMMIBwUHYXJ0VHlwZQIiQXJ0ZWZhY3Qgb2YgV2F2ZXMgRHVja3MgbWV0YXZlcnNlLgABAAAHBQR1bml0CQERQGV4dHJOYXRpdmUoMTA1NSkBBQloZWlnaHRLZXkEB2Fzc2V0SWQJALgIAQUFYXNzZXQJAMwIAgkBC1N0cmluZ0VudHJ5AgUJc3RhdHVzS2V5BQdhcnRUeXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfBQhib3hJZFN0cgILX2FydGVmYWN0SWQJANgEAQUHYXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJANgEAQUHYXNzZXRJZAIFX3R5cGUFB2FydFR5cGUJAMwIAgUFYXNzZXQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEFB2Fzc2V0SWQFA25pbAECdHgBBnZlcmlmeQADCQEJaXNUZXN0RW52AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQQJZmlyc3RVc2VyASBRHOT9Zv8SadLxWhSfO7Li9Dt/wctoJ6I0Xmw411fdbQQKc2Vjb25kVXNlcgEgwWzfju3TjXOPi6L5+okP9HXNRBtUclKjtJzSVqQt4HUECXRoaXJkVXNlcgEg51v0jqrS+UmeboQmuPl+H9xnqH3cK7jU6nvN8mgKwSUED2ZpcnN0VXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUJZmlyc3RVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQlmaXJzdFVzZXIAAQAABBBzZWNvbmRVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUKc2Vjb25kVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUKc2Vjb25kVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUKc2Vjb25kVXNlcgABAAAED3RoaXJkVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUJdGhpcmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQl0aGlyZFVzZXIAAQAABA9zaWduYXR1cmVzQ291bnQJAGQCCQBkAgUPZmlyc3RVc2VyU2lnbmVkBRBzZWNvbmRVc2VyU2lnbmVkBQ90aGlyZFVzZXJTaWduZWQEByRtYXRjaDAFAnR4CQBnAgUPc2lnbmF0dXJlc0NvdW50AALxAnJe", "height": 3822807, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AaBxitQacVR1sKmpMLgdZEjCHz1zJqrN1SBfTdhgxKro Next: 3BiNj2jugTgst2TyYtBbEmHoHEJqCiAGgLhM3jiF43nf Diff:
OldNewDifferences
1414
1515
1616 func staticKey_rebirthAddress () = "static_rebirthAddress"
17+
18+
19+func staticKey_turtleRebirthAddress () = "static_turtleRebirthAddress"
1720
1821
1922 func staticKey_pipelineUser () = "static_pipelineUser"
148151
149152
150153 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rebirthAddress())))
154+
155+
156+func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
151157
152158
153159 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
508514
509515
510516 @Callable(i)
511-func issueArtefact (type,receiver) = if (if (if ((i.caller != this))
517+func issueArtefact (type,receiver) = if (if (if (if ((i.caller != this))
512518 then (i.caller != getRebirthAddress())
519+ else false)
520+ then (i.caller != getTurtleRebirthAddress())
513521 else false)
514522 then (i.caller != getHuntDistroAddress())
515523 else false)
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_turtleRebirthAddress () = "static_turtleRebirthAddress"
1720
1821
1922 func staticKey_pipelineUser () = "static_pipelineUser"
2023
2124
2225 func staticKey_extraFee () = "static_extraFee"
2326
2427
2528 func staticKey_feeAggregator () = "static_feeAggregator"
2629
2730
2831 func staticKey_huntDistroAddress () = "static_huntDistroAddress"
2932
3033
3134 func key_artefactOwner (artefactName,owner) = (((artefactName + "_") + owner) + "_owner")
3235
3336
3437 func key_unstakeHeight (artefactName,artefactId) = (((artefactName + "_") + artefactId) + "_unstake_height")
3538
3639
3740 func key_externalBoostDuck (duckId) = (duckId + "_duck_external_boost")
3841
3942
4043 func key_externalBoostAddress (address) = (address + "_user_external_boost")
4144
4245
4346 func key_priceCosmetic (item) = ("direct_cosmetic_" + item)
4447
4548
4649 func key_maxSalesCosmetic (item) = (("direct_cosmetic_" + item) + "_max_sales")
4750
4851
4952 func key_saleCosmetic (item) = (("direct_cosmetic_" + item) + "_sale")
5053
5154
5255 func key_priceAssetCosmetic (item) = (("direct_cosmetic_" + item) + "_priceAsset")
5356
5457
5558 func key_growPercentageCosmetic (item) = (("direct_cosmetic_" + item) + "_growing_percentage")
5659
5760
5861 func key_soldCosmetic (item) = (("direct_cosmetic_" + item) + "_sold")
5962
6063
6164 func key_lastPriceCosmetic (item) = (("direct_cosmetic_" + item) + "_last_price")
6265
6366
6467 func key_startTsCosmetic (item) = (("direct_cosmetic_" + item) + "_startTs")
6568
6669
6770 func key_endTsCosmetic (item) = (("direct_cosmetic_" + item) + "_endTs")
6871
6972
7073 func key_processFinishHeight (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
7174
7275
7376 let devAddress = base58'3P44yqcpfhPF2iC1nptm2ZJCTaN7VYhz9og'
7477
7578 let eggsNeeded = (3 * 100000000)
7679
7780 let artefactsLimit = (301 + 600)
7881
7982 let freeGenes = ["A", "B", "C", "D", "E", "F", "G", "H", "I"]
8083
8184 let oldArtefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-POMP", "ART-CAPE", "ART-HAT", "ART-CUSTOMDUCK"]
8285
8386 let artefacts = ["ART-XMISTL", "ART-XHAT", "ART-XSCARF", "ART-XSWEATER", "ART-XSOCK", "ART-XTREE"]
8487
8588 let allArtefact = (artefacts ++ oldArtefacts)
8689
8790 func tryGetBoolean (key) = match getBoolean(this, key) {
8891 case b: Boolean =>
8992 b
9093 case _ =>
9194 false
9295 }
9396
9497
9598 func tryGetString (key) = match getString(this, key) {
9699 case a: String =>
97100 a
98101 case _ =>
99102 ""
100103 }
101104
102105
103106 func tryGetInteger (key) = match getInteger(this, key) {
104107 case a: Int =>
105108 a
106109 case _ =>
107110 0
108111 }
109112
110113
111114 func getRandomNumber (variants,txId,finishHeight,offset) = {
112115 let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1)))
113116 let randomHash = sha256(((base58'items' + txId) + value(randomSeedBlock.vrf)))
114117 (toInt(randomHash, offset) % variants)
115118 }
116119
117120
118121 func getRandomArtefact (boxId,h) = {
119122 let randomNumber = getRandomNumber(6, boxId, h, 1)
120123 artefacts[randomNumber]
121124 }
122125
123126
124127 func getRandomGenes (txId,h) = {
125128 let randomNumber = getRandomNumber(6, txId, h, 2)
126129 freeGenes[randomNumber]
127130 }
128131
129132
130133 func tryGetStringExternal (address,key) = match getString(address, key) {
131134 case a: String =>
132135 a
133136 case _ =>
134137 ""
135138 }
136139
137140
138141 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
139142
140143
141144 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
142145
143146
144147 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
145148
146149
147150 func getTrustedContracts () = tryGetStringExternal(getOracle(), staticKey_trustedContracts())
148151
149152
150153 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rebirthAddress())))
154+
155+
156+func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
151157
152158
153159 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
154160
155161
156162 func getHuntDistroAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_huntDistroAddress())))
157163
158164
159165 func tryGetCosmeticItemPrice (item) = {
160166 let key = key_priceCosmetic(item)
161167 match getInteger(this, key) {
162168 case a: Int =>
163169 a
164170 case _ =>
165171 throw("ITGCIP: This item is not available in the store!")
166172 }
167173 }
168174
169175
170176 func asString (value) = match value {
171177 case string: String =>
172178 string
173179 case _ =>
174180 throw("wrong type, expected: String")
175181 }
176182
177183
178184 func asInt (value) = match value {
179185 case int: Int =>
180186 int
181187 case _ =>
182188 throw("wrong type, expected: Int")
183189 }
184190
185191
186192 func manipulateName (assetName,position,char) = ((take(assetName, (position - 1)) + char) + takeRight(assetName, (16 - position)))
187193
188194
189195 func itemIsInCoolDown (artefactName,artefactId) = {
190196 let unstakeHeightLast = tryGetInteger(key_unstakeHeight(artefactName, artefactId))
191197 let cooldownPeriod = 240
192198 if ((height > (unstakeHeightLast + cooldownPeriod)))
193199 then false
194200 else true
195201 }
196202
197203
198204 func isTestEnv () = tryGetBoolean("TESTENV")
199205
200206
201207 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
202208 then throw("WCAP: Please attach waves")
203209 else {
204210 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
205211 if ((payment.amount != feeAmount))
206212 then throw((("WCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
207213 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
208214 }
209215
210216
211217 @Callable(i)
212218 func directBuyItem (itemName) = {
213219 let basePrice = tryGetCosmeticItemPrice(itemName)
214220 let grow = tryGetInteger(key_growPercentageCosmetic(itemName))
215221 let startTs = tryGetInteger(key_startTsCosmetic(itemName))
216222 let endTs = tryGetInteger(key_endTsCosmetic(itemName))
217223 if (if ((startTs != 0))
218224 then (startTs > lastBlock.timestamp)
219225 else false)
220226 then throw("IDBI: The sale did not start yet!")
221227 else if (if ((endTs != 0))
222228 then (lastBlock.timestamp > endTs)
223229 else false)
224230 then throw("IDBI: The sale has already finished!")
225231 else if (!(tryGetBoolean(key_saleCosmetic(itemName))))
226232 then throw(("IDBI: Item not for sale anymore" + key_saleCosmetic(itemName)))
227233 else {
228234 let maxSalesValue = tryGetInteger(key_maxSalesCosmetic(itemName))
229235 let soldValue = tryGetInteger(key_soldCosmetic(itemName))
230236 let price = if ((grow == 0))
231237 then basePrice
232238 else (basePrice + ((basePrice / 100) * (soldValue * grow)))
233239 if (if ((maxSalesValue != 0))
234240 then (soldValue >= maxSalesValue)
235241 else false)
236242 then throw("IDBI: Max editions sold!")
237243 else {
238244 let assetId = if ((tryGetString(key_priceAssetCosmetic(itemName)) == ""))
239245 then getEggAssetId()
240246 else if ((tryGetString(key_priceAssetCosmetic(itemName)) == "WAVES"))
241247 then unit
242248 else fromBase58String(tryGetString(key_priceAssetCosmetic(itemName)))
243249 let amountPaidByCoupons = 0
244250 let leftToPay = (price - amountPaidByCoupons)
245251 let validPayment = checkAdditionalPayment(i.payments[0])
246252 let firstPayment = value(i.payments[1])
247253 let amount = firstPayment.amount
248254 if ((firstPayment.assetId != assetId))
249255 then throw("IDBI: You can attach only tokens with the correct payment ")
250256 else if ((amount != leftToPay))
251257 then throw(("IDBI: Please attach the exact asset amount" + toString(price)))
252258 else {
253259 let txIdStr = toBase58String(i.transactionId)
254260 let address = i.originCaller
255261 let artefact = Issue(itemName, ("NFT artefact of Waves Ducks game: " + itemName), 1, 0, false, unit, 0)
256262 let artefactId = calculateAssetId(artefact)
257263 $Tuple2(([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), itemName), IntegerEntry(key_lastPriceCosmetic(itemName), price), IntegerEntry(key_soldCosmetic(itemName), (soldValue + 1)), ScriptTransfer(address, 1, artefactId), ScriptTransfer(getFeeAggregator(), amount, assetId)] ++ validPayment), toBase58String(artefactId))
258264 }
259265 }
260266 }
261267 }
262268
263269
264270
265271 @Callable(i)
266272 func manipulateBoost (boost,duckId) = {
267273 let allowedContracts = getTrustedContracts()
268274 let allowedContractsList = split(allowedContracts, ";")
269275 let dappToCall = toString(i.caller)
270276 if ((indexOf(allowedContractsList, dappToCall) == unit))
271277 then throw("IMB: This smart contract can't manipulate the boost!")
272278 else {
273279 let key = key_externalBoostDuck(duckId)
274280 let activeBoost = tryGetInteger(key)
275281 let newBoost = (activeBoost + boost)
276282 if ((0 > newBoost))
277283 then throw("IMB: Something went wrong with boost, please contact the admins!")
278284 else [IntegerEntry(key, newBoost)]
279285 }
280286 }
281287
282288
283289
284290 @Callable(i)
285291 func manipulateBoostAccount (boost,address) = {
286292 let allowedContracts = getTrustedContracts()
287293 let allowedContractsList = split(allowedContracts, ";")
288294 let dappToCall = toString(i.caller)
289295 if ((indexOf(allowedContractsList, dappToCall) == unit))
290296 then throw("IMBA: This smart contract can't manipulate the boost!")
291297 else {
292298 let key = key_externalBoostAddress(address)
293299 let activeBoost = tryGetInteger(key)
294300 let newBoost = (activeBoost + boost)
295301 if ((0 > newBoost))
296302 then throw("IMBA: Something went wrong with boost, please contact the admins!")
297303 else [IntegerEntry(key, newBoost)]
298304 }
299305 }
300306
301307
302308
303309 @Callable(i)
304310 func checkArtefactDetails (assetId) = {
305311 let asset = value(assetInfo(fromBase58String(assetId)))
306312 let assetName = value(asset.name)
307313 if (if (if (containsElement(allArtefact, assetName))
308314 then true
309315 else isDefined(tryGetCosmeticItemPrice(assetName)))
310316 then (asset.issuer == this)
311317 else false)
312318 then $Tuple2(nil, assetName)
313319 else throw("Invalid artefact")
314320 }
315321
316322
317323
318324 @Callable(i)
319325 func configureOracle (oracle) = if ((i.caller != this))
320326 then throw("admin only")
321327 else [StringEntry(staticKey_oracleAddress(), oracle)]
322328
323329
324330
325331 @Callable(i)
326332 func calculateFarmingPowerBoost (duckId,address) = {
327333 let externalBoostDuck = tryGetInteger(key_externalBoostDuck(duckId))
328334 let externalBoostAddress = tryGetInteger(key_externalBoostAddress(address))
329335 let totalBoost = (externalBoostDuck + externalBoostAddress)
330336 $Tuple2([IntegerEntry((duckId + "_last_boost"), totalBoost)], totalBoost)
331337 }
332338
333339
334340
335341 @Callable(i)
336342 func fixedGene (txIdStr,parentFixedGene,positionFixedGene) = {
337343 let firstPayment = value(i.payments[0])
338344 let validPayment = checkAdditionalPayment(i.payments[1])
339345 let firstAssetId = toBase58String(value(firstPayment.assetId))
340346 if ((firstPayment.amount != 1))
341347 then throw("NFT is not attached")
342348 else {
343349 let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
344350 if ((artefact == artefact))
345351 then if ((artefact != "ART-FIXGENE"))
346352 then throw("You need to attach a ART-FIXGENE artefact")
347353 else {
348354 let txId = fromBase58String(txIdStr)
349355 let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
350356 let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
351357 let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
352358 if ((duckGenesString == duckGenesString))
353359 then {
354360 let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil)
355361 if ((call == call))
356362 then ([Burn(value(firstPayment.assetId), 1)] ++ validPayment)
357363 else throw("Strict value is not equal to itself.")
358364 }
359365 else throw("Strict value is not equal to itself.")
360366 }
361367 else throw("Strict value is not equal to itself.")
362368 }
363369 }
364370
365371
366372
367373 @Callable(i)
368374 func freeGene (txIdStr) = {
369375 let firstPayment = value(i.payments[0])
370376 let firstAssetId = toBase58String(value(firstPayment.assetId))
371377 if ((firstPayment.amount != 1))
372378 then throw("NFT is not attached")
373379 else {
374380 let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
375381 if ((artefact == artefact))
376382 then if ((artefact != "ART-FREEGENE"))
377383 then throw("You need to attach a ART-FREEGENE artefact")
378384 else {
379385 let txId = fromBase58String(txIdStr)
380386 let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
381387 let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
382388 let selectedGene = getRandomGenes(txId, processFinishHeight)
383389 let randomPosition = getRandomNumber(7, txId, processFinishHeight, 3)
384390 let validPayment = checkAdditionalPayment(i.payments[1])
385391 let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, 0, 0, selectedGene, randomPosition], nil))
386392 if ((duckGenesString == duckGenesString))
387393 then {
388394 let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil)
389395 if ((call == call))
390396 then ([Burn(value(firstPayment.assetId), 1)] ++ validPayment)
391397 else throw("Strict value is not equal to itself.")
392398 }
393399 else throw("Strict value is not equal to itself.")
394400 }
395401 else throw("Strict value is not equal to itself.")
396402 }
397403 }
398404
399405
400406
401407 @Callable(i)
402408 func copyDuck () = {
403409 let firstPayment = value(i.payments[0])
404410 let secondPayment = value(i.payments[1])
405411 let validPayment = checkAdditionalPayment(i.payments[2])
406412 let firstAssetId = toBase58String(value(firstPayment.assetId))
407413 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
408414 if ((children == children))
409415 then if (if ((firstPayment.amount != 1))
410416 then true
411417 else (secondPayment.amount != 1))
412418 then throw("NFT is not attached")
413419 else {
414420 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
415421 if ((artefact == artefact))
416422 then if ((artefact != "ART-MIRROR"))
417423 then throw("You need to attach a ART-MIRROR artefact")
418424 else {
419425 let nftInfo = value(assetInfo(value(firstPayment.assetId)))
420426 let asset1Gen = split(nftInfo.name, "")
421427 if (if ((asset1Gen[14] == "G"))
422428 then true
423429 else (asset1Gen[14] == "J"))
424430 then throw("You can't mirror this duck")
425431 else {
426432 let duckGen = nftInfo.name
427433 let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
428434 if ((call == call))
429435 then ([ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)] ++ validPayment)
430436 else throw("Strict value is not equal to itself.")
431437 }
432438 }
433439 else throw("Strict value is not equal to itself.")
434440 }
435441 else throw("Strict value is not equal to itself.")
436442 }
437443
438444
439445
440446 @Callable(i)
441447 func addArteFactToDuck () = {
442448 let firstPayment = value(i.payments[0])
443449 let secondPayment = value(i.payments[1])
444450 let validPayment = checkAdditionalPayment(i.payments[2])
445451 let firstAssetId = toBase58String(value(firstPayment.assetId))
446452 if (if ((firstPayment.amount != 1))
447453 then true
448454 else (secondPayment.amount != 1))
449455 then throw("NFT is not attached")
450456 else {
451457 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
452458 if ((children == children))
453459 then if ((children == 0))
454460 then throw("You can only pick a sterile NFT-duck")
455461 else {
456462 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
457463 if ((artefact == artefact))
458464 then if (if ((artefact != "ART-XHAT"))
459465 then (artefact != "ART-POMP")
460466 else false)
461467 then throw("You need to attach a ART-XHAT or ART-POMP artefact")
462468 else {
463469 let nftInfo = value(assetInfo(value(firstPayment.assetId)))
464470 let asset1Gen = split(nftInfo.name, "")
465471 if (if ((asset1Gen[14] == "G"))
466472 then true
467473 else (asset1Gen[14] == "J"))
468474 then throw("You can't mirror this duck")
469475 else if (if ((asset1Gen[5] == "S"))
470476 then true
471477 else (asset1Gen[5] == "T"))
472478 then throw("you already attached a artefact")
473479 else {
474480 let char = if ((artefact == "ART-XHAT"))
475481 then "T"
476482 else if ((artefact == "ART-POMP"))
477483 then "S"
478484 else throw("No char defined")
479485 let oldDuckGen = nftInfo.name
480486 let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil))
481487 if ((oldFarmGen == oldFarmGen))
482488 then {
483489 let duckGen = manipulateName(oldDuckGen, 6, char)
484490 let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
485491 if ((call == call))
486492 then {
487493 let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil)
488494 if ((callReduce == callReduce))
489495 then ([Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)] ++ validPayment)
490496 else throw("Strict value is not equal to itself.")
491497 }
492498 else throw("Strict value is not equal to itself.")
493499 }
494500 else throw("Strict value is not equal to itself.")
495501 }
496502 }
497503 else throw("Strict value is not equal to itself.")
498504 }
499505 else throw("Strict value is not equal to itself.")
500506 }
501507 }
502508
503509
504510
505511 @Callable(i)
506512 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)]
507513
508514
509515
510516 @Callable(i)
511-func issueArtefact (type,receiver) = if (if (if ((i.caller != this))
517+func issueArtefact (type,receiver) = if (if (if (if ((i.caller != this))
512518 then (i.caller != getRebirthAddress())
519+ else false)
520+ then (i.caller != getTurtleRebirthAddress())
513521 else false)
514522 then (i.caller != getHuntDistroAddress())
515523 else false)
516524 then throw("admin only")
517525 else if (if ((i.caller == getHuntDistroAddress()))
518526 then !(contains(type, "ART-FIRE_"))
519527 else false)
520528 then throw("FIRE ITEM ONLY!")
521529 else {
522530 let txIdStr = toBase58String(i.transactionId)
523531 let address = Address(fromBase58String(receiver))
524532 let artefact = Issue(type, "NFT artefact of Waves Ducks game. Drop #2.", 1, 0, false, unit, 0)
525533 let artefactId = calculateAssetId(artefact)
526534 $Tuple2([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), type), ScriptTransfer(address, 1, artefactId)], toBase58String(artefactId))
527535 }
528536
529537
530538
531539 @Callable(i)
532540 func setLock (n) = if ((i.caller == this))
533541 then [IntegerEntry("global_locked", n)]
534542 else throw("admin only")
535543
536544
537545
538546 @Callable(i)
539547 func buyArtefact () = if ((lastBlock.timestamp > 1639742400000))
540548 then throw("There are no active sales now... ")
541549 else if ((tryGetInteger("global_locked") > 0))
542550 then throw("contract is temporarily locked")
543551 else if ((tryGetInteger("global_artAmount") >= artefactsLimit))
544552 then throw("SOLDOUT!!! Hurray!")
545553 else if (if ((1639605600000 > lastBlock.timestamp))
546554 then (i.caller != Address(devAddress))
547555 else false)
548556 then throw("Too early...")
549557 else {
550558 let firstPayment = value(i.payments[0])
551559 if ((firstPayment.assetId != getEggAssetId()))
552560 then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
553561 else if ((eggsNeeded > firstPayment.amount))
554562 then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded)))
555563 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))]
556564 }
557565
558566
559567
560568 @Callable(i)
561569 func addItemToStore (price,item,maxSales,sale,pricesset,growthPercentage,startTs,endTs) = if ((i.caller != addressFromStringValue(tryGetStringExternal(getOracle(), staticKey_pipelineUser()))))
562570 then throw("IAITS: Only for trusted users!")
563571 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)]
564572
565573
566574
567575 @Callable(i)
568576 func setGlobalArtAmount (newAmount) = if (if ((i.caller == this))
569577 then true
570578 else (i.caller == Address(devAddress)))
571579 then [IntegerEntry("global_artAmount", newAmount)]
572580 else throw("Permission denied")
573581
574582
575583
576584 @Callable(i)
577585 func claimArtefact (boxIdStr) = {
578586 let txId = fromBase58String(boxIdStr)
579587 let statusKey = (((toString(i.caller) + "_") + boxIdStr) + "_status")
580588 let heightKey = (((toString(i.caller) + "_") + boxIdStr) + "_finishHeight")
581589 if ((getStringValue(statusKey) != "started"))
582590 then throw("claimed already")
583591 else if ((getIntegerValue(heightKey) > height))
584592 then throw("you cannot claim yet")
585593 else {
586594 let artType = getRandomArtefact(txId, getIntegerValue(heightKey))
587595 let asset = Issue(artType, "Artefact of Waves Ducks metaverse.", 1, 0, false, unit, getIntegerValue(heightKey))
588596 let assetId = calculateAssetId(asset)
589597 [StringEntry(statusKey, artType), StringEntry((((toString(i.caller) + "_") + boxIdStr) + "_artefactId"), toBase58String(assetId)), StringEntry((toBase58String(assetId) + "_type"), artType), asset, ScriptTransfer(i.caller, 1, assetId)]
590598 }
591599 }
592600
593601
594602 @Verifier(tx)
595603 func verify () = if (isTestEnv())
596604 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
597605 else {
598606 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
599607 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
600608 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
601609 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
602610 then 1
603611 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
604612 then 1
605613 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
606614 then 1
607615 else 0
608616 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
609617 then 1
610618 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
611619 then 1
612620 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
613621 then 1
614622 else 0
615623 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
616624 then 1
617625 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
618626 then 1
619627 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
620628 then 1
621629 else 0
622630 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
623631 match tx {
624632 case _ =>
625633 (signaturesCount >= 2)
626634 }
627635 }
628636

github/deemru/w8io/3ef1775 
58.55 ms