2023.06.06 09:56 [3676019] smart account 3PHBHv5bHJ54gGPra43dJjmmDQfx3XZnaMh > SELF 0.00000000 Waves

{ "type": 13, "id": "FCgKpV3XQJartdPsG4KtAwkffRe3FXepAFXgbn9TQ3kn", "fee": 3700000, "feeAssetId": null, "timestamp": 1686034644966, "version": 2, "chainId": 87, "sender": "3PHBHv5bHJ54gGPra43dJjmmDQfx3XZnaMh", "senderPublicKey": "44g3MaVEsS9ULWvcrh5WTeF6neYVgVFeaaEcwf1ypKvs", "proofs": [ "2ZARk6dnxuuUF29DVbSwA9VL6vQkJn3f74quYNVtbDAdp7k2PM4H494MJQ6vziLnhEWWbDx6tfzkE2TsttnEJUuZ" ], "script": "base64:BgIlCAISBQoDCAgIEgASABIECgIICBIECgIIARIAEgMKAQgSAwoBCCMAB2tfZnVuZHMCB2tfZnVuZHMAF2tfYXNzZXRfbWFuYWdlcl9hZGRyZXNzAhdrX2Fzc2V0X21hbmFnZXJfYWRkcmVzcwAUa19jb29yZGluYXRvckFkZHJlc3MCFGtfY29vcmRpbmF0b3JBZGRyZXNzABBrX29yZGVyc19hZGRyZXNzAhBrX29yZGVyc19hZGRyZXNzAA9rX3ZhdWx0X2FkZHJlc3MCD2tfdmF1bHRfYWRkcmVzcwAFa19hbW0CBWtfYW1tAA9rX2FkbWluX2FkZHJlc3MCD2tfYWRtaW5fYWRkcmVzcwARa19zdGFraW5nX2FkZHJlc3MCEWtfc3Rha2luZ19hZGRyZXNzAA5rX3Nwb3RfYWRkcmVzcwIOa19zcG90X2FkZHJlc3MAEWtfZmFybWluZ19hZGRyZXNzAhFrX2Zhcm1pbmdfYWRkcmVzcwAOa19yZXdhcmRfYXNzZXQCDmtfcmV3YXJkX2Fzc2V0AAdrX3ZhdWx0AgdrX3ZhdWx0AA1rX2luaXRpYWxpemVkAg1rX2luaXRpYWxpemVkAAhrX3BhdXNlZAIIa19wYXVzZWQAEWtfcHJvZml0RGlyZWN0aW9uAhFrX3Byb2ZpdERpcmVjdGlvbgAJUFJPRklUX0xQAAEAC1BST0ZJVF9GQVJNAAIBDnRvQ29tcG9zaXRlS2V5AgRfa2V5CF9hZGRyZXNzCQCsAgIJAKwCAgUEX2tleQIBXwUIX2FkZHJlc3MBCWJhbGFuY2VPZgEIX2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUHa19mdW5kcwUIX2Fzc2V0SWQAAAELY29vcmRpbmF0b3IACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAhtDb29yZGluYXRvciBub3Qgc2V0IE1hbmFnZXICG0Nvb3JkaW5hdG9yIGFkZHJlc3MgaW52YWxpZAEMdmF1bHRBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQELY29vcmRpbmF0b3IABQ9rX3ZhdWx0X2FkZHJlc3MCFVZhdWx0IGFkZHJlc3Mgbm90IHNldAIVVmF1bHQgYWRkcmVzcyBpbnZhbGlkAQ1vcmRlcnNBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQELY29vcmRpbmF0b3IABRBrX29yZGVyc19hZGRyZXNzAhZPcmRlcnMgYWRkcmVzcyBub3Qgc2V0AhZPcmRlcnMgYWRkcmVzcyBpbnZhbGlkAQxhZG1pbkFkZHJlc3MACQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQELY29vcmRpbmF0b3IABQ9rX2FkbWluX2FkZHJlc3MCFUFkbWluIGFkZHJlc3Mgbm90IHNldAEOc3Rha2luZ0FkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQtjb29yZGluYXRvcgAFEWtfc3Rha2luZ19hZGRyZXNzAhdTdGFraW5nIGFkZHJlc3Mgbm90IHNldAIXU3Rha2luZyBhZGRyZXNzIGludmFsaWQBC3Nwb3RBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQELY29vcmRpbmF0b3IABQ5rX3Nwb3RfYWRkcmVzcwIUU3BvdCBhZGRyZXNzIG5vdCBzZXQCFFNwb3QgYWRkcmVzcyBpbnZhbGlkAQ5mYXJtaW5nQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRFrX2Zhcm1pbmdfYWRkcmVzcwIPRmFybWluZyBub3Qgc2V0AQtyZXdhcmRBc3NldAAJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQtjb29yZGluYXRvcgAFDmtfcmV3YXJkX2Fzc2V0AhRSZXdhcmQgYXNzZXQgbm90IHNldAELaW5pdGlhbGl6ZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDWtfaW5pdGlhbGl6ZWQHAQZwYXVzZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFCGtfcGF1c2VkBwETYXNzZXRNYW5hZ2VyQWRkcmVzcwEIX2Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUXa19hc3NldF9tYW5hZ2VyX2FkZHJlc3MFCF9hc3NldElkCQCsAgICG05vIGFzc2V0IG1hbmFnZXIgZm9yIHRva2VuIAUIX2Fzc2V0SWQJAKwCAgIoSW52YWxpZCBhc3NldCBtYW5hZ2VyIGFkZHJlc3MgZm9yIHRva2VuIAUIX2Fzc2V0SWQBD3Byb2ZpdERpcmVjdGlvbgAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa19wcm9maXREaXJlY3Rpb24FCVBST0ZJVF9MUAELaXNTcG90VmF1bHQBCF9hZGRyZXNzBARzcG90CQELc3BvdEFkZHJlc3MACQELdmFsdWVPckVsc2UCCQCbCAIFBHNwb3QJAQ50b0NvbXBvc2l0ZUtleQIFB2tfdmF1bHQFCF9hZGRyZXNzBwELaXNXaGl0ZWxpc3QBCF9hZGRyZXNzAwMDCQAAAgUIX2FkZHJlc3MJAKUIAQkBDnN0YWtpbmdBZGRyZXNzAAYJAAACBQhfYWRkcmVzcwkApQgBCQEMdmF1bHRBZGRyZXNzAAYJAAACBQhfYWRkcmVzcwkApQgBCQENb3JkZXJzQWRkcmVzcwAGCQELaXNTcG90VmF1bHQBBQhfYWRkcmVzcwELdXBkYXRlRnVuZHMCCF9hc3NldElkBl92YWx1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUHa19mdW5kcwUIX2Fzc2V0SWQFBl92YWx1ZQUDbmlsAQpzdHJBc3NldElkAQZfYXNzZXQDCQEJaXNEZWZpbmVkAQUGX2Fzc2V0CQDYBAEJAQV2YWx1ZQEFBl9hc3NldAIFV0FWRVMIAWkBCmluaXRpYWxpemUDDF9jb29yZGluYXRvcg1fcXVvdGVBc3NldElkEl9xdW90ZUFzc2V0TWFuYWdlcgMDCQELaW5pdGlhbGl6ZWQABgkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIUVW5hYmxlIHRvIGluaXRpYWxpemUJAMwIAgkBC1N0cmluZ0VudHJ5AgUUa19jb29yZGluYXRvckFkZHJlc3MJAKUIAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUMX2Nvb3JkaW5hdG9yCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFF2tfYXNzZXRfbWFuYWdlcl9hZGRyZXNzBQ1fcXVvdGVBc3NldElkCQClCAEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEl9xdW90ZUFzc2V0TWFuYWdlcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUNa19pbml0aWFsaXplZAYFA25pbAFpAQd1bnBhdXNlAAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhZJbnZhbGlkIHVucGF1c2UgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQhrX3BhdXNlZAcFA25pbAFpAQVwYXVzZQADCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIUSW52YWxpZCBwYXVzZSBwYXJhbXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCGtfcGF1c2VkBgUDbmlsAWkBD2FkZEFzc2V0TWFuYWdlcgIIX2Fzc2V0SWQNX3ZhdWx0QWRkcmVzcwMDAwkBASEBCQELaW5pdGlhbGl6ZWQABgkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAYDCQEJaXNEZWZpbmVkAQkAoggBCQEOdG9Db21wb3NpdGVLZXkCBRdrX2Fzc2V0X21hbmFnZXJfYWRkcmVzcwUIX2Fzc2V0SWQJAGYCCQEJYmFsYW5jZU9mAQUIX2Fzc2V0SWQAAAcJAAIBAhxJbnZhbGlkIGFkZFRva2VuVmF1bHQgcGFyYW1zCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFF2tfYXNzZXRfbWFuYWdlcl9hZGRyZXNzBQhfYXNzZXRJZAkApQgBCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1fdmF1bHRBZGRyZXNzBQNuaWwBaQEId2l0aGRyYXcCCF9hc3NldElkB19hbW91bnQDAwMDCQEBIQEJAQtpc1doaXRlbGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAGCQBmAgUHX2Ftb3VudAkBCWJhbGFuY2VPZgEFCF9hc3NldElkCQACAQkArAICCQCsAgIJAKwCAgIiSW52YWxpZCB3aXRoZHJhdyBwYXJhbXMgKG1hbmFnZXIpIAkApAMBBQdfYW1vdW50AgMgPiAJAKQDAQkBCWJhbGFuY2VPZgEFCF9hc3NldElkBAd1bnN0YWtlCQD8BwQJARNhc3NldE1hbmFnZXJBZGRyZXNzAQUIX2Fzc2V0SWQCCHdpdGhkcmF3CQDMCAIFCF9hc3NldElkCQDMCAIFB19hbW91bnQFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UEE2N1cnJlbnRBc3NldEJhbGFuY2UJAGUCCQEJYmFsYW5jZU9mAQUIX2Fzc2V0SWQFB19hbW91bnQJAM4IAgkBC3VwZGF0ZUZ1bmRzAgUIX2Fzc2V0SWQFE2N1cnJlbnRBc3NldEJhbGFuY2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQdfYW1vdW50AwkAAAIFCF9hc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQhfYXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2RlcG9zaXQABAdfYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQIX2Fzc2V0SWQJAQpzdHJBc3NldElkAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwMDAwkBASEBCQELaW5pdGlhbGl6ZWQABgMJAQEhAQkBC2lzV2hpdGVsaXN0AQkApQgBCAUBaQZjYWxsZXIJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAHBgkBBnBhdXNlZAAGCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiBJbnZhbGlkIGRlcG9zaXQgcGFyYW1zIChtYW5hZ2VyKQQFc3Rha2UJAPwHBAkBE2Fzc2V0TWFuYWdlckFkZHJlc3MBBQhfYXNzZXRJZAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFB19hbW91bnQFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UEE2N1cnJlbnRBc3NldEJhbGFuY2UJAGQCCQEJYmFsYW5jZU9mAQUIX2Fzc2V0SWQFB19hbW91bnQJAQt1cGRhdGVGdW5kcwIFCF9hc3NldElkBRNjdXJyZW50QXNzZXRCYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2NsYWltUHJvZml0AQhfYXNzZXRJZAMDCQEBIQEJAQtpbml0aWFsaXplZAAGCQEBIQEDCQAAAggFAWkGY2FsbGVyCQEMdmF1bHRBZGRyZXNzAAYJAQtpc1Nwb3RWYXVsdAEJAKUIAQgFAWkGY2FsbGVyCQACAQIkSW52YWxpZCBjbGFpbVByb2ZpdCBwYXJhbXMgKG1hbmFnZXIpBBNkb0NsYWltUHJvZml0UmVzdWx0CQD8BwQJARNhc3NldE1hbmFnZXJBZGRyZXNzAQUIX2Fzc2V0SWQCC2NsYWltUHJvZml0CQDMCAIFCF9hc3NldElkBQNuaWwFA25pbAMJAAACBRNkb0NsYWltUHJvZml0UmVzdWx0BRNkb0NsYWltUHJvZml0UmVzdWx0BAZwcm9maXQEByRtYXRjaDAFE2RvQ2xhaW1Qcm9maXRSZXN1bHQDCQABAgUHJG1hdGNoMAIDSW50BAF0BQckbWF0Y2gwBQF0CQACAQIfSW52YWxpZCBjbGFpbVByb2ZpdCByZXN1bHQgdHlwZQQLcHJvZml0QXNzZXQDCQAAAgUIX2Fzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFCF9hc3NldElkBA5wcm9maXRSZWNlaXZlcgMDCQAAAgULcHJvZml0QXNzZXQJAQtyZXdhcmRBc3NldAAJAAACCQEPcHJvZml0RGlyZWN0aW9uAAULUFJPRklUX0ZBUk0HCQEOZmFybWluZ0FkZHJlc3MACAUBaQZjYWxsZXIJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5wcm9maXRSZWNlaXZlcgUGcHJvZml0BQtwcm9maXRBc3NldAUDbmlsBQZwcm9maXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQdmlld19jbGFpbVByb2ZpdAEIX2Fzc2V0SWQDCQEBIQEJAQtpbml0aWFsaXplZAAJAAIBAilJbnZhbGlkIHZpZXdfY2xhaW1Qcm9maXQgcGFyYW1zIChtYW5hZ2VyKQQTZG9DbGFpbVByb2ZpdFJlc3VsdAkA/AcECQETYXNzZXRNYW5hZ2VyQWRkcmVzcwEFCF9hc3NldElkAgtjbGFpbVByb2ZpdAkAzAgCBQhfYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUTZG9DbGFpbVByb2ZpdFJlc3VsdAUTZG9DbGFpbVByb2ZpdFJlc3VsdAQGcHJvZml0BAckbWF0Y2gwBRNkb0NsYWltUHJvZml0UmVzdWx0AwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAUBdAkAAgECH0ludmFsaWQgY2xhaW1Qcm9maXQgcmVzdWx0IHR5cGUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKQDAQkBCWJhbGFuY2VPZgEFCF9hc3NldElkAgEsCQCkAwEJAGQCCQEJYmFsYW5jZU9mAQUIX2Fzc2V0SWQFBnByb2ZpdAIBLAkApAMBBQZwcm9maXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA5jb29yZGluYXRvclN0cgkAnQgCBQR0aGlzBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwMJAQlpc0RlZmluZWQBBQ5jb29yZGluYXRvclN0cgQFYWRtaW4JAJ0IAgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUOY29vcmRpbmF0b3JTdHIFD2tfYWRtaW5fYWRkcmVzcwMJAQlpc0RlZmluZWQBBQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQVhZG1pbgkArAICCQCsAgIJAKwCAgIHc3RhdHVzXwkApQgBBQR0aGlzAgFfCQDYBAEIBQJ0eAJpZAcJAAIBAi51bmFibGUgdG8gdmVyaWZ5OiBhZG1pbiBub3Qgc2V0IGluIGNvb3JkaW5hdG9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5p9V1rg==", "height": 3676019, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BF4BSBtkggpf87i24m6Wph3qnhd2dCderNN5ZH6cJyLg Next: HBNndZWRRPV4zApMMht6dPqaAxvrKMjjBSJUSFznhjMb Diff:
OldNewDifferences
1919
2020 let k_spot_address = "k_spot_address"
2121
22+let k_farming_address = "k_farming_address"
23+
24+let k_reward_asset = "k_reward_asset"
25+
2226 let k_vault = "k_vault"
2327
2428 let k_initialized = "k_initialized"
2529
2630 let k_paused = "k_paused"
31+
32+let k_profitDirection = "k_profitDirection"
33+
34+let PROFIT_LP = 1
35+
36+let PROFIT_FARM = 2
2737
2838 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
2939
4959 func spotAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(coordinator(), k_spot_address), "Spot address not set")), "Spot address invalid")
5060
5161
62+func farmingAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_farming_address)), "Farming not set")
63+
64+
65+func rewardAsset () = fromBase58String(valueOrErrorMessage(getString(coordinator(), k_reward_asset), "Reward asset not set"))
66+
67+
5268 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
5369
5470
5874 func assetManagerAddress (_assetId) = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, toCompositeKey(k_asset_manager_address, _assetId)), ("No asset manager for token " + _assetId))), ("Invalid asset manager address for token " + _assetId))
5975
6076
77+func profitDirection () = valueOrElse(getInteger(this, k_profitDirection), PROFIT_LP)
78+
79+
6180 func isSpotVault (_address) = {
6281 let spot = spotAddress()
6382 valueOrElse(getBoolean(spot, toCompositeKey(k_vault, _address)), false)
6483 }
6584
6685
67-func isWhitelist (_address) = if (if ((_address == toString(stakingAddress())))
86+func isWhitelist (_address) = if (if (if ((_address == toString(stakingAddress())))
6887 then true
6988 else (_address == toString(vaultAddress())))
7089 then true
71- else (_address == toString(ordersAddress()))
90+ else (_address == toString(ordersAddress())))
91+ then true
92+ else isSpotVault(_address)
7293
7394
7495 func updateFunds (_assetId,_value) = [IntegerEntry(toCompositeKey(k_funds, _assetId), _value)]
168189 @Callable(i)
169190 func claimProfit (_assetId) = if (if (!(initialized()))
170191 then true
171- else (i.caller != vaultAddress()))
192+ else !(if ((i.caller == vaultAddress()))
193+ then true
194+ else isSpotVault(toString(i.caller))))
172195 then throw("Invalid claimProfit params (manager)")
173196 else {
174197 let doClaimProfitResult = invoke(assetManagerAddress(_assetId), "claimProfit", [_assetId], nil)
180203 case _ =>
181204 throw("Invalid claimProfit result type")
182205 }
183- $Tuple2([ScriptTransfer(i.caller, profit, if ((_assetId == "WAVES"))
206+ let profitAsset = if ((_assetId == "WAVES"))
184207 then unit
185- else fromBase58String(_assetId))], profit)
208+ else fromBase58String(_assetId)
209+ let profitReceiver = if (if ((profitAsset == rewardAsset()))
210+ then (profitDirection() == PROFIT_FARM)
211+ else false)
212+ then farmingAddress()
213+ else i.caller
214+ $Tuple2([ScriptTransfer(profitReceiver, profit, profitAsset)], profit)
186215 }
187216 else throw("Strict value is not equal to itself.")
188217 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let k_funds = "k_funds"
55
66 let k_asset_manager_address = "k_asset_manager_address"
77
88 let k_coordinatorAddress = "k_coordinatorAddress"
99
1010 let k_orders_address = "k_orders_address"
1111
1212 let k_vault_address = "k_vault_address"
1313
1414 let k_amm = "k_amm"
1515
1616 let k_admin_address = "k_admin_address"
1717
1818 let k_staking_address = "k_staking_address"
1919
2020 let k_spot_address = "k_spot_address"
2121
22+let k_farming_address = "k_farming_address"
23+
24+let k_reward_asset = "k_reward_asset"
25+
2226 let k_vault = "k_vault"
2327
2428 let k_initialized = "k_initialized"
2529
2630 let k_paused = "k_paused"
31+
32+let k_profitDirection = "k_profitDirection"
33+
34+let PROFIT_LP = 1
35+
36+let PROFIT_FARM = 2
2737
2838 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
2939
3040
3141 func balanceOf (_assetId) = valueOrElse(getInteger(this, toCompositeKey(k_funds, _assetId)), 0)
3242
3343
3444 func coordinator () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, k_coordinatorAddress), "Coordinator not set Manager")), "Coordinator address invalid")
3545
3646
3747 func vaultAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(coordinator(), k_vault_address), "Vault address not set")), "Vault address invalid")
3848
3949
4050 func ordersAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(coordinator(), k_orders_address), "Orders address not set")), "Orders address invalid")
4151
4252
4353 func adminAddress () = addressFromString(valueOrErrorMessage(getString(coordinator(), k_admin_address), "Admin address not set"))
4454
4555
4656 func stakingAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(coordinator(), k_staking_address), "Staking address not set")), "Staking address invalid")
4757
4858
4959 func spotAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(coordinator(), k_spot_address), "Spot address not set")), "Spot address invalid")
5060
5161
62+func farmingAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_farming_address)), "Farming not set")
63+
64+
65+func rewardAsset () = fromBase58String(valueOrErrorMessage(getString(coordinator(), k_reward_asset), "Reward asset not set"))
66+
67+
5268 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
5369
5470
5571 func paused () = valueOrElse(getBoolean(this, k_paused), false)
5672
5773
5874 func assetManagerAddress (_assetId) = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, toCompositeKey(k_asset_manager_address, _assetId)), ("No asset manager for token " + _assetId))), ("Invalid asset manager address for token " + _assetId))
5975
6076
77+func profitDirection () = valueOrElse(getInteger(this, k_profitDirection), PROFIT_LP)
78+
79+
6180 func isSpotVault (_address) = {
6281 let spot = spotAddress()
6382 valueOrElse(getBoolean(spot, toCompositeKey(k_vault, _address)), false)
6483 }
6584
6685
67-func isWhitelist (_address) = if (if ((_address == toString(stakingAddress())))
86+func isWhitelist (_address) = if (if (if ((_address == toString(stakingAddress())))
6887 then true
6988 else (_address == toString(vaultAddress())))
7089 then true
71- else (_address == toString(ordersAddress()))
90+ else (_address == toString(ordersAddress())))
91+ then true
92+ else isSpotVault(_address)
7293
7394
7495 func updateFunds (_assetId,_value) = [IntegerEntry(toCompositeKey(k_funds, _assetId), _value)]
7596
7697
7798 func strAssetId (_asset) = if (isDefined(_asset))
7899 then toBase58String(value(_asset))
79100 else "WAVES"
80101
81102
82103 @Callable(i)
83104 func initialize (_coordinator,_quoteAssetId,_quoteAssetManager) = if (if (initialized())
84105 then true
85106 else (i.caller != this))
86107 then throw("Unable to initialize")
87108 else [StringEntry(k_coordinatorAddress, toString(addressFromStringValue(_coordinator))), StringEntry(toCompositeKey(k_asset_manager_address, _quoteAssetId), toString(addressFromStringValue(_quoteAssetManager))), BooleanEntry(k_initialized, true)]
88109
89110
90111
91112 @Callable(i)
92113 func unpause () = if ((i.caller != adminAddress()))
93114 then throw("Invalid unpause params")
94115 else [BooleanEntry(k_paused, false)]
95116
96117
97118
98119 @Callable(i)
99120 func pause () = if ((i.caller != adminAddress()))
100121 then throw("Invalid pause params")
101122 else [BooleanEntry(k_paused, true)]
102123
103124
104125
105126 @Callable(i)
106127 func addAssetManager (_assetId,_vaultAddress) = if (if (if (!(initialized()))
107128 then true
108129 else (i.caller != adminAddress()))
109130 then true
110131 else if (isDefined(getString(toCompositeKey(k_asset_manager_address, _assetId))))
111132 then (balanceOf(_assetId) > 0)
112133 else false)
113134 then throw("Invalid addTokenVault params")
114135 else [StringEntry(toCompositeKey(k_asset_manager_address, _assetId), toString(addressFromStringValue(_vaultAddress)))]
115136
116137
117138
118139 @Callable(i)
119140 func withdraw (_assetId,_amount) = if (if (if (if (!(isWhitelist(toString(i.caller))))
120141 then true
121142 else !(initialized()))
122143 then true
123144 else paused())
124145 then true
125146 else (_amount > balanceOf(_assetId)))
126147 then throw(((("Invalid withdraw params (manager) " + toString(_amount)) + " > ") + toString(balanceOf(_assetId))))
127148 else {
128149 let unstake = invoke(assetManagerAddress(_assetId), "withdraw", [_assetId, _amount], nil)
129150 if ((unstake == unstake))
130151 then {
131152 let currentAssetBalance = (balanceOf(_assetId) - _amount)
132153 (updateFunds(_assetId, currentAssetBalance) ++ [ScriptTransfer(i.caller, _amount, if ((_assetId == "WAVES"))
133154 then unit
134155 else fromBase58String(_assetId))])
135156 }
136157 else throw("Strict value is not equal to itself.")
137158 }
138159
139160
140161
141162 @Callable(i)
142163 func deposit () = {
143164 let _amount = i.payments[0].amount
144165 let _assetId = strAssetId(i.payments[0].assetId)
145166 if (if (if (if (!(initialized()))
146167 then true
147168 else if (!(isWhitelist(toString(i.caller))))
148169 then (i.caller != adminAddress())
149170 else false)
150171 then true
151172 else paused())
152173 then true
153174 else (size(i.payments) != 1))
154175 then throw("Invalid deposit params (manager)")
155176 else {
156177 let stake = invoke(assetManagerAddress(_assetId), "deposit", nil, [AttachedPayment(i.payments[0].assetId, _amount)])
157178 if ((stake == stake))
158179 then {
159180 let currentAssetBalance = (balanceOf(_assetId) + _amount)
160181 updateFunds(_assetId, currentAssetBalance)
161182 }
162183 else throw("Strict value is not equal to itself.")
163184 }
164185 }
165186
166187
167188
168189 @Callable(i)
169190 func claimProfit (_assetId) = if (if (!(initialized()))
170191 then true
171- else (i.caller != vaultAddress()))
192+ else !(if ((i.caller == vaultAddress()))
193+ then true
194+ else isSpotVault(toString(i.caller))))
172195 then throw("Invalid claimProfit params (manager)")
173196 else {
174197 let doClaimProfitResult = invoke(assetManagerAddress(_assetId), "claimProfit", [_assetId], nil)
175198 if ((doClaimProfitResult == doClaimProfitResult))
176199 then {
177200 let profit = match doClaimProfitResult {
178201 case t: Int =>
179202 t
180203 case _ =>
181204 throw("Invalid claimProfit result type")
182205 }
183- $Tuple2([ScriptTransfer(i.caller, profit, if ((_assetId == "WAVES"))
206+ let profitAsset = if ((_assetId == "WAVES"))
184207 then unit
185- else fromBase58String(_assetId))], profit)
208+ else fromBase58String(_assetId)
209+ let profitReceiver = if (if ((profitAsset == rewardAsset()))
210+ then (profitDirection() == PROFIT_FARM)
211+ else false)
212+ then farmingAddress()
213+ else i.caller
214+ $Tuple2([ScriptTransfer(profitReceiver, profit, profitAsset)], profit)
186215 }
187216 else throw("Strict value is not equal to itself.")
188217 }
189218
190219
191220
192221 @Callable(i)
193222 func view_claimProfit (_assetId) = if (!(initialized()))
194223 then throw("Invalid view_claimProfit params (manager)")
195224 else {
196225 let doClaimProfitResult = invoke(assetManagerAddress(_assetId), "claimProfit", [_assetId], nil)
197226 if ((doClaimProfitResult == doClaimProfitResult))
198227 then {
199228 let profit = match doClaimProfitResult {
200229 case t: Int =>
201230 t
202231 case _ =>
203232 throw("Invalid claimProfit result type")
204233 }
205234 throw(((((toString(balanceOf(_assetId)) + ",") + toString((balanceOf(_assetId) + profit))) + ",") + toString(profit)))
206235 }
207236 else throw("Strict value is not equal to itself.")
208237 }
209238
210239
211240 @Verifier(tx)
212241 func verify () = {
213242 let coordinatorStr = getString(this, k_coordinatorAddress)
214243 if (isDefined(coordinatorStr))
215244 then {
216245 let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address)
217246 if (isDefined(admin))
218247 then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
219248 else throw("unable to verify: admin not set in coordinator")
220249 }
221250 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
222251 }
223252

github/deemru/w8io/786bc32 
38.43 ms