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:
Old | New | Differences | |
---|---|---|---|
94 | 94 | ||
95 | 95 | let ethPPT = "3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13" | |
96 | 96 | ||
97 | + | func refBonusStorage (code) = ("ref_bonus_" + code) | |
98 | + | ||
99 | + | ||
100 | + | func refAddressStorage (code) = ("ref_address_" + code) | |
101 | + | ||
102 | + | ||
97 | 103 | func pwrAmount (amountIn,assetIn) = { | |
98 | - | let $ | |
99 | - | let price = $ | |
100 | - | let priceAvg = $ | |
104 | + | let $t035133615 = asPriceAndAvg(invoke(oracle, "priceInfo", [pwrPricePeriodHours, "PWR-USDT"], nil)) | |
105 | + | let price = $t035133615._1 | |
106 | + | let priceAvg = $t035133615._2 | |
101 | 107 | let PWR_USDT = max([price, priceAvg]) | |
102 | 108 | let usdtPrice = if ((assetIn == usdtERC20)) | |
103 | 109 | then 100000000 | |
112 | 118 | } | |
113 | 119 | ||
114 | 120 | ||
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) = { | |
180 | 122 | let paused = allowed("buyPwr") | |
181 | 123 | if ((paused == paused)) | |
182 | 124 | then if ((size(i.payments) != 1)) | |
205 | 147 | let totalPwr = pwrAmount(p.amount, assetIn) | |
206 | 148 | if ((totalPwr == totalPwr)) | |
207 | 149 | 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)) | |
209 | 159 | let mint = invoke(minterContract, "mint", [pwrToMint], nil) | |
210 | 160 | if ((mint == mint)) | |
211 | 161 | then { | |
212 | 162 | let newLimit = (currentGlobalLimit - pwrToMint) | |
213 | 163 | if ((0 > newLimit)) | |
214 | - | then throw(("The rest of | |
164 | + | then throw(("The rest of weekly global limit is: PWR " + toString(currentGlobalLimit))) | |
215 | 165 | else { | |
216 | 166 | let pwrBalanceAtEnd = assetBalance(this, pwrAssetId) | |
217 | - | let pwrSold = (pwrBalanceAtEnd - pwrBalanceAtStart) | |
167 | + | let pwrSold = ((pwrBalanceAtEnd - pwrBalanceAtStart) - bonus) | |
218 | 168 | if ((minPwr > pwrSold)) | |
219 | 169 | then throw(((("Resulting " + toString(pwrSold)) + " PWRlets is less then min requested ") + toString(minPwr))) | |
220 | 170 | else { | |
221 | 171 | let staked = invoke(stakingContract, "stakeFor", [user], [AttachedPayment(pwrAssetId, pwrSold)]) | |
222 | 172 | 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 | + | } | |
224 | 187 | else throw("Strict value is not equal to itself.") | |
225 | 188 | } | |
226 | 189 | } | |
238 | 201 | } | |
239 | 202 | else throw("Strict value is not equal to itself.") | |
240 | 203 | } | |
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 | + | } | |
241 | 235 | ||
242 | 236 | ||
243 | 237 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func writeConstString (key,value) = if (!(isDefined(getString(this, key)))) | |
5 | 5 | then StringEntry(key, value) | |
6 | 6 | else throw(("already initialized: " + key)) | |
7 | 7 | ||
8 | 8 | ||
9 | 9 | func writeInt (key,value) = if ((0 > value)) | |
10 | 10 | then throw(((("writing negative value " + toString(value)) + " for key ") + key)) | |
11 | 11 | else IntegerEntry(key, value) | |
12 | 12 | ||
13 | 13 | ||
14 | 14 | func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value)) | |
15 | 15 | ||
16 | 16 | ||
17 | 17 | func asInt (value) = match value { | |
18 | 18 | case int: Int => | |
19 | 19 | int | |
20 | 20 | case _ => | |
21 | 21 | throw("wrong type, expected: Int") | |
22 | 22 | } | |
23 | 23 | ||
24 | 24 | ||
25 | 25 | func asPriceAndAvg (value) = match value { | |
26 | 26 | case _ => | |
27 | 27 | if (if (if ($isInstanceOf($match0._1, "Int")) | |
28 | 28 | then if ($isInstanceOf($match0._2, "Int")) | |
29 | 29 | then if ($isInstanceOf($match0._3, "Int")) | |
30 | 30 | then $isInstanceOf($match0._4, "Int") | |
31 | 31 | else false | |
32 | 32 | else false | |
33 | 33 | else false) | |
34 | 34 | then $isInstanceOf($match0, "(Int, Int, Int, Int)") | |
35 | 35 | else false) | |
36 | 36 | then { | |
37 | 37 | let int1 = $match0._1 | |
38 | 38 | let int2 = $match0._2 | |
39 | 39 | let int3 = $match0._3 | |
40 | 40 | let int4 = $match0._4 | |
41 | 41 | $Tuple2(int1, int2) | |
42 | 42 | } | |
43 | 43 | else throw("wrong type, expected: (Int, Int, Int, Int)") | |
44 | 44 | } | |
45 | 45 | ||
46 | 46 | ||
47 | 47 | let configAddressStore = "config" | |
48 | 48 | ||
49 | 49 | let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "treasury: config address not found")), "invalid config address") | |
50 | 50 | ||
51 | 51 | let votingResults = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting_result"), "no contract_voting_result")), "invalid contract_voting_result") | |
52 | 52 | ||
53 | 53 | let HEIGHT = height | |
54 | 54 | ||
55 | 55 | func opAllowedStore (op) = (("op_" + op) + "_allowed") | |
56 | 56 | ||
57 | 57 | ||
58 | 58 | func allowed (op) = invoke(configAddress, "opAllowed", [op], nil) | |
59 | 59 | ||
60 | 60 | ||
61 | 61 | let pwrAssetId = fromBase58String(valueOrErrorMessage(getString(configAddress, "powerAssetId"), "pwr asset id not found")) | |
62 | 62 | ||
63 | 63 | let minterContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_minter"), "no contract_minter")), "invalid minter contract") | |
64 | 64 | ||
65 | 65 | let stakingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_staking"), "no staking_contract")), "invalid staking address") | |
66 | 66 | ||
67 | 67 | let oracle = valueOrErrorMessage(addressFromString(valueOrElse(getString(configAddress, (toString(this) + "_oracle")), "3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF")), "invalid oracle address") | |
68 | 68 | ||
69 | 69 | let swap = valueOrErrorMessage(addressFromString(valueOrElse(getString(configAddress, (toString(this) + "_swap")), "3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93")), "invalid swap address") | |
70 | 70 | ||
71 | 71 | let puzzleSwap = valueOrErrorMessage(addressFromString(valueOrElse(getString(configAddress, (toString(this) + "_puzzleSwap")), "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU")), "invalid puzzleSwap address") | |
72 | 72 | ||
73 | 73 | let totalPower = asInt(invoke(stakingContract, "totalPower", nil, nil)) | |
74 | 74 | ||
75 | 75 | let weeklyGlobalLimitPercent = valueOrElse(getInteger(configAddress, (toString(this) + "_weeklyGlobalLimitPercentBase1000")), 100) | |
76 | 76 | ||
77 | 77 | let weeklyGlobalLimit = fraction(totalPower, weeklyGlobalLimitPercent, 1000) | |
78 | 78 | ||
79 | 79 | let currentWeek = fraction(HEIGHT, 1, (1440 * 7)) | |
80 | 80 | ||
81 | 81 | let currentGlobalLimitStore = ("global_limit_" + toString(currentWeek)) | |
82 | 82 | ||
83 | 83 | let currentGlobalLimit = valueOrElse(getInteger(this, currentGlobalLimitStore), weeklyGlobalLimit) | |
84 | 84 | ||
85 | 85 | let bonusPercent = valueOrElse(getInteger(configAddress, (toString(this) + "_bonusPercentBase1000")), 1010) | |
86 | 86 | ||
87 | 87 | let pwrAssetIdStr = toBase58String(pwrAssetId) | |
88 | 88 | ||
89 | 89 | let pwrPricePeriodHours = valueOrElse(getInteger(configAddress, (toString(this) + "_pwrPricePeriodHours")), 4) | |
90 | 90 | ||
91 | 91 | let xtn = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" | |
92 | 92 | ||
93 | 93 | let usdtERC20 = "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" | |
94 | 94 | ||
95 | 95 | let ethPPT = "3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13" | |
96 | 96 | ||
97 | + | func refBonusStorage (code) = ("ref_bonus_" + code) | |
98 | + | ||
99 | + | ||
100 | + | func refAddressStorage (code) = ("ref_address_" + code) | |
101 | + | ||
102 | + | ||
97 | 103 | func pwrAmount (amountIn,assetIn) = { | |
98 | - | let $ | |
99 | - | let price = $ | |
100 | - | let priceAvg = $ | |
104 | + | let $t035133615 = asPriceAndAvg(invoke(oracle, "priceInfo", [pwrPricePeriodHours, "PWR-USDT"], nil)) | |
105 | + | let price = $t035133615._1 | |
106 | + | let priceAvg = $t035133615._2 | |
101 | 107 | let PWR_USDT = max([price, priceAvg]) | |
102 | 108 | let usdtPrice = if ((assetIn == usdtERC20)) | |
103 | 109 | then 100000000 | |
104 | 110 | else if ((assetIn == ethPPT)) | |
105 | 111 | then valueOrErrorMessage(getInteger(oracle, "%s%s__price__ETH-USDT"), "ETH price is not in the Oracle") | |
106 | 112 | else if ((assetIn == "WAVES")) | |
107 | 113 | then valueOrErrorMessage(getInteger(oracle, "%s%s__price__WAVES-USDT"), "WAVES price is not in the Oracle") | |
108 | 114 | else if ((assetIn == xtn)) | |
109 | 115 | then (valueOrErrorMessage(getInteger(oracle, "%s%s__price__USDN-USDT"), "XTN price is not in the Oracle") * 100) | |
110 | 116 | else throw("Token is not supported yet. Supported are: USDT-ERC20, WAVES, XTN") | |
111 | 117 | fraction(fraction(amountIn, usdtPrice, PWR_USDT), bonusPercent, 1000) | |
112 | 118 | } | |
113 | 119 | ||
114 | 120 | ||
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) = { | |
180 | 122 | let paused = allowed("buyPwr") | |
181 | 123 | if ((paused == paused)) | |
182 | 124 | then if ((size(i.payments) != 1)) | |
183 | 125 | then throw("1 and only 1 payment is allowed") | |
184 | 126 | else { | |
185 | 127 | let user = toString(i.caller) | |
186 | 128 | let p = i.payments[0] | |
187 | 129 | let pwrBalanceAtStart = assetBalance(this, pwrAssetId) | |
188 | 130 | if ((pwrBalanceAtStart == pwrBalanceAtStart)) | |
189 | 131 | then { | |
190 | 132 | let tenPercent = fraction(p.amount, 1, 10) | |
191 | 133 | let paymentToBuyPwr = AttachedPayment(p.assetId, tenPercent) | |
192 | 134 | let swaped = invoke(puzzleSwap, "swap", [routesStr, 0], [paymentToBuyPwr]) | |
193 | 135 | if ((swaped == swaped)) | |
194 | 136 | then { | |
195 | 137 | let pwrBalanceAfterSwap = assetBalance(this, pwrAssetId) | |
196 | 138 | if ((pwrBalanceAfterSwap == pwrBalanceAfterSwap)) | |
197 | 139 | then { | |
198 | 140 | let pwrSwapped = (pwrBalanceAfterSwap - pwrBalanceAtStart) | |
199 | 141 | if ((0 >= pwrSwapped)) | |
200 | 142 | then throw("nothing was swapped") | |
201 | 143 | else { | |
202 | 144 | let assetIn = if (isDefined(p.assetId)) | |
203 | 145 | then toBase58String(value(p.assetId)) | |
204 | 146 | else "WAVES" | |
205 | 147 | let totalPwr = pwrAmount(p.amount, assetIn) | |
206 | 148 | if ((totalPwr == totalPwr)) | |
207 | 149 | 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)) | |
209 | 159 | let mint = invoke(minterContract, "mint", [pwrToMint], nil) | |
210 | 160 | if ((mint == mint)) | |
211 | 161 | then { | |
212 | 162 | let newLimit = (currentGlobalLimit - pwrToMint) | |
213 | 163 | if ((0 > newLimit)) | |
214 | - | then throw(("The rest of | |
164 | + | then throw(("The rest of weekly global limit is: PWR " + toString(currentGlobalLimit))) | |
215 | 165 | else { | |
216 | 166 | let pwrBalanceAtEnd = assetBalance(this, pwrAssetId) | |
217 | - | let pwrSold = (pwrBalanceAtEnd - pwrBalanceAtStart) | |
167 | + | let pwrSold = ((pwrBalanceAtEnd - pwrBalanceAtStart) - bonus) | |
218 | 168 | if ((minPwr > pwrSold)) | |
219 | 169 | then throw(((("Resulting " + toString(pwrSold)) + " PWRlets is less then min requested ") + toString(minPwr))) | |
220 | 170 | else { | |
221 | 171 | let staked = invoke(stakingContract, "stakeFor", [user], [AttachedPayment(pwrAssetId, pwrSold)]) | |
222 | 172 | 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 | + | } | |
224 | 187 | else throw("Strict value is not equal to itself.") | |
225 | 188 | } | |
226 | 189 | } | |
227 | 190 | } | |
228 | 191 | else throw("Strict value is not equal to itself.") | |
229 | 192 | } | |
230 | 193 | else throw("Strict value is not equal to itself.") | |
231 | 194 | } | |
232 | 195 | } | |
233 | 196 | else throw("Strict value is not equal to itself.") | |
234 | 197 | } | |
235 | 198 | else throw("Strict value is not equal to itself.") | |
236 | 199 | } | |
237 | 200 | else throw("Strict value is not equal to itself.") | |
238 | 201 | } | |
239 | 202 | else throw("Strict value is not equal to itself.") | |
240 | 203 | } | |
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 | + | } | |
241 | 235 | ||
242 | 236 | ||
243 | 237 | ||
244 | 238 | @Callable(i) | |
245 | 239 | func init (conf) = [writeConstString(configAddressStore, conf)] | |
246 | 240 | ||
247 | 241 | ||
248 | 242 | @Verifier(tx) | |
249 | 243 | func verify () = { | |
250 | 244 | let byVoting = { | |
251 | 245 | let enabled = valueOrElse(getBoolean(configAddress, opAllowedStore("governance_apply_tx")), true) | |
252 | 246 | if (!(enabled)) | |
253 | 247 | then throw("tx application throw governance not enabled") | |
254 | 248 | else { | |
255 | 249 | let id = toBase58String(tx.id) | |
256 | 250 | (HEIGHT >= getIntegerValue(votingResults, ((("proposal_allow_broadcast_" + toString(this)) + "_") + id))) | |
257 | 251 | } | |
258 | 252 | } | |
259 | 253 | if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)) | |
260 | 254 | then true | |
261 | 255 | else byVoting | |
262 | 256 | } | |
263 | 257 |
github/deemru/w8io/873ac7e 61.35 ms ◑![]()