tx · FBiqb4mndVRasMatwN5RkoLLznEqN7aDEwAV6P4HYExe

3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks:  -0.02600000 Waves

2023.11.19 22:45 [3916553] smart account 3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks > SELF 0.00000000 Waves

{ "type": 13, "id": "FBiqb4mndVRasMatwN5RkoLLznEqN7aDEwAV6P4HYExe", "fee": 2600000, "feeAssetId": null, "timestamp": 1700423103016, "version": 2, "chainId": 87, "sender": "3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks", "senderPublicKey": "XrNmTusDFaLSz3wAjmdfcyC5h6uYyVbpdh18758UpFv", "proofs": [ "Li8P8gKL49dVBunfMrR9kSgw8jumoSqKAQiHMshTpgrzV6Px33Yc4JraSsWkHjYdyuxMpAQWR7SonL1W7UbFHGq" ], "script": "base64:BgJYCAISAwoBCBIDCgEIEgQKAgEIEgQKAgEIEgMKAQgSAwoBCBIECgIICBIAEgUKAwgBARIDCgEIEgASABIAEgQKAggIEgMKAQESCgoIAQgBBAgBAQESAwoBAT4BF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAIUc3RhdGljX29yYWNsZUFkZHJlc3MBGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwACFXN0YXRpY19icmVlZGVyQWRkcmVzcwEUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAAhFzdGF0aWNfZWdnQXNzZXRJZAEac3RhdGljS2V5X3RydXN0ZWRDb250cmFjdHMAAhdzdGF0aWNfdHJ1c3RlZENvbnRyYWN0cwEYc3RhdGljS2V5X3JlYmlydGhBZGRyZXNzAAIVc3RhdGljX3JlYmlydGhBZGRyZXNzAR5zdGF0aWNLZXlfdHVydGxlUmViaXJ0aEFkZHJlc3MAAhtzdGF0aWNfdHVydGxlUmViaXJ0aEFkZHJlc3MBFnN0YXRpY0tleV9waXBlbGluZVVzZXIAAhNzdGF0aWNfcGlwZWxpbmVVc2VyARJzdGF0aWNLZXlfZXh0cmFGZWUAAg9zdGF0aWNfZXh0cmFGZWUBF3N0YXRpY0tleV9mZWVBZ2dyZWdhdG9yAAIUc3RhdGljX2ZlZUFnZ3JlZ2F0b3IBG3N0YXRpY0tleV9odW50RGlzdHJvQWRkcmVzcwACGHN0YXRpY19odW50RGlzdHJvQWRkcmVzcwESc3RhdGljS2V5X3dhcnNQS2V5AAIPc3RhdGljX3dhcnNQS2V5ARFrZXlfYXJ0ZWZhY3RPd25lcgIMYXJ0ZWZhY3ROYW1lBW93bmVyCQCsAgIJAKwCAgkArAICBQxhcnRlZmFjdE5hbWUCAV8FBW93bmVyAgZfb3duZXIBEWtleV91bnN0YWtlSGVpZ2h0AgxhcnRlZmFjdE5hbWUKYXJ0ZWZhY3RJZAkArAICCQCsAgIJAKwCAgUMYXJ0ZWZhY3ROYW1lAgFfBQphcnRlZmFjdElkAg9fdW5zdGFrZV9oZWlnaHQBFWtleV9leHRlcm5hbEJvb3N0RHVjawEGZHVja0lkCQCsAgIFBmR1Y2tJZAIUX2R1Y2tfZXh0ZXJuYWxfYm9vc3QBGGtleV9leHRlcm5hbEJvb3N0QWRkcmVzcwEHYWRkcmVzcwkArAICBQdhZGRyZXNzAhRfdXNlcl9leHRlcm5hbF9ib29zdAERa2V5X3ByaWNlQ29zbWV0aWMBBGl0ZW0JAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQEUa2V5X21heFNhbGVzQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAgpfbWF4X3NhbGVzARBrZXlfc2FsZUNvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQIFX3NhbGUBFmtleV9wcmljZUFzc2V0Q29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAgtfcHJpY2VBc3NldAEaa2V5X2dyb3dQZXJjZW50YWdlQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAhNfZ3Jvd2luZ19wZXJjZW50YWdlARBrZXlfc29sZENvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQIFX3NvbGQBFWtleV9sYXN0UHJpY2VDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CC19sYXN0X3ByaWNlARNrZXlfc3RhcnRUc0Nvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQIIX3N0YXJ0VHMBEWtleV9lbmRUc0Nvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQIGX2VuZFRzARdrZXlfcHJvY2Vzc0ZpbmlzaEhlaWdodAIHYWRkcmVzcwR0eElkCQCsAgIJAKwCAgkArAICBQdhZGRyZXNzAgFfCQDYBAEFBHR4SWQCA19maAAKZGV2QWRkcmVzcwEaAVcXd9hCTyE6CkZPy+KvhiJrE5znW6fefHsACmVnZ3NOZWVkZWQJAGgCAAMAgMLXLwAOYXJ0ZWZhY3RzTGltaXQJAGQCAK0CANgEAAlmcmVlR2VuZXMJAMwIAgIBQQkAzAgCAgFCCQDMCAICAUMJAMwIAgIBRAkAzAgCAgFFCQDMCAICAUYJAMwIAgIBRwkAzAgCAgFICQDMCAICAUkFA25pbAAMb2xkQXJ0ZWZhY3RzCQDMCAICCEFSVC1MQUtFCQDMCAICCUFSVC1IT1VTRQkAzAgCAgxBUlQtQklHSE9VU0UJAMwIAgILQVJULUZJWEdFTkUJAMwIAgIMQVJULUZSRUVHRU5FCQDMCAICCkFSVC1NSVJST1IJAMwIAgIIQVJULVBPTVAJAMwIAgIIQVJULUNBUEUJAMwIAgIHQVJULUhBVAkAzAgCAg5BUlQtQ1VTVE9NRFVDSwUDbmlsAAlhcnRlZmFjdHMJAMwIAgIKQVJULVhNSVNUTAkAzAgCAghBUlQtWEhBVAkAzAgCAgpBUlQtWFNDQVJGCQDMCAICDEFSVC1YU1dFQVRFUgkAzAgCAglBUlQtWFNPQ0sJAMwIAgIJQVJULVhUUkVFBQNuaWwACWlzc3VlTGlzdAkAzAgCAgtBUlQtRklYR0VORQkAzAgCAgxBUlQtRlJFRUdFTkUJAMwIAgIKQVJULU1JUlJPUgkAzAgCAg5BUlQtRkFXS0VTTUFTSwUDbmlsAAthbGxBcnRlZmFjdAkAzggCBQlhcnRlZmFjdHMFDG9sZEFydGVmYWN0cwENdHJ5R2V0Qm9vbGVhbgEDa2V5BAckbWF0Y2gwCQCbCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwEMdHJ5R2V0U3RyaW5nAQNrZXkEByRtYXRjaDAJAJ0IAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQ9nZXRSYW5kb21OdW1iZXIECHZhcmlhbnRzBHR4SWQMZmluaXNoSGVpZ2h0Bm9mZnNldAQPcmFuZG9tU2VlZEJsb2NrCQEFdmFsdWUBCQDtBwEJAGUCBQxmaW5pc2hIZWlnaHQAAQQKcmFuZG9tSGFzaAkA9wMBCQDLAQIJAMsBAgEEHEF95gUEdHhJZAkBBXZhbHVlAQgFD3JhbmRvbVNlZWRCbG9jawN2cmYJAGoCCQCyCQIFCnJhbmRvbUhhc2gFBm9mZnNldAUIdmFyaWFudHMBEWdldFJhbmRvbUFydGVmYWN0AgVib3hJZAFoBAxyYW5kb21OdW1iZXIJAQ9nZXRSYW5kb21OdW1iZXIEAAYFBWJveElkBQFoAAEJAJEDAgUJYXJ0ZWZhY3RzBQxyYW5kb21OdW1iZXIBDmdldFJhbmRvbUdlbmVzAgR0eElkAWgEDHJhbmRvbU51bWJlcgkBD2dldFJhbmRvbU51bWJlcgQABgUEdHhJZAUBaAACCQCRAwIFCWZyZWVHZW5lcwUMcmFuZG9tTnVtYmVyARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJ0IAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABEWdldEJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAENZ2V0RWdnQXNzZXRJZAAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARRzdGF0aWNLZXlfZWdnQXNzZXRJZAABE2dldFRydXN0ZWRDb250cmFjdHMACQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGnN0YXRpY0tleV90cnVzdGVkQ29udHJhY3RzAAERZ2V0UmViaXJ0aEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfcmViaXJ0aEFkZHJlc3MAARdnZXRUdXJ0bGVSZWJpcnRoQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHnN0YXRpY0tleV90dXJ0bGVSZWJpcnRoQWRkcmVzcwABEGdldEZlZUFnZ3JlZ2F0b3IACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgABFGdldEh1bnREaXN0cm9BZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEbc3RhdGljS2V5X2h1bnREaXN0cm9BZGRyZXNzAAELZ2V0V2Fyc1BLZXkACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQESc3RhdGljS2V5X3dhcnNQS2V5AAEXdHJ5R2V0Q29zbWV0aWNJdGVtUHJpY2UBBGl0ZW0EA2tleQkBEWtleV9wcmljZUNvc21ldGljAQUEaXRlbQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhCQACAQIwSVRHQ0lQOiBUaGlzIGl0ZW0gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgc3RvcmUhAQhhc1N0cmluZwEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwBQZzdHJpbmcJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQ5tYW5pcHVsYXRlTmFtZQMJYXNzZXROYW1lCHBvc2l0aW9uBGNoYXIJAKwCAgkArAICCQCvAgIFCWFzc2V0TmFtZQkAZQIFCHBvc2l0aW9uAAEFBGNoYXIJALICAgUJYXNzZXROYW1lCQBlAgAQBQhwb3NpdGlvbgEQaXRlbUlzSW5Db29sRG93bgIMYXJ0ZWZhY3ROYW1lCmFydGVmYWN0SWQEEXVuc3Rha2VIZWlnaHRMYXN0CQENdHJ5R2V0SW50ZWdlcgEJARFrZXlfdW5zdGFrZUhlaWdodAIFDGFydGVmYWN0TmFtZQUKYXJ0ZWZhY3RJZAQOY29vbGRvd25QZXJpb2QA8AEDCQBmAgUGaGVpZ2h0CQBkAgURdW5zdGFrZUhlaWdodExhc3QFDmNvb2xkb3duUGVyaW9kBwYBCWlzVGVzdEVudgAJAQ10cnlHZXRCb29sZWFuAQIHVEVTVEVOVgEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEHcGF5bWVudAMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIZV0NBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQJZmVlQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxXQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsAQppdGVtTWVyZ2VyCQhiYXNlSXRlbQ5hbW91bnRCYXNlSXRlbQdlbmRJdGVtCHBheW1lbnRzCWZlZUFtb3VudApmZWVBc3NldElkCXJlY2lwaWVudA1pbnN0YW50RmluaXNoBHR4SWQDCQECIT0CCQCQAwEFCHBheW1lbnRzCQBkAgUOYW1vdW50QmFzZUl0ZW0AAQkAAgEJAKwCAgkArAICAhNJSUQ6IFBsZWFzZSBhdHRhY2ggCQCkAwEJAGQCBQ5hbW91bnRCYXNlSXRlbQACAgogcGF5bWVudHMhCgEKaXNCYXNlSXRlbQILYWNjdW11bGF0ZWQDcGF5BAdhc3NldElkCQEFdmFsdWUBCAUDcGF5B2Fzc2V0SWQECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIJANgEAQUHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwkAAAIFCGFydGVmYWN0BQhiYXNlSXRlbQkAlAoCCQDOCAIIBQthY2N1bXVsYXRlZAJfMQkAzAgCCQEEQnVybgIFB2Fzc2V0SWQAAQUDbmlsCQBkAggFC2FjY3VtdWxhdGVkAl8yAAEJAJQKAggFC2FjY3VtdWxhdGVkAl8xCQBkAggFC2FjY3VtdWxhdGVkAl8yAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDXRvdGFsQmFzZUl0ZW0KAAIkbAUIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQppc0Jhc2VJdGVtAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA4CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAMJAQIhPQIIBQ10b3RhbEJhc2VJdGVtAl8yBQ5hbW91bnRCYXNlSXRlbQkAAgEJAKwCAgkArAICCQCsAgICE0lJRDogUGxlYXNlIGF0dGFjaCAJAKQDAQUOYW1vdW50QmFzZUl0ZW0CEyBhcnRlZmFjdHMgb2YgdHlwZSAFCGJhc2VJdGVtBApmZWVQYXltZW50CQCRAwIFCHBheW1lbnRzBQ5hbW91bnRCYXNlSXRlbQMJAQIhPQIIBQpmZWVQYXltZW50B2Fzc2V0SWQFCmZlZUFzc2V0SWQJAAIBAiVJSUQ6IFlvdSBtaXNzIGEgcGF5bWVudCB3aXRoIHRoZSBmZWUhAwkBAiE9AggFCmZlZVBheW1lbnQGYW1vdW50BQlmZWVBbW91bnQJAAIBAi9JSUQ6IFlvdSBkaWQgbm90IGF0dGFjaCB0aGUgY29ycmVjdCBmZWUgYW1vdW50IQQIYXJ0ZWZhY3QJAMMIBwUHZW5kSXRlbQkArAICAiJORlQgYXJ0ZWZhY3Qgb2YgV2F2ZXMgRHVja3MgZ2FtZTogBQdlbmRJdGVtAAEAAAcFBHVuaXQAAAQKYXJ0ZWZhY3RJZAkAuAgBBQhhcnRlZmFjdAQHaW5zdGFudAMFDWluc3RhbnRGaW5pc2gJAJQKAgkAzAgCBQhhcnRlZmFjdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIJYXJ0ZWZhY3RfCQDYBAEFCmFydGVmYWN0SWQCBV90eXBlBQdlbmRJdGVtCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCXJlY2lwaWVudAABBQphcnRlZmFjdElkBQNuaWwJANgEAQUKYXJ0ZWZhY3RJZAkAlAoCBQNuaWwCAAkAlAoCCQDOCAIJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgICBm1lcmdlXwUEdHhJZAIIX2luc3RhbnQFDWluc3RhbnRGaW5pc2gJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEGdldEZlZUFnZ3JlZ2F0b3IABQlmZWVBbW91bnQIBQpmZWVQYXltZW50B2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBm1lcmdlXwUEdHhJZAIHX3Jld2FyZAUHZW5kSXRlbQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgICBm1lcmdlXwUEdHhJZAIJX2ZpbmlzaGVkCQEBIQEFDWluc3RhbnRGaW5pc2gFA25pbAgFB2luc3RhbnQCXzEIBQ10b3RhbEJhc2VJdGVtAl8xCAUHaW5zdGFudAJfMgERZ2V0QW1vdW50QmFzZUl0ZW0BCGJhc2VJdGVtCQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgIJAKwCAgIGbWVyZ2VfBQhiYXNlSXRlbQIHX2Ftb3VudAEKZ2V0RW5kSXRlbQEIYmFzZUl0ZW0JARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkArAICAgZtZXJnZV8FCGJhc2VJdGVtAghfZW5kSXRlbQEIZ2V0UHJpY2UBCGJhc2VJdGVtCQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgIJAKwCAgIGbWVyZ2VfBQhiYXNlSXRlbQIGX3ByaWNlAQpnZXRJbnN0YW50AQhiYXNlSXRlbQkBEUBleHRyTmF0aXZlKDEwNTYpAQkArAICCQCsAgICBm1lcmdlXwUIYmFzZUl0ZW0CCF9pbnN0YW50AQhnZXRBc3NldAEIYmFzZUl0ZW0EBWFzc2V0CQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAKwCAgIGbWVyZ2VfBQhiYXNlSXRlbQIGX2Fzc2V0AwkAAAIFBWFzc2V0AgVXQVZFUwUEdW5pdAkA2QQBBQVhc3NldBEBaQEPaW5zdGFuTWVyZ2VJdGVtAQhiYXNlSXRlbQMJAQIhPQIFCGJhc2VJdGVtAgpBUlQtS0FUQU5BCQACAQIfSUlEOiBPbmx5IEthdGFuYSBjYW4gYmUgbWVyZ2VkIQQGcGFyYW1zCQCXCgUJARFnZXRBbW91bnRCYXNlSXRlbQEFCGJhc2VJdGVtCQEKZ2V0RW5kSXRlbQEFCGJhc2VJdGVtCQEIZ2V0UHJpY2UBBQhiYXNlSXRlbQkBCGdldEFzc2V0AQUIYmFzZUl0ZW0JAQpnZXRJbnN0YW50AQUIYmFzZUl0ZW0JAQppdGVtTWVyZ2VyCQUIYmFzZUl0ZW0IBQZwYXJhbXMCXzEIBQZwYXJhbXMCXzIIBQFpCHBheW1lbnRzCAUGcGFyYW1zAl8zCAUGcGFyYW1zAl80CAUBaQZjYWxsZXIIBQZwYXJhbXMCXzUJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAFpAQ1kaXJlY3RCdXlJdGVtAQhpdGVtTmFtZQQJYmFzZVByaWNlCQEXdHJ5R2V0Q29zbWV0aWNJdGVtUHJpY2UBBQhpdGVtTmFtZQQEZ3JvdwkBDXRyeUdldEludGVnZXIBCQEaa2V5X2dyb3dQZXJjZW50YWdlQ29zbWV0aWMBBQhpdGVtTmFtZQQHc3RhcnRUcwkBDXRyeUdldEludGVnZXIBCQETa2V5X3N0YXJ0VHNDb3NtZXRpYwEFCGl0ZW1OYW1lBAVlbmRUcwkBDXRyeUdldEludGVnZXIBCQERa2V5X2VuZFRzQ29zbWV0aWMBBQhpdGVtTmFtZQMDCQECIT0CBQdzdGFydFRzAAAJAGYCBQdzdGFydFRzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAcJAAIBAiFJREJJOiBUaGUgc2FsZSBkaWQgbm90IHN0YXJ0IHlldCEDAwkBAiE9AgUFZW5kVHMAAAkAZgIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQVlbmRUcwcJAAIBAiRJREJJOiBUaGUgc2FsZSBoYXMgYWxyZWFkeSBmaW5pc2hlZCEDCQEBIQEJAQ10cnlHZXRCb29sZWFuAQkBEGtleV9zYWxlQ29zbWV0aWMBBQhpdGVtTmFtZQkAAgEJAKwCAgIfSURCSTogSXRlbSBub3QgZm9yIHNhbGUgYW55bW9yZQkBEGtleV9zYWxlQ29zbWV0aWMBBQhpdGVtTmFtZQQNbWF4U2FsZXNWYWx1ZQkBDXRyeUdldEludGVnZXIBCQEUa2V5X21heFNhbGVzQ29zbWV0aWMBBQhpdGVtTmFtZQQJc29sZFZhbHVlCQENdHJ5R2V0SW50ZWdlcgEJARBrZXlfc29sZENvc21ldGljAQUIaXRlbU5hbWUEBXByaWNlAwkAAAIFBGdyb3cAAAUJYmFzZVByaWNlCQBkAgUJYmFzZVByaWNlCQBoAgkAaQIFCWJhc2VQcmljZQBkCQBoAgUJc29sZFZhbHVlBQRncm93AwMJAQIhPQIFDW1heFNhbGVzVmFsdWUAAAkAZwIFCXNvbGRWYWx1ZQUNbWF4U2FsZXNWYWx1ZQcJAAIBAhhJREJJOiBNYXggZWRpdGlvbnMgc29sZCEEB2Fzc2V0SWQDCQAAAgkBDHRyeUdldFN0cmluZwEJARZrZXlfcHJpY2VBc3NldENvc21ldGljAQUIaXRlbU5hbWUCAAkBDWdldEVnZ0Fzc2V0SWQAAwkAAAIJAQx0cnlHZXRTdHJpbmcBCQEWa2V5X3ByaWNlQXNzZXRDb3NtZXRpYwEFCGl0ZW1OYW1lAgVXQVZFUwUEdW5pdAkA2QQBCQEMdHJ5R2V0U3RyaW5nAQkBFmtleV9wcmljZUFzc2V0Q29zbWV0aWMBBQhpdGVtTmFtZQQTYW1vdW50UGFpZEJ5Q291cG9ucwAABAlsZWZ0VG9QYXkJAGUCBQVwcmljZQUTYW1vdW50UGFpZEJ5Q291cG9ucwQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAAQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEBmFtb3VudAgFDGZpcnN0UGF5bWVudAZhbW91bnQDCQECIT0CCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQFB2Fzc2V0SWQJAAIBAjpJREJJOiBZb3UgY2FuIGF0dGFjaCBvbmx5IHRva2VucyB3aXRoIHRoZSBjb3JyZWN0IHBheW1lbnQgAwkBAiE9AgUGYW1vdW50BQlsZWZ0VG9QYXkJAAIBCQCsAgICKklEQkk6IFBsZWFzZSBhdHRhY2ggdGhlIGV4YWN0IGFzc2V0IGFtb3VudAkApAMBBQVwcmljZQQHdHhJZFN0cgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAdhZGRyZXNzCAUBaQxvcmlnaW5DYWxsZXIECGFydGVmYWN0CQDDCAcFCGl0ZW1OYW1lCQCsAgICIk5GVCBhcnRlZmFjdCBvZiBXYXZlcyBEdWNrcyBnYW1lOiAFCGl0ZW1OYW1lAAEAAAcFBHVuaXQAAAQKYXJ0ZWZhY3RJZAkAuAgBBQhhcnRlZmFjdAkAlAoCCQDOCAIJAMwIAgUIYXJ0ZWZhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICCWFydGVmYWN0XwkA2AQBBQphcnRlZmFjdElkAgVfdHlwZQUIaXRlbU5hbWUJAMwIAgkBDEludGVnZXJFbnRyeQIJARVrZXlfbGFzdFByaWNlQ29zbWV0aWMBBQhpdGVtTmFtZQUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlfc29sZENvc21ldGljAQUIaXRlbU5hbWUJAGQCBQlzb2xkVmFsdWUAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQdhZGRyZXNzAAEFCmFydGVmYWN0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEGdldEZlZUFnZ3JlZ2F0b3IABQZhbW91bnQFB2Fzc2V0SWQFA25pbAUMdmFsaWRQYXltZW50CQDYBAEFCmFydGVmYWN0SWQBaQEPbWFuaXB1bGF0ZUJvb3N0AgVib29zdAZkdWNrSWQEEGFsbG93ZWRDb250cmFjdHMJARNnZXRUcnVzdGVkQ29udHJhY3RzAAQUYWxsb3dlZENvbnRyYWN0c0xpc3QJALUJAgUQYWxsb3dlZENvbnRyYWN0cwIBOwQKZGFwcFRvQ2FsbAkApQgBCAUBaQZjYWxsZXIDCQAAAgkAzwgCBRRhbGxvd2VkQ29udHJhY3RzTGlzdAUKZGFwcFRvQ2FsbAUEdW5pdAkAAgECNElNQjogVGhpcyBzbWFydCBjb250cmFjdCBjYW4ndCBtYW5pcHVsYXRlIHRoZSBib29zdCEEA2tleQkBFWtleV9leHRlcm5hbEJvb3N0RHVjawEFBmR1Y2tJZAQLYWN0aXZlQm9vc3QJAQ10cnlHZXRJbnRlZ2VyAQUDa2V5BAhuZXdCb29zdAkAZAIFC2FjdGl2ZUJvb3N0BQVib29zdAMJAGYCAAAFCG5ld0Jvb3N0CQACAQJASU1COiBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIGJvb3N0LCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW5zIQkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQhuZXdCb29zdAUDbmlsAWkBFm1hbmlwdWxhdGVCb29zdEFjY291bnQCBWJvb3N0B2FkZHJlc3MEEGFsbG93ZWRDb250cmFjdHMJARNnZXRUcnVzdGVkQ29udHJhY3RzAAQUYWxsb3dlZENvbnRyYWN0c0xpc3QJALUJAgUQYWxsb3dlZENvbnRyYWN0cwIBOwQKZGFwcFRvQ2FsbAkApQgBCAUBaQZjYWxsZXIDCQAAAgkAzwgCBRRhbGxvd2VkQ29udHJhY3RzTGlzdAUKZGFwcFRvQ2FsbAUEdW5pdAkAAgECNUlNQkE6IFRoaXMgc21hcnQgY29udHJhY3QgY2FuJ3QgbWFuaXB1bGF0ZSB0aGUgYm9vc3QhBANrZXkJARhrZXlfZXh0ZXJuYWxCb29zdEFkZHJlc3MBBQdhZGRyZXNzBAthY3RpdmVCb29zdAkBDXRyeUdldEludGVnZXIBBQNrZXkECG5ld0Jvb3N0CQBkAgULYWN0aXZlQm9vc3QFBWJvb3N0AwkAZgIAAAUIbmV3Qm9vc3QJAAIBAkFJTUJBOiBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIGJvb3N0LCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW5zIQkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQhuZXdCb29zdAUDbmlsAWkBFGNoZWNrQXJ0ZWZhY3REZXRhaWxzAQdhc3NldElkBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFB2Fzc2V0SWQECWFzc2V0TmFtZQkBBXZhbHVlAQgFBWFzc2V0BG5hbWUDAwMJAQ9jb250YWluc0VsZW1lbnQCBQthbGxBcnRlZmFjdAUJYXNzZXROYW1lBgkBCWlzRGVmaW5lZAEJARd0cnlHZXRDb3NtZXRpY0l0ZW1QcmljZQEFCWFzc2V0TmFtZQkAAAIIBQVhc3NldAZpc3N1ZXIFBHRoaXMHCQCUCgIFA25pbAUJYXNzZXROYW1lCQACAQIQSW52YWxpZCBhcnRlZmFjdAFpAQ9jb25maWd1cmVPcmFjbGUBBm9yYWNsZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCmFkbWluIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAUGb3JhY2xlBQNuaWwBaQEaY2FsY3VsYXRlRmFybWluZ1Bvd2VyQm9vc3QCBmR1Y2tJZAdhZGRyZXNzBBFleHRlcm5hbEJvb3N0RHVjawkBDXRyeUdldEludGVnZXIBCQEVa2V5X2V4dGVybmFsQm9vc3REdWNrAQUGZHVja0lkBBRleHRlcm5hbEJvb3N0QWRkcmVzcwkBDXRyeUdldEludGVnZXIBCQEYa2V5X2V4dGVybmFsQm9vc3RBZGRyZXNzAQUHYWRkcmVzcwQKdG90YWxCb29zdAkAZAIFEWV4dGVybmFsQm9vc3REdWNrBRRleHRlcm5hbEJvb3N0QWRkcmVzcwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBmR1Y2tJZAILX2xhc3RfYm9vc3QFCnRvdGFsQm9vc3QFA25pbAUKdG90YWxCb29zdAFpAQ5pdGVtRHVwbGljYXRvcgADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAQJAAIBAh9JSUQ6IFRocmVlIHBheW1lbnRzIGFyZSBuZWVkZWQhBBFkdXBsaWNhdG9yUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAtpdGVtUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBAplZ2dQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAIEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAMEEWR1cGxpY2F0b3JBc3NldElkCQDYBAEJAQV2YWx1ZQEIBRFkdXBsaWNhdG9yUGF5bWVudAdhc3NldElkAwkBAiE9AggFEWR1cGxpY2F0b3JQYXltZW50BmFtb3VudAABCQACAQIjSUlEOiBEdXBsaWNhdG9yIE5GVCBpcyBub3QgYXR0YWNoZWQEC2l0ZW1Bc3NldElkCQDYBAEJAQV2YWx1ZQEIBQtpdGVtUGF5bWVudAdhc3NldElkAwkBAiE9AggFC2l0ZW1QYXltZW50BmFtb3VudAABCQACAQIdSUlEOiBJdGVtIE5GVCBpcyBub3QgYXR0YWNoZWQECmVnZ0Fzc2V0SWQJAQV2YWx1ZQEIBQplZ2dQYXltZW50B2Fzc2V0SWQDCQECIT0CBQplZ2dBc3NldElkCQENZ2V0RWdnQXNzZXRJZAAJAAIBAhhJSUQ6IFBsZWFzZSBhdHRhY2ggZWdncyEDCQBmAgUKZWdnc05lZWRlZAgFCmVnZ1BheW1lbnQGYW1vdW50CQACAQkArAICAkVJSUQ6IHRvIGR1cGxpY2F0ZSBhbiBpdGVtcyB5b3UgbmVlZCB0aGUgZm9sbG93aW5nIGFtb3VudCBvZiBlZ2dsZXRzOiAJAKQDAQUKZWdnc05lZWRlZAQSZHVwbGljYXRvckFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIFEWR1cGxpY2F0b3JBc3NldElkBQNuaWwFA25pbAMJAAACBRJkdXBsaWNhdG9yQXJ0ZWZhY3QFEmR1cGxpY2F0b3JBcnRlZmFjdAMJAQIhPQIFEmR1cGxpY2F0b3JBcnRlZmFjdAIJQVJULURVUExJCQACAQIsSUlEOiBZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtRFVQTEkgYXJ0ZWZhY3QEDGFydGVmYWN0TmFtZQkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBQtpdGVtQXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUMYXJ0ZWZhY3ROYW1lBQxhcnRlZmFjdE5hbWUECGFydGVmYWN0CQDDCAcFDGFydGVmYWN0TmFtZQkArAICAiJORlQgYXJ0ZWZhY3Qgb2YgV2F2ZXMgRHVja3MgZ2FtZTogBQxhcnRlZmFjdE5hbWUAAQAABwUEdW5pdAAABAphcnRlZmFjdElkCQC4CAEFCGFydGVmYWN0CQCUCgIJAM4IAgkAzAgCBQhhcnRlZmFjdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIJYXJ0ZWZhY3RfCQDYBAEFCmFydGVmYWN0SWQCBV90eXBlBQxhcnRlZmFjdE5hbWUJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAURZHVwbGljYXRvclBheW1lbnQHYXNzZXRJZAABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpDG9yaWdpbkNhbGxlcgABCAULaXRlbVBheW1lbnQHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQxvcmlnaW5DYWxsZXIAAQUKYXJ0ZWZhY3RJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAIBQplZ2dQYXltZW50BmFtb3VudAgFCmVnZ1BheW1lbnQHYXNzZXRJZAUDbmlsBQx2YWxpZFBheW1lbnQJANgEAQUKYXJ0ZWZhY3RJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlmaXhlZEdlbmUDB3R4SWRTdHIPcGFyZW50Rml4ZWRHZW5lEXBvc2l0aW9uRml4ZWRHZW5lBAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAQQMZmlyc3RBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAMJAQIhPQIIBQxmaXJzdFBheW1lbnQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBAhhcnRlZmFjdAkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBQxmaXJzdEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFCGFydGVmYWN0BQhhcnRlZmFjdAMJAQIhPQIFCGFydGVmYWN0AgtBUlQtRklYR0VORQkAAgECKVlvdSBuZWVkIHRvIGF0dGFjaCBhIEFSVC1GSVhHRU5FIGFydGVmYWN0BAR0eElkCQDZBAEFB3R4SWRTdHIED2ZpbmlzaEhlaWdodEtleQkBF2tleV9wcm9jZXNzRmluaXNoSGVpZ2h0AgkApQgBCAUBaQZjYWxsZXIFBHR4SWQEE3Byb2Nlc3NGaW5pc2hIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIJARFnZXRCcmVlZGVyQWRkcmVzcwAFD2ZpbmlzaEhlaWdodEtleQQPZHVja0dlbmVzU3RyaW5nCQEIYXNTdHJpbmcBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACDGdlbmVyYXRlRHVjawkAzAgCBQR0eElkCQDMCAIFE3Byb2Nlc3NGaW5pc2hIZWlnaHQJAMwIAgUPcGFyZW50Rml4ZWRHZW5lCQDMCAIFEXBvc2l0aW9uRml4ZWRHZW5lCQDMCAICAAkAzAgCAAAFA25pbAUDbmlsAwkAAAIFD2R1Y2tHZW5lc1N0cmluZwUPZHVja0dlbmVzU3RyaW5nBARjYWxsCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACF2ZpbmlzaER1Y2tIYXRjaGluZ0l0ZW1zCQDMCAIFB3R4SWRTdHIJAMwIAgUPZHVja0dlbmVzU3RyaW5nBQNuaWwJAMwIAgkAkQMCCAUBaQhwYXltZW50cwABCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAgUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGZyZWVHZW5lAQd0eElkU3RyBAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQMZmlyc3RBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAMJAQIhPQIIBQxmaXJzdFBheW1lbnQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBAhhcnRlZmFjdAkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBQxmaXJzdEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFCGFydGVmYWN0BQhhcnRlZmFjdAMJAQIhPQIFCGFydGVmYWN0AgxBUlQtRlJFRUdFTkUJAAIBAipZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtRlJFRUdFTkUgYXJ0ZWZhY3QEBHR4SWQJANkEAQUHdHhJZFN0cgQPZmluaXNoSGVpZ2h0S2V5CQEXa2V5X3Byb2Nlc3NGaW5pc2hIZWlnaHQCCQClCAEIBQFpBmNhbGxlcgUEdHhJZAQTcHJvY2Vzc0ZpbmlzaEhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgkBEWdldEJyZWVkZXJBZGRyZXNzAAUPZmluaXNoSGVpZ2h0S2V5BAxzZWxlY3RlZEdlbmUJAQ5nZXRSYW5kb21HZW5lcwIFBHR4SWQFE3Byb2Nlc3NGaW5pc2hIZWlnaHQEDnJhbmRvbVBvc2l0aW9uCQEPZ2V0UmFuZG9tTnVtYmVyBAAHBQR0eElkBRNwcm9jZXNzRmluaXNoSGVpZ2h0AAMED2R1Y2tHZW5lc1N0cmluZwkBCGFzU3RyaW5nAQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAgxnZW5lcmF0ZUR1Y2sJAMwIAgUEdHhJZAkAzAgCBRNwcm9jZXNzRmluaXNoSGVpZ2h0CQDMCAIAAAkAzAgCAAAJAMwIAgUMc2VsZWN0ZWRHZW5lCQDMCAIFDnJhbmRvbVBvc2l0aW9uBQNuaWwFA25pbAMJAAACBQ9kdWNrR2VuZXNTdHJpbmcFD2R1Y2tHZW5lc1N0cmluZwQEY2FsbAkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhdmaW5pc2hEdWNrSGF0Y2hpbmdJdGVtcwkAzAgCBQd0eElkU3RyCQDMCAIFD2R1Y2tHZW5lc1N0cmluZwUDbmlsCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAQkAzAgCCQCRAwIIBQFpCHBheW1lbnRzAAIFA25pbAMJAAACBQRjYWxsBQRjYWxsCQDMCAIJAQRCdXJuAgkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkAAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhjb3B5RHVjawAEDGZpcnN0UGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABA1zZWNvbmRQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAIEDGZpcnN0QXNzZXRJZAkA2AQBCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQECGNoaWxkcmVuCQEFYXNJbnQBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACFnZhbGlkYXRlQW5kR2V0Q2hpbGRyZW4JAMwIAgUMZmlyc3RBc3NldElkBQNuaWwFA25pbAMJAAACBQhjaGlsZHJlbgUIY2hpbGRyZW4DAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQYJAQIhPQIIBQ1zZWNvbmRQYXltZW50BmFtb3VudAABCQACAQITTkZUIGlzIG5vdCBhdHRhY2hlZAQIYXJ0ZWZhY3QJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgkA2AQBCQEFdmFsdWUBCAUNc2Vjb25kUGF5bWVudAdhc3NldElkBQNuaWwFA25pbAMJAAACBQhhcnRlZmFjdAUIYXJ0ZWZhY3QDCQECIT0CBQhhcnRlZmFjdAIKQVJULU1JUlJPUgkAAgECKFlvdSBuZWVkIHRvIGF0dGFjaCBhIEFSVC1NSVJST1IgYXJ0ZWZhY3QEB25mdEluZm8JAQV2YWx1ZQEJAOwHAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkBAlhc3NldDFHZW4JALUJAggFB25mdEluZm8EbmFtZQIAAwMJAAACCQCRAwIFCWFzc2V0MUdlbgAOAgFHBgkAAAIJAJEDAgUJYXNzZXQxR2VuAA4CAUoJAAIBAhpZb3UgY2FuJ3QgbWlycm9yIHRoaXMgZHVjawQHZHVja0dlbggFB25mdEluZm8EbmFtZQQEY2FsbAkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhZjcmVhdGVEdWNrU3BlY2lhbEdlbmVzCQDMCAIICAUBaQZjYWxsZXIFYnl0ZXMJAMwIAgUHZHVja0dlbgkAzAgCBQhjaGlsZHJlbgUDbmlsBQNuaWwDCQAAAgUEY2FsbAUEY2FsbAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUNc2Vjb25kUGF5bWVudAdhc3NldElkAAEFA25pbAUMdmFsaWRQYXltZW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWFkZEFydGVGYWN0VG9EdWNrAAQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEDXNlY29uZFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAgQMZmlyc3RBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAMDCQECIT0CCAUMZmlyc3RQYXltZW50BmFtb3VudAABBgkBAiE9AggFDXNlY29uZFBheW1lbnQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBAhjaGlsZHJlbgkBBWFzSW50AQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQDMCAIFDGZpcnN0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIY2hpbGRyZW4FCGNoaWxkcmVuAwkAAAIFCGNoaWxkcmVuAAAJAAIBAiRZb3UgY2FuIG9ubHkgcGljayBhIHN0ZXJpbGUgTkZULWR1Y2sECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIJANgEAQkBBXZhbHVlAQgFDXNlY29uZFBheW1lbnQHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwMJAQIhPQIFCGFydGVmYWN0AghBUlQtWEhBVAkBAiE9AgUIYXJ0ZWZhY3QCCEFSVC1QT01QBwkAAgECMllvdSBuZWVkIHRvIGF0dGFjaCBhIEFSVC1YSEFUIG9yIEFSVC1QT01QIGFydGVmYWN0BAduZnRJbmZvCQEFdmFsdWUBCQDsBwEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAQJYXNzZXQxR2VuCQC1CQIIBQduZnRJbmZvBG5hbWUCAAMDCQAAAgkAkQMCBQlhc3NldDFHZW4ADgIBRwYJAAACCQCRAwIFCWFzc2V0MUdlbgAOAgFKCQACAQIaWW91IGNhbid0IG1pcnJvciB0aGlzIGR1Y2sDAwkAAAIJAJEDAgUJYXNzZXQxR2VuAAUCAVMGCQAAAgkAkQMCBQlhc3NldDFHZW4ABQIBVAkAAgECH3lvdSBhbHJlYWR5IGF0dGFjaGVkIGEgYXJ0ZWZhY3QEBGNoYXIDCQAAAgUIYXJ0ZWZhY3QCCEFSVC1YSEFUAgFUAwkAAAIFCGFydGVmYWN0AghBUlQtUE9NUAIBUwkAAgECD05vIGNoYXIgZGVmaW5lZAQKb2xkRHVja0dlbggFB25mdEluZm8EbmFtZQQKb2xkRmFybUdlbgkBCGFzU3RyaW5nAQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAg5nZXRHZW5Gcm9tTmFtZQkAzAgCBQpvbGREdWNrR2VuBQNuaWwFA25pbAMJAAACBQpvbGRGYXJtR2VuBQpvbGRGYXJtR2VuBAdkdWNrR2VuCQEObWFuaXB1bGF0ZU5hbWUDBQpvbGREdWNrR2VuAAYFBGNoYXIEBGNhbGwJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWY3JlYXRlRHVja1NwZWNpYWxHZW5lcwkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIFB2R1Y2tHZW4JAMwIAgUIY2hpbGRyZW4FA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwECmNhbGxSZWR1Y2UJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIMcmVkdWNlUmFyaXR5CQDMCAIFDGZpcnN0QXNzZXRJZAkAzAgCBQpvbGRGYXJtR2VuBQNuaWwFA25pbAMJAAACBQpjYWxsUmVkdWNlBQpjYWxsUmVkdWNlCQDOCAIJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQAAQkAzAgCCQEEQnVybgIJAQV2YWx1ZQEIBQ1zZWNvbmRQYXltZW50B2Fzc2V0SWQAAQUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHcHJlSW5pdAAJAMwIAgkBDEludGVnZXJFbnRyeQICHHN0YXRpY19BUlQtTEFLRV9mYXJtaW5nU2xvdHMAyAEJAMwIAgkBDEludGVnZXJFbnRyeQICHHN0YXRpY19BUlQtTEFLRV9mYXJtaW5nQm9vc3QAAgkAzAgCCQEMSW50ZWdlckVudHJ5AgIdc3RhdGljX0FSVC1IT1VTRV9mYXJtaW5nU2xvdHMABAkAzAgCCQEMSW50ZWdlckVudHJ5AgIdc3RhdGljX0FSVC1IT1VTRV9mYXJtaW5nQm9vc3QAHgkAzAgCCQEMSW50ZWdlckVudHJ5AgIgc3RhdGljX0FSVC1CSUdIT1VTRV9mYXJtaW5nU2xvdHMACgkAzAgCCQEMSW50ZWdlckVudHJ5AgIgc3RhdGljX0FSVC1CSUdIT1VTRV9mYXJtaW5nQm9vc3QADwUDbmlsAWkBDWlzc3VlQXJ0ZWZhY3QCBHR5cGUIcmVjZWl2ZXIDAwMDAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQECIT0CCAUBaQZjYWxsZXIJARFnZXRSZWJpcnRoQWRkcmVzcwAHCQECIT0CCAUBaQZjYWxsZXIJARdnZXRUdXJ0bGVSZWJpcnRoQWRkcmVzcwAHCQECIT0CCAUBaQZjYWxsZXIJARRnZXRIdW50RGlzdHJvQWRkcmVzcwAHCQECIT0CCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQtnZXRXYXJzUEtleQAHCQACAQIKYWRtaW4gb25seQMDAwMJAAACCAUBaQZjYWxsZXIJARRnZXRIdW50RGlzdHJvQWRkcmVzcwAGCQAAAggFAWkPY2FsbGVyUHVibGljS2V5CQELZ2V0V2Fyc1BLZXkACQEBIQEJAQhjb250YWlucwIFBHR5cGUCCUFSVC1GSVJFXwcJAQEhAQkBDXRyeUdldEJvb2xlYW4BCQCsAgIFBHR5cGUCBl9pc3N1ZQcJAAIBAh1GSVJFIEFORCBXSElURUxJU1QgSVRFTSBPTkxZIQQHdHhJZFN0cgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAdhZGRyZXNzCQEHQWRkcmVzcwEJANkEAQUIcmVjZWl2ZXIECGFydGVmYWN0CQDDCAcFBHR5cGUCIU5GVCBhcnRlZmFjdCBvZiBXYXZlcyBEdWNrcyBnYW1lLgABAAAHBQR1bml0AAAECmFydGVmYWN0SWQJALgIAQUIYXJ0ZWZhY3QJAJQKAgkAzAgCBQhhcnRlZmFjdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIJYXJ0ZWZhY3RfCQDYBAEFCmFydGVmYWN0SWQCBV90eXBlBQR0eXBlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFB2FkZHJlc3MAAQUKYXJ0ZWZhY3RJZAUDbmlsCQDYBAEFCmFydGVmYWN0SWQBaQEHc2V0TG9jawEBbgMJAAACCAUBaQZjYWxsZXIFBHRoaXMJAMwIAgkBDEludGVnZXJFbnRyeQICDWdsb2JhbF9sb2NrZWQFAW4FA25pbAkAAgECCmFkbWluIG9ubHkBaQEOYWRkSXRlbVRvU3RvcmUIBXByaWNlBGl0ZW0IbWF4U2FsZXMEc2FsZQlwcmljZXNzZXQQZ3Jvd3RoUGVyY2VudGFnZQdzdGFydFRzBWVuZFRzAwkBAiE9AggFAWkGY2FsbGVyCQERQGV4dHJOYXRpdmUoMTA2MikBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFnN0YXRpY0tleV9waXBlbGluZVVzZXIACQACAQIeSUFJVFM6IE9ubHkgZm9yIHRydXN0ZWQgdXNlcnMhCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERa2V5X3ByaWNlQ29zbWV0aWMBBQRpdGVtBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleV9tYXhTYWxlc0Nvc21ldGljAQUEaXRlbQUIbWF4U2FsZXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIJARBrZXlfc2FsZUNvc21ldGljAQUEaXRlbQUEc2FsZQkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5X3ByaWNlQXNzZXRDb3NtZXRpYwEFBGl0ZW0FCXByaWNlc3NldAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmtleV9ncm93UGVyY2VudGFnZUNvc21ldGljAQUEaXRlbQUQZ3Jvd3RoUGVyY2VudGFnZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE2tleV9zdGFydFRzQ29zbWV0aWMBBQRpdGVtBQdzdGFydFRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERa2V5X2VuZFRzQ29zbWV0aWMBBQRpdGVtBQVlbmRUcwUDbmlsAWkBEnNldEdsb2JhbEFydEFtb3VudAEJbmV3QW1vdW50AwMJAAACCAUBaQZjYWxsZXIFBHRoaXMGCQAAAggFAWkGY2FsbGVyCQEHQWRkcmVzcwEFCmRldkFkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQICEGdsb2JhbF9hcnRBbW91bnQFCW5ld0Ftb3VudAUDbmlsCQACAQIRUGVybWlzc2lvbiBkZW5pZWQBAnR4AQZ2ZXJpZnkAAwkBCWlzVGVzdEVudgAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECWZpcnN0VXNlcgEgURzk/Wb/EmnS8VoUnzuy4vQ7f8HLaCeiNF5sONdX3W0ECnNlY29uZFVzZXIBIMFs347t041zj4ui+fqJD/R1zUQbVHJSo7Sc0lakLeB1BAl0aGlyZFVzZXIBIOdb9I6q0vlJnm6EJrj5fh/cZ6h93Cu41Op7zfJoCsElBA9maXJzdFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJZmlyc3RVc2VyAAEAAAQQc2Vjb25kVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCnNlY29uZFVzZXIAAQAABA90aGlyZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJdGhpcmRVc2VyAAEAAAQPc2lnbmF0dXJlc0NvdW50CQBkAgkAZAIFD2ZpcnN0VXNlclNpZ25lZAUQc2Vjb25kVXNlclNpZ25lZAUPdGhpcmRVc2VyU2lnbmVkBAckbWF0Y2gwBQJ0eAkAZwIFD3NpZ25hdHVyZXNDb3VudAAC2GNNCA==", "height": 3916553, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4dh72q8uqRuV1HCMLt4mBdu58XEe43xdYjCVQQaek5Ps Next: CMqvsyjk544zR9CyDTamuwtA7M6rET6AQ3BePYv8zDG4 Diff:
OldNewDifferences
8888
8989 let artefacts = ["ART-XMISTL", "ART-XHAT", "ART-XSCARF", "ART-XSWEATER", "ART-XSOCK", "ART-XTREE"]
9090
91-let issueList = ["ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR"]
91+let issueList = ["ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-FAWKESMASK"]
9292
9393 let allArtefact = (artefacts ++ oldArtefacts)
9494
222222 }
223223
224224
225+func itemMerger (baseItem,amountBaseItem,endItem,payments,feeAmount,feeAssetId,recipient,instantFinish,txId) = if ((size(payments) != (amountBaseItem + 1)))
226+ then throw((("IID: Please attach " + toString((amountBaseItem + 2))) + " payments!"))
227+ else {
228+ func isBaseItem (accumulated,pay) = {
229+ let assetId = value(pay.assetId)
230+ let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(assetId)], nil))
231+ if ((artefact == artefact))
232+ then if ((artefact == baseItem))
233+ then $Tuple2((accumulated._1 ++ [Burn(assetId, 1)]), (accumulated._2 + 1))
234+ else $Tuple2(accumulated._1, (accumulated._2 + 0))
235+ else throw("Strict value is not equal to itself.")
236+ }
237+
238+ let totalBaseItem = {
239+ let $l = payments
240+ let $s = size($l)
241+ let $acc0 = $Tuple2(nil, 0)
242+ func $f0_1 ($a,$i) = if (($i >= $s))
243+ then $a
244+ else isBaseItem($a, $l[$i])
245+
246+ func $f0_2 ($a,$i) = if (($i >= $s))
247+ then $a
248+ else throw("List size exceeds 8")
249+
250+ $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)
251+ }
252+ if ((totalBaseItem._2 != amountBaseItem))
253+ then throw(((("IID: Please attach " + toString(amountBaseItem)) + " artefacts of type ") + baseItem))
254+ else {
255+ let feePayment = payments[amountBaseItem]
256+ if ((feePayment.assetId != feeAssetId))
257+ then throw("IID: You miss a payment with the fee!")
258+ else if ((feePayment.amount != feeAmount))
259+ then throw("IID: You did not attach the correct fee amount!")
260+ else {
261+ let artefact = Issue(endItem, ("NFT artefact of Waves Ducks game: " + endItem), 1, 0, false, unit, 0)
262+ let artefactId = calculateAssetId(artefact)
263+ let instant = if (instantFinish)
264+ then $Tuple2([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), endItem), ScriptTransfer(recipient, 1, artefactId)], toBase58String(artefactId))
265+ else $Tuple2(nil, "")
266+ $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)
267+ }
268+ }
269+ }
270+
271+
272+func getAmountBaseItem (baseItem) = getIntegerValue((("merge_" + baseItem) + "_amount"))
273+
274+
275+func getEndItem (baseItem) = getStringValue((("merge_" + baseItem) + "_endItem"))
276+
277+
278+func getPrice (baseItem) = getIntegerValue((("merge_" + baseItem) + "_price"))
279+
280+
281+func getInstant (baseItem) = getBooleanValue((("merge_" + baseItem) + "_instant"))
282+
283+
284+func getAsset (baseItem) = {
285+ let asset = getStringValue((("merge_" + baseItem) + "_asset"))
286+ if ((asset == "WAVES"))
287+ then unit
288+ else fromBase58String(asset)
289+ }
290+
291+
292+@Callable(i)
293+func instanMergeItem (baseItem) = if ((baseItem != "ART-KATANA"))
294+ then throw("IID: Only Katana can be merged!")
295+ else {
296+ let params = $Tuple5(getAmountBaseItem(baseItem), getEndItem(baseItem), getPrice(baseItem), getAsset(baseItem), getInstant(baseItem))
297+ itemMerger(baseItem, params._1, params._2, i.payments, params._3, params._4, i.caller, params._5, toBase58String(i.transactionId))
298+ }
299+
300+
301+
225302 @Callable(i)
226303 func directBuyItem (itemName) = {
227304 let basePrice = tryGetCosmeticItemPrice(itemName)
343420 let totalBoost = (externalBoostDuck + externalBoostAddress)
344421 $Tuple2([IntegerEntry((duckId + "_last_boost"), totalBoost)], totalBoost)
345422 }
423+
424+
425+
426+@Callable(i)
427+func itemDuplicator () = if ((size(i.payments) != 4))
428+ then throw("IID: Three payments are needed!")
429+ else {
430+ let duplicatorPayment = value(i.payments[0])
431+ let itemPayment = value(i.payments[1])
432+ let eggPayment = value(i.payments[2])
433+ let validPayment = checkAdditionalPayment(i.payments[3])
434+ let duplicatorAssetId = toBase58String(value(duplicatorPayment.assetId))
435+ if ((duplicatorPayment.amount != 1))
436+ then throw("IID: Duplicator NFT is not attached")
437+ else {
438+ let itemAssetId = toBase58String(value(itemPayment.assetId))
439+ if ((itemPayment.amount != 1))
440+ then throw("IID: Item NFT is not attached")
441+ else {
442+ let eggAssetId = value(eggPayment.assetId)
443+ if ((eggAssetId != getEggAssetId()))
444+ 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)))
447+ else {
448+ let duplicatorArtefact = asString(invoke(this, "checkArtefactDetails", [duplicatorAssetId], nil))
449+ if ((duplicatorArtefact == duplicatorArtefact))
450+ then if ((duplicatorArtefact != "ART-DUPLI"))
451+ then throw("IID: You need to attach a ART-DUPLI artefact")
452+ else {
453+ let artefactName = asString(invoke(this, "checkArtefactDetails", [itemAssetId], nil))
454+ if ((artefactName == artefactName))
455+ then {
456+ let artefact = Issue(artefactName, ("NFT artefact of Waves Ducks game: " + artefactName), 1, 0, false, unit, 0)
457+ let artefactId = calculateAssetId(artefact)
458+ $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))
459+ }
460+ else throw("Strict value is not equal to itself.")
461+ }
462+ else throw("Strict value is not equal to itself.")
463+ }
464+ }
465+ }
466+ }
346467
347468
348469
536657 else (i.callerPublicKey == getWarsPKey()))
537658 then !(contains(type, "ART-FIRE_"))
538659 else false)
539- then !(containsElement(issueList, type))
660+ then !(tryGetBoolean((type + "_issue")))
540661 else false)
541- then throw("FIRE ITEM ONLY!")
662+ then throw("FIRE AND WHITELIST ITEM ONLY!")
542663 else {
543664 let txIdStr = toBase58String(i.transactionId)
544665 let address = Address(fromBase58String(receiver))
545- let artefact = Issue(type, "NFT artefact of Waves Ducks game. Drop #2.", 1, 0, false, unit, 0)
666+ let artefact = Issue(type, "NFT artefact of Waves Ducks game.", 1, 0, false, unit, 0)
546667 let artefactId = calculateAssetId(artefact)
547668 $Tuple2([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), type), ScriptTransfer(address, 1, artefactId)], toBase58String(artefactId))
548669 }
553674 func setLock (n) = if ((i.caller == this))
554675 then [IntegerEntry("global_locked", n)]
555676 else throw("admin only")
556-
557-
558-
559-@Callable(i)
560-func buyArtefact () = if ((lastBlock.timestamp > 1639742400000))
561- then throw("There are no active sales now... ")
562- else if ((tryGetInteger("global_locked") > 0))
563- then throw("contract is temporarily locked")
564- else if ((tryGetInteger("global_artAmount") >= artefactsLimit))
565- then throw("SOLDOUT!!! Hurray!")
566- else if (if ((1639605600000 > lastBlock.timestamp))
567- then (i.caller != Address(devAddress))
568- else false)
569- then throw("Too early...")
570- else {
571- let firstPayment = value(i.payments[0])
572- if ((firstPayment.assetId != getEggAssetId()))
573- then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
574- else if ((eggsNeeded > firstPayment.amount))
575- then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded)))
576- 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))]
577- }
578677
579678
580679
591690 else (i.caller == Address(devAddress)))
592691 then [IntegerEntry("global_artAmount", newAmount)]
593692 else throw("Permission denied")
594-
595-
596-
597-@Callable(i)
598-func claimArtefact (boxIdStr) = {
599- let txId = fromBase58String(boxIdStr)
600- let statusKey = (((toString(i.caller) + "_") + boxIdStr) + "_status")
601- let heightKey = (((toString(i.caller) + "_") + boxIdStr) + "_finishHeight")
602- if ((getStringValue(statusKey) != "started"))
603- then throw("claimed already")
604- else if ((getIntegerValue(heightKey) > height))
605- then throw("you cannot claim yet")
606- else {
607- let artType = getRandomArtefact(txId, getIntegerValue(heightKey))
608- let asset = Issue(artType, "Artefact of Waves Ducks metaverse.", 1, 0, false, unit, getIntegerValue(heightKey))
609- let assetId = calculateAssetId(asset)
610-[StringEntry(statusKey, artType), StringEntry((((toString(i.caller) + "_") + boxIdStr) + "_artefactId"), toBase58String(assetId)), StringEntry((toBase58String(assetId) + "_type"), artType), asset, ScriptTransfer(i.caller, 1, assetId)]
611- }
612- }
613693
614694
615695 @Verifier(tx)
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"
3535
3636
3737 func key_artefactOwner (artefactName,owner) = (((artefactName + "_") + owner) + "_owner")
3838
3939
4040 func key_unstakeHeight (artefactName,artefactId) = (((artefactName + "_") + artefactId) + "_unstake_height")
4141
4242
4343 func key_externalBoostDuck (duckId) = (duckId + "_duck_external_boost")
4444
4545
4646 func key_externalBoostAddress (address) = (address + "_user_external_boost")
4747
4848
4949 func key_priceCosmetic (item) = ("direct_cosmetic_" + item)
5050
5151
5252 func key_maxSalesCosmetic (item) = (("direct_cosmetic_" + item) + "_max_sales")
5353
5454
5555 func key_saleCosmetic (item) = (("direct_cosmetic_" + item) + "_sale")
5656
5757
5858 func key_priceAssetCosmetic (item) = (("direct_cosmetic_" + item) + "_priceAsset")
5959
6060
6161 func key_growPercentageCosmetic (item) = (("direct_cosmetic_" + item) + "_growing_percentage")
6262
6363
6464 func key_soldCosmetic (item) = (("direct_cosmetic_" + item) + "_sold")
6565
6666
6767 func key_lastPriceCosmetic (item) = (("direct_cosmetic_" + item) + "_last_price")
6868
6969
7070 func key_startTsCosmetic (item) = (("direct_cosmetic_" + item) + "_startTs")
7171
7272
7373 func key_endTsCosmetic (item) = (("direct_cosmetic_" + item) + "_endTs")
7474
7575
7676 func key_processFinishHeight (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
7777
7878
7979 let devAddress = base58'3P44yqcpfhPF2iC1nptm2ZJCTaN7VYhz9og'
8080
8181 let eggsNeeded = (3 * 100000000)
8282
8383 let artefactsLimit = (301 + 600)
8484
8585 let freeGenes = ["A", "B", "C", "D", "E", "F", "G", "H", "I"]
8686
8787 let oldArtefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-POMP", "ART-CAPE", "ART-HAT", "ART-CUSTOMDUCK"]
8888
8989 let artefacts = ["ART-XMISTL", "ART-XHAT", "ART-XSCARF", "ART-XSWEATER", "ART-XSOCK", "ART-XTREE"]
9090
91-let issueList = ["ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR"]
91+let issueList = ["ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-FAWKESMASK"]
9292
9393 let allArtefact = (artefacts ++ oldArtefacts)
9494
9595 func tryGetBoolean (key) = match getBoolean(this, key) {
9696 case b: Boolean =>
9797 b
9898 case _ =>
9999 false
100100 }
101101
102102
103103 func tryGetString (key) = match getString(this, key) {
104104 case a: String =>
105105 a
106106 case _ =>
107107 ""
108108 }
109109
110110
111111 func tryGetInteger (key) = match getInteger(this, key) {
112112 case a: Int =>
113113 a
114114 case _ =>
115115 0
116116 }
117117
118118
119119 func getRandomNumber (variants,txId,finishHeight,offset) = {
120120 let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1)))
121121 let randomHash = sha256(((base58'items' + txId) + value(randomSeedBlock.vrf)))
122122 (toInt(randomHash, offset) % variants)
123123 }
124124
125125
126126 func getRandomArtefact (boxId,h) = {
127127 let randomNumber = getRandomNumber(6, boxId, h, 1)
128128 artefacts[randomNumber]
129129 }
130130
131131
132132 func getRandomGenes (txId,h) = {
133133 let randomNumber = getRandomNumber(6, txId, h, 2)
134134 freeGenes[randomNumber]
135135 }
136136
137137
138138 func tryGetStringExternal (address,key) = match getString(address, key) {
139139 case a: String =>
140140 a
141141 case _ =>
142142 ""
143143 }
144144
145145
146146 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
147147
148148
149149 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
150150
151151
152152 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
153153
154154
155155 func getTrustedContracts () = tryGetStringExternal(getOracle(), staticKey_trustedContracts())
156156
157157
158158 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rebirthAddress())))
159159
160160
161161 func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
162162
163163
164164 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
165165
166166
167167 func getHuntDistroAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_huntDistroAddress())))
168168
169169
170170 func getWarsPKey () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_warsPKey()))
171171
172172
173173 func tryGetCosmeticItemPrice (item) = {
174174 let key = key_priceCosmetic(item)
175175 match getInteger(this, key) {
176176 case a: Int =>
177177 a
178178 case _ =>
179179 throw("ITGCIP: This item is not available in the store!")
180180 }
181181 }
182182
183183
184184 func asString (value) = match value {
185185 case string: String =>
186186 string
187187 case _ =>
188188 throw("wrong type, expected: String")
189189 }
190190
191191
192192 func asInt (value) = match value {
193193 case int: Int =>
194194 int
195195 case _ =>
196196 throw("wrong type, expected: Int")
197197 }
198198
199199
200200 func manipulateName (assetName,position,char) = ((take(assetName, (position - 1)) + char) + takeRight(assetName, (16 - position)))
201201
202202
203203 func itemIsInCoolDown (artefactName,artefactId) = {
204204 let unstakeHeightLast = tryGetInteger(key_unstakeHeight(artefactName, artefactId))
205205 let cooldownPeriod = 240
206206 if ((height > (unstakeHeightLast + cooldownPeriod)))
207207 then false
208208 else true
209209 }
210210
211211
212212 func isTestEnv () = tryGetBoolean("TESTENV")
213213
214214
215215 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
216216 then throw("WCAP: Please attach waves")
217217 else {
218218 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
219219 if ((payment.amount != feeAmount))
220220 then throw((("WCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
221221 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
222222 }
223223
224224
225+func itemMerger (baseItem,amountBaseItem,endItem,payments,feeAmount,feeAssetId,recipient,instantFinish,txId) = if ((size(payments) != (amountBaseItem + 1)))
226+ then throw((("IID: Please attach " + toString((amountBaseItem + 2))) + " payments!"))
227+ else {
228+ func isBaseItem (accumulated,pay) = {
229+ let assetId = value(pay.assetId)
230+ let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(assetId)], nil))
231+ if ((artefact == artefact))
232+ then if ((artefact == baseItem))
233+ then $Tuple2((accumulated._1 ++ [Burn(assetId, 1)]), (accumulated._2 + 1))
234+ else $Tuple2(accumulated._1, (accumulated._2 + 0))
235+ else throw("Strict value is not equal to itself.")
236+ }
237+
238+ let totalBaseItem = {
239+ let $l = payments
240+ let $s = size($l)
241+ let $acc0 = $Tuple2(nil, 0)
242+ func $f0_1 ($a,$i) = if (($i >= $s))
243+ then $a
244+ else isBaseItem($a, $l[$i])
245+
246+ func $f0_2 ($a,$i) = if (($i >= $s))
247+ then $a
248+ else throw("List size exceeds 8")
249+
250+ $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)
251+ }
252+ if ((totalBaseItem._2 != amountBaseItem))
253+ then throw(((("IID: Please attach " + toString(amountBaseItem)) + " artefacts of type ") + baseItem))
254+ else {
255+ let feePayment = payments[amountBaseItem]
256+ if ((feePayment.assetId != feeAssetId))
257+ then throw("IID: You miss a payment with the fee!")
258+ else if ((feePayment.amount != feeAmount))
259+ then throw("IID: You did not attach the correct fee amount!")
260+ else {
261+ let artefact = Issue(endItem, ("NFT artefact of Waves Ducks game: " + endItem), 1, 0, false, unit, 0)
262+ let artefactId = calculateAssetId(artefact)
263+ let instant = if (instantFinish)
264+ then $Tuple2([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), endItem), ScriptTransfer(recipient, 1, artefactId)], toBase58String(artefactId))
265+ else $Tuple2(nil, "")
266+ $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)
267+ }
268+ }
269+ }
270+
271+
272+func getAmountBaseItem (baseItem) = getIntegerValue((("merge_" + baseItem) + "_amount"))
273+
274+
275+func getEndItem (baseItem) = getStringValue((("merge_" + baseItem) + "_endItem"))
276+
277+
278+func getPrice (baseItem) = getIntegerValue((("merge_" + baseItem) + "_price"))
279+
280+
281+func getInstant (baseItem) = getBooleanValue((("merge_" + baseItem) + "_instant"))
282+
283+
284+func getAsset (baseItem) = {
285+ let asset = getStringValue((("merge_" + baseItem) + "_asset"))
286+ if ((asset == "WAVES"))
287+ then unit
288+ else fromBase58String(asset)
289+ }
290+
291+
292+@Callable(i)
293+func instanMergeItem (baseItem) = if ((baseItem != "ART-KATANA"))
294+ then throw("IID: Only Katana can be merged!")
295+ else {
296+ let params = $Tuple5(getAmountBaseItem(baseItem), getEndItem(baseItem), getPrice(baseItem), getAsset(baseItem), getInstant(baseItem))
297+ itemMerger(baseItem, params._1, params._2, i.payments, params._3, params._4, i.caller, params._5, toBase58String(i.transactionId))
298+ }
299+
300+
301+
225302 @Callable(i)
226303 func directBuyItem (itemName) = {
227304 let basePrice = tryGetCosmeticItemPrice(itemName)
228305 let grow = tryGetInteger(key_growPercentageCosmetic(itemName))
229306 let startTs = tryGetInteger(key_startTsCosmetic(itemName))
230307 let endTs = tryGetInteger(key_endTsCosmetic(itemName))
231308 if (if ((startTs != 0))
232309 then (startTs > lastBlock.timestamp)
233310 else false)
234311 then throw("IDBI: The sale did not start yet!")
235312 else if (if ((endTs != 0))
236313 then (lastBlock.timestamp > endTs)
237314 else false)
238315 then throw("IDBI: The sale has already finished!")
239316 else if (!(tryGetBoolean(key_saleCosmetic(itemName))))
240317 then throw(("IDBI: Item not for sale anymore" + key_saleCosmetic(itemName)))
241318 else {
242319 let maxSalesValue = tryGetInteger(key_maxSalesCosmetic(itemName))
243320 let soldValue = tryGetInteger(key_soldCosmetic(itemName))
244321 let price = if ((grow == 0))
245322 then basePrice
246323 else (basePrice + ((basePrice / 100) * (soldValue * grow)))
247324 if (if ((maxSalesValue != 0))
248325 then (soldValue >= maxSalesValue)
249326 else false)
250327 then throw("IDBI: Max editions sold!")
251328 else {
252329 let assetId = if ((tryGetString(key_priceAssetCosmetic(itemName)) == ""))
253330 then getEggAssetId()
254331 else if ((tryGetString(key_priceAssetCosmetic(itemName)) == "WAVES"))
255332 then unit
256333 else fromBase58String(tryGetString(key_priceAssetCosmetic(itemName)))
257334 let amountPaidByCoupons = 0
258335 let leftToPay = (price - amountPaidByCoupons)
259336 let validPayment = checkAdditionalPayment(i.payments[0])
260337 let firstPayment = value(i.payments[1])
261338 let amount = firstPayment.amount
262339 if ((firstPayment.assetId != assetId))
263340 then throw("IDBI: You can attach only tokens with the correct payment ")
264341 else if ((amount != leftToPay))
265342 then throw(("IDBI: Please attach the exact asset amount" + toString(price)))
266343 else {
267344 let txIdStr = toBase58String(i.transactionId)
268345 let address = i.originCaller
269346 let artefact = Issue(itemName, ("NFT artefact of Waves Ducks game: " + itemName), 1, 0, false, unit, 0)
270347 let artefactId = calculateAssetId(artefact)
271348 $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))
272349 }
273350 }
274351 }
275352 }
276353
277354
278355
279356 @Callable(i)
280357 func manipulateBoost (boost,duckId) = {
281358 let allowedContracts = getTrustedContracts()
282359 let allowedContractsList = split(allowedContracts, ";")
283360 let dappToCall = toString(i.caller)
284361 if ((indexOf(allowedContractsList, dappToCall) == unit))
285362 then throw("IMB: This smart contract can't manipulate the boost!")
286363 else {
287364 let key = key_externalBoostDuck(duckId)
288365 let activeBoost = tryGetInteger(key)
289366 let newBoost = (activeBoost + boost)
290367 if ((0 > newBoost))
291368 then throw("IMB: Something went wrong with boost, please contact the admins!")
292369 else [IntegerEntry(key, newBoost)]
293370 }
294371 }
295372
296373
297374
298375 @Callable(i)
299376 func manipulateBoostAccount (boost,address) = {
300377 let allowedContracts = getTrustedContracts()
301378 let allowedContractsList = split(allowedContracts, ";")
302379 let dappToCall = toString(i.caller)
303380 if ((indexOf(allowedContractsList, dappToCall) == unit))
304381 then throw("IMBA: This smart contract can't manipulate the boost!")
305382 else {
306383 let key = key_externalBoostAddress(address)
307384 let activeBoost = tryGetInteger(key)
308385 let newBoost = (activeBoost + boost)
309386 if ((0 > newBoost))
310387 then throw("IMBA: Something went wrong with boost, please contact the admins!")
311388 else [IntegerEntry(key, newBoost)]
312389 }
313390 }
314391
315392
316393
317394 @Callable(i)
318395 func checkArtefactDetails (assetId) = {
319396 let asset = value(assetInfo(fromBase58String(assetId)))
320397 let assetName = value(asset.name)
321398 if (if (if (containsElement(allArtefact, assetName))
322399 then true
323400 else isDefined(tryGetCosmeticItemPrice(assetName)))
324401 then (asset.issuer == this)
325402 else false)
326403 then $Tuple2(nil, assetName)
327404 else throw("Invalid artefact")
328405 }
329406
330407
331408
332409 @Callable(i)
333410 func configureOracle (oracle) = if ((i.caller != this))
334411 then throw("admin only")
335412 else [StringEntry(staticKey_oracleAddress(), oracle)]
336413
337414
338415
339416 @Callable(i)
340417 func calculateFarmingPowerBoost (duckId,address) = {
341418 let externalBoostDuck = tryGetInteger(key_externalBoostDuck(duckId))
342419 let externalBoostAddress = tryGetInteger(key_externalBoostAddress(address))
343420 let totalBoost = (externalBoostDuck + externalBoostAddress)
344421 $Tuple2([IntegerEntry((duckId + "_last_boost"), totalBoost)], totalBoost)
345422 }
423+
424+
425+
426+@Callable(i)
427+func itemDuplicator () = if ((size(i.payments) != 4))
428+ then throw("IID: Three payments are needed!")
429+ else {
430+ let duplicatorPayment = value(i.payments[0])
431+ let itemPayment = value(i.payments[1])
432+ let eggPayment = value(i.payments[2])
433+ let validPayment = checkAdditionalPayment(i.payments[3])
434+ let duplicatorAssetId = toBase58String(value(duplicatorPayment.assetId))
435+ if ((duplicatorPayment.amount != 1))
436+ then throw("IID: Duplicator NFT is not attached")
437+ else {
438+ let itemAssetId = toBase58String(value(itemPayment.assetId))
439+ if ((itemPayment.amount != 1))
440+ then throw("IID: Item NFT is not attached")
441+ else {
442+ let eggAssetId = value(eggPayment.assetId)
443+ if ((eggAssetId != getEggAssetId()))
444+ 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)))
447+ else {
448+ let duplicatorArtefact = asString(invoke(this, "checkArtefactDetails", [duplicatorAssetId], nil))
449+ if ((duplicatorArtefact == duplicatorArtefact))
450+ then if ((duplicatorArtefact != "ART-DUPLI"))
451+ then throw("IID: You need to attach a ART-DUPLI artefact")
452+ else {
453+ let artefactName = asString(invoke(this, "checkArtefactDetails", [itemAssetId], nil))
454+ if ((artefactName == artefactName))
455+ then {
456+ let artefact = Issue(artefactName, ("NFT artefact of Waves Ducks game: " + artefactName), 1, 0, false, unit, 0)
457+ let artefactId = calculateAssetId(artefact)
458+ $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))
459+ }
460+ else throw("Strict value is not equal to itself.")
461+ }
462+ else throw("Strict value is not equal to itself.")
463+ }
464+ }
465+ }
466+ }
346467
347468
348469
349470 @Callable(i)
350471 func fixedGene (txIdStr,parentFixedGene,positionFixedGene) = {
351472 let firstPayment = value(i.payments[0])
352473 let validPayment = checkAdditionalPayment(i.payments[1])
353474 let firstAssetId = toBase58String(value(firstPayment.assetId))
354475 if ((firstPayment.amount != 1))
355476 then throw("NFT is not attached")
356477 else {
357478 let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
358479 if ((artefact == artefact))
359480 then if ((artefact != "ART-FIXGENE"))
360481 then throw("You need to attach a ART-FIXGENE artefact")
361482 else {
362483 let txId = fromBase58String(txIdStr)
363484 let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
364485 let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
365486 let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
366487 if ((duckGenesString == duckGenesString))
367488 then {
368489 let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], [i.payments[1], i.payments[2]])
369490 if ((call == call))
370491 then [Burn(value(firstPayment.assetId), 1)]
371492 else throw("Strict value is not equal to itself.")
372493 }
373494 else throw("Strict value is not equal to itself.")
374495 }
375496 else throw("Strict value is not equal to itself.")
376497 }
377498 }
378499
379500
380501
381502 @Callable(i)
382503 func freeGene (txIdStr) = {
383504 let firstPayment = value(i.payments[0])
384505 let firstAssetId = toBase58String(value(firstPayment.assetId))
385506 if ((firstPayment.amount != 1))
386507 then throw("NFT is not attached")
387508 else {
388509 let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
389510 if ((artefact == artefact))
390511 then if ((artefact != "ART-FREEGENE"))
391512 then throw("You need to attach a ART-FREEGENE artefact")
392513 else {
393514 let txId = fromBase58String(txIdStr)
394515 let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
395516 let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
396517 let selectedGene = getRandomGenes(txId, processFinishHeight)
397518 let randomPosition = getRandomNumber(7, txId, processFinishHeight, 3)
398519 let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, 0, 0, selectedGene, randomPosition], nil))
399520 if ((duckGenesString == duckGenesString))
400521 then {
401522 let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], [i.payments[1], i.payments[2]])
402523 if ((call == call))
403524 then [Burn(value(firstPayment.assetId), 1)]
404525 else throw("Strict value is not equal to itself.")
405526 }
406527 else throw("Strict value is not equal to itself.")
407528 }
408529 else throw("Strict value is not equal to itself.")
409530 }
410531 }
411532
412533
413534
414535 @Callable(i)
415536 func copyDuck () = {
416537 let firstPayment = value(i.payments[0])
417538 let secondPayment = value(i.payments[1])
418539 let validPayment = checkAdditionalPayment(i.payments[2])
419540 let firstAssetId = toBase58String(value(firstPayment.assetId))
420541 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
421542 if ((children == children))
422543 then if (if ((firstPayment.amount != 1))
423544 then true
424545 else (secondPayment.amount != 1))
425546 then throw("NFT is not attached")
426547 else {
427548 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
428549 if ((artefact == artefact))
429550 then if ((artefact != "ART-MIRROR"))
430551 then throw("You need to attach a ART-MIRROR artefact")
431552 else {
432553 let nftInfo = value(assetInfo(value(firstPayment.assetId)))
433554 let asset1Gen = split(nftInfo.name, "")
434555 if (if ((asset1Gen[14] == "G"))
435556 then true
436557 else (asset1Gen[14] == "J"))
437558 then throw("You can't mirror this duck")
438559 else {
439560 let duckGen = nftInfo.name
440561 let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
441562 if ((call == call))
442563 then ([ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)] ++ validPayment)
443564 else throw("Strict value is not equal to itself.")
444565 }
445566 }
446567 else throw("Strict value is not equal to itself.")
447568 }
448569 else throw("Strict value is not equal to itself.")
449570 }
450571
451572
452573
453574 @Callable(i)
454575 func addArteFactToDuck () = {
455576 let firstPayment = value(i.payments[0])
456577 let secondPayment = value(i.payments[1])
457578 let validPayment = checkAdditionalPayment(i.payments[2])
458579 let firstAssetId = toBase58String(value(firstPayment.assetId))
459580 if (if ((firstPayment.amount != 1))
460581 then true
461582 else (secondPayment.amount != 1))
462583 then throw("NFT is not attached")
463584 else {
464585 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
465586 if ((children == children))
466587 then if ((children == 0))
467588 then throw("You can only pick a sterile NFT-duck")
468589 else {
469590 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
470591 if ((artefact == artefact))
471592 then if (if ((artefact != "ART-XHAT"))
472593 then (artefact != "ART-POMP")
473594 else false)
474595 then throw("You need to attach a ART-XHAT or ART-POMP artefact")
475596 else {
476597 let nftInfo = value(assetInfo(value(firstPayment.assetId)))
477598 let asset1Gen = split(nftInfo.name, "")
478599 if (if ((asset1Gen[14] == "G"))
479600 then true
480601 else (asset1Gen[14] == "J"))
481602 then throw("You can't mirror this duck")
482603 else if (if ((asset1Gen[5] == "S"))
483604 then true
484605 else (asset1Gen[5] == "T"))
485606 then throw("you already attached a artefact")
486607 else {
487608 let char = if ((artefact == "ART-XHAT"))
488609 then "T"
489610 else if ((artefact == "ART-POMP"))
490611 then "S"
491612 else throw("No char defined")
492613 let oldDuckGen = nftInfo.name
493614 let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil))
494615 if ((oldFarmGen == oldFarmGen))
495616 then {
496617 let duckGen = manipulateName(oldDuckGen, 6, char)
497618 let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
498619 if ((call == call))
499620 then {
500621 let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil)
501622 if ((callReduce == callReduce))
502623 then ([Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)] ++ validPayment)
503624 else throw("Strict value is not equal to itself.")
504625 }
505626 else throw("Strict value is not equal to itself.")
506627 }
507628 else throw("Strict value is not equal to itself.")
508629 }
509630 }
510631 else throw("Strict value is not equal to itself.")
511632 }
512633 else throw("Strict value is not equal to itself.")
513634 }
514635 }
515636
516637
517638
518639 @Callable(i)
519640 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)]
520641
521642
522643
523644 @Callable(i)
524645 func issueArtefact (type,receiver) = if (if (if (if (if ((i.caller != this))
525646 then (i.caller != getRebirthAddress())
526647 else false)
527648 then (i.caller != getTurtleRebirthAddress())
528649 else false)
529650 then (i.caller != getHuntDistroAddress())
530651 else false)
531652 then (i.callerPublicKey != getWarsPKey())
532653 else false)
533654 then throw("admin only")
534655 else if (if (if (if ((i.caller == getHuntDistroAddress()))
535656 then true
536657 else (i.callerPublicKey == getWarsPKey()))
537658 then !(contains(type, "ART-FIRE_"))
538659 else false)
539- then !(containsElement(issueList, type))
660+ then !(tryGetBoolean((type + "_issue")))
540661 else false)
541- then throw("FIRE ITEM ONLY!")
662+ then throw("FIRE AND WHITELIST ITEM ONLY!")
542663 else {
543664 let txIdStr = toBase58String(i.transactionId)
544665 let address = Address(fromBase58String(receiver))
545- let artefact = Issue(type, "NFT artefact of Waves Ducks game. Drop #2.", 1, 0, false, unit, 0)
666+ let artefact = Issue(type, "NFT artefact of Waves Ducks game.", 1, 0, false, unit, 0)
546667 let artefactId = calculateAssetId(artefact)
547668 $Tuple2([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), type), ScriptTransfer(address, 1, artefactId)], toBase58String(artefactId))
548669 }
549670
550671
551672
552673 @Callable(i)
553674 func setLock (n) = if ((i.caller == this))
554675 then [IntegerEntry("global_locked", n)]
555676 else throw("admin only")
556-
557-
558-
559-@Callable(i)
560-func buyArtefact () = if ((lastBlock.timestamp > 1639742400000))
561- then throw("There are no active sales now... ")
562- else if ((tryGetInteger("global_locked") > 0))
563- then throw("contract is temporarily locked")
564- else if ((tryGetInteger("global_artAmount") >= artefactsLimit))
565- then throw("SOLDOUT!!! Hurray!")
566- else if (if ((1639605600000 > lastBlock.timestamp))
567- then (i.caller != Address(devAddress))
568- else false)
569- then throw("Too early...")
570- else {
571- let firstPayment = value(i.payments[0])
572- if ((firstPayment.assetId != getEggAssetId()))
573- then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
574- else if ((eggsNeeded > firstPayment.amount))
575- then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded)))
576- 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))]
577- }
578677
579678
580679
581680 @Callable(i)
582681 func addItemToStore (price,item,maxSales,sale,pricesset,growthPercentage,startTs,endTs) = if ((i.caller != addressFromStringValue(tryGetStringExternal(getOracle(), staticKey_pipelineUser()))))
583682 then throw("IAITS: Only for trusted users!")
584683 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)]
585684
586685
587686
588687 @Callable(i)
589688 func setGlobalArtAmount (newAmount) = if (if ((i.caller == this))
590689 then true
591690 else (i.caller == Address(devAddress)))
592691 then [IntegerEntry("global_artAmount", newAmount)]
593692 else throw("Permission denied")
594-
595-
596-
597-@Callable(i)
598-func claimArtefact (boxIdStr) = {
599- let txId = fromBase58String(boxIdStr)
600- let statusKey = (((toString(i.caller) + "_") + boxIdStr) + "_status")
601- let heightKey = (((toString(i.caller) + "_") + boxIdStr) + "_finishHeight")
602- if ((getStringValue(statusKey) != "started"))
603- then throw("claimed already")
604- else if ((getIntegerValue(heightKey) > height))
605- then throw("you cannot claim yet")
606- else {
607- let artType = getRandomArtefact(txId, getIntegerValue(heightKey))
608- let asset = Issue(artType, "Artefact of Waves Ducks metaverse.", 1, 0, false, unit, getIntegerValue(heightKey))
609- let assetId = calculateAssetId(asset)
610-[StringEntry(statusKey, artType), StringEntry((((toString(i.caller) + "_") + boxIdStr) + "_artefactId"), toBase58String(assetId)), StringEntry((toBase58String(assetId) + "_type"), artType), asset, ScriptTransfer(i.caller, 1, assetId)]
611- }
612- }
613693
614694
615695 @Verifier(tx)
616696 func verify () = if (isTestEnv())
617697 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
618698 else {
619699 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
620700 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
621701 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
622702 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
623703 then 1
624704 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
625705 then 1
626706 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
627707 then 1
628708 else 0
629709 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
630710 then 1
631711 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
632712 then 1
633713 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
634714 then 1
635715 else 0
636716 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
637717 then 1
638718 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
639719 then 1
640720 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
641721 then 1
642722 else 0
643723 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
644724 match tx {
645725 case _ =>
646726 (signaturesCount >= 2)
647727 }
648728 }
649729

github/deemru/w8io/3ef1775 
81.76 ms