tx · DE8TGRBBv6F8SGvRMjthuYyVeW7oUJPKJNKWrMTtYwRX

3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX:  -0.01500000 Waves

2022.08.11 13:16 [3245170] smart account 3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX > SELF 0.00000000 Waves

{ "type": 13, "id": "DE8TGRBBv6F8SGvRMjthuYyVeW7oUJPKJNKWrMTtYwRX", "fee": 1500000, "feeAssetId": null, "timestamp": 1660213065092, "version": 2, "chainId": 87, "sender": "3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX", "senderPublicKey": "27DK15MykfnsVojpifD1gbr8kRr8rpY5mw6EH4zL8R25", "proofs": [ "2LpJB7FfaMdGnsC5uZPYUoijecQZZEapCqPbNzSCx7RieR9CtBeJZqC7tvRpaiWvD4FvoSTupT8LtBMRzZoLXNgV" ], "script": "base64:BgIfCAISAwoBCBIAEgUKAwgIARIGCgQICAEBEgMKAQgSACsBFHRyeUdldFN0cmluZ0V4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABFXRyeUdldEludGVnZXJFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJoIAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQ10cnlHZXRCb29sZWFuAQNrZXkEByRtYXRjaDAJAKAIAQUDa2V5AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAFAWIHAQx0cnlHZXRTdHJpbmcBA2tleQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgUEdGhpcwUDa2V5AQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwECFHN0YXRpY19vcmFjbGVBZGRyZXNzARBnZXREdWNrbGluZ1ByaWNlAAkBFXRyeUdldEludGVnZXJFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhRzdGF0aWNfZHVja2xpbmdQcmljZQENZ2V0RWdnQXNzZXRJZAAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACEXN0YXRpY19lZ2dBc3NldElkAQ9nZXRTcGljZUFzc2V0SWQACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhNzdGF0aWNfc3BpY2VBc3NldElkARFnZXRSZWJpcnRoQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIVc3RhdGljX3JlYmlydGhBZGRyZXNzARNnZXRJbmN1YmF0b3JBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhdzdGF0aWNfaW5jdWJhdG9yQWRkcmVzcwERZ2V0Q291cG9uc0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACFXN0YXRpY19jb3Vwb25zQWRkcmVzcwEOZ2V0QnVybkFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACEnN0YXRpY19idXJuQWRkcmVzcwANYmFja2VuZFB1YktleQEgoDCy4rCf80EEjcXf21TkTT+MhYwNT/IrVrGQdfl53jUADlNUQVJUVElNRVNUQU1QAIDVobjBLwAJTEFQTEVOR1RIAICupgoADURVQ0tMSU5HUFJJQ0UAgMLXLwAWcGVyY2VudEdyb3d0aFByZWNpc2lvbgCAgIT+pt7hEQAVZXhpc3RpbmdEdWNrUHJlY2lzaW9uAICA6YOx3hYAFktHbG9iYWxJc3N1ZWRUaW1lc3RhbXACF2dsb2JhbF9pc3N1ZWRfdGltZXN0YW1wAAdNU0lOREFZAIC4mSkBDGtleVRvdGFsRmVlZAEKZHVja2xpbmdJZAkArAICCQCsAgICCWR1Y2tsaW5nXwUKZHVja2xpbmdJZAIFX2ZlZWQBEWtleUR1Y2tsaW5nRmVkTGFwAQpkdWNrbGluZ0lkCQCsAgIJAKwCAgIJZHVja2xpbmdfBQpkdWNrbGluZ0lkAgdfZmVkTGFwARdrZXlEdWNrbGluZ0ZlZFRpbWVzdGFtcAEKZHVja2xpbmdJZAkArAICCQCsAgICCWR1Y2tsaW5nXwUKZHVja2xpbmdJZAIGX2ZlZFRzARprZXlEdWNrbGluZ0ZlZExhcFRpbWVzdGFtcAIKZHVja2xpbmdJZANsYXAJAKwCAgkArAICCQCsAgIJAKwCAgIJZHVja2xpbmdfBQpkdWNrbGluZ0lkAgVfbGFwXwkApAMBBQNsYXACBl9mZWRUcwEWa2V5QWRkcmVzc0ZlZFRpbWVzdGFtcAMHYWRkcmVzcwNsYXAJdGltZXN0YW1wCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCBV9sYXBfCQCkAwEFA2xhcAIHX2ZlZFRzXwkApAMBBQl0aW1lc3RhbXABD2tleUFkZHJlc3NOb25jZQEHYWRkcmVzcwkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgZfbm9uY2UBG2tleUR1Y2tsaW5nRmVkTGFzdFRpbWVzdGFtcAEKZHVja2xpbmdJZAkArAICCQCsAgICCWR1Y2tsaW5nXwUKZHVja2xpbmdJZAIKX2ZlZExhc3RUcwEQa2V5RHVja2xpbmdMZXZlbAEKZHVja2xpbmdJZAkArAICCQCsAgICCWR1Y2tsaW5nXwUKZHVja2xpbmdJZAIGX2xldmVsAQ1rZXlGZWVkRm9yTGFwAgdhZGRyZXNzA2xhcAkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIFX2xhcF8JAKQDAQUDbGFwAgVfZmVlZAEQa2V5RHVja2xpbmdHcm93bgEKZHVja2xpbmdJZAkArAICCQCsAgICCWR1Y2tsaW5nXwUKZHVja2xpbmdJZAIGX2dyb3duARJrZXlTdGFydEhhdGNoaW5nSWQBCmR1Y2tsaW5nSWQJAKwCAgkArAICAglkdWNrbGluZ18FCmR1Y2tsaW5nSWQCBl9ncm93bgESa2V5U3RhcnRQZXJjZW50YWdlAQpkdWNrbGluZ0lkCQCsAgIJAKwCAgIJZHVja2xpbmdfBQpkdWNrbGluZ0lkAhBfc3RhcnRQZXJjZW50YWdlAQhrZXlPd25lcgEKZHVja2xpbmdJZAkArAICCQCsAgICCWR1Y2tsaW5nXwUKZHVja2xpbmdJZAIGX293bmVyAQ5rZXlCbGFja2xpc3RlZAEKZHVja2xpbmdJZAkArAICCQCsAgICCWR1Y2tsaW5nXwUKZHVja2xpbmdJZAIMX2JsYWNrbGlzdGVkAQ10cnlHZXRJbnRlZ2VyAQNrZXkEA3ZhbAQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAAFA3ZhbAEHZ2V0Qm9vbAEDa2V5BAckbWF0Y2gwCQCbCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwEVZ2V0RHVja2xpbmdQZXJjZW50YWdlAQpkdWNrbGluZ0lkBBJwZXJjZW50YWdlRHVja2xpbmcJAQ10cnlHZXRJbnRlZ2VyAQkBEmtleVN0YXJ0UGVyY2VudGFnZQEFCmR1Y2tsaW5nSWQEBGJhc2UDCQECIT0CBRJwZXJjZW50YWdlRHVja2xpbmcAAAUScGVyY2VudGFnZUR1Y2tsaW5nABQJALYCAQkAaAIFBGJhc2UFFWV4aXN0aW5nRHVja1ByZWNpc2lvbgEVZ2V0Q3VycmVudExldmVsQmlnSW50AQpkdWNrbGluZ0lkBAprRHVja0xldmVsCQEQa2V5RHVja2xpbmdMZXZlbAEFCmR1Y2tsaW5nSWQEByRtYXRjaDAJAKIIAQUKa0R1Y2tMZXZlbAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKcDAQUBcwQHJG1hdGNoMQkAoAgBCQCsAgIJAKwCAgIJZHVja2xpbmdfBQpkdWNrbGluZ0lkAhFfaXNzdWVkQnlGZWVkQ2FsbAMJAAECBQckbWF0Y2gxAgdCb29sZWFuBAFiBQckbWF0Y2gxAwkAAAIFAWIGCQC2AgEAAAkBFWdldER1Y2tsaW5nUGVyY2VudGFnZQEFCmR1Y2tsaW5nSWQJARVnZXREdWNrbGluZ1BlcmNlbnRhZ2UBBQpkdWNrbGluZ0lkAQ1nZXRDdXJyZW50TGFwAAkAZAIJAGkCCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFDlNUQVJUVElNRVNUQU1QBQlMQVBMRU5HVEgAAQETZ2V0TGFzdEZlZFRpbWVzdGFtcAEKZHVja2xpbmdJZAQQbGFzdEZlZFRpbWVzdGFtcAkBDXRyeUdldEludGVnZXIBCQEba2V5RHVja2xpbmdGZWRMYXN0VGltZXN0YW1wAQUKZHVja2xpbmdJZAMJAGYCBRBsYXN0RmVkVGltZXN0YW1wAAAFEGxhc3RGZWRUaW1lc3RhbXAIBQlsYXN0QmxvY2sJdGltZXN0YW1wARljYWxjdWxhdGVOZXdEdWNrbGluZ0xldmVsAgpkdWNrbGluZ0lkDXBheW1lbnRBbW91bnQECWN1cnJlbnRUcwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEF2xhc3RGZWRUaW1lc3RhbXBDaGVja2VkCQETZ2V0TGFzdEZlZFRpbWVzdGFtcAEFCmR1Y2tsaW5nSWQEB2ZlZERpZmYJAGUCBQljdXJyZW50VHMFF2xhc3RGZWRUaW1lc3RhbXBDaGVja2VkBAdwZW5hbHR5CQC2AgEAAAQGZ3Jvd3RoCQC8AgMJALYCAQUNcGF5bWVudEFtb3VudAkAtgIBBRZwZXJjZW50R3Jvd3RoUHJlY2lzaW9uCQC2AgEFDURVQ0tMSU5HUFJJQ0UEDGN1cnJlbnRMZXZlbAkBFWdldEN1cnJlbnRMZXZlbEJpZ0ludAEFCmR1Y2tsaW5nSWQECG5ld0xldmVsCQC3AgIFDGN1cnJlbnRMZXZlbAUGZ3Jvd3RoBAZyZXN1bHQJAKYDAQUIbmV3TGV2ZWwJAJQKAgUGcmVzdWx0CQDMCAIJAKwCAgINY3VycmVudExldmVsPQkApgMBBQxjdXJyZW50TGV2ZWwJAMwIAgkArAICAgluZXdMZXZlbD0JAKYDAQUIbmV3TGV2ZWwJAMwIAgkArAICAgdncm93dGg9CQCmAwEFBmdyb3d0aAkAzAgCCQCsAgICCHBlbmFsdHk9CQCmAwEFB3BlbmFsdHkJAMwIAgkArAICAgpsYXN0RmVkVHM9CQCkAwEFF2xhc3RGZWRUaW1lc3RhbXBDaGVja2VkCQDMCAIJAKwCAgIIZmVkRGlmZj0JAKQDAQUHZmVkRGlmZgUDbmlsAQ9nZXRCYWNrZW5kUHJvb2YDDW1heEZlZWRBbW91bnQJdXNlck5vbmNlB2FkZHJlc3MJALkJAgkAzAgCCQCkAwEFDW1heEZlZWRBbW91bnQJAMwIAgkApAMBBQl1c2VyTm9uY2UJAMwIAgUHYWRkcmVzcwUDbmlsAgE7AQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAh5CQUk6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQGAWkBD2NvbmZpZ3VyZU9yYWNsZQEGb3JhY2xlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIPQkNPOiBhZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQICFHN0YXRpY19vcmFjbGVBZGRyZXNzBQZvcmFjbGUFA25pbAFpAQtidXlEdWNrbGluZwAECmV4YWN0UHJpY2UJARBnZXREdWNrbGluZ1ByaWNlAAMJAGYCAIDh6xcFCmV4YWN0UHJpY2UJAAIBAh9CQkQ6IEludmFsaWQgcHJpY2UgZnJvbSBvcmFjbGUhBBNhbW91bnRQYWlkQnlDb3Vwb25zCQEFYXNJbnQBCQD8BwQJARFnZXRDb3Vwb25zQWRkcmVzcwACCnVzZUNvdXBvbnMJAMwIAgUKZXhhY3RQcmljZQUDbmlsBQNuaWwDCQAAAgUTYW1vdW50UGFpZEJ5Q291cG9ucwUTYW1vdW50UGFpZEJ5Q291cG9ucwQJbGVmdFRvUGF5CQBlAgUKZXhhY3RQcmljZQUTYW1vdW50UGFpZEJ5Q291cG9ucwQHcGF5bWVudAMJAQIhPQIFCWxlZnRUb1BheQAABAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAMJAQIhPQIIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAkBDWdldEVnZ0Fzc2V0SWQACQACAQkArAICAkFCQkQ6IFlvdSBjYW4gYXR0YWNoIG9ubHkgRUdHIHRva2VucyB3aXRoIHRoZSBmb2xsb3dpbmcgYXNzZXQgaWQ6IAkA2AQBCQENZ2V0RWdnQXNzZXRJZAADCQECIT0CCAUMZmlyc3RQYXltZW50BmFtb3VudAUJbGVmdFRvUGF5CQACAQkArAICAkhCQkQ6IFRvIGJ1eSBhIHBlcmNoIHlvdSBjdXJyZW50bHkgbmVlZCB0aGUgZm9sbG93aW5nIGFtb3VudCBvZiBFR0dsZXRzOiAJAKQDAQUJbGVmdFRvUGF5BAhidXJuQ2FsbAkA/AcECQEOZ2V0QnVybkFkZHJlc3MAAhRidXJuQXR0YWNoZWRQYXltZW50cwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQENZ2V0RWdnQXNzZXRJZAAFCWxlZnRUb1BheQUDbmlsAwkAAAIFCGJ1cm5DYWxsBQhidXJuQ2FsbAUJbGVmdFRvUGF5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAADCQAAAgUHcGF5bWVudAUHcGF5bWVudAQPZHVja2xpbmdBc3NldElkCQD8BwQFBHRoaXMCEWlzc3VlRnJlZUR1Y2tsaW5nCQDMCAIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQDMCAIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkAzAgCAAAFA25pbAUDbmlsAwkAAAIFD2R1Y2tsaW5nQXNzZXRJZAUPZHVja2xpbmdBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERaXNzdWVGcmVlRHVja2xpbmcDB2FkZHJlc3MHdHhJZFN0cgpwZXJjZW50YWdlAwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkBAiE9AggFAWkGY2FsbGVyCQERZ2V0UmViaXJ0aEFkZHJlc3MABwkAAgECI0JJRkQ6IFlvdSBjYW4ndCBpc3N1ZSBmcmVlIGR1Y2tsaW5nBAVhc3NldAkAwwgHAhBCQUJZLTExMTExMTExLUdaAgAAAQAABwUEdW5pdAUGaGVpZ2h0BAdhc3NldElkCQC4CAEFBWFzc2V0CQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUHYWRkcmVzcwIBXwUHdHhJZFN0cgIDX2RpCQDYBAEFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQICDHN0YXRzX2Ftb3VudAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQIMc3RhdHNfYW1vdW50AAEJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICAglkdWNrbGluZ18JANgEAQUHYXNzZXRJZAIRX2lzc3VlZEJ5RmVlZENhbGwJAAACCAUBaQZjYWxsZXIFBHRoaXMJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlTdGFydFBlcmNlbnRhZ2UBCQDYBAEFB2Fzc2V0SWQFCnBlcmNlbnRhZ2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCGtleU93bmVyAQkA2AQBBQdhc3NldElkBQdhZGRyZXNzCQDMCAIFBWFzc2V0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQV2YWx1ZQEJAKYIAQUHYWRkcmVzcwABBQdhc3NldElkBQNuaWwJANgEAQUHYXNzZXRJZAFpAQxmZWVkRHVja2xpbmcECmR1Y2tsaW5nSWQQYmFja2VuZFNpZ25hdHVyZQ1tYXhGZWVkQW1vdW50CXVzZXJOb25jZQQNYWRkcmVzc1N0cmluZwkApQgBCAUBaQZjYWxsZXIEDGJhY2tlbmRQcm9vZgkBD2dldEJhY2tlbmRQcm9vZgMFDW1heEZlZWRBbW91bnQFCXVzZXJOb25jZQUNYWRkcmVzc1N0cmluZwQNa0FkZHJlc3NOb25jZQkBD2tleUFkZHJlc3NOb25jZQEFDWFkZHJlc3NTdHJpbmcEDGN1cnJlbnROb25jZQkBDXRyeUdldEludGVnZXIBBQ1rQWRkcmVzc05vbmNlBA5yZWFsRHVja2xpbmdJZAMJAQEhAQkAxBMDCQCbAwEFDGJhY2tlbmRQcm9vZgkA2QQBBRBiYWNrZW5kU2lnbmF0dXJlBQ1iYWNrZW5kUHViS2V5CQACAQIfQkZEOiBJbnZhbGlkIHByb29mIGZyb20gYmFja2VuZAMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQECIT0CCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJAQ9nZXRTcGljZUFzc2V0SWQACQACAQIuQkZEOiBCYWQgcGF5bWVudCBhdHRhY2hlZCAoYXNzZXRbc10gb3IgYW1vdW50KQMJAQdnZXRCb29sAQkBEGtleUR1Y2tsaW5nR3Jvd24BBQpkdWNrbGluZ0lkCQACAQIeQkZEOiBEdWNrbGluZyBpcyBhbHJlYWR5IGdyb3duAwkBAiE9AgUJdXNlck5vbmNlCQBkAgUMY3VycmVudE5vbmNlAAEJAAIBCQCsAgIJAKwCAgkArAICAhpCRkQ6IFVzZXIgTm9uY2Ugc2hvdWxkIGJlIAkApAMBBQxjdXJyZW50Tm9uY2UCFSArIDEsIHdoaWxlIHJlY2VpdmVkIAkApAMBBQl1c2VyTm9uY2UEC2JsYWNrTGlzdGVkCQENdHJ5R2V0Qm9vbGVhbgEJAQ5rZXlCbGFja2xpc3RlZAEFCmR1Y2tsaW5nSWQDBQtibGFja0xpc3RlZAkAAgECJ0JGRDogQ2FuIG5vdCBmZWVkIGJsYWNrbGlzdGVkIGR1Y2tsaW5nIQMJAAACBQpkdWNrbGluZ0lkAgAJAAIBAiFCRkQ6IFBsZWFzZSBidXkgYSBkdWNrbGluZyBmaXJzdCEED2R1Y2tsaW5nSWRDaGVjawkBBXZhbHVlAQkA7AcBCQDZBAEFCmR1Y2tsaW5nSWQDCQECIT0CCQDwBwIIBQFpBmNhbGxlcggFD2R1Y2tsaW5nSWRDaGVjawJpZAABCQACAQIpQkZEOiBZb3UncmUgbm90IHRoZSBvd25lciBvZiB0aGUgZHVja2xpbmcDCQECIT0CCAUPZHVja2xpbmdJZENoZWNrBmlzc3VlcgUEdGhpcwkAAgECJEJGRDogQ2FudCBmaW5kIGR1Y2tsaW5nIHdpdGggc3VjaCBpZAkA2AQBCAUPZHVja2xpbmdJZENoZWNrAmlkBBJrRHVja2xpbmdMYXN0RmVkVHMJARtrZXlEdWNrbGluZ0ZlZExhc3RUaW1lc3RhbXABBQpkdWNrbGluZ0lkBAlsYXN0RmVkVHMJARNnZXRMYXN0RmVkVGltZXN0YW1wAQUOcmVhbER1Y2tsaW5nSWQEDmN1cnJlbnRQYXltZW50CAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQJa05ld0xldmVsCQEQa2V5RHVja2xpbmdMZXZlbAEFDnJlYWxEdWNrbGluZ0lkBAprVG90YWxGZWVkCQEMa2V5VG90YWxGZWVkAQUOcmVhbER1Y2tsaW5nSWQECXRvdGFsRmVlZAkBDXRyeUdldEludGVnZXIBBQprVG90YWxGZWVkBAxrRmVlZFR4U3RhdHMJAKwCAgkArAICCQCsAgICCWR1Y2tsaW5nXwUOcmVhbER1Y2tsaW5nSWQCBl9zdGF0XwkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQUa0FkZHJlc3NGZWRUaW1lc3RhbXAJARZrZXlBZGRyZXNzRmVkVGltZXN0YW1wAwUNYWRkcmVzc1N0cmluZwkBDWdldEN1cnJlbnRMYXAACAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQYa0R1Y2tsaW5nRmVkTGFwVGltZXN0YW1wCQEaa2V5RHVja2xpbmdGZWRMYXBUaW1lc3RhbXACBQ5yZWFsRHVja2xpbmdJZAkBDWdldEN1cnJlbnRMYXAABA9rRHVja2xpbmdGZWRMYXAJARFrZXlEdWNrbGluZ0ZlZExhcAEFDnJlYWxEdWNrbGluZ0lkAwkAZgIFDmN1cnJlbnRQYXltZW50BQ1tYXhGZWVkQW1vdW50CQACAQkArAICAj9CRkQ6IENhbm5vdCBmZWVkIGR1Y2tsaW5nIGZvciBzdWNoIGFtb3VudCwgbWF4IGZlZWQgYW1vdW50IGlzOiAJAKQDAQUNbWF4RmVlZEFtb3VudAQQY2FsY3VsYXRlUmVzdWx0cwkBGWNhbGN1bGF0ZU5ld0R1Y2tsaW5nTGV2ZWwCBQ5yZWFsRHVja2xpbmdJZAkAaQIFDmN1cnJlbnRQYXltZW50AGQEDWR1Y2tsaW5nT3duZXIJAQx0cnlHZXRTdHJpbmcBCQEIa2V5T3duZXIBBQ5yZWFsRHVja2xpbmdJZAMJAQIhPQIFDWR1Y2tsaW5nT3duZXIJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAQxCb29sZWFuRW50cnkCCQEOa2V5QmxhY2tsaXN0ZWQBBQ5yZWFsRHVja2xpbmdJZAYFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa0FkZHJlc3NOb25jZQkAZAIFDGN1cnJlbnROb25jZQABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrRHVja2xpbmdMYXN0RmVkVHMIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQprVG90YWxGZWVkCQBkAgUJdG90YWxGZWVkBQ5jdXJyZW50UGF5bWVudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa0ZlZWRUeFN0YXRzBQ5jdXJyZW50UGF5bWVudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa0FkZHJlc3NGZWRUaW1lc3RhbXAFDmN1cnJlbnRQYXltZW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRhrRHVja2xpbmdGZWRMYXBUaW1lc3RhbXAFDmN1cnJlbnRQYXltZW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rRHVja2xpbmdGZWRMYXAJAQ1nZXRDdXJyZW50TGFwAAkAzAgCCQELU3RyaW5nRW50cnkCBQlrTmV3TGV2ZWwIBRBjYWxjdWxhdGVSZXN1bHRzAl8xCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUMa0ZlZWRUeFN0YXRzAgZfZGVidWcJALkJAggFEGNhbGN1bGF0ZVJlc3VsdHMCXzICATsFA25pbAFpAQlmaXhMZXZlbHMBC2R1Y2tsaW5nSWRzAwMJAQIhPQIIBQFpD2NhbGxlclB1YmxpY0tleQEg4jCrQaSaRY9uaPb/iI1dy/xcgsAiOBaUksF2pAJAViIJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwcJAAIBAhNCRkw6IE5vdCBhdXRob3JpemVkBA9kdWNrbGluZ0lkc0xpc3QJAQV2YWx1ZQEJALUJAgULZHVja2xpbmdJZHMCASwKAQhoYW5kbGVJZAIDYWNjAmlkBAprVG90YWxGZWVkCQEMa2V5VG90YWxGZWVkAQUCaWQECXRvdGFsRmVlZAkBDXRyeUdldEludGVnZXIBBQprVG90YWxGZWVkBAlrTmV3TGV2ZWwJARBrZXlEdWNrbGluZ0xldmVsAQUCaWQEDXN0YXJ0aW5nTGV2ZWwEByRtYXRjaDAJAKAIAQkArAICCQCsAgICCWR1Y2tsaW5nXwUCaWQCEV9pc3N1ZWRCeUZlZWRDYWxsAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDADCQAAAgUBYgYJALYCAQAACQEVZ2V0RHVja2xpbmdQZXJjZW50YWdlAQUCaWQJARVnZXREdWNrbGluZ1BlcmNlbnRhZ2UBBQJpZAQGZ3Jvd3RoCQC8AgMJALYCAQUJdG90YWxGZWVkCQC2AgEFFnBlcmNlbnRHcm93dGhQcmVjaXNpb24JALYCAQUNRFVDS0xJTkdQUklDRQkAzggCBQNhY2MJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa05ld0xldmVsCQCmAwEJALcCAgUNc3RhcnRpbmdMZXZlbAUGZ3Jvd3RoBQNuaWwKAAIkbAUPZHVja2xpbmdJZHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhoYW5kbGVJZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAWkBFHR1cm5EdWNrbGluZ0ludG9EdWNrAAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEBHR4SWQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAQUbGFzdElzc3VlZER1Y2tsaW5nVHMJAQ10cnlHZXRJbnRlZ2VyAQUWS0dsb2JhbElzc3VlZFRpbWVzdGFtcAQLZml2ZU1pbkluTXMJAGgCCQBoAgAFADwA6AcECHRpbWVEaWZmCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAGQCBRRsYXN0SXNzdWVkRHVja2xpbmdUcwULZml2ZU1pbkluTXMDAwkAZgIFFGxhc3RJc3N1ZWREdWNrbGluZ1RzAAAJAGYCAAAFCHRpbWVEaWZmBwkAAgEJAKwCAgkArAICAkJCVEQ6IENhbiBpc3N1ZSBkdWNrbGluZ3Mgb25seSBvbmNlIHBlciA1IG1pbnV0ZXMsIHBsZWFzZSB3YWl0IGZvciAJAKQDAQkAawMFCHRpbWVEaWZmAAEA6AcCBSBzZWMuAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIuQlREOiBCYWQgcGF5bWVudCBhdHRhY2hlZCAoYXNzZXRbc10gb3IgYW1vdW50KQQDcG10CQEFdmFsdWUBCQDsBwEJAQV2YWx1ZQEICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLYmxhY2tMaXN0ZWQJAQ10cnlHZXRCb29sZWFuAQkBDmtleUJsYWNrbGlzdGVkAQkA2AQBCAUDcG10AmlkAwULYmxhY2tMaXN0ZWQJAAIBAipCVEQ6IENhbiBub3QgY29udmVydCBibGFja2xpc3RlZCBkdWNrbGluZyEDCQC/AgIJALYCAQUWcGVyY2VudEdyb3d0aFByZWNpc2lvbgkBFWdldEN1cnJlbnRMZXZlbEJpZ0ludAEJANgEAQgFA3BtdAJpZAkAAgECIUJURDogRHVja2xpbmcgaXMgbm90IGdyb3duIHlldC4uLgMJAQIhPQIIBQNwbXQGaXNzdWVyBQR0aGlzCQACAQIqQlREOiBDYW4gdXNlIG9ubHkgZHVja2xpbmdzIGZyb20gdGhpcyBkQXBwBARjYWxsCQD8BwQJARNnZXRJbmN1YmF0b3JBZGRyZXNzAAIRc3RhcnREdWNrSGF0Y2hpbmcJAMwIAgIABQNuaWwFA25pbAMJAAACBQRjYWxsBQRjYWxsBA5rRHVja2xpbmdHcm93bgkBEGtleUR1Y2tsaW5nR3Jvd24BCQDYBAEIBQNwbXQCaWQJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDmtEdWNrbGluZ0dyb3duBgkAzAgCCQEMSW50ZWdlckVudHJ5AgUWS0dsb2JhbElzc3VlZFRpbWVzdGFtcAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXk+TQxX", "height": 3245170, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: A5ZvWnF6C1S57RfcvR1syoWMUesuKzL318tPVdWDAHTp Next: o36jA3fPpA85YsL4DQRQaBgyZHYeFXAU95FNwgzFBQH Diff:
OldNewDifferences
5252 func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_burnAddress")))
5353
5454
55-let backendPubKey = base58'BmKAXRQy7jZm44fa1YxNQDTcAwNSb74EpQwP5CT7UHdV'
55+let backendPubKey = base58'BnKJTqkWD69SotKhJXdKu76NRtkdQJEpThqGGeFwF9EL'
5656
5757 let STARTTIMESTAMP = 1632474000000
5858
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetStringExternal (address,key) = match getString(address, key) {
55 case a: String =>
66 a
77 case _ =>
88 ""
99 }
1010
1111
1212 func tryGetIntegerExternal (address,key) = match getInteger(address, key) {
1313 case b: Int =>
1414 b
1515 case _ =>
1616 0
1717 }
1818
1919
2020 func tryGetBoolean (key) = match getBoolean(key) {
2121 case b: Boolean =>
2222 b
2323 case _ =>
2424 false
2525 }
2626
2727
2828 func tryGetString (key) = tryGetStringExternal(this, key)
2929
3030
3131 func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
3232
3333
3434 func getDucklingPrice () = tryGetIntegerExternal(getOracle(), "static_ducklingPrice")
3535
3636
3737 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId"))
3838
3939
4040 func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_spiceAssetId"))
4141
4242
4343 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
4444
4545
4646 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
4747
4848
4949 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_couponsAddress")))
5050
5151
5252 func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_burnAddress")))
5353
5454
55-let backendPubKey = base58'BmKAXRQy7jZm44fa1YxNQDTcAwNSb74EpQwP5CT7UHdV'
55+let backendPubKey = base58'BnKJTqkWD69SotKhJXdKu76NRtkdQJEpThqGGeFwF9EL'
5656
5757 let STARTTIMESTAMP = 1632474000000
5858
5959 let LAPLENGTH = 21600000
6060
6161 let DUCKLINGPRICE = 100000000
6262
6363 let percentGrowthPrecision = 10000000000000000
6464
6565 let existingDuckPrecision = 100000000000000
6666
6767 let KGlobalIssuedTimestamp = "global_issued_timestamp"
6868
6969 let MSINDAY = 86400000
7070
7171 func keyTotalFeed (ducklingId) = (("duckling_" + ducklingId) + "_feed")
7272
7373
7474 func keyDucklingFedLap (ducklingId) = (("duckling_" + ducklingId) + "_fedLap")
7575
7676
7777 func keyDucklingFedTimestamp (ducklingId) = (("duckling_" + ducklingId) + "_fedTs")
7878
7979
8080 func keyDucklingFedLapTimestamp (ducklingId,lap) = (((("duckling_" + ducklingId) + "_lap_") + toString(lap)) + "_fedTs")
8181
8282
8383 func keyAddressFedTimestamp (address,lap,timestamp) = ((((("address_" + address) + "_lap_") + toString(lap)) + "_fedTs_") + toString(timestamp))
8484
8585
8686 func keyAddressNonce (address) = (("address_" + address) + "_nonce")
8787
8888
8989 func keyDucklingFedLastTimestamp (ducklingId) = (("duckling_" + ducklingId) + "_fedLastTs")
9090
9191
9292 func keyDucklingLevel (ducklingId) = (("duckling_" + ducklingId) + "_level")
9393
9494
9595 func keyFeedForLap (address,lap) = (((("address_" + address) + "_lap_") + toString(lap)) + "_feed")
9696
9797
9898 func keyDucklingGrown (ducklingId) = (("duckling_" + ducklingId) + "_grown")
9999
100100
101101 func keyStartHatchingId (ducklingId) = (("duckling_" + ducklingId) + "_grown")
102102
103103
104104 func keyStartPercentage (ducklingId) = (("duckling_" + ducklingId) + "_startPercentage")
105105
106106
107107 func keyOwner (ducklingId) = (("duckling_" + ducklingId) + "_owner")
108108
109109
110110 func keyBlacklisted (ducklingId) = (("duckling_" + ducklingId) + "_blacklisted")
111111
112112
113113 func tryGetInteger (key) = {
114114 let val = match getInteger(this, key) {
115115 case b: Int =>
116116 b
117117 case _ =>
118118 0
119119 }
120120 val
121121 }
122122
123123
124124 func getBool (key) = match getBoolean(this, key) {
125125 case b: Boolean =>
126126 b
127127 case _ =>
128128 false
129129 }
130130
131131
132132 func getDucklingPercentage (ducklingId) = {
133133 let percentageDuckling = tryGetInteger(keyStartPercentage(ducklingId))
134134 let base = if ((percentageDuckling != 0))
135135 then percentageDuckling
136136 else 20
137137 toBigInt((base * existingDuckPrecision))
138138 }
139139
140140
141141 func getCurrentLevelBigInt (ducklingId) = {
142142 let kDuckLevel = keyDucklingLevel(ducklingId)
143143 match getString(kDuckLevel) {
144144 case s: String =>
145145 parseBigIntValue(s)
146146 case _ =>
147147 match getBoolean((("duckling_" + ducklingId) + "_issuedByFeedCall")) {
148148 case b: Boolean =>
149149 if ((b == true))
150150 then toBigInt(0)
151151 else getDucklingPercentage(ducklingId)
152152 case _ =>
153153 getDucklingPercentage(ducklingId)
154154 }
155155 }
156156 }
157157
158158
159159 func getCurrentLap () = (((lastBlock.timestamp - STARTTIMESTAMP) / LAPLENGTH) + 1)
160160
161161
162162 func getLastFedTimestamp (ducklingId) = {
163163 let lastFedTimestamp = tryGetInteger(keyDucklingFedLastTimestamp(ducklingId))
164164 if ((lastFedTimestamp > 0))
165165 then lastFedTimestamp
166166 else lastBlock.timestamp
167167 }
168168
169169
170170 func calculateNewDucklingLevel (ducklingId,paymentAmount) = {
171171 let currentTs = lastBlock.timestamp
172172 let lastFedTimestampChecked = getLastFedTimestamp(ducklingId)
173173 let fedDiff = (currentTs - lastFedTimestampChecked)
174174 let penalty = toBigInt(0)
175175 let growth = fraction(toBigInt(paymentAmount), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
176176 let currentLevel = getCurrentLevelBigInt(ducklingId)
177177 let newLevel = (currentLevel + growth)
178178 let result = toString(newLevel)
179179 $Tuple2(result, [("currentLevel=" + toString(currentLevel)), ("newLevel=" + toString(newLevel)), ("growth=" + toString(growth)), ("penalty=" + toString(penalty)), ("lastFedTs=" + toString(lastFedTimestampChecked)), ("fedDiff=" + toString(fedDiff))])
180180 }
181181
182182
183183 func getBackendProof (maxFeedAmount,userNonce,address) = makeString([toString(maxFeedAmount), toString(userNonce), address], ";")
184184
185185
186186 func asInt (value) = match value {
187187 case int: Int =>
188188 int
189189 case _ =>
190190 throw("BAI: wrong type, expected: Int")
191191 }
192192
193193
194194 @Callable(i)
195195 func configureOracle (oracle) = if ((i.caller != this))
196196 then throw("BCO: admin only")
197197 else [StringEntry("static_oracleAddress", oracle)]
198198
199199
200200
201201 @Callable(i)
202202 func buyDuckling () = {
203203 let exactPrice = getDucklingPrice()
204204 if ((50000000 > exactPrice))
205205 then throw("BBD: Invalid price from oracle!")
206206 else {
207207 let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [exactPrice], nil))
208208 if ((amountPaidByCoupons == amountPaidByCoupons))
209209 then {
210210 let leftToPay = (exactPrice - amountPaidByCoupons)
211211 let payment = if ((leftToPay != 0))
212212 then {
213213 let firstPayment = value(i.payments[0])
214214 if ((firstPayment.assetId != getEggAssetId()))
215215 then throw(("BBD: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
216216 else if ((firstPayment.amount != leftToPay))
217217 then throw(("BBD: To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay)))
218218 else {
219219 let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), leftToPay)])
220220 if ((burnCall == burnCall))
221221 then leftToPay
222222 else throw("Strict value is not equal to itself.")
223223 }
224224 }
225225 else 0
226226 if ((payment == payment))
227227 then {
228228 let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId), 0], nil)
229229 if ((ducklingAssetId == ducklingAssetId))
230230 then nil
231231 else throw("Strict value is not equal to itself.")
232232 }
233233 else throw("Strict value is not equal to itself.")
234234 }
235235 else throw("Strict value is not equal to itself.")
236236 }
237237 }
238238
239239
240240
241241 @Callable(i)
242242 func issueFreeDuckling (address,txIdStr,percentage) = if (if ((i.caller != this))
243243 then (i.caller != getRebirthAddress())
244244 else false)
245245 then throw("BIFD: You can't issue free duckling")
246246 else {
247247 let asset = Issue("BABY-11111111-GZ", "", 1, 0, false, unit, height)
248248 let assetId = calculateAssetId(asset)
249249 $Tuple2([StringEntry((((address + "_") + txIdStr) + "_di"), toBase58String(assetId)), IntegerEntry("stats_amount", (tryGetInteger("stats_amount") + 1)), BooleanEntry((("duckling_" + toBase58String(assetId)) + "_issuedByFeedCall"), (i.caller == this)), IntegerEntry(keyStartPercentage(toBase58String(assetId)), percentage), StringEntry(keyOwner(toBase58String(assetId)), address), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId))
250250 }
251251
252252
253253
254254 @Callable(i)
255255 func feedDuckling (ducklingId,backendSignature,maxFeedAmount,userNonce) = {
256256 let addressString = toString(i.caller)
257257 let backendProof = getBackendProof(maxFeedAmount, userNonce, addressString)
258258 let kAddressNonce = keyAddressNonce(addressString)
259259 let currentNonce = tryGetInteger(kAddressNonce)
260260 let realDucklingId = if (!(sigVerify_8Kb(toBytes(backendProof), fromBase58String(backendSignature), backendPubKey)))
261261 then throw("BFD: Invalid proof from backend")
262262 else if (if ((size(i.payments) != 1))
263263 then true
264264 else (value(i.payments[0]).assetId != getSpiceAssetId()))
265265 then throw("BFD: Bad payment attached (asset[s] or amount)")
266266 else if (getBool(keyDucklingGrown(ducklingId)))
267267 then throw("BFD: Duckling is already grown")
268268 else if ((userNonce != (currentNonce + 1)))
269269 then throw(((("BFD: User Nonce should be " + toString(currentNonce)) + " + 1, while received ") + toString(userNonce)))
270270 else {
271271 let blackListed = tryGetBoolean(keyBlacklisted(ducklingId))
272272 if (blackListed)
273273 then throw("BFD: Can not feed blacklisted duckling!")
274274 else if ((ducklingId == ""))
275275 then throw("BFD: Please buy a duckling first!")
276276 else {
277277 let ducklingIdCheck = value(assetInfo(fromBase58String(ducklingId)))
278278 if ((assetBalance(i.caller, ducklingIdCheck.id) != 1))
279279 then throw("BFD: You're not the owner of the duckling")
280280 else if ((ducklingIdCheck.issuer != this))
281281 then throw("BFD: Cant find duckling with such id")
282282 else toBase58String(ducklingIdCheck.id)
283283 }
284284 }
285285 let kDucklingLastFedTs = keyDucklingFedLastTimestamp(ducklingId)
286286 let lastFedTs = getLastFedTimestamp(realDucklingId)
287287 let currentPayment = value(i.payments[0]).amount
288288 let kNewLevel = keyDucklingLevel(realDucklingId)
289289 let kTotalFeed = keyTotalFeed(realDucklingId)
290290 let totalFeed = tryGetInteger(kTotalFeed)
291291 let kFeedTxStats = ((("duckling_" + realDucklingId) + "_stat_") + toString(lastBlock.timestamp))
292292 let kAddressFedTimestamp = keyAddressFedTimestamp(addressString, getCurrentLap(), lastBlock.timestamp)
293293 let kDucklingFedLapTimestamp = keyDucklingFedLapTimestamp(realDucklingId, getCurrentLap())
294294 let kDucklingFedLap = keyDucklingFedLap(realDucklingId)
295295 if ((currentPayment > maxFeedAmount))
296296 then throw(("BFD: Cannot feed duckling for such amount, max feed amount is: " + toString(maxFeedAmount)))
297297 else {
298298 let calculateResults = calculateNewDucklingLevel(realDucklingId, (currentPayment / 100))
299299 let ducklingOwner = tryGetString(keyOwner(realDucklingId))
300300 if ((ducklingOwner != toString(i.caller)))
301301 then [BooleanEntry(keyBlacklisted(realDucklingId), true)]
302302 else [IntegerEntry(kAddressNonce, (currentNonce + 1)), IntegerEntry(kDucklingLastFedTs, lastBlock.timestamp), IntegerEntry(kTotalFeed, (totalFeed + currentPayment)), IntegerEntry(kFeedTxStats, currentPayment), IntegerEntry(kAddressFedTimestamp, currentPayment), IntegerEntry(kDucklingFedLapTimestamp, currentPayment), IntegerEntry(kDucklingFedLap, getCurrentLap()), StringEntry(kNewLevel, calculateResults._1), StringEntry((kFeedTxStats + "_debug"), makeString(calculateResults._2, ";"))]
303303 }
304304 }
305305
306306
307307
308308 @Callable(i)
309309 func fixLevels (ducklingIds) = if (if ((i.callerPublicKey != base58'GDxBbsDRmeY39quNrDsTXKJzFWbQVtjxHseF4ikxZ7n9'))
310310 then (i.caller != this)
311311 else false)
312312 then throw("BFL: Not authorized")
313313 else {
314314 let ducklingIdsList = value(split(ducklingIds, ","))
315315 func handleId (acc,id) = {
316316 let kTotalFeed = keyTotalFeed(id)
317317 let totalFeed = tryGetInteger(kTotalFeed)
318318 let kNewLevel = keyDucklingLevel(id)
319319 let startingLevel = match getBoolean((("duckling_" + id) + "_issuedByFeedCall")) {
320320 case b: Boolean =>
321321 if ((b == true))
322322 then toBigInt(0)
323323 else getDucklingPercentage(id)
324324 case _ =>
325325 getDucklingPercentage(id)
326326 }
327327 let growth = fraction(toBigInt(totalFeed), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
328328 (acc ++ [StringEntry(kNewLevel, toString((startingLevel + growth)))])
329329 }
330330
331331 let $l = ducklingIdsList
332332 let $s = size($l)
333333 let $acc0 = nil
334334 func $f0_1 ($a,$i) = if (($i >= $s))
335335 then $a
336336 else handleId($a, $l[$i])
337337
338338 func $f0_2 ($a,$i) = if (($i >= $s))
339339 then $a
340340 else throw("List size exceeds 20")
341341
342342 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
343343 }
344344
345345
346346
347347 @Callable(i)
348348 func turnDucklingIntoDuck () = {
349349 let address = toString(i.caller)
350350 let txId = toBase58String(i.transactionId)
351351 let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp)
352352 let fiveMinInMs = ((5 * 60) * 1000)
353353 let timeDiff = (lastBlock.timestamp - (lastIssuedDucklingTs + fiveMinInMs))
354354 if (if ((lastIssuedDucklingTs > 0))
355355 then (0 > timeDiff)
356356 else false)
357357 then throw((("BTD: Can issue ducklings only once per 5 minutes, please wait for " + toString(fraction(timeDiff, 1, 1000))) + " sec."))
358358 else if ((size(i.payments) != 1))
359359 then throw("BTD: Bad payment attached (asset[s] or amount)")
360360 else {
361361 let pmt = value(assetInfo(value(value(i.payments[0]).assetId)))
362362 let blackListed = tryGetBoolean(keyBlacklisted(toBase58String(pmt.id)))
363363 if (blackListed)
364364 then throw("BTD: Can not convert blacklisted duckling!")
365365 else if ((toBigInt(percentGrowthPrecision) > getCurrentLevelBigInt(toBase58String(pmt.id))))
366366 then throw("BTD: Duckling is not grown yet...")
367367 else if ((pmt.issuer != this))
368368 then throw("BTD: Can use only ducklings from this dApp")
369369 else {
370370 let call = invoke(getIncubatorAddress(), "startDuckHatching", [""], nil)
371371 if ((call == call))
372372 then {
373373 let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
374374 [BooleanEntry(kDucklingGrown, true), IntegerEntry(KGlobalIssuedTimestamp, lastBlock.timestamp)]
375375 }
376376 else throw("Strict value is not equal to itself.")
377377 }
378378 }
379379 }
380380
381381
382382 @Verifier(tx)
383383 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
384384

github/deemru/w8io/3ef1775 
46.40 ms