tx · CMqvsyjk544zR9CyDTamuwtA7M6rET6AQ3BePYv8zDG4

3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks:  -0.02600000 Waves

2023.11.25 17:21 [3924907] smart account 3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks > SELF 0.00000000 Waves

{ "type": 13, "id": "CMqvsyjk544zR9CyDTamuwtA7M6rET6AQ3BePYv8zDG4", "fee": 2600000, "feeAssetId": null, "timestamp": 1700922095332, "version": 2, "chainId": 87, "sender": "3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks", "senderPublicKey": "XrNmTusDFaLSz3wAjmdfcyC5h6uYyVbpdh18758UpFv", "proofs": [ "121X4NM9qLeLrENW9LxEb9T9bZgu9HiC1XyFjuD6X781twk2q2RoFfvnL64tKiY35rJFeSCE3HL9KxRf43v7qiwC" ], "script": "base64:BgJYCAISAwoBCBIDCgEIEgQKAgEIEgQKAgEIEgMKAQgSAwoBCBIECgIICBIAEgUKAwgBARIDCgEIEgASABIAEgQKAggIEgMKAQESCgoIAQgBBAgBAQESAwoBAT8BF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAIUc3RhdGljX29yYWNsZUFkZHJlc3MBGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwACFXN0YXRpY19icmVlZGVyQWRkcmVzcwEUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAAhFzdGF0aWNfZWdnQXNzZXRJZAEac3RhdGljS2V5X3RydXN0ZWRDb250cmFjdHMAAhdzdGF0aWNfdHJ1c3RlZENvbnRyYWN0cwEYc3RhdGljS2V5X3JlYmlydGhBZGRyZXNzAAIVc3RhdGljX3JlYmlydGhBZGRyZXNzAR5zdGF0aWNLZXlfdHVydGxlUmViaXJ0aEFkZHJlc3MAAhtzdGF0aWNfdHVydGxlUmViaXJ0aEFkZHJlc3MBFnN0YXRpY0tleV9waXBlbGluZVVzZXIAAhNzdGF0aWNfcGlwZWxpbmVVc2VyARJzdGF0aWNLZXlfZXh0cmFGZWUAAg9zdGF0aWNfZXh0cmFGZWUBF3N0YXRpY0tleV9mZWVBZ2dyZWdhdG9yAAIUc3RhdGljX2ZlZUFnZ3JlZ2F0b3IBG3N0YXRpY0tleV9odW50RGlzdHJvQWRkcmVzcwACGHN0YXRpY19odW50RGlzdHJvQWRkcmVzcwESc3RhdGljS2V5X3dhcnNQS2V5AAIPc3RhdGljX3dhcnNQS2V5ARdzdGF0aXNLZXlfZHVwbGljYXRvckZlZQACFHN0YXRpY19kdXBsaWNhdG9yRmVlARFrZXlfYXJ0ZWZhY3RPd25lcgIMYXJ0ZWZhY3ROYW1lBW93bmVyCQCsAgIJAKwCAgkArAICBQxhcnRlZmFjdE5hbWUCAV8FBW93bmVyAgZfb3duZXIBEWtleV91bnN0YWtlSGVpZ2h0AgxhcnRlZmFjdE5hbWUKYXJ0ZWZhY3RJZAkArAICCQCsAgIJAKwCAgUMYXJ0ZWZhY3ROYW1lAgFfBQphcnRlZmFjdElkAg9fdW5zdGFrZV9oZWlnaHQBFWtleV9leHRlcm5hbEJvb3N0RHVjawEGZHVja0lkCQCsAgIFBmR1Y2tJZAIUX2R1Y2tfZXh0ZXJuYWxfYm9vc3QBGGtleV9leHRlcm5hbEJvb3N0QWRkcmVzcwEHYWRkcmVzcwkArAICBQdhZGRyZXNzAhRfdXNlcl9leHRlcm5hbF9ib29zdAERa2V5X3ByaWNlQ29zbWV0aWMBBGl0ZW0JAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQEUa2V5X21heFNhbGVzQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAgpfbWF4X3NhbGVzARBrZXlfc2FsZUNvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQIFX3NhbGUBFmtleV9wcmljZUFzc2V0Q29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAgtfcHJpY2VBc3NldAEaa2V5X2dyb3dQZXJjZW50YWdlQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAhNfZ3Jvd2luZ19wZXJjZW50YWdlARBrZXlfc29sZENvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQIFX3NvbGQBFWtleV9sYXN0UHJpY2VDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CC19sYXN0X3ByaWNlARNrZXlfc3RhcnRUc0Nvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQIIX3N0YXJ0VHMBEWtleV9lbmRUc0Nvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQIGX2VuZFRzARdrZXlfcHJvY2Vzc0ZpbmlzaEhlaWdodAIHYWRkcmVzcwR0eElkCQCsAgIJAKwCAgkArAICBQdhZGRyZXNzAgFfCQDYBAEFBHR4SWQCA19maAAKZGV2QWRkcmVzcwEaAVcXd9hCTyE6CkZPy+KvhiJrE5znW6fefHsACmVnZ3NOZWVkZWQJAGgCAAMAgMLXLwAOYXJ0ZWZhY3RzTGltaXQJAGQCAK0CANgEAAlmcmVlR2VuZXMJAMwIAgIBQQkAzAgCAgFCCQDMCAICAUMJAMwIAgIBRAkAzAgCAgFFCQDMCAICAUYJAMwIAgIBRwkAzAgCAgFICQDMCAICAUkFA25pbAAMb2xkQXJ0ZWZhY3RzCQDMCAICCEFSVC1MQUtFCQDMCAICCUFSVC1IT1VTRQkAzAgCAgxBUlQtQklHSE9VU0UJAMwIAgILQVJULUZJWEdFTkUJAMwIAgIMQVJULUZSRUVHRU5FCQDMCAICCkFSVC1NSVJST1IJAMwIAgIIQVJULVBPTVAJAMwIAgIIQVJULUNBUEUJAMwIAgIHQVJULUhBVAkAzAgCAg5BUlQtQ1VTVE9NRFVDSwUDbmlsAAlhcnRlZmFjdHMJAMwIAgIKQVJULVhNSVNUTAkAzAgCAghBUlQtWEhBVAkAzAgCAgpBUlQtWFNDQVJGCQDMCAICDEFSVC1YU1dFQVRFUgkAzAgCAglBUlQtWFNPQ0sJAMwIAgIJQVJULVhUUkVFBQNuaWwAC2FsbEFydGVmYWN0CQDOCAIFCWFydGVmYWN0cwUMb2xkQXJ0ZWZhY3RzAQ10cnlHZXRCb29sZWFuAQNrZXkEByRtYXRjaDAJAJsIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAFAWIHAQx0cnlHZXRTdHJpbmcBA2tleQQHJG1hdGNoMAkAnQgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABD2dldFJhbmRvbU51bWJlcgQIdmFyaWFudHMEdHhJZAxmaW5pc2hIZWlnaHQGb2Zmc2V0BA9yYW5kb21TZWVkQmxvY2sJAQV2YWx1ZQEJAO0HAQkAZQIFDGZpbmlzaEhlaWdodAABBApyYW5kb21IYXNoCQD3AwEJAMsBAgkAywECAQQcQX3mBQR0eElkCQEFdmFsdWUBCAUPcmFuZG9tU2VlZEJsb2NrA3ZyZgkAagIJALIJAgUKcmFuZG9tSGFzaAUGb2Zmc2V0BQh2YXJpYW50cwERZ2V0UmFuZG9tQXJ0ZWZhY3QCBWJveElkAWgEDHJhbmRvbU51bWJlcgkBD2dldFJhbmRvbU51bWJlcgQJAJADAQUJYXJ0ZWZhY3RzBQVib3hJZAUBaAABCQCRAwIFCWFydGVmYWN0cwUMcmFuZG9tTnVtYmVyAQ5nZXRSYW5kb21HZW5lcwIEdHhJZAFoBAxyYW5kb21OdW1iZXIJAQ9nZXRSYW5kb21OdW1iZXIECQCQAwEFCWZyZWVHZW5lcwUEdHhJZAUBaAACCQCRAwIFCWZyZWVHZW5lcwUMcmFuZG9tTnVtYmVyARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJ0IAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABEWdldEJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAENZ2V0RWdnQXNzZXRJZAAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARRzdGF0aWNLZXlfZWdnQXNzZXRJZAABE2dldFRydXN0ZWRDb250cmFjdHMACQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGnN0YXRpY0tleV90cnVzdGVkQ29udHJhY3RzAAERZ2V0UmViaXJ0aEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfcmViaXJ0aEFkZHJlc3MAARdnZXRUdXJ0bGVSZWJpcnRoQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHnN0YXRpY0tleV90dXJ0bGVSZWJpcnRoQWRkcmVzcwABEGdldEZlZUFnZ3JlZ2F0b3IACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgABFGdldEh1bnREaXN0cm9BZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEbc3RhdGljS2V5X2h1bnREaXN0cm9BZGRyZXNzAAELZ2V0V2Fyc1BLZXkACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQESc3RhdGljS2V5X3dhcnNQS2V5AAEQZ2V0RHVwbGljYXRvckZlZQAJAQ10cnlHZXRJbnRlZ2VyAQkBF3N0YXRpc0tleV9kdXBsaWNhdG9yRmVlAAEXdHJ5R2V0Q29zbWV0aWNJdGVtUHJpY2UBBGl0ZW0EA2tleQkBEWtleV9wcmljZUNvc21ldGljAQUEaXRlbQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhCQACAQIwSVRHQ0lQOiBUaGlzIGl0ZW0gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgc3RvcmUhAQhhc1N0cmluZwEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwBQZzdHJpbmcJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQ5tYW5pcHVsYXRlTmFtZQMJYXNzZXROYW1lCHBvc2l0aW9uBGNoYXIJAKwCAgkArAICCQCvAgIFCWFzc2V0TmFtZQkAZQIFCHBvc2l0aW9uAAEFBGNoYXIJALICAgUJYXNzZXROYW1lCQBlAgAQBQhwb3NpdGlvbgEQaXRlbUlzSW5Db29sRG93bgIMYXJ0ZWZhY3ROYW1lCmFydGVmYWN0SWQEEXVuc3Rha2VIZWlnaHRMYXN0CQENdHJ5R2V0SW50ZWdlcgEJARFrZXlfdW5zdGFrZUhlaWdodAIFDGFydGVmYWN0TmFtZQUKYXJ0ZWZhY3RJZAQOY29vbGRvd25QZXJpb2QA8AEDCQBmAgUGaGVpZ2h0CQBkAgURdW5zdGFrZUhlaWdodExhc3QFDmNvb2xkb3duUGVyaW9kBwYBCWlzVGVzdEVudgAJAQ10cnlHZXRCb29sZWFuAQIHVEVTVEVOVgEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEHcGF5bWVudAMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIZV0NBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQJZmVlQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxXQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsAQppdGVtTWVyZ2VyCQhiYXNlSXRlbQ5hbW91bnRCYXNlSXRlbQdlbmRJdGVtCHBheW1lbnRzCWZlZUFtb3VudApmZWVBc3NldElkCXJlY2lwaWVudA1pbnN0YW50RmluaXNoBHR4SWQDCQECIT0CCQCQAwEFCHBheW1lbnRzCQBkAgUOYW1vdW50QmFzZUl0ZW0AAQkAAgEJAKwCAgkArAICAhNJSUQ6IFBsZWFzZSBhdHRhY2ggCQCkAwEJAGQCBQ5hbW91bnRCYXNlSXRlbQACAgogcGF5bWVudHMhCgEKaXNCYXNlSXRlbQILYWNjdW11bGF0ZWQDcGF5BAdhc3NldElkCQEFdmFsdWUBCAUDcGF5B2Fzc2V0SWQECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIJANgEAQUHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwkAAAIFCGFydGVmYWN0BQhiYXNlSXRlbQkAlAoCCQDOCAIIBQthY2N1bXVsYXRlZAJfMQkAzAgCCQEEQnVybgIFB2Fzc2V0SWQAAQUDbmlsCQBkAggFC2FjY3VtdWxhdGVkAl8yAAEJAJQKAggFC2FjY3VtdWxhdGVkAl8xCQBkAggFC2FjY3VtdWxhdGVkAl8yAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDXRvdGFsQmFzZUl0ZW0KAAIkbAUIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQppc0Jhc2VJdGVtAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA4CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAMJAQIhPQIIBQ10b3RhbEJhc2VJdGVtAl8yBQ5hbW91bnRCYXNlSXRlbQkAAgEJAKwCAgkArAICCQCsAgICE0lJRDogUGxlYXNlIGF0dGFjaCAJAKQDAQUOYW1vdW50QmFzZUl0ZW0CEyBhcnRlZmFjdHMgb2YgdHlwZSAFCGJhc2VJdGVtBApmZWVQYXltZW50CQCRAwIFCHBheW1lbnRzBQ5hbW91bnRCYXNlSXRlbQMJAQIhPQIIBQpmZWVQYXltZW50B2Fzc2V0SWQFCmZlZUFzc2V0SWQJAAIBAiVJSUQ6IFlvdSBtaXNzIGEgcGF5bWVudCB3aXRoIHRoZSBmZWUhAwkBAiE9AggFCmZlZVBheW1lbnQGYW1vdW50BQlmZWVBbW91bnQJAAIBAi9JSUQ6IFlvdSBkaWQgbm90IGF0dGFjaCB0aGUgY29ycmVjdCBmZWUgYW1vdW50IQQIYXJ0ZWZhY3QJAMMIBwUHZW5kSXRlbQkArAICAiJORlQgYXJ0ZWZhY3Qgb2YgV2F2ZXMgRHVja3MgZ2FtZTogBQdlbmRJdGVtAAEAAAcFBHVuaXQAAAQKYXJ0ZWZhY3RJZAkAuAgBBQhhcnRlZmFjdAQHaW5zdGFudAMFDWluc3RhbnRGaW5pc2gJAJQKAgkAzAgCBQhhcnRlZmFjdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIJYXJ0ZWZhY3RfCQDYBAEFCmFydGVmYWN0SWQCBV90eXBlBQdlbmRJdGVtCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCXJlY2lwaWVudAABBQphcnRlZmFjdElkBQNuaWwJANgEAQUKYXJ0ZWZhY3RJZAkAlAoCBQNuaWwCAAkAlAoCCQDOCAIJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgICBm1lcmdlXwUEdHhJZAIIX2luc3RhbnQFDWluc3RhbnRGaW5pc2gJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEGdldEZlZUFnZ3JlZ2F0b3IABQlmZWVBbW91bnQIBQpmZWVQYXltZW50B2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBm1lcmdlXwUEdHhJZAIHX3Jld2FyZAUHZW5kSXRlbQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgICBm1lcmdlXwUEdHhJZAIJX2ZpbmlzaGVkCQEBIQEFDWluc3RhbnRGaW5pc2gFA25pbAgFB2luc3RhbnQCXzEIBQ10b3RhbEJhc2VJdGVtAl8xCAUHaW5zdGFudAJfMgERZ2V0QW1vdW50QmFzZUl0ZW0BCGJhc2VJdGVtCQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgIJAKwCAgIGbWVyZ2VfBQhiYXNlSXRlbQIHX2Ftb3VudAEKZ2V0RW5kSXRlbQEIYmFzZUl0ZW0JARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkArAICAgZtZXJnZV8FCGJhc2VJdGVtAghfZW5kSXRlbQEIZ2V0UHJpY2UBCGJhc2VJdGVtCQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgIJAKwCAgIGbWVyZ2VfBQhiYXNlSXRlbQIGX3ByaWNlAQpnZXRJbnN0YW50AQhiYXNlSXRlbQkBEUBleHRyTmF0aXZlKDEwNTYpAQkArAICCQCsAgICBm1lcmdlXwUIYmFzZUl0ZW0CCF9pbnN0YW50AQhnZXRBc3NldAEIYmFzZUl0ZW0EBWFzc2V0CQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAKwCAgIGbWVyZ2VfBQhiYXNlSXRlbQIGX2Fzc2V0AwkAAAIFBWFzc2V0AgVXQVZFUwUEdW5pdAkA2QQBBQVhc3NldBEBaQEPaW5zdGFuTWVyZ2VJdGVtAQhiYXNlSXRlbQMJAQIhPQIFCGJhc2VJdGVtAgpBUlQtS0FUQU5BCQACAQIfSUlEOiBPbmx5IEthdGFuYSBjYW4gYmUgbWVyZ2VkIQQGcGFyYW1zCQCXCgUJARFnZXRBbW91bnRCYXNlSXRlbQEFCGJhc2VJdGVtCQEKZ2V0RW5kSXRlbQEFCGJhc2VJdGVtCQEIZ2V0UHJpY2UBBQhiYXNlSXRlbQkBCGdldEFzc2V0AQUIYmFzZUl0ZW0JAQpnZXRJbnN0YW50AQUIYmFzZUl0ZW0JAQppdGVtTWVyZ2VyCQUIYmFzZUl0ZW0IBQZwYXJhbXMCXzEIBQZwYXJhbXMCXzIIBQFpCHBheW1lbnRzCAUGcGFyYW1zAl8zCAUGcGFyYW1zAl80CAUBaQZjYWxsZXIIBQZwYXJhbXMCXzUJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAFpAQ1kaXJlY3RCdXlJdGVtAQhpdGVtTmFtZQQJYmFzZVByaWNlCQEXdHJ5R2V0Q29zbWV0aWNJdGVtUHJpY2UBBQhpdGVtTmFtZQQEZ3JvdwkBDXRyeUdldEludGVnZXIBCQEaa2V5X2dyb3dQZXJjZW50YWdlQ29zbWV0aWMBBQhpdGVtTmFtZQQHc3RhcnRUcwkBDXRyeUdldEludGVnZXIBCQETa2V5X3N0YXJ0VHNDb3NtZXRpYwEFCGl0ZW1OYW1lBAVlbmRUcwkBDXRyeUdldEludGVnZXIBCQERa2V5X2VuZFRzQ29zbWV0aWMBBQhpdGVtTmFtZQMDCQECIT0CBQdzdGFydFRzAAAJAGYCBQdzdGFydFRzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAcJAAIBAiFJREJJOiBUaGUgc2FsZSBkaWQgbm90IHN0YXJ0IHlldCEDAwkBAiE9AgUFZW5kVHMAAAkAZgIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQVlbmRUcwcJAAIBAiRJREJJOiBUaGUgc2FsZSBoYXMgYWxyZWFkeSBmaW5pc2hlZCEDCQEBIQEJAQ10cnlHZXRCb29sZWFuAQkBEGtleV9zYWxlQ29zbWV0aWMBBQhpdGVtTmFtZQkAAgEJAKwCAgIfSURCSTogSXRlbSBub3QgZm9yIHNhbGUgYW55bW9yZQkBEGtleV9zYWxlQ29zbWV0aWMBBQhpdGVtTmFtZQQNbWF4U2FsZXNWYWx1ZQkBDXRyeUdldEludGVnZXIBCQEUa2V5X21heFNhbGVzQ29zbWV0aWMBBQhpdGVtTmFtZQQJc29sZFZhbHVlCQENdHJ5R2V0SW50ZWdlcgEJARBrZXlfc29sZENvc21ldGljAQUIaXRlbU5hbWUEBXByaWNlAwkAAAIFBGdyb3cAAAUJYmFzZVByaWNlCQBkAgUJYmFzZVByaWNlCQBoAgkAaQIFCWJhc2VQcmljZQBkCQBoAgUJc29sZFZhbHVlBQRncm93AwMJAQIhPQIFDW1heFNhbGVzVmFsdWUAAAkAZwIFCXNvbGRWYWx1ZQUNbWF4U2FsZXNWYWx1ZQcJAAIBAhhJREJJOiBNYXggZWRpdGlvbnMgc29sZCEEB2Fzc2V0SWQDCQAAAgkBDHRyeUdldFN0cmluZwEJARZrZXlfcHJpY2VBc3NldENvc21ldGljAQUIaXRlbU5hbWUCAAkBDWdldEVnZ0Fzc2V0SWQAAwkAAAIJAQx0cnlHZXRTdHJpbmcBCQEWa2V5X3ByaWNlQXNzZXRDb3NtZXRpYwEFCGl0ZW1OYW1lAgVXQVZFUwUEdW5pdAkA2QQBCQEMdHJ5R2V0U3RyaW5nAQkBFmtleV9wcmljZUFzc2V0Q29zbWV0aWMBBQhpdGVtTmFtZQQTYW1vdW50UGFpZEJ5Q291cG9ucwAABAlsZWZ0VG9QYXkJAGUCBQVwcmljZQUTYW1vdW50UGFpZEJ5Q291cG9ucwQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAAQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEBmFtb3VudAgFDGZpcnN0UGF5bWVudAZhbW91bnQDCQECIT0CCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQFB2Fzc2V0SWQJAAIBAjpJREJJOiBZb3UgY2FuIGF0dGFjaCBvbmx5IHRva2VucyB3aXRoIHRoZSBjb3JyZWN0IHBheW1lbnQgAwkBAiE9AgUGYW1vdW50BQlsZWZ0VG9QYXkJAAIBCQCsAgICKklEQkk6IFBsZWFzZSBhdHRhY2ggdGhlIGV4YWN0IGFzc2V0IGFtb3VudAkApAMBBQVwcmljZQQHdHhJZFN0cgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAdhZGRyZXNzCAUBaQxvcmlnaW5DYWxsZXIECGFydGVmYWN0CQDDCAcFCGl0ZW1OYW1lCQCsAgICIk5GVCBhcnRlZmFjdCBvZiBXYXZlcyBEdWNrcyBnYW1lOiAFCGl0ZW1OYW1lAAEAAAcFBHVuaXQAAAQKYXJ0ZWZhY3RJZAkAuAgBBQhhcnRlZmFjdAkAlAoCCQDOCAIJAMwIAgUIYXJ0ZWZhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICCWFydGVmYWN0XwkA2AQBBQphcnRlZmFjdElkAgVfdHlwZQUIaXRlbU5hbWUJAMwIAgkBDEludGVnZXJFbnRyeQIJARVrZXlfbGFzdFByaWNlQ29zbWV0aWMBBQhpdGVtTmFtZQUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlfc29sZENvc21ldGljAQUIaXRlbU5hbWUJAGQCBQlzb2xkVmFsdWUAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQdhZGRyZXNzAAEFCmFydGVmYWN0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEGdldEZlZUFnZ3JlZ2F0b3IABQZhbW91bnQFB2Fzc2V0SWQFA25pbAUMdmFsaWRQYXltZW50CQDYBAEFCmFydGVmYWN0SWQBaQEPbWFuaXB1bGF0ZUJvb3N0AgVib29zdAZkdWNrSWQEEGFsbG93ZWRDb250cmFjdHMJARNnZXRUcnVzdGVkQ29udHJhY3RzAAQUYWxsb3dlZENvbnRyYWN0c0xpc3QJALUJAgUQYWxsb3dlZENvbnRyYWN0cwIBOwQKZGFwcFRvQ2FsbAkApQgBCAUBaQZjYWxsZXIDCQAAAgkAzwgCBRRhbGxvd2VkQ29udHJhY3RzTGlzdAUKZGFwcFRvQ2FsbAUEdW5pdAkAAgECNElNQjogVGhpcyBzbWFydCBjb250cmFjdCBjYW4ndCBtYW5pcHVsYXRlIHRoZSBib29zdCEEA2tleQkBFWtleV9leHRlcm5hbEJvb3N0RHVjawEFBmR1Y2tJZAQLYWN0aXZlQm9vc3QJAQ10cnlHZXRJbnRlZ2VyAQUDa2V5BAhuZXdCb29zdAkAZAIFC2FjdGl2ZUJvb3N0BQVib29zdAMJAGYCAAAFCG5ld0Jvb3N0CQACAQJASU1COiBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIGJvb3N0LCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW5zIQkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQhuZXdCb29zdAUDbmlsAWkBFm1hbmlwdWxhdGVCb29zdEFjY291bnQCBWJvb3N0B2FkZHJlc3MEEGFsbG93ZWRDb250cmFjdHMJARNnZXRUcnVzdGVkQ29udHJhY3RzAAQUYWxsb3dlZENvbnRyYWN0c0xpc3QJALUJAgUQYWxsb3dlZENvbnRyYWN0cwIBOwQKZGFwcFRvQ2FsbAkApQgBCAUBaQZjYWxsZXIDCQAAAgkAzwgCBRRhbGxvd2VkQ29udHJhY3RzTGlzdAUKZGFwcFRvQ2FsbAUEdW5pdAkAAgECNUlNQkE6IFRoaXMgc21hcnQgY29udHJhY3QgY2FuJ3QgbWFuaXB1bGF0ZSB0aGUgYm9vc3QhBANrZXkJARhrZXlfZXh0ZXJuYWxCb29zdEFkZHJlc3MBBQdhZGRyZXNzBAthY3RpdmVCb29zdAkBDXRyeUdldEludGVnZXIBBQNrZXkECG5ld0Jvb3N0CQBkAgULYWN0aXZlQm9vc3QFBWJvb3N0AwkAZgIAAAUIbmV3Qm9vc3QJAAIBAkFJTUJBOiBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIGJvb3N0LCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW5zIQkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQhuZXdCb29zdAUDbmlsAWkBFGNoZWNrQXJ0ZWZhY3REZXRhaWxzAQdhc3NldElkBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFB2Fzc2V0SWQECWFzc2V0TmFtZQkBBXZhbHVlAQgFBWFzc2V0BG5hbWUDAwMJAQ9jb250YWluc0VsZW1lbnQCBQthbGxBcnRlZmFjdAUJYXNzZXROYW1lBgkBCWlzRGVmaW5lZAEJARd0cnlHZXRDb3NtZXRpY0l0ZW1QcmljZQEFCWFzc2V0TmFtZQkAAAIIBQVhc3NldAZpc3N1ZXIFBHRoaXMHCQCUCgIFA25pbAUJYXNzZXROYW1lCQACAQIQSW52YWxpZCBhcnRlZmFjdAFpAQ9jb25maWd1cmVPcmFjbGUBBm9yYWNsZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCmFkbWluIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAUGb3JhY2xlBQNuaWwBaQEaY2FsY3VsYXRlRmFybWluZ1Bvd2VyQm9vc3QCBmR1Y2tJZAdhZGRyZXNzBBFleHRlcm5hbEJvb3N0RHVjawkBDXRyeUdldEludGVnZXIBCQEVa2V5X2V4dGVybmFsQm9vc3REdWNrAQUGZHVja0lkBBRleHRlcm5hbEJvb3N0QWRkcmVzcwkBDXRyeUdldEludGVnZXIBCQEYa2V5X2V4dGVybmFsQm9vc3RBZGRyZXNzAQUHYWRkcmVzcwQKdG90YWxCb29zdAkAZAIFEWV4dGVybmFsQm9vc3REdWNrBRRleHRlcm5hbEJvb3N0QWRkcmVzcwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBmR1Y2tJZAILX2xhc3RfYm9vc3QFCnRvdGFsQm9vc3QFA25pbAUKdG90YWxCb29zdAFpAQ5pdGVtRHVwbGljYXRvcgADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAQJAAIBAh9JSUQ6IFRocmVlIHBheW1lbnRzIGFyZSBuZWVkZWQhBBFkdXBsaWNhdG9yUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAtpdGVtUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBAplZ2dQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAIEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAMEEWR1cGxpY2F0b3JBc3NldElkCQDYBAEJAQV2YWx1ZQEIBRFkdXBsaWNhdG9yUGF5bWVudAdhc3NldElkAwkBAiE9AggFEWR1cGxpY2F0b3JQYXltZW50BmFtb3VudAABCQACAQIjSUlEOiBEdXBsaWNhdG9yIE5GVCBpcyBub3QgYXR0YWNoZWQEC2l0ZW1Bc3NldElkCQDYBAEJAQV2YWx1ZQEIBQtpdGVtUGF5bWVudAdhc3NldElkAwkBAiE9AggFC2l0ZW1QYXltZW50BmFtb3VudAABCQACAQIdSUlEOiBJdGVtIE5GVCBpcyBub3QgYXR0YWNoZWQECmVnZ0Fzc2V0SWQJAQV2YWx1ZQEIBQplZ2dQYXltZW50B2Fzc2V0SWQDCQECIT0CBQplZ2dBc3NldElkCQENZ2V0RWdnQXNzZXRJZAAJAAIBAhhJSUQ6IFBsZWFzZSBhdHRhY2ggZWdncyEDCQBmAgkBEGdldER1cGxpY2F0b3JGZWUACAUKZWdnUGF5bWVudAZhbW91bnQJAAIBCQCsAgICRUlJRDogdG8gZHVwbGljYXRlIGFuIGl0ZW1zIHlvdSBuZWVkIHRoZSBmb2xsb3dpbmcgYW1vdW50IG9mIGVnZ2xldHM6IAkApAMBCQEQZ2V0RHVwbGljYXRvckZlZQAEEmR1cGxpY2F0b3JBcnRlZmFjdAkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBRFkdXBsaWNhdG9yQXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUSZHVwbGljYXRvckFydGVmYWN0BRJkdXBsaWNhdG9yQXJ0ZWZhY3QDCQECIT0CBRJkdXBsaWNhdG9yQXJ0ZWZhY3QCCUFSVC1EVVBMSQkAAgECLElJRDogWW91IG5lZWQgdG8gYXR0YWNoIGEgQVJULURVUExJIGFydGVmYWN0BAxhcnRlZmFjdE5hbWUJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgULaXRlbUFzc2V0SWQFA25pbAUDbmlsAwkAAAIFDGFydGVmYWN0TmFtZQUMYXJ0ZWZhY3ROYW1lBAhhcnRlZmFjdAkAwwgHBQxhcnRlZmFjdE5hbWUJAKwCAgIiTkZUIGFydGVmYWN0IG9mIFdhdmVzIER1Y2tzIGdhbWU6IAUMYXJ0ZWZhY3ROYW1lAAEAAAcFBHVuaXQAAAQKYXJ0ZWZhY3RJZAkAuAgBBQhhcnRlZmFjdAkAlAoCCQDOCAIJAMwIAgUIYXJ0ZWZhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICCWFydGVmYWN0XwkA2AQBBQphcnRlZmFjdElkAgVfdHlwZQUMYXJ0ZWZhY3ROYW1lCQDMCAIJAQRCdXJuAgkBBXZhbHVlAQgFEWR1cGxpY2F0b3JQYXltZW50B2Fzc2V0SWQAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQxvcmlnaW5DYWxsZXIAAQgFC2l0ZW1QYXltZW50B2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkMb3JpZ2luQ2FsbGVyAAEFCmFydGVmYWN0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEGdldEZlZUFnZ3JlZ2F0b3IACAUKZWdnUGF5bWVudAZhbW91bnQIBQplZ2dQYXltZW50B2Fzc2V0SWQFA25pbAUMdmFsaWRQYXltZW50CQDYBAEFCmFydGVmYWN0SWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJZml4ZWRHZW5lAwd0eElkU3RyD3BhcmVudEZpeGVkR2VuZRFwb3NpdGlvbkZpeGVkR2VuZQQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAEEDGZpcnN0QXNzZXRJZAkA2AQBCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQDCQECIT0CCAUMZmlyc3RQYXltZW50BmFtb3VudAABCQACAQITTkZUIGlzIG5vdCBhdHRhY2hlZAQIYXJ0ZWZhY3QJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgUMZmlyc3RBc3NldElkBQNuaWwFA25pbAMJAAACBQhhcnRlZmFjdAUIYXJ0ZWZhY3QDCQECIT0CBQhhcnRlZmFjdAILQVJULUZJWEdFTkUJAAIBAilZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtRklYR0VORSBhcnRlZmFjdAQEdHhJZAkA2QQBBQd0eElkU3RyBA9maW5pc2hIZWlnaHRLZXkJARdrZXlfcHJvY2Vzc0ZpbmlzaEhlaWdodAIJAKUIAQgFAWkGY2FsbGVyBQR0eElkBBNwcm9jZXNzRmluaXNoSGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCCQERZ2V0QnJlZWRlckFkZHJlc3MABQ9maW5pc2hIZWlnaHRLZXkED2R1Y2tHZW5lc1N0cmluZwkBCGFzU3RyaW5nAQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAgxnZW5lcmF0ZUR1Y2sJAMwIAgUEdHhJZAkAzAgCBRNwcm9jZXNzRmluaXNoSGVpZ2h0CQDMCAIFD3BhcmVudEZpeGVkR2VuZQkAzAgCBRFwb3NpdGlvbkZpeGVkR2VuZQkAzAgCAgAJAMwIAgAABQNuaWwFA25pbAMJAAACBQ9kdWNrR2VuZXNTdHJpbmcFD2R1Y2tHZW5lc1N0cmluZwQEY2FsbAkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhdmaW5pc2hEdWNrSGF0Y2hpbmdJdGVtcwkAzAgCBQd0eElkU3RyCQDMCAIFD2R1Y2tHZW5lc1N0cmluZwUDbmlsCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAQkAzAgCCQCRAwIIBQFpCHBheW1lbnRzAAIFA25pbAMJAAACBQRjYWxsBQRjYWxsCQDMCAIJAQRCdXJuAgkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkAAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhmcmVlR2VuZQEHdHhJZFN0cgQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEDGZpcnN0QXNzZXRJZAkA2AQBCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQDCQECIT0CCAUMZmlyc3RQYXltZW50BmFtb3VudAABCQACAQITTkZUIGlzIG5vdCBhdHRhY2hlZAQIYXJ0ZWZhY3QJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgUMZmlyc3RBc3NldElkBQNuaWwFA25pbAMJAAACBQhhcnRlZmFjdAUIYXJ0ZWZhY3QDCQECIT0CBQhhcnRlZmFjdAIMQVJULUZSRUVHRU5FCQACAQIqWW91IG5lZWQgdG8gYXR0YWNoIGEgQVJULUZSRUVHRU5FIGFydGVmYWN0BAR0eElkCQDZBAEFB3R4SWRTdHIED2ZpbmlzaEhlaWdodEtleQkBF2tleV9wcm9jZXNzRmluaXNoSGVpZ2h0AgkApQgBCAUBaQZjYWxsZXIFBHR4SWQEE3Byb2Nlc3NGaW5pc2hIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIJARFnZXRCcmVlZGVyQWRkcmVzcwAFD2ZpbmlzaEhlaWdodEtleQQMc2VsZWN0ZWRHZW5lCQEOZ2V0UmFuZG9tR2VuZXMCBQR0eElkBRNwcm9jZXNzRmluaXNoSGVpZ2h0BA5yYW5kb21Qb3NpdGlvbgkBD2dldFJhbmRvbU51bWJlcgQACAUEdHhJZAUTcHJvY2Vzc0ZpbmlzaEhlaWdodAADBA9kdWNrR2VuZXNTdHJpbmcJAQhhc1N0cmluZwEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIMZ2VuZXJhdGVEdWNrCQDMCAIFBHR4SWQJAMwIAgUTcHJvY2Vzc0ZpbmlzaEhlaWdodAkAzAgCAAAJAMwIAgAACQDMCAIFDHNlbGVjdGVkR2VuZQkAzAgCBQ5yYW5kb21Qb3NpdGlvbgUDbmlsBQNuaWwDCQAAAgUPZHVja0dlbmVzU3RyaW5nBQ9kdWNrR2VuZXNTdHJpbmcEBGNhbGwJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIXZmluaXNoRHVja0hhdGNoaW5nSXRlbXMJAMwIAgUHdHhJZFN0cgkAzAgCBQ9kdWNrR2VuZXNTdHJpbmcFA25pbAkAzAgCCQCRAwIIBQFpCHBheW1lbnRzAAEJAMwIAgkAkQMCCAUBaQhwYXltZW50cwACBQNuaWwDCQAAAgUEY2FsbAUEY2FsbAkAzAgCCQEEQnVybgIJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIY29weUR1Y2sABAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQNc2Vjb25kUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBAx2YWxpZFBheW1lbnQJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwACBAxmaXJzdEFzc2V0SWQJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkBAhjaGlsZHJlbgkBBWFzSW50AQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQDMCAIFDGZpcnN0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIY2hpbGRyZW4FCGNoaWxkcmVuAwMJAQIhPQIIBQxmaXJzdFBheW1lbnQGYW1vdW50AAEGCQECIT0CCAUNc2Vjb25kUGF5bWVudAZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIJANgEAQkBBXZhbHVlAQgFDXNlY29uZFBheW1lbnQHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwkBAiE9AgUIYXJ0ZWZhY3QCCkFSVC1NSVJST1IJAAIBAihZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtTUlSUk9SIGFydGVmYWN0BAduZnRJbmZvCQEFdmFsdWUBCQDsBwEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAQJYXNzZXQxR2VuCQC1CQIIBQduZnRJbmZvBG5hbWUCAAMDCQAAAgkAkQMCBQlhc3NldDFHZW4ADgIBRwYJAAACCQCRAwIFCWFzc2V0MUdlbgAOAgFKCQACAQIaWW91IGNhbid0IG1pcnJvciB0aGlzIGR1Y2sEB2R1Y2tHZW4IBQduZnRJbmZvBG5hbWUEBGNhbGwJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWY3JlYXRlRHVja1NwZWNpYWxHZW5lcwkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIFB2R1Y2tHZW4JAMwIAgUIY2hpbGRyZW4FA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQgFDGZpcnN0UGF5bWVudAdhc3NldElkCQDMCAIJAQRCdXJuAgkBBXZhbHVlAQgFDXNlY29uZFBheW1lbnQHYXNzZXRJZAABBQNuaWwFDHZhbGlkUGF5bWVudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFhZGRBcnRlRmFjdFRvRHVjawAEDGZpcnN0UGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABA1zZWNvbmRQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAIEDGZpcnN0QXNzZXRJZAkA2AQBCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQDAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQYJAQIhPQIIBQ1zZWNvbmRQYXltZW50BmFtb3VudAABCQACAQITTkZUIGlzIG5vdCBhdHRhY2hlZAQIY2hpbGRyZW4JAQVhc0ludAEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWdmFsaWRhdGVBbmRHZXRDaGlsZHJlbgkAzAgCBQxmaXJzdEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFCGNoaWxkcmVuBQhjaGlsZHJlbgMJAAACBQhjaGlsZHJlbgAACQACAQIkWW91IGNhbiBvbmx5IHBpY2sgYSBzdGVyaWxlIE5GVC1kdWNrBAhhcnRlZmFjdAkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCCQDYBAEJAQV2YWx1ZQEIBQ1zZWNvbmRQYXltZW50B2Fzc2V0SWQFA25pbAUDbmlsAwkAAAIFCGFydGVmYWN0BQhhcnRlZmFjdAMDCQECIT0CBQhhcnRlZmFjdAIIQVJULVhIQVQJAQIhPQIFCGFydGVmYWN0AghBUlQtUE9NUAcJAAIBAjJZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtWEhBVCBvciBBUlQtUE9NUCBhcnRlZmFjdAQHbmZ0SW5mbwkBBXZhbHVlAQkA7AcBCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQECWFzc2V0MUdlbgkAtQkCCAUHbmZ0SW5mbwRuYW1lAgADAwkAAAIJAJEDAgUJYXNzZXQxR2VuAA4CAUcGCQAAAgkAkQMCBQlhc3NldDFHZW4ADgIBSgkAAgECGllvdSBjYW4ndCBtaXJyb3IgdGhpcyBkdWNrAwMJAAACCQCRAwIFCWFzc2V0MUdlbgAFAgFTBgkAAAIJAJEDAgUJYXNzZXQxR2VuAAUCAVQJAAIBAh95b3UgYWxyZWFkeSBhdHRhY2hlZCBhIGFydGVmYWN0BARjaGFyAwkAAAIFCGFydGVmYWN0AghBUlQtWEhBVAIBVAMJAAACBQhhcnRlZmFjdAIIQVJULVBPTVACAVMJAAIBAg9ObyBjaGFyIGRlZmluZWQECm9sZER1Y2tHZW4IBQduZnRJbmZvBG5hbWUECm9sZEZhcm1HZW4JAQhhc1N0cmluZwEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIOZ2V0R2VuRnJvbU5hbWUJAMwIAgUKb2xkRHVja0dlbgUDbmlsBQNuaWwDCQAAAgUKb2xkRmFybUdlbgUKb2xkRmFybUdlbgQHZHVja0dlbgkBDm1hbmlwdWxhdGVOYW1lAwUKb2xkRHVja0dlbgAGBQRjaGFyBARjYWxsCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACFmNyZWF0ZUR1Y2tTcGVjaWFsR2VuZXMJAMwIAggIBQFpBmNhbGxlcgVieXRlcwkAzAgCBQdkdWNrR2VuCQDMCAIFCGNoaWxkcmVuBQNuaWwFA25pbAMJAAACBQRjYWxsBQRjYWxsBApjYWxsUmVkdWNlCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACDHJlZHVjZVJhcml0eQkAzAgCBQxmaXJzdEFzc2V0SWQJAMwIAgUKb2xkRmFybUdlbgUDbmlsBQNuaWwDCQAAAgUKY2FsbFJlZHVjZQUKY2FsbFJlZHVjZQkAzggCCQDMCAIJAQRCdXJuAgkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkAAEJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUNc2Vjb25kUGF5bWVudAdhc3NldElkAAEFA25pbAUMdmFsaWRQYXltZW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3ByZUluaXQACQDMCAIJAQxJbnRlZ2VyRW50cnkCAhxzdGF0aWNfQVJULUxBS0VfZmFybWluZ1Nsb3RzAMgBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhxzdGF0aWNfQVJULUxBS0VfZmFybWluZ0Jvb3N0AAIJAMwIAgkBDEludGVnZXJFbnRyeQICHXN0YXRpY19BUlQtSE9VU0VfZmFybWluZ1Nsb3RzAAQJAMwIAgkBDEludGVnZXJFbnRyeQICHXN0YXRpY19BUlQtSE9VU0VfZmFybWluZ0Jvb3N0AB4JAMwIAgkBDEludGVnZXJFbnRyeQICIHN0YXRpY19BUlQtQklHSE9VU0VfZmFybWluZ1Nsb3RzAAoJAMwIAgkBDEludGVnZXJFbnRyeQICIHN0YXRpY19BUlQtQklHSE9VU0VfZmFybWluZ0Jvb3N0AA8FA25pbAFpAQ1pc3N1ZUFydGVmYWN0AgR0eXBlCHJlY2VpdmVyAwMDAwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkBAiE9AggFAWkGY2FsbGVyCQERZ2V0UmViaXJ0aEFkZHJlc3MABwkBAiE9AggFAWkGY2FsbGVyCQEXZ2V0VHVydGxlUmViaXJ0aEFkZHJlc3MABwkBAiE9AggFAWkGY2FsbGVyCQEUZ2V0SHVudERpc3Ryb0FkZHJlc3MABwkBAiE9AggFAWkPY2FsbGVyUHVibGljS2V5CQELZ2V0V2Fyc1BLZXkABwkAAgECCmFkbWluIG9ubHkDAwMDCQAAAggFAWkGY2FsbGVyCQEUZ2V0SHVudERpc3Ryb0FkZHJlc3MABgkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQkBC2dldFdhcnNQS2V5AAkBASEBCQEIY29udGFpbnMCBQR0eXBlAglBUlQtRklSRV8HCQEBIQEJAQ10cnlHZXRCb29sZWFuAQkArAICBQR0eXBlAgZfaXNzdWUHCQACAQIdRklSRSBBTkQgV0hJVEVMSVNUIElURU0gT05MWSEEB3R4SWRTdHIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAQHYWRkcmVzcwkBB0FkZHJlc3MBCQDZBAEFCHJlY2VpdmVyBAhhcnRlZmFjdAkAwwgHBQR0eXBlAiFORlQgYXJ0ZWZhY3Qgb2YgV2F2ZXMgRHVja3MgZ2FtZS4AAQAABwUEdW5pdAAABAphcnRlZmFjdElkCQC4CAEFCGFydGVmYWN0CQCUCgIJAMwIAgUIYXJ0ZWZhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICCWFydGVmYWN0XwkA2AQBBQphcnRlZmFjdElkAgVfdHlwZQUEdHlwZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQdhZGRyZXNzAAEFCmFydGVmYWN0SWQFA25pbAkA2AQBBQphcnRlZmFjdElkAWkBB3NldExvY2sBAW4DCQAAAggFAWkGY2FsbGVyBQR0aGlzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1nbG9iYWxfbG9ja2VkBQFuBQNuaWwJAAIBAgphZG1pbiBvbmx5AWkBDmFkZEl0ZW1Ub1N0b3JlCAVwcmljZQRpdGVtCG1heFNhbGVzBHNhbGUJcHJpY2Vzc2V0EGdyb3d0aFBlcmNlbnRhZ2UHc3RhcnRUcwVlbmRUcwMJAQIhPQIIBQFpBmNhbGxlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARZzdGF0aWNLZXlfcGlwZWxpbmVVc2VyAAkAAgECHklBSVRTOiBPbmx5IGZvciB0cnVzdGVkIHVzZXJzIQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWtleV9wcmljZUNvc21ldGljAQUEaXRlbQUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlfbWF4U2FsZXNDb3NtZXRpYwEFBGl0ZW0FCG1heFNhbGVzCQDMCAIJAQxCb29sZWFuRW50cnkCCQEQa2V5X3NhbGVDb3NtZXRpYwEFBGl0ZW0FBHNhbGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleV9wcmljZUFzc2V0Q29zbWV0aWMBBQRpdGVtBQlwcmljZXNzZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJARprZXlfZ3Jvd1BlcmNlbnRhZ2VDb3NtZXRpYwEFBGl0ZW0FEGdyb3d0aFBlcmNlbnRhZ2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARNrZXlfc3RhcnRUc0Nvc21ldGljAQUEaXRlbQUHc3RhcnRUcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWtleV9lbmRUc0Nvc21ldGljAQUEaXRlbQUFZW5kVHMFA25pbAFpARJzZXRHbG9iYWxBcnRBbW91bnQBCW5ld0Ftb3VudAMDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgkAAAIIBQFpBmNhbGxlcgkBB0FkZHJlc3MBBQpkZXZBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhBnbG9iYWxfYXJ0QW1vdW50BQluZXdBbW91bnQFA25pbAkAAgECEVBlcm1pc3Npb24gZGVuaWVkAQJ0eAEGdmVyaWZ5AAMJAQlpc1Rlc3RFbnYACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAlmaXJzdFVzZXIBIFEc5P1m/xJp0vFaFJ87suL0O3/By2gnojRebDjXV91tBApzZWNvbmRVc2VyASDBbN+O7dONc4+Lovn6iQ/0dc1EG1RyUqO0nNJWpC3gdQQJdGhpcmRVc2VyASDnW/SOqtL5SZ5uhCa4+X4f3GeofdwruNTqe83yaArBJQQPZmlyc3RVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJZmlyc3RVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCWZpcnN0VXNlcgABAAAEEHNlY29uZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQpzZWNvbmRVc2VyAAEAAAQPdGhpcmRVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJdGhpcmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCXRoaXJkVXNlcgABAAAED3NpZ25hdHVyZXNDb3VudAkAZAIJAGQCBQ9maXJzdFVzZXJTaWduZWQFEHNlY29uZFVzZXJTaWduZWQFD3RoaXJkVXNlclNpZ25lZAQHJG1hdGNoMAUCdHgJAGcCBQ9zaWduYXR1cmVzQ291bnQAAtCFp7o=", "height": 3924907, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FBiqb4mndVRasMatwN5RkoLLznEqN7aDEwAV6P4HYExe Next: 9oKjPjUdoKjUghQPYvLsBcAU7NvqSVYghFs655CX6s1 Diff:
OldNewDifferences
3232
3333
3434 func staticKey_warsPKey () = "static_warsPKey"
35+
36+
37+func statisKey_duplicatorFee () = "static_duplicatorFee"
3538
3639
3740 func key_artefactOwner (artefactName,owner) = (((artefactName + "_") + owner) + "_owner")
8891
8992 let artefacts = ["ART-XMISTL", "ART-XHAT", "ART-XSCARF", "ART-XSWEATER", "ART-XSOCK", "ART-XTREE"]
9093
91-let issueList = ["ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-FAWKESMASK"]
92-
9394 let allArtefact = (artefacts ++ oldArtefacts)
9495
9596 func tryGetBoolean (key) = match getBoolean(this, key) {
124125
125126
126127 func getRandomArtefact (boxId,h) = {
127- let randomNumber = getRandomNumber(6, boxId, h, 1)
128+ let randomNumber = getRandomNumber(size(artefacts), boxId, h, 1)
128129 artefacts[randomNumber]
129130 }
130131
131132
132133 func getRandomGenes (txId,h) = {
133- let randomNumber = getRandomNumber(6, txId, h, 2)
134+ let randomNumber = getRandomNumber(size(freeGenes), txId, h, 2)
134135 freeGenes[randomNumber]
135136 }
136137
168169
169170
170171 func getWarsPKey () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_warsPKey()))
172+
173+
174+func getDuplicatorFee () = tryGetInteger(statisKey_duplicatorFee())
171175
172176
173177 func tryGetCosmeticItemPrice (item) = {
442446 let eggAssetId = value(eggPayment.assetId)
443447 if ((eggAssetId != getEggAssetId()))
444448 then throw("IID: Please attach eggs!")
445- else if ((eggsNeeded > eggPayment.amount))
446- then throw(("IID: to duplicate an items you need the following amount of egglets: " + toString(eggsNeeded)))
449+ else if ((getDuplicatorFee() > eggPayment.amount))
450+ then throw(("IID: to duplicate an items you need the following amount of egglets: " + toString(getDuplicatorFee())))
447451 else {
448452 let duplicatorArtefact = asString(invoke(this, "checkArtefactDetails", [duplicatorAssetId], nil))
449453 if ((duplicatorArtefact == duplicatorArtefact))
515519 let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
516520 let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
517521 let selectedGene = getRandomGenes(txId, processFinishHeight)
518- let randomPosition = getRandomNumber(7, txId, processFinishHeight, 3)
522+ let randomPosition = getRandomNumber(8, txId, processFinishHeight, 3)
519523 let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, 0, 0, selectedGene, randomPosition], nil))
520524 if ((duckGenesString == duckGenesString))
521525 then {
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"
1717
1818
1919 func staticKey_turtleRebirthAddress () = "static_turtleRebirthAddress"
2020
2121
2222 func staticKey_pipelineUser () = "static_pipelineUser"
2323
2424
2525 func staticKey_extraFee () = "static_extraFee"
2626
2727
2828 func staticKey_feeAggregator () = "static_feeAggregator"
2929
3030
3131 func staticKey_huntDistroAddress () = "static_huntDistroAddress"
3232
3333
3434 func staticKey_warsPKey () = "static_warsPKey"
35+
36+
37+func statisKey_duplicatorFee () = "static_duplicatorFee"
3538
3639
3740 func key_artefactOwner (artefactName,owner) = (((artefactName + "_") + owner) + "_owner")
3841
3942
4043 func key_unstakeHeight (artefactName,artefactId) = (((artefactName + "_") + artefactId) + "_unstake_height")
4144
4245
4346 func key_externalBoostDuck (duckId) = (duckId + "_duck_external_boost")
4447
4548
4649 func key_externalBoostAddress (address) = (address + "_user_external_boost")
4750
4851
4952 func key_priceCosmetic (item) = ("direct_cosmetic_" + item)
5053
5154
5255 func key_maxSalesCosmetic (item) = (("direct_cosmetic_" + item) + "_max_sales")
5356
5457
5558 func key_saleCosmetic (item) = (("direct_cosmetic_" + item) + "_sale")
5659
5760
5861 func key_priceAssetCosmetic (item) = (("direct_cosmetic_" + item) + "_priceAsset")
5962
6063
6164 func key_growPercentageCosmetic (item) = (("direct_cosmetic_" + item) + "_growing_percentage")
6265
6366
6467 func key_soldCosmetic (item) = (("direct_cosmetic_" + item) + "_sold")
6568
6669
6770 func key_lastPriceCosmetic (item) = (("direct_cosmetic_" + item) + "_last_price")
6871
6972
7073 func key_startTsCosmetic (item) = (("direct_cosmetic_" + item) + "_startTs")
7174
7275
7376 func key_endTsCosmetic (item) = (("direct_cosmetic_" + item) + "_endTs")
7477
7578
7679 func key_processFinishHeight (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
7780
7881
7982 let devAddress = base58'3P44yqcpfhPF2iC1nptm2ZJCTaN7VYhz9og'
8083
8184 let eggsNeeded = (3 * 100000000)
8285
8386 let artefactsLimit = (301 + 600)
8487
8588 let freeGenes = ["A", "B", "C", "D", "E", "F", "G", "H", "I"]
8689
8790 let oldArtefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-POMP", "ART-CAPE", "ART-HAT", "ART-CUSTOMDUCK"]
8891
8992 let artefacts = ["ART-XMISTL", "ART-XHAT", "ART-XSCARF", "ART-XSWEATER", "ART-XSOCK", "ART-XTREE"]
9093
91-let issueList = ["ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-FAWKESMASK"]
92-
9394 let allArtefact = (artefacts ++ oldArtefacts)
9495
9596 func tryGetBoolean (key) = match getBoolean(this, key) {
9697 case b: Boolean =>
9798 b
9899 case _ =>
99100 false
100101 }
101102
102103
103104 func tryGetString (key) = match getString(this, key) {
104105 case a: String =>
105106 a
106107 case _ =>
107108 ""
108109 }
109110
110111
111112 func tryGetInteger (key) = match getInteger(this, key) {
112113 case a: Int =>
113114 a
114115 case _ =>
115116 0
116117 }
117118
118119
119120 func getRandomNumber (variants,txId,finishHeight,offset) = {
120121 let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1)))
121122 let randomHash = sha256(((base58'items' + txId) + value(randomSeedBlock.vrf)))
122123 (toInt(randomHash, offset) % variants)
123124 }
124125
125126
126127 func getRandomArtefact (boxId,h) = {
127- let randomNumber = getRandomNumber(6, boxId, h, 1)
128+ let randomNumber = getRandomNumber(size(artefacts), boxId, h, 1)
128129 artefacts[randomNumber]
129130 }
130131
131132
132133 func getRandomGenes (txId,h) = {
133- let randomNumber = getRandomNumber(6, txId, h, 2)
134+ let randomNumber = getRandomNumber(size(freeGenes), txId, h, 2)
134135 freeGenes[randomNumber]
135136 }
136137
137138
138139 func tryGetStringExternal (address,key) = match getString(address, key) {
139140 case a: String =>
140141 a
141142 case _ =>
142143 ""
143144 }
144145
145146
146147 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
147148
148149
149150 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
150151
151152
152153 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
153154
154155
155156 func getTrustedContracts () = tryGetStringExternal(getOracle(), staticKey_trustedContracts())
156157
157158
158159 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rebirthAddress())))
159160
160161
161162 func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
162163
163164
164165 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
165166
166167
167168 func getHuntDistroAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_huntDistroAddress())))
168169
169170
170171 func getWarsPKey () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_warsPKey()))
172+
173+
174+func getDuplicatorFee () = tryGetInteger(statisKey_duplicatorFee())
171175
172176
173177 func tryGetCosmeticItemPrice (item) = {
174178 let key = key_priceCosmetic(item)
175179 match getInteger(this, key) {
176180 case a: Int =>
177181 a
178182 case _ =>
179183 throw("ITGCIP: This item is not available in the store!")
180184 }
181185 }
182186
183187
184188 func asString (value) = match value {
185189 case string: String =>
186190 string
187191 case _ =>
188192 throw("wrong type, expected: String")
189193 }
190194
191195
192196 func asInt (value) = match value {
193197 case int: Int =>
194198 int
195199 case _ =>
196200 throw("wrong type, expected: Int")
197201 }
198202
199203
200204 func manipulateName (assetName,position,char) = ((take(assetName, (position - 1)) + char) + takeRight(assetName, (16 - position)))
201205
202206
203207 func itemIsInCoolDown (artefactName,artefactId) = {
204208 let unstakeHeightLast = tryGetInteger(key_unstakeHeight(artefactName, artefactId))
205209 let cooldownPeriod = 240
206210 if ((height > (unstakeHeightLast + cooldownPeriod)))
207211 then false
208212 else true
209213 }
210214
211215
212216 func isTestEnv () = tryGetBoolean("TESTENV")
213217
214218
215219 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
216220 then throw("WCAP: Please attach waves")
217221 else {
218222 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
219223 if ((payment.amount != feeAmount))
220224 then throw((("WCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
221225 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
222226 }
223227
224228
225229 func itemMerger (baseItem,amountBaseItem,endItem,payments,feeAmount,feeAssetId,recipient,instantFinish,txId) = if ((size(payments) != (amountBaseItem + 1)))
226230 then throw((("IID: Please attach " + toString((amountBaseItem + 2))) + " payments!"))
227231 else {
228232 func isBaseItem (accumulated,pay) = {
229233 let assetId = value(pay.assetId)
230234 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(assetId)], nil))
231235 if ((artefact == artefact))
232236 then if ((artefact == baseItem))
233237 then $Tuple2((accumulated._1 ++ [Burn(assetId, 1)]), (accumulated._2 + 1))
234238 else $Tuple2(accumulated._1, (accumulated._2 + 0))
235239 else throw("Strict value is not equal to itself.")
236240 }
237241
238242 let totalBaseItem = {
239243 let $l = payments
240244 let $s = size($l)
241245 let $acc0 = $Tuple2(nil, 0)
242246 func $f0_1 ($a,$i) = if (($i >= $s))
243247 then $a
244248 else isBaseItem($a, $l[$i])
245249
246250 func $f0_2 ($a,$i) = if (($i >= $s))
247251 then $a
248252 else throw("List size exceeds 8")
249253
250254 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
251255 }
252256 if ((totalBaseItem._2 != amountBaseItem))
253257 then throw(((("IID: Please attach " + toString(amountBaseItem)) + " artefacts of type ") + baseItem))
254258 else {
255259 let feePayment = payments[amountBaseItem]
256260 if ((feePayment.assetId != feeAssetId))
257261 then throw("IID: You miss a payment with the fee!")
258262 else if ((feePayment.amount != feeAmount))
259263 then throw("IID: You did not attach the correct fee amount!")
260264 else {
261265 let artefact = Issue(endItem, ("NFT artefact of Waves Ducks game: " + endItem), 1, 0, false, unit, 0)
262266 let artefactId = calculateAssetId(artefact)
263267 let instant = if (instantFinish)
264268 then $Tuple2([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), endItem), ScriptTransfer(recipient, 1, artefactId)], toBase58String(artefactId))
265269 else $Tuple2(nil, "")
266270 $Tuple2((([BooleanEntry((("merge_" + txId) + "_instant"), instantFinish), ScriptTransfer(getFeeAggregator(), feeAmount, feePayment.assetId), StringEntry((("merge_" + txId) + "_reward"), endItem), BooleanEntry((("merge_" + txId) + "_finished"), !(instantFinish))] ++ instant._1) ++ totalBaseItem._1), instant._2)
267271 }
268272 }
269273 }
270274
271275
272276 func getAmountBaseItem (baseItem) = getIntegerValue((("merge_" + baseItem) + "_amount"))
273277
274278
275279 func getEndItem (baseItem) = getStringValue((("merge_" + baseItem) + "_endItem"))
276280
277281
278282 func getPrice (baseItem) = getIntegerValue((("merge_" + baseItem) + "_price"))
279283
280284
281285 func getInstant (baseItem) = getBooleanValue((("merge_" + baseItem) + "_instant"))
282286
283287
284288 func getAsset (baseItem) = {
285289 let asset = getStringValue((("merge_" + baseItem) + "_asset"))
286290 if ((asset == "WAVES"))
287291 then unit
288292 else fromBase58String(asset)
289293 }
290294
291295
292296 @Callable(i)
293297 func instanMergeItem (baseItem) = if ((baseItem != "ART-KATANA"))
294298 then throw("IID: Only Katana can be merged!")
295299 else {
296300 let params = $Tuple5(getAmountBaseItem(baseItem), getEndItem(baseItem), getPrice(baseItem), getAsset(baseItem), getInstant(baseItem))
297301 itemMerger(baseItem, params._1, params._2, i.payments, params._3, params._4, i.caller, params._5, toBase58String(i.transactionId))
298302 }
299303
300304
301305
302306 @Callable(i)
303307 func directBuyItem (itemName) = {
304308 let basePrice = tryGetCosmeticItemPrice(itemName)
305309 let grow = tryGetInteger(key_growPercentageCosmetic(itemName))
306310 let startTs = tryGetInteger(key_startTsCosmetic(itemName))
307311 let endTs = tryGetInteger(key_endTsCosmetic(itemName))
308312 if (if ((startTs != 0))
309313 then (startTs > lastBlock.timestamp)
310314 else false)
311315 then throw("IDBI: The sale did not start yet!")
312316 else if (if ((endTs != 0))
313317 then (lastBlock.timestamp > endTs)
314318 else false)
315319 then throw("IDBI: The sale has already finished!")
316320 else if (!(tryGetBoolean(key_saleCosmetic(itemName))))
317321 then throw(("IDBI: Item not for sale anymore" + key_saleCosmetic(itemName)))
318322 else {
319323 let maxSalesValue = tryGetInteger(key_maxSalesCosmetic(itemName))
320324 let soldValue = tryGetInteger(key_soldCosmetic(itemName))
321325 let price = if ((grow == 0))
322326 then basePrice
323327 else (basePrice + ((basePrice / 100) * (soldValue * grow)))
324328 if (if ((maxSalesValue != 0))
325329 then (soldValue >= maxSalesValue)
326330 else false)
327331 then throw("IDBI: Max editions sold!")
328332 else {
329333 let assetId = if ((tryGetString(key_priceAssetCosmetic(itemName)) == ""))
330334 then getEggAssetId()
331335 else if ((tryGetString(key_priceAssetCosmetic(itemName)) == "WAVES"))
332336 then unit
333337 else fromBase58String(tryGetString(key_priceAssetCosmetic(itemName)))
334338 let amountPaidByCoupons = 0
335339 let leftToPay = (price - amountPaidByCoupons)
336340 let validPayment = checkAdditionalPayment(i.payments[0])
337341 let firstPayment = value(i.payments[1])
338342 let amount = firstPayment.amount
339343 if ((firstPayment.assetId != assetId))
340344 then throw("IDBI: You can attach only tokens with the correct payment ")
341345 else if ((amount != leftToPay))
342346 then throw(("IDBI: Please attach the exact asset amount" + toString(price)))
343347 else {
344348 let txIdStr = toBase58String(i.transactionId)
345349 let address = i.originCaller
346350 let artefact = Issue(itemName, ("NFT artefact of Waves Ducks game: " + itemName), 1, 0, false, unit, 0)
347351 let artefactId = calculateAssetId(artefact)
348352 $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))
349353 }
350354 }
351355 }
352356 }
353357
354358
355359
356360 @Callable(i)
357361 func manipulateBoost (boost,duckId) = {
358362 let allowedContracts = getTrustedContracts()
359363 let allowedContractsList = split(allowedContracts, ";")
360364 let dappToCall = toString(i.caller)
361365 if ((indexOf(allowedContractsList, dappToCall) == unit))
362366 then throw("IMB: This smart contract can't manipulate the boost!")
363367 else {
364368 let key = key_externalBoostDuck(duckId)
365369 let activeBoost = tryGetInteger(key)
366370 let newBoost = (activeBoost + boost)
367371 if ((0 > newBoost))
368372 then throw("IMB: Something went wrong with boost, please contact the admins!")
369373 else [IntegerEntry(key, newBoost)]
370374 }
371375 }
372376
373377
374378
375379 @Callable(i)
376380 func manipulateBoostAccount (boost,address) = {
377381 let allowedContracts = getTrustedContracts()
378382 let allowedContractsList = split(allowedContracts, ";")
379383 let dappToCall = toString(i.caller)
380384 if ((indexOf(allowedContractsList, dappToCall) == unit))
381385 then throw("IMBA: This smart contract can't manipulate the boost!")
382386 else {
383387 let key = key_externalBoostAddress(address)
384388 let activeBoost = tryGetInteger(key)
385389 let newBoost = (activeBoost + boost)
386390 if ((0 > newBoost))
387391 then throw("IMBA: Something went wrong with boost, please contact the admins!")
388392 else [IntegerEntry(key, newBoost)]
389393 }
390394 }
391395
392396
393397
394398 @Callable(i)
395399 func checkArtefactDetails (assetId) = {
396400 let asset = value(assetInfo(fromBase58String(assetId)))
397401 let assetName = value(asset.name)
398402 if (if (if (containsElement(allArtefact, assetName))
399403 then true
400404 else isDefined(tryGetCosmeticItemPrice(assetName)))
401405 then (asset.issuer == this)
402406 else false)
403407 then $Tuple2(nil, assetName)
404408 else throw("Invalid artefact")
405409 }
406410
407411
408412
409413 @Callable(i)
410414 func configureOracle (oracle) = if ((i.caller != this))
411415 then throw("admin only")
412416 else [StringEntry(staticKey_oracleAddress(), oracle)]
413417
414418
415419
416420 @Callable(i)
417421 func calculateFarmingPowerBoost (duckId,address) = {
418422 let externalBoostDuck = tryGetInteger(key_externalBoostDuck(duckId))
419423 let externalBoostAddress = tryGetInteger(key_externalBoostAddress(address))
420424 let totalBoost = (externalBoostDuck + externalBoostAddress)
421425 $Tuple2([IntegerEntry((duckId + "_last_boost"), totalBoost)], totalBoost)
422426 }
423427
424428
425429
426430 @Callable(i)
427431 func itemDuplicator () = if ((size(i.payments) != 4))
428432 then throw("IID: Three payments are needed!")
429433 else {
430434 let duplicatorPayment = value(i.payments[0])
431435 let itemPayment = value(i.payments[1])
432436 let eggPayment = value(i.payments[2])
433437 let validPayment = checkAdditionalPayment(i.payments[3])
434438 let duplicatorAssetId = toBase58String(value(duplicatorPayment.assetId))
435439 if ((duplicatorPayment.amount != 1))
436440 then throw("IID: Duplicator NFT is not attached")
437441 else {
438442 let itemAssetId = toBase58String(value(itemPayment.assetId))
439443 if ((itemPayment.amount != 1))
440444 then throw("IID: Item NFT is not attached")
441445 else {
442446 let eggAssetId = value(eggPayment.assetId)
443447 if ((eggAssetId != getEggAssetId()))
444448 then throw("IID: Please attach eggs!")
445- else if ((eggsNeeded > eggPayment.amount))
446- then throw(("IID: to duplicate an items you need the following amount of egglets: " + toString(eggsNeeded)))
449+ else if ((getDuplicatorFee() > eggPayment.amount))
450+ then throw(("IID: to duplicate an items you need the following amount of egglets: " + toString(getDuplicatorFee())))
447451 else {
448452 let duplicatorArtefact = asString(invoke(this, "checkArtefactDetails", [duplicatorAssetId], nil))
449453 if ((duplicatorArtefact == duplicatorArtefact))
450454 then if ((duplicatorArtefact != "ART-DUPLI"))
451455 then throw("IID: You need to attach a ART-DUPLI artefact")
452456 else {
453457 let artefactName = asString(invoke(this, "checkArtefactDetails", [itemAssetId], nil))
454458 if ((artefactName == artefactName))
455459 then {
456460 let artefact = Issue(artefactName, ("NFT artefact of Waves Ducks game: " + artefactName), 1, 0, false, unit, 0)
457461 let artefactId = calculateAssetId(artefact)
458462 $Tuple2(([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), artefactName), Burn(value(duplicatorPayment.assetId), 1), ScriptTransfer(i.originCaller, 1, itemPayment.assetId), ScriptTransfer(i.originCaller, 1, artefactId), ScriptTransfer(getFeeAggregator(), eggPayment.amount, eggPayment.assetId)] ++ validPayment), toBase58String(artefactId))
459463 }
460464 else throw("Strict value is not equal to itself.")
461465 }
462466 else throw("Strict value is not equal to itself.")
463467 }
464468 }
465469 }
466470 }
467471
468472
469473
470474 @Callable(i)
471475 func fixedGene (txIdStr,parentFixedGene,positionFixedGene) = {
472476 let firstPayment = value(i.payments[0])
473477 let validPayment = checkAdditionalPayment(i.payments[1])
474478 let firstAssetId = toBase58String(value(firstPayment.assetId))
475479 if ((firstPayment.amount != 1))
476480 then throw("NFT is not attached")
477481 else {
478482 let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
479483 if ((artefact == artefact))
480484 then if ((artefact != "ART-FIXGENE"))
481485 then throw("You need to attach a ART-FIXGENE artefact")
482486 else {
483487 let txId = fromBase58String(txIdStr)
484488 let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
485489 let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
486490 let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
487491 if ((duckGenesString == duckGenesString))
488492 then {
489493 let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], [i.payments[1], i.payments[2]])
490494 if ((call == call))
491495 then [Burn(value(firstPayment.assetId), 1)]
492496 else throw("Strict value is not equal to itself.")
493497 }
494498 else throw("Strict value is not equal to itself.")
495499 }
496500 else throw("Strict value is not equal to itself.")
497501 }
498502 }
499503
500504
501505
502506 @Callable(i)
503507 func freeGene (txIdStr) = {
504508 let firstPayment = value(i.payments[0])
505509 let firstAssetId = toBase58String(value(firstPayment.assetId))
506510 if ((firstPayment.amount != 1))
507511 then throw("NFT is not attached")
508512 else {
509513 let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
510514 if ((artefact == artefact))
511515 then if ((artefact != "ART-FREEGENE"))
512516 then throw("You need to attach a ART-FREEGENE artefact")
513517 else {
514518 let txId = fromBase58String(txIdStr)
515519 let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
516520 let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
517521 let selectedGene = getRandomGenes(txId, processFinishHeight)
518- let randomPosition = getRandomNumber(7, txId, processFinishHeight, 3)
522+ let randomPosition = getRandomNumber(8, txId, processFinishHeight, 3)
519523 let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, 0, 0, selectedGene, randomPosition], nil))
520524 if ((duckGenesString == duckGenesString))
521525 then {
522526 let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], [i.payments[1], i.payments[2]])
523527 if ((call == call))
524528 then [Burn(value(firstPayment.assetId), 1)]
525529 else throw("Strict value is not equal to itself.")
526530 }
527531 else throw("Strict value is not equal to itself.")
528532 }
529533 else throw("Strict value is not equal to itself.")
530534 }
531535 }
532536
533537
534538
535539 @Callable(i)
536540 func copyDuck () = {
537541 let firstPayment = value(i.payments[0])
538542 let secondPayment = value(i.payments[1])
539543 let validPayment = checkAdditionalPayment(i.payments[2])
540544 let firstAssetId = toBase58String(value(firstPayment.assetId))
541545 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
542546 if ((children == children))
543547 then if (if ((firstPayment.amount != 1))
544548 then true
545549 else (secondPayment.amount != 1))
546550 then throw("NFT is not attached")
547551 else {
548552 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
549553 if ((artefact == artefact))
550554 then if ((artefact != "ART-MIRROR"))
551555 then throw("You need to attach a ART-MIRROR artefact")
552556 else {
553557 let nftInfo = value(assetInfo(value(firstPayment.assetId)))
554558 let asset1Gen = split(nftInfo.name, "")
555559 if (if ((asset1Gen[14] == "G"))
556560 then true
557561 else (asset1Gen[14] == "J"))
558562 then throw("You can't mirror this duck")
559563 else {
560564 let duckGen = nftInfo.name
561565 let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
562566 if ((call == call))
563567 then ([ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)] ++ validPayment)
564568 else throw("Strict value is not equal to itself.")
565569 }
566570 }
567571 else throw("Strict value is not equal to itself.")
568572 }
569573 else throw("Strict value is not equal to itself.")
570574 }
571575
572576
573577
574578 @Callable(i)
575579 func addArteFactToDuck () = {
576580 let firstPayment = value(i.payments[0])
577581 let secondPayment = value(i.payments[1])
578582 let validPayment = checkAdditionalPayment(i.payments[2])
579583 let firstAssetId = toBase58String(value(firstPayment.assetId))
580584 if (if ((firstPayment.amount != 1))
581585 then true
582586 else (secondPayment.amount != 1))
583587 then throw("NFT is not attached")
584588 else {
585589 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
586590 if ((children == children))
587591 then if ((children == 0))
588592 then throw("You can only pick a sterile NFT-duck")
589593 else {
590594 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
591595 if ((artefact == artefact))
592596 then if (if ((artefact != "ART-XHAT"))
593597 then (artefact != "ART-POMP")
594598 else false)
595599 then throw("You need to attach a ART-XHAT or ART-POMP artefact")
596600 else {
597601 let nftInfo = value(assetInfo(value(firstPayment.assetId)))
598602 let asset1Gen = split(nftInfo.name, "")
599603 if (if ((asset1Gen[14] == "G"))
600604 then true
601605 else (asset1Gen[14] == "J"))
602606 then throw("You can't mirror this duck")
603607 else if (if ((asset1Gen[5] == "S"))
604608 then true
605609 else (asset1Gen[5] == "T"))
606610 then throw("you already attached a artefact")
607611 else {
608612 let char = if ((artefact == "ART-XHAT"))
609613 then "T"
610614 else if ((artefact == "ART-POMP"))
611615 then "S"
612616 else throw("No char defined")
613617 let oldDuckGen = nftInfo.name
614618 let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil))
615619 if ((oldFarmGen == oldFarmGen))
616620 then {
617621 let duckGen = manipulateName(oldDuckGen, 6, char)
618622 let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
619623 if ((call == call))
620624 then {
621625 let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil)
622626 if ((callReduce == callReduce))
623627 then ([Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)] ++ validPayment)
624628 else throw("Strict value is not equal to itself.")
625629 }
626630 else throw("Strict value is not equal to itself.")
627631 }
628632 else throw("Strict value is not equal to itself.")
629633 }
630634 }
631635 else throw("Strict value is not equal to itself.")
632636 }
633637 else throw("Strict value is not equal to itself.")
634638 }
635639 }
636640
637641
638642
639643 @Callable(i)
640644 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)]
641645
642646
643647
644648 @Callable(i)
645649 func issueArtefact (type,receiver) = if (if (if (if (if ((i.caller != this))
646650 then (i.caller != getRebirthAddress())
647651 else false)
648652 then (i.caller != getTurtleRebirthAddress())
649653 else false)
650654 then (i.caller != getHuntDistroAddress())
651655 else false)
652656 then (i.callerPublicKey != getWarsPKey())
653657 else false)
654658 then throw("admin only")
655659 else if (if (if (if ((i.caller == getHuntDistroAddress()))
656660 then true
657661 else (i.callerPublicKey == getWarsPKey()))
658662 then !(contains(type, "ART-FIRE_"))
659663 else false)
660664 then !(tryGetBoolean((type + "_issue")))
661665 else false)
662666 then throw("FIRE AND WHITELIST ITEM ONLY!")
663667 else {
664668 let txIdStr = toBase58String(i.transactionId)
665669 let address = Address(fromBase58String(receiver))
666670 let artefact = Issue(type, "NFT artefact of Waves Ducks game.", 1, 0, false, unit, 0)
667671 let artefactId = calculateAssetId(artefact)
668672 $Tuple2([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), type), ScriptTransfer(address, 1, artefactId)], toBase58String(artefactId))
669673 }
670674
671675
672676
673677 @Callable(i)
674678 func setLock (n) = if ((i.caller == this))
675679 then [IntegerEntry("global_locked", n)]
676680 else throw("admin only")
677681
678682
679683
680684 @Callable(i)
681685 func addItemToStore (price,item,maxSales,sale,pricesset,growthPercentage,startTs,endTs) = if ((i.caller != addressFromStringValue(tryGetStringExternal(getOracle(), staticKey_pipelineUser()))))
682686 then throw("IAITS: Only for trusted users!")
683687 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)]
684688
685689
686690
687691 @Callable(i)
688692 func setGlobalArtAmount (newAmount) = if (if ((i.caller == this))
689693 then true
690694 else (i.caller == Address(devAddress)))
691695 then [IntegerEntry("global_artAmount", newAmount)]
692696 else throw("Permission denied")
693697
694698
695699 @Verifier(tx)
696700 func verify () = if (isTestEnv())
697701 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
698702 else {
699703 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
700704 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
701705 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
702706 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
703707 then 1
704708 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
705709 then 1
706710 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
707711 then 1
708712 else 0
709713 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
710714 then 1
711715 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
712716 then 1
713717 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
714718 then 1
715719 else 0
716720 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
717721 then 1
718722 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
719723 then 1
720724 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
721725 then 1
722726 else 0
723727 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
724728 match tx {
725729 case _ =>
726730 (signaturesCount >= 2)
727731 }
728732 }
729733

github/deemru/w8io/3ef1775 
322.49 ms