tx · DWqrtvc3Pyhfb5FsEv1g95zpUC6VRaahBtfFPYM3fiP8

3PQn4BwNW1kcX1gagVHWxSP5RyQ3V9UYPT8:  -0.01200000 Waves

2024.05.22 11:41 [4183064] smart account 3PQn4BwNW1kcX1gagVHWxSP5RyQ3V9UYPT8 > SELF 0.00000000 Waves

{ "type": 13, "id": "DWqrtvc3Pyhfb5FsEv1g95zpUC6VRaahBtfFPYM3fiP8", "fee": 1200000, "feeAssetId": null, "timestamp": 1716367318133, "version": 1, "sender": "3PQn4BwNW1kcX1gagVHWxSP5RyQ3V9UYPT8", "senderPublicKey": "4EGAYvzAwMC6xLvFvRhFGwE4TwWsLmYPKTM9hjMjannm", "proofs": [ "4BBG5k13F9gtnWPiVNsoc2p6FWa6pgv1x2yhFkFsB6dM2PGLUwB9drhTKTRcTR5YBr8PBQgsf9EzeAgB1y4H3bK4" ], "script": "base64:BgIhCAISBAoCAQgSBQoDAQgIEgQKAgEIEgUKAwgIARIDCgEIIQEQd3JpdGVDb25zdFN0cmluZwIDa2V5BXZhbHVlAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzBQNrZXkJAQtTdHJpbmdFbnRyeQIFA2tleQUFdmFsdWUJAAIBCQCsAgICFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUDa2V5AQh3cml0ZUludAIDa2V5BXZhbHVlAwkAZgIAAAUFdmFsdWUJAAIBCQCsAgIJAKwCAgkArAICAhd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkApAMBBQV2YWx1ZQIJIGZvciBrZXkgBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlAQhjaGFuZ2VCeQIDa2V5BXZhbHVlCQEId3JpdGVJbnQCBQNrZXkJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAABQV2YWx1ZQEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIZd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAENYXNQcmljZUFuZEF2ZwEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwMDCQABAggFByRtYXRjaDACXzECA0ludAMJAAECCAUHJG1hdGNoMAJfMgIDSW50AwkAAQIIBQckbWF0Y2gwAl8zAgNJbnQJAAECCAUHJG1hdGNoMAJfNAIDSW50BwcHCQABAgUHJG1hdGNoMAIUKEludCwgSW50LCBJbnQsIEludCkHBARpbnQxCAUHJG1hdGNoMAJfMQQEaW50MggFByRtYXRjaDACXzIEBGludDMIBQckbWF0Y2gwAl8zBARpbnQ0CAUHJG1hdGNoMAJfNAkAlAoCBQRpbnQxBQRpbnQyCQACAQIqd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IChJbnQsIEludCwgSW50LCBJbnQpABJjb25maWdBZGRyZXNzU3RvcmUCBmNvbmZpZwANY29uZmlnQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRJjb25maWdBZGRyZXNzU3RvcmUCInRyZWFzdXJ5OiBjb25maWcgYWRkcmVzcyBub3QgZm91bmQCFmludmFsaWQgY29uZmlnIGFkZHJlc3MADXZvdGluZ1Jlc3VsdHMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIWY29udHJhY3Rfdm90aW5nX3Jlc3VsdAIZbm8gY29udHJhY3Rfdm90aW5nX3Jlc3VsdAIeaW52YWxpZCBjb250cmFjdF92b3RpbmdfcmVzdWx0AAZIRUlHSFQFBmhlaWdodAEOb3BBbGxvd2VkU3RvcmUBAm9wCQCsAgIJAKwCAgIDb3BfBQJvcAIIX2FsbG93ZWQBB2FsbG93ZWQBAm9wCQD8BwQFDWNvbmZpZ0FkZHJlc3MCCW9wQWxsb3dlZAkAzAgCBQJvcAUDbmlsBQNuaWwACnB3ckFzc2V0SWQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDHBvd2VyQXNzZXRJZAIWcHdyIGFzc2V0IGlkIG5vdCBmb3VuZAAObWludGVyQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIPY29udHJhY3RfbWludGVyAhJubyBjb250cmFjdF9taW50ZXICF2ludmFsaWQgbWludGVyIGNvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIQY29udHJhY3Rfc3Rha2luZwITbm8gc3Rha2luZ19jb250cmFjdAIXaW52YWxpZCBzdGFraW5nIGFkZHJlc3MABm9yYWNsZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwkArAICCQClCAEFBHRoaXMCB19vcmFjbGUCIzNQS2tvaktkZDZCQnpUZjFSWGJRVmZVRHJhTkZYWEhLelFGAhZpbnZhbGlkIG9yYWNsZSBhZGRyZXNzAARzd2FwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1jb25maWdBZGRyZXNzCQCsAgIJAKUIAQUEdGhpcwIFX3N3YXACIzNQNjh6Tml1ZnN1MXZpWnB1MWFZM2NkYWhSUktjdlY1TjkzAhRpbnZhbGlkIHN3YXAgYWRkcmVzcwAKcHV6emxlU3dhcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwkArAICCQClCAEFBHRoaXMCC19wdXp6bGVTd2FwAiMzUEdGSHpWR1Q0TlRpZ3dDS1AxTmN3b1hrb2RWWnd2QnV1VQIaaW52YWxpZCBwdXp6bGVTd2FwIGFkZHJlc3MACnRvdGFsUG93ZXIJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Agp0b3RhbFBvd2VyBQNuaWwFA25pbAAYd2Vla2x5R2xvYmFsTGltaXRQZXJjZW50CQELdmFsdWVPckVsc2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MJAKwCAgkApQgBBQR0aGlzAiFfd2Vla2x5R2xvYmFsTGltaXRQZXJjZW50QmFzZTEwMDAAZAARd2Vla2x5R2xvYmFsTGltaXQJAGsDBQp0b3RhbFBvd2VyBRh3ZWVrbHlHbG9iYWxMaW1pdFBlcmNlbnQA6AcAC2N1cnJlbnRXZWVrCQBrAwUGSEVJR0hUAAEJAGgCAKALAAcAF2N1cnJlbnRHbG9iYWxMaW1pdFN0b3JlCQCsAgICDWdsb2JhbF9saW1pdF8JAKQDAQULY3VycmVudFdlZWsAEmN1cnJlbnRHbG9iYWxMaW1pdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRdjdXJyZW50R2xvYmFsTGltaXRTdG9yZQURd2Vla2x5R2xvYmFsTGltaXQADGJvbnVzUGVyY2VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1jb25maWdBZGRyZXNzCQCsAgIJAKUIAQUEdGhpcwIVX2JvbnVzUGVyY2VudEJhc2UxMDAwAPIHAA1wd3JBc3NldElkU3RyCQDYBAEFCnB3ckFzc2V0SWQAE3B3clByaWNlUGVyaW9kSG91cnMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNY29uZmlnQWRkcmVzcwkArAICCQClCAEFBHRoaXMCFF9wd3JQcmljZVBlcmlvZEhvdXJzAAQAA3h0bgIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAACXVzZHRFUkMyMAIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kABmV0aFBQVAIsM1Z1VjVXVG1EejQ3RG1kbjNRcGNZanpiU2RpcGpRRTRKTWROZTF4WnBYMTMBD3JlZkJvbnVzU3RvcmFnZQEEY29kZQkArAICAgpyZWZfYm9udXNfBQRjb2RlARFyZWZBZGRyZXNzU3RvcmFnZQEEY29kZQkArAICAgxyZWZfYWRkcmVzc18FBGNvZGUBCXB3ckFtb3VudAIIYW1vdW50SW4HYXNzZXRJbgQLJHQwMzUxMzM2MTUJAQ1hc1ByaWNlQW5kQXZnAQkA/AcEBQZvcmFjbGUCCXByaWNlSW5mbwkAzAgCBRNwd3JQcmljZVBlcmlvZEhvdXJzCQDMCAICCFBXUi1VU0RUBQNuaWwFA25pbAQFcHJpY2UIBQskdDAzNTEzMzYxNQJfMQQIcHJpY2VBdmcIBQskdDAzNTEzMzYxNQJfMgQIUFdSX1VTRFQJAJYDAQkAzAgCBQVwcmljZQkAzAgCBQhwcmljZUF2ZwUDbmlsBAl1c2R0UHJpY2UDCQAAAgUHYXNzZXRJbgUJdXNkdEVSQzIwAIDC1y8DCQAAAgUHYXNzZXRJbgUGZXRoUFBUCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUGb3JhY2xlAhUlcyVzX19wcmljZV9fRVRILVVTRFQCHkVUSCBwcmljZSBpcyBub3QgaW4gdGhlIE9yYWNsZQMJAAACBQdhc3NldEluAgVXQVZFUwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBm9yYWNsZQIXJXMlc19fcHJpY2VfX1dBVkVTLVVTRFQCIFdBVkVTIHByaWNlIGlzIG5vdCBpbiB0aGUgT3JhY2xlAwkAAAIFB2Fzc2V0SW4FA3h0bgkAaAIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQZvcmFjbGUCFiVzJXNfX3ByaWNlX19VU0ROLVVTRFQCHlhUTiBwcmljZSBpcyBub3QgaW4gdGhlIE9yYWNsZQBkCQACAQJBVG9rZW4gaXMgbm90IHN1cHBvcnRlZCB5ZXQuIFN1cHBvcnRlZCBhcmU6IFVTRFQtRVJDMjAsIFdBVkVTLCBYVE4JAGsDCQBrAwUIYW1vdW50SW4FCXVzZHRQcmljZQUIUFdSX1VTRFQFDGJvbnVzUGVyY2VudADoBwEUYnV5UHdyUHV6emxlSW50ZXJuYWwEAWkGbWluUHdyCXJvdXRlc1N0cgdyZWZDb2RlBAZwYXVzZWQJAQdhbGxvd2VkAQIGYnV5UHdyAwkAAAIFBnBhdXNlZAUGcGF1c2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIfMSBhbmQgb25seSAxIHBheW1lbnQgaXMgYWxsb3dlZAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAXAJAJEDAggFAWkIcGF5bWVudHMAAAQRcHdyQmFsYW5jZUF0U3RhcnQJAPAHAgUEdGhpcwUKcHdyQXNzZXRJZAMJAAACBRFwd3JCYWxhbmNlQXRTdGFydAURcHdyQmFsYW5jZUF0U3RhcnQECnRlblBlcmNlbnQJAGsDCAUBcAZhbW91bnQAAQAKBA9wYXltZW50VG9CdXlQd3IJAQ9BdHRhY2hlZFBheW1lbnQCCAUBcAdhc3NldElkBQp0ZW5QZXJjZW50BAZzd2FwZWQJAPwHBAUKcHV6emxlU3dhcAIEc3dhcAkAzAgCBQlyb3V0ZXNTdHIJAMwIAgAABQNuaWwJAMwIAgUPcGF5bWVudFRvQnV5UHdyBQNuaWwDCQAAAgUGc3dhcGVkBQZzd2FwZWQEE3B3ckJhbGFuY2VBZnRlclN3YXAJAPAHAgUEdGhpcwUKcHdyQXNzZXRJZAMJAAACBRNwd3JCYWxhbmNlQWZ0ZXJTd2FwBRNwd3JCYWxhbmNlQWZ0ZXJTd2FwBApwd3JTd2FwcGVkCQBlAgUTcHdyQmFsYW5jZUFmdGVyU3dhcAURcHdyQmFsYW5jZUF0U3RhcnQDCQBnAgAABQpwd3JTd2FwcGVkCQACAQITbm90aGluZyB3YXMgc3dhcHBlZAQHYXNzZXRJbgMJAQlpc0RlZmluZWQBCAUBcAdhc3NldElkCQDYBAEJAQV2YWx1ZQEIBQFwB2Fzc2V0SWQCBVdBVkVTBAh0b3RhbFB3cgkBCXB3ckFtb3VudAIIBQFwBmFtb3VudAUHYXNzZXRJbgMJAAACBQh0b3RhbFB3cgUIdG90YWxQd3IEBWJvbnVzBA1ib251c0Jhc2UxMDAwCQCfCAEJAQ9yZWZCb251c1N0b3JhZ2UBBQdyZWZDb2RlAwMJAGcCCQCxAgEFB3JlZkNvZGUABAkBCWlzRGVmaW5lZAEFDWJvbnVzQmFzZTEwMDAHCQBrAwUIdG90YWxQd3IJAQV2YWx1ZQEFDWJvbnVzQmFzZTEwMDAA6AcAAAQJcHdyVG9NaW50CQBkAgkAZQIFCHRvdGFsUHdyBQpwd3JTd2FwcGVkCQBoAgACBQVib251cwQEbWludAkA/AcEBQ5taW50ZXJDb250cmFjdAIEbWludAkAzAgCBQlwd3JUb01pbnQFA25pbAUDbmlsAwkAAAIFBG1pbnQFBG1pbnQECG5ld0xpbWl0CQBlAgUSY3VycmVudEdsb2JhbExpbWl0BQlwd3JUb01pbnQDCQBmAgAABQhuZXdMaW1pdAkAAgEJAKwCAgIoVGhlIHJlc3Qgb2Ygd2Vla2x5IGdsb2JhbCBsaW1pdCBpczogUFdSIAkApAMBBRJjdXJyZW50R2xvYmFsTGltaXQED3B3ckJhbGFuY2VBdEVuZAkA8AcCBQR0aGlzBQpwd3JBc3NldElkBAdwd3JTb2xkCQBlAgkAZQIFD3B3ckJhbGFuY2VBdEVuZAURcHdyQmFsYW5jZUF0U3RhcnQFBWJvbnVzAwkAZgIFBm1pblB3cgUHcHdyU29sZAkAAgEJAKwCAgkArAICCQCsAgICClJlc3VsdGluZyAJAKQDAQUHcHdyU29sZAIkIFBXUmxldHMgaXMgbGVzcyB0aGVuIG1pbiByZXF1ZXN0ZWQgCQCkAwEFBm1pblB3cgQGc3Rha2VkCQD8BwQFD3N0YWtpbmdDb250cmFjdAIIc3Rha2VGb3IJAMwIAgUEdXNlcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpwd3JBc3NldElkBQdwd3JTb2xkBQNuaWwDCQAAAgUGc3Rha2VkBQZzdGFrZWQECmJvbnVzVG9SZWYDCQBmAgUFYm9udXMAAAQKcmVmQWRkcmVzcwkBEXJlZkFkZHJlc3NTdG9yYWdlAQUHcmVmQ29kZQQKc3Rha2VCb251cwkA/AcEBQ9zdGFraW5nQ29udHJhY3QCCHN0YWtlRm9yCQDMCAIFCnJlZkFkZHJlc3MFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcHdyQXNzZXRJZAUFYm9udXMFA25pbAMJAAACBQpzdGFrZUJvbnVzBQpzdGFrZUJvbnVzBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQR1bml0AwkAAAIFCmJvbnVzVG9SZWYFCmJvbnVzVG9SZWYJAJQKAgkAzAgCCQEIY2hhbmdlQnkCAgtwd3Jfc3dhcHBlZAUKcHdyU3dhcHBlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUXY3VycmVudEdsb2JhbExpbWl0U3RvcmUFCG5ld0xpbWl0CQDMCAIJAQhjaGFuZ2VCeQIJAKwCAgIIYmFsYW5jZV8FB2Fzc2V0SW4JAGUCCAUBcAZhbW91bnQFCnRlblBlcmNlbnQFA25pbAUHcHdyU29sZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUBaQEVc3dhcENhbGN1bGF0ZVJFQURPTkxZAghhbW91bnRJbgdhc3NldEluCQCUCgIFA25pbAkBCXB3ckFtb3VudAIFCGFtb3VudEluBQdhc3NldEluAWkBD2J1eVB3clB1enpsZVJlZgMGbWluUHdyCXJvdXRlc1N0cgdyZWZDb2RlCQEUYnV5UHdyUHV6emxlSW50ZXJuYWwEBQFpBQZtaW5Qd3IFCXJvdXRlc1N0cgUHcmVmQ29kZQFpAQxidXlQd3JQdXp6bGUCBm1pblB3cglyb3V0ZXNTdHIJARRidXlQd3JQdXp6bGVJbnRlcm5hbAQFAWkFBm1pblB3cgUJcm91dGVzU3RyAgABaQEKbmV3UmVmQ29kZQMEY29kZQdhZGRyZXNzDWJvbnVzQkFTRTEwMDADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgZkZW5pZWQDCQBmAgAECQCxAgEFBGNvZGUJAAIBAiBjb2RlIG11c3QgYmUgYXQgbGVhc3QgNCBjaHIgbG9uZwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUHYWRkcmVzcwkAAgECD2ludmFsaWQgYWRkcmVzcwQMYm9udXNTdG9yYWdlCQEPcmVmQm9udXNTdG9yYWdlAQUEY29kZQQOYWRkcmVzc1N0b3JhZ2UJARFyZWZBZGRyZXNzU3RvcmFnZQEFBGNvZGUDCQBmAgUNYm9udXNCQVNFMTAwMAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxib251c1N0b3JhZ2UFDWJvbnVzQkFTRTEwMDAJAMwIAgkBC1N0cmluZ0VudHJ5AgUOYWRkcmVzc1N0b3JhZ2UFB2FkZHJlc3MFA25pbAkAzAgCCQELRGVsZXRlRW50cnkBBQxib251c1N0b3JhZ2UJAMwIAgkBC0RlbGV0ZUVudHJ5AQUOYWRkcmVzc1N0b3JhZ2UFA25pbAFpAQRpbml0AQRjb25mCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgUSY29uZmlnQWRkcmVzc1N0b3JlBQRjb25mBQNuaWwBAnR4AQZ2ZXJpZnkABAhieVZvdGluZwQHZW5hYmxlZAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ1jb25maWdBZGRyZXNzCQEOb3BBbGxvd2VkU3RvcmUBAhNnb3Zlcm5hbmNlX2FwcGx5X3R4BgMJAQEhAQUHZW5hYmxlZAkAAgECK3R4IGFwcGxpY2F0aW9uIHRocm93IGdvdmVybmFuY2Ugbm90IGVuYWJsZWQEAmlkCQDYBAEIBQJ0eAJpZAkAZwIFBkhFSUdIVAkBEUBleHRyTmF0aXZlKDEwNTApAgUNdm90aW5nUmVzdWx0cwkArAICCQCsAgIJAKwCAgIZcHJvcG9zYWxfYWxsb3dfYnJvYWRjYXN0XwkApQgBBQR0aGlzAgFfBQJpZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkGBQhieVZvdGluZ3OWLMg=", "chainId": 87, "height": 4183064, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8qMJoa76nTXF9ZB4QEuRAGjcngNzGPwY6uPyxbk94mw3 Next: Cve75rBvxj2RB3NCaVPZ72YbMX51RKB8nZtX9SW8i2rs Diff:
OldNewDifferences
9494
9595 let ethPPT = "3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13"
9696
97+func refBonusStorage (code) = ("ref_bonus_" + code)
98+
99+
100+func refAddressStorage (code) = ("ref_address_" + code)
101+
102+
97103 func pwrAmount (amountIn,assetIn) = {
98- let $t033953497 = asPriceAndAvg(invoke(oracle, "priceInfo", [pwrPricePeriodHours, "PWR-USDT"], nil))
99- let price = $t033953497._1
100- let priceAvg = $t033953497._2
104+ let $t035133615 = asPriceAndAvg(invoke(oracle, "priceInfo", [pwrPricePeriodHours, "PWR-USDT"], nil))
105+ let price = $t035133615._1
106+ let priceAvg = $t035133615._2
101107 let PWR_USDT = max([price, priceAvg])
102108 let usdtPrice = if ((assetIn == usdtERC20))
103109 then 100000000
112118 }
113119
114120
115-@Callable(i)
116-func swapCalculateREADONLY (amountIn,assetIn) = $Tuple2(nil, pwrAmount(amountIn, assetIn))
117-
118-
119-
120-@Callable(i)
121-func buyPwr (minPwr) = {
122- let paused = allowed("buyPwr")
123- if ((paused == paused))
124- then if ((size(i.payments) != 1))
125- then throw("1 and only 1 payment is allowed")
126- else {
127- let user = toString(i.caller)
128- let p = i.payments[0]
129- let pwrBalanceAtStart = assetBalance(this, pwrAssetId)
130- if ((pwrBalanceAtStart == pwrBalanceAtStart))
131- then {
132- let tenPercent = fraction(p.amount, 1, 10)
133- let paymentToBuyPwr = AttachedPayment(p.assetId, tenPercent)
134- let swaped = invoke(swap, "swap", [0, pwrAssetIdStr, toString(this)], [paymentToBuyPwr])
135- if ((swaped == swaped))
136- then {
137- let pwrBalanceAfterSwap = assetBalance(this, pwrAssetId)
138- let pwrSwapped = (pwrBalanceAfterSwap - pwrBalanceAtStart)
139- if ((0 >= pwrSwapped))
140- then throw("nothing was swapped")
141- else {
142- let assetIn = if (isDefined(p.assetId))
143- then toBase58String(value(p.assetId))
144- else "WAVES"
145- let totalPwr = pwrAmount(p.amount, assetIn)
146- let pwrToMint = (totalPwr - pwrSwapped)
147- let mint = invoke(minterContract, "mint", [pwrToMint], nil)
148- if ((mint == mint))
149- then {
150- let newLimit = (currentGlobalLimit - pwrToMint)
151- if ((0 > newLimit))
152- then throw(("The rest of the weekly global limit is: PWR " + toString(currentGlobalLimit)))
153- else {
154- let pwrBalanceAtEnd = assetBalance(this, pwrAssetId)
155- let pwrSold = (pwrBalanceAtEnd - pwrBalanceAtStart)
156- if ((minPwr > pwrSold))
157- then throw(((("Resulting " + toString(pwrSold)) + " PWRlets is less then min requested ") + toString(minPwr)))
158- else {
159- let staked = invoke(stakingContract, "stakeFor", [user], [AttachedPayment(pwrAssetId, pwrSold)])
160- if ((staked == staked))
161- then $Tuple2([changeBy("pwr_swapped", pwrSwapped), IntegerEntry(currentGlobalLimitStore, newLimit), changeBy(("balance_" + assetIn), (p.amount - tenPercent))], pwrSold)
162- else throw("Strict value is not equal to itself.")
163- }
164- }
165- }
166- else throw("Strict value is not equal to itself.")
167- }
168- }
169- else throw("Strict value is not equal to itself.")
170- }
171- else throw("Strict value is not equal to itself.")
172- }
173- else throw("Strict value is not equal to itself.")
174- }
175-
176-
177-
178-@Callable(i)
179-func buyPwrPuzzle (minPwr,routesStr) = {
121+func buyPwrPuzzleInternal (i,minPwr,routesStr,refCode) = {
180122 let paused = allowed("buyPwr")
181123 if ((paused == paused))
182124 then if ((size(i.payments) != 1))
205147 let totalPwr = pwrAmount(p.amount, assetIn)
206148 if ((totalPwr == totalPwr))
207149 then {
208- let pwrToMint = (totalPwr - pwrSwapped)
150+ let bonus = {
151+ let bonusBase1000 = getInteger(refBonusStorage(refCode))
152+ if (if ((size(refCode) >= 4))
153+ then isDefined(bonusBase1000)
154+ else false)
155+ then fraction(totalPwr, value(bonusBase1000), 1000)
156+ else 0
157+ }
158+ let pwrToMint = ((totalPwr - pwrSwapped) + (2 * bonus))
209159 let mint = invoke(minterContract, "mint", [pwrToMint], nil)
210160 if ((mint == mint))
211161 then {
212162 let newLimit = (currentGlobalLimit - pwrToMint)
213163 if ((0 > newLimit))
214- then throw(("The rest of the weekly global limit is: PWR " + toString(currentGlobalLimit)))
164+ then throw(("The rest of weekly global limit is: PWR " + toString(currentGlobalLimit)))
215165 else {
216166 let pwrBalanceAtEnd = assetBalance(this, pwrAssetId)
217- let pwrSold = (pwrBalanceAtEnd - pwrBalanceAtStart)
167+ let pwrSold = ((pwrBalanceAtEnd - pwrBalanceAtStart) - bonus)
218168 if ((minPwr > pwrSold))
219169 then throw(((("Resulting " + toString(pwrSold)) + " PWRlets is less then min requested ") + toString(minPwr)))
220170 else {
221171 let staked = invoke(stakingContract, "stakeFor", [user], [AttachedPayment(pwrAssetId, pwrSold)])
222172 if ((staked == staked))
223- then $Tuple2([changeBy("pwr_swapped", pwrSwapped), IntegerEntry(currentGlobalLimitStore, newLimit), changeBy(("balance_" + assetIn), (p.amount - tenPercent))], pwrSold)
173+ then {
174+ let bonusToRef = if ((bonus > 0))
175+ then {
176+ let refAddress = refAddressStorage(refCode)
177+ let stakeBonus = invoke(stakingContract, "stakeFor", [refAddress], [AttachedPayment(pwrAssetId, bonus)])
178+ if ((stakeBonus == stakeBonus))
179+ then unit
180+ else throw("Strict value is not equal to itself.")
181+ }
182+ else unit
183+ if ((bonusToRef == bonusToRef))
184+ then $Tuple2([changeBy("pwr_swapped", pwrSwapped), IntegerEntry(currentGlobalLimitStore, newLimit), changeBy(("balance_" + assetIn), (p.amount - tenPercent))], pwrSold)
185+ else throw("Strict value is not equal to itself.")
186+ }
224187 else throw("Strict value is not equal to itself.")
225188 }
226189 }
238201 }
239202 else throw("Strict value is not equal to itself.")
240203 }
204+
205+
206+@Callable(i)
207+func swapCalculateREADONLY (amountIn,assetIn) = $Tuple2(nil, pwrAmount(amountIn, assetIn))
208+
209+
210+
211+@Callable(i)
212+func buyPwrPuzzleRef (minPwr,routesStr,refCode) = buyPwrPuzzleInternal(i, minPwr, routesStr, refCode)
213+
214+
215+
216+@Callable(i)
217+func buyPwrPuzzle (minPwr,routesStr) = buyPwrPuzzleInternal(i, minPwr, routesStr, "")
218+
219+
220+
221+@Callable(i)
222+func newRefCode (code,address,bonusBASE1000) = if ((i.caller != this))
223+ then throw("denied")
224+ else if ((4 > size(code)))
225+ then throw("code must be at least 4 chr long")
226+ else if (!(isDefined(addressFromString(address))))
227+ then throw("invalid address")
228+ else {
229+ let bonusStorage = refBonusStorage(code)
230+ let addressStorage = refAddressStorage(code)
231+ if ((bonusBASE1000 > 0))
232+ then [IntegerEntry(bonusStorage, bonusBASE1000), StringEntry(addressStorage, address)]
233+ else [DeleteEntry(bonusStorage), DeleteEntry(addressStorage)]
234+ }
241235
242236
243237
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
55 then StringEntry(key, value)
66 else throw(("already initialized: " + key))
77
88
99 func writeInt (key,value) = if ((0 > value))
1010 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
1111 else IntegerEntry(key, value)
1212
1313
1414 func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
1515
1616
1717 func asInt (value) = match value {
1818 case int: Int =>
1919 int
2020 case _ =>
2121 throw("wrong type, expected: Int")
2222 }
2323
2424
2525 func asPriceAndAvg (value) = match value {
2626 case _ =>
2727 if (if (if ($isInstanceOf($match0._1, "Int"))
2828 then if ($isInstanceOf($match0._2, "Int"))
2929 then if ($isInstanceOf($match0._3, "Int"))
3030 then $isInstanceOf($match0._4, "Int")
3131 else false
3232 else false
3333 else false)
3434 then $isInstanceOf($match0, "(Int, Int, Int, Int)")
3535 else false)
3636 then {
3737 let int1 = $match0._1
3838 let int2 = $match0._2
3939 let int3 = $match0._3
4040 let int4 = $match0._4
4141 $Tuple2(int1, int2)
4242 }
4343 else throw("wrong type, expected: (Int, Int, Int, Int)")
4444 }
4545
4646
4747 let configAddressStore = "config"
4848
4949 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "treasury: config address not found")), "invalid config address")
5050
5151 let votingResults = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting_result"), "no contract_voting_result")), "invalid contract_voting_result")
5252
5353 let HEIGHT = height
5454
5555 func opAllowedStore (op) = (("op_" + op) + "_allowed")
5656
5757
5858 func allowed (op) = invoke(configAddress, "opAllowed", [op], nil)
5959
6060
6161 let pwrAssetId = fromBase58String(valueOrErrorMessage(getString(configAddress, "powerAssetId"), "pwr asset id not found"))
6262
6363 let minterContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_minter"), "no contract_minter")), "invalid minter contract")
6464
6565 let stakingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_staking"), "no staking_contract")), "invalid staking address")
6666
6767 let oracle = valueOrErrorMessage(addressFromString(valueOrElse(getString(configAddress, (toString(this) + "_oracle")), "3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF")), "invalid oracle address")
6868
6969 let swap = valueOrErrorMessage(addressFromString(valueOrElse(getString(configAddress, (toString(this) + "_swap")), "3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93")), "invalid swap address")
7070
7171 let puzzleSwap = valueOrErrorMessage(addressFromString(valueOrElse(getString(configAddress, (toString(this) + "_puzzleSwap")), "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU")), "invalid puzzleSwap address")
7272
7373 let totalPower = asInt(invoke(stakingContract, "totalPower", nil, nil))
7474
7575 let weeklyGlobalLimitPercent = valueOrElse(getInteger(configAddress, (toString(this) + "_weeklyGlobalLimitPercentBase1000")), 100)
7676
7777 let weeklyGlobalLimit = fraction(totalPower, weeklyGlobalLimitPercent, 1000)
7878
7979 let currentWeek = fraction(HEIGHT, 1, (1440 * 7))
8080
8181 let currentGlobalLimitStore = ("global_limit_" + toString(currentWeek))
8282
8383 let currentGlobalLimit = valueOrElse(getInteger(this, currentGlobalLimitStore), weeklyGlobalLimit)
8484
8585 let bonusPercent = valueOrElse(getInteger(configAddress, (toString(this) + "_bonusPercentBase1000")), 1010)
8686
8787 let pwrAssetIdStr = toBase58String(pwrAssetId)
8888
8989 let pwrPricePeriodHours = valueOrElse(getInteger(configAddress, (toString(this) + "_pwrPricePeriodHours")), 4)
9090
9191 let xtn = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p"
9292
9393 let usdtERC20 = "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"
9494
9595 let ethPPT = "3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13"
9696
97+func refBonusStorage (code) = ("ref_bonus_" + code)
98+
99+
100+func refAddressStorage (code) = ("ref_address_" + code)
101+
102+
97103 func pwrAmount (amountIn,assetIn) = {
98- let $t033953497 = asPriceAndAvg(invoke(oracle, "priceInfo", [pwrPricePeriodHours, "PWR-USDT"], nil))
99- let price = $t033953497._1
100- let priceAvg = $t033953497._2
104+ let $t035133615 = asPriceAndAvg(invoke(oracle, "priceInfo", [pwrPricePeriodHours, "PWR-USDT"], nil))
105+ let price = $t035133615._1
106+ let priceAvg = $t035133615._2
101107 let PWR_USDT = max([price, priceAvg])
102108 let usdtPrice = if ((assetIn == usdtERC20))
103109 then 100000000
104110 else if ((assetIn == ethPPT))
105111 then valueOrErrorMessage(getInteger(oracle, "%s%s__price__ETH-USDT"), "ETH price is not in the Oracle")
106112 else if ((assetIn == "WAVES"))
107113 then valueOrErrorMessage(getInteger(oracle, "%s%s__price__WAVES-USDT"), "WAVES price is not in the Oracle")
108114 else if ((assetIn == xtn))
109115 then (valueOrErrorMessage(getInteger(oracle, "%s%s__price__USDN-USDT"), "XTN price is not in the Oracle") * 100)
110116 else throw("Token is not supported yet. Supported are: USDT-ERC20, WAVES, XTN")
111117 fraction(fraction(amountIn, usdtPrice, PWR_USDT), bonusPercent, 1000)
112118 }
113119
114120
115-@Callable(i)
116-func swapCalculateREADONLY (amountIn,assetIn) = $Tuple2(nil, pwrAmount(amountIn, assetIn))
117-
118-
119-
120-@Callable(i)
121-func buyPwr (minPwr) = {
122- let paused = allowed("buyPwr")
123- if ((paused == paused))
124- then if ((size(i.payments) != 1))
125- then throw("1 and only 1 payment is allowed")
126- else {
127- let user = toString(i.caller)
128- let p = i.payments[0]
129- let pwrBalanceAtStart = assetBalance(this, pwrAssetId)
130- if ((pwrBalanceAtStart == pwrBalanceAtStart))
131- then {
132- let tenPercent = fraction(p.amount, 1, 10)
133- let paymentToBuyPwr = AttachedPayment(p.assetId, tenPercent)
134- let swaped = invoke(swap, "swap", [0, pwrAssetIdStr, toString(this)], [paymentToBuyPwr])
135- if ((swaped == swaped))
136- then {
137- let pwrBalanceAfterSwap = assetBalance(this, pwrAssetId)
138- let pwrSwapped = (pwrBalanceAfterSwap - pwrBalanceAtStart)
139- if ((0 >= pwrSwapped))
140- then throw("nothing was swapped")
141- else {
142- let assetIn = if (isDefined(p.assetId))
143- then toBase58String(value(p.assetId))
144- else "WAVES"
145- let totalPwr = pwrAmount(p.amount, assetIn)
146- let pwrToMint = (totalPwr - pwrSwapped)
147- let mint = invoke(minterContract, "mint", [pwrToMint], nil)
148- if ((mint == mint))
149- then {
150- let newLimit = (currentGlobalLimit - pwrToMint)
151- if ((0 > newLimit))
152- then throw(("The rest of the weekly global limit is: PWR " + toString(currentGlobalLimit)))
153- else {
154- let pwrBalanceAtEnd = assetBalance(this, pwrAssetId)
155- let pwrSold = (pwrBalanceAtEnd - pwrBalanceAtStart)
156- if ((minPwr > pwrSold))
157- then throw(((("Resulting " + toString(pwrSold)) + " PWRlets is less then min requested ") + toString(minPwr)))
158- else {
159- let staked = invoke(stakingContract, "stakeFor", [user], [AttachedPayment(pwrAssetId, pwrSold)])
160- if ((staked == staked))
161- then $Tuple2([changeBy("pwr_swapped", pwrSwapped), IntegerEntry(currentGlobalLimitStore, newLimit), changeBy(("balance_" + assetIn), (p.amount - tenPercent))], pwrSold)
162- else throw("Strict value is not equal to itself.")
163- }
164- }
165- }
166- else throw("Strict value is not equal to itself.")
167- }
168- }
169- else throw("Strict value is not equal to itself.")
170- }
171- else throw("Strict value is not equal to itself.")
172- }
173- else throw("Strict value is not equal to itself.")
174- }
175-
176-
177-
178-@Callable(i)
179-func buyPwrPuzzle (minPwr,routesStr) = {
121+func buyPwrPuzzleInternal (i,minPwr,routesStr,refCode) = {
180122 let paused = allowed("buyPwr")
181123 if ((paused == paused))
182124 then if ((size(i.payments) != 1))
183125 then throw("1 and only 1 payment is allowed")
184126 else {
185127 let user = toString(i.caller)
186128 let p = i.payments[0]
187129 let pwrBalanceAtStart = assetBalance(this, pwrAssetId)
188130 if ((pwrBalanceAtStart == pwrBalanceAtStart))
189131 then {
190132 let tenPercent = fraction(p.amount, 1, 10)
191133 let paymentToBuyPwr = AttachedPayment(p.assetId, tenPercent)
192134 let swaped = invoke(puzzleSwap, "swap", [routesStr, 0], [paymentToBuyPwr])
193135 if ((swaped == swaped))
194136 then {
195137 let pwrBalanceAfterSwap = assetBalance(this, pwrAssetId)
196138 if ((pwrBalanceAfterSwap == pwrBalanceAfterSwap))
197139 then {
198140 let pwrSwapped = (pwrBalanceAfterSwap - pwrBalanceAtStart)
199141 if ((0 >= pwrSwapped))
200142 then throw("nothing was swapped")
201143 else {
202144 let assetIn = if (isDefined(p.assetId))
203145 then toBase58String(value(p.assetId))
204146 else "WAVES"
205147 let totalPwr = pwrAmount(p.amount, assetIn)
206148 if ((totalPwr == totalPwr))
207149 then {
208- let pwrToMint = (totalPwr - pwrSwapped)
150+ let bonus = {
151+ let bonusBase1000 = getInteger(refBonusStorage(refCode))
152+ if (if ((size(refCode) >= 4))
153+ then isDefined(bonusBase1000)
154+ else false)
155+ then fraction(totalPwr, value(bonusBase1000), 1000)
156+ else 0
157+ }
158+ let pwrToMint = ((totalPwr - pwrSwapped) + (2 * bonus))
209159 let mint = invoke(minterContract, "mint", [pwrToMint], nil)
210160 if ((mint == mint))
211161 then {
212162 let newLimit = (currentGlobalLimit - pwrToMint)
213163 if ((0 > newLimit))
214- then throw(("The rest of the weekly global limit is: PWR " + toString(currentGlobalLimit)))
164+ then throw(("The rest of weekly global limit is: PWR " + toString(currentGlobalLimit)))
215165 else {
216166 let pwrBalanceAtEnd = assetBalance(this, pwrAssetId)
217- let pwrSold = (pwrBalanceAtEnd - pwrBalanceAtStart)
167+ let pwrSold = ((pwrBalanceAtEnd - pwrBalanceAtStart) - bonus)
218168 if ((minPwr > pwrSold))
219169 then throw(((("Resulting " + toString(pwrSold)) + " PWRlets is less then min requested ") + toString(minPwr)))
220170 else {
221171 let staked = invoke(stakingContract, "stakeFor", [user], [AttachedPayment(pwrAssetId, pwrSold)])
222172 if ((staked == staked))
223- then $Tuple2([changeBy("pwr_swapped", pwrSwapped), IntegerEntry(currentGlobalLimitStore, newLimit), changeBy(("balance_" + assetIn), (p.amount - tenPercent))], pwrSold)
173+ then {
174+ let bonusToRef = if ((bonus > 0))
175+ then {
176+ let refAddress = refAddressStorage(refCode)
177+ let stakeBonus = invoke(stakingContract, "stakeFor", [refAddress], [AttachedPayment(pwrAssetId, bonus)])
178+ if ((stakeBonus == stakeBonus))
179+ then unit
180+ else throw("Strict value is not equal to itself.")
181+ }
182+ else unit
183+ if ((bonusToRef == bonusToRef))
184+ then $Tuple2([changeBy("pwr_swapped", pwrSwapped), IntegerEntry(currentGlobalLimitStore, newLimit), changeBy(("balance_" + assetIn), (p.amount - tenPercent))], pwrSold)
185+ else throw("Strict value is not equal to itself.")
186+ }
224187 else throw("Strict value is not equal to itself.")
225188 }
226189 }
227190 }
228191 else throw("Strict value is not equal to itself.")
229192 }
230193 else throw("Strict value is not equal to itself.")
231194 }
232195 }
233196 else throw("Strict value is not equal to itself.")
234197 }
235198 else throw("Strict value is not equal to itself.")
236199 }
237200 else throw("Strict value is not equal to itself.")
238201 }
239202 else throw("Strict value is not equal to itself.")
240203 }
204+
205+
206+@Callable(i)
207+func swapCalculateREADONLY (amountIn,assetIn) = $Tuple2(nil, pwrAmount(amountIn, assetIn))
208+
209+
210+
211+@Callable(i)
212+func buyPwrPuzzleRef (minPwr,routesStr,refCode) = buyPwrPuzzleInternal(i, minPwr, routesStr, refCode)
213+
214+
215+
216+@Callable(i)
217+func buyPwrPuzzle (minPwr,routesStr) = buyPwrPuzzleInternal(i, minPwr, routesStr, "")
218+
219+
220+
221+@Callable(i)
222+func newRefCode (code,address,bonusBASE1000) = if ((i.caller != this))
223+ then throw("denied")
224+ else if ((4 > size(code)))
225+ then throw("code must be at least 4 chr long")
226+ else if (!(isDefined(addressFromString(address))))
227+ then throw("invalid address")
228+ else {
229+ let bonusStorage = refBonusStorage(code)
230+ let addressStorage = refAddressStorage(code)
231+ if ((bonusBASE1000 > 0))
232+ then [IntegerEntry(bonusStorage, bonusBASE1000), StringEntry(addressStorage, address)]
233+ else [DeleteEntry(bonusStorage), DeleteEntry(addressStorage)]
234+ }
241235
242236
243237
244238 @Callable(i)
245239 func init (conf) = [writeConstString(configAddressStore, conf)]
246240
247241
248242 @Verifier(tx)
249243 func verify () = {
250244 let byVoting = {
251245 let enabled = valueOrElse(getBoolean(configAddress, opAllowedStore("governance_apply_tx")), true)
252246 if (!(enabled))
253247 then throw("tx application throw governance not enabled")
254248 else {
255249 let id = toBase58String(tx.id)
256250 (HEIGHT >= getIntegerValue(votingResults, ((("proposal_allow_broadcast_" + toString(this)) + "_") + id)))
257251 }
258252 }
259253 if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
260254 then true
261255 else byVoting
262256 }
263257

github/deemru/w8io/873ac7e 
61.35 ms