2022.11.25 11:06 [3397811] smart account 3PK7Xe5BiedRyxHLuMQx5ey9riUQqvUths2 > SELF 0.00000000 Waves

{ "type": 13, "id": "712Ae6e6UtgVmkqu8LZoubZtfEQDRWGg6exogTehipqL", "fee": 1200000, "feeAssetId": null, "timestamp": 1669363334872, "version": 2, "chainId": 87, "sender": "3PK7Xe5BiedRyxHLuMQx5ey9riUQqvUths2", "senderPublicKey": "7hEH4UN8YsnvBCS3YmjieqS332S69yTNjxNp83SmtDrQ", "proofs": [ "", "bLaqCcChNLpAyqntVDjHy9J3gz4yt6kRvpmHLzgvgHyY9ou9Lcy11cB7ue1QbNzubqo2Dc2KYpdT2VZ5AVokQ5G", "4nQjFcSXz7RszgHsUbVoFqch6Fy8Tak4BPKioDfbAUHbQ2eSW7CpWVZLY4cHed4pTyxXNstpxJjULPPxPzYaH33R" ], "script": "base64:BgIkCAISBAoCCBgSABIAEgUKAwQBCBIDCgEBEgMKAQESABIDCgEBJwAHa0FjdGl2ZQIGYWN0aXZlAAZrQ2F1c2UCDnNodXRkb3duX2NhdXNlAAxrVVNETkFkZHJlc3MCGHN0YWtpbmdfdXNkbm5zYnRfYWRkcmVzcwAMa0VVUk5BZGRyZXNzAhRzdGFraW5nX2V1cm5fYWRkcmVzcwAMa0xlYXNpbmdQb29sAg9sZWFzaW5nX2FkZHJlc3MADmtMZWFzaW5nQW1vdW50Ag5sZWFzaW5nX2Ftb3VudAAKa0xlYXNpbmdJZAIKbGVhc2luZ19pZAANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViAA1rQ3BtbUNvbnRyYWN0Ag1jcG1tX2NvbnRyYWN0AAxrVVNETkFzc2V0SWQCDXVzZG5fYXNzZXRfaWQADGtFVVJOQXNzZXRJZAINZXVybl9hc3NldF9pZAAOa1N0YWtpbmdBc3NldHMCDnN0YWtpbmdfYXNzZXRzAA1rU2hhcmVBc3NldElkAg5zaGFyZV9hc3NldF9pZAAGb3JhY2xlCQEHQWRkcmVzcwEBGgFXiv8IaJo1ukDNYXTyEjfepjfw+jjO6B44ARNnZXRCYXNlNThGcm9tT3JhY2xlAQNrZXkEByRtYXRjaDAJAJ0IAgUGb3JhY2xlBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQkArAICBQNrZXkCCGlzIGVtcHR5AAxhZG1pblB1YktleTEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MQAMYWRtaW5QdWJLZXkyCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTIADGFkbWluUHViS2V5MwkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkzABFhZG1pblB1YktleUludm9rZQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRJrQWRtaW5JbnZva2VQdWJLZXkAEnN0YWtpbmdVU0ROQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtVU0ROQWRkcmVzcwASc3Rha2luZ0VVUk5BZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUMa0VVUk5BZGRyZXNzAAxjcG1tQ29udHJhY3QJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQ3BtbUNvbnRyYWN0AARVU0ROCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtVU0ROQXNzZXRJZAAERVVSTgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrRVVSTkFzc2V0SWQADXN0YWtpbmdBc3NldHMJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUOa1N0YWtpbmdBc3NldHMABmFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgEIaXNBY3RpdmUAAwUGYWN0aXZlBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEOaXNHbG9iYWxDYWxsZXIBBmNhbGxlcgMJAAACBQZjYWxsZXIFDGNwbW1Db250cmFjdAUEdW5pdAkAAgECLU9ubHkgZ2xvYmFsIENvbnRyYWN0IGNhbiBpbnZva2UgdGhpcyBmdW5jdGlvbgELaXNBZG1pbkNhbGwBDGNhbGxlclB1YktleQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwFDGNhbGxlclB1YktleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgVzdGFrZQdhc3NldElkAwUFc3Rha2UDCQAAAgUHYXNzZXRJZAUEVVNETgkAlAoCAgxsb2NrTmV1dHJpbm8FEnN0YWtpbmdVU0ROQWRkcmVzcwkAlAoCAgxzdGFydFN0YWtpbmcFEnN0YWtpbmdFVVJOQWRkcmVzcwMJAAACBQdhc3NldElkBQRVU0ROCQCUCgICDnVubG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MJAJQKAgILc3RvcFN0YWtpbmcFEnN0YWtpbmdFVVJOQWRkcmVzcwERY2FsY1N0YWtpbmdQYXJhbXMDBXN0YWtlBmFtb3VudAdhc3NldElkAwUFc3Rha2UECyR0MDI0NzMyNTM5CQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQskdDAyNDczMjUzOQJfMQQLc3Rha2luZ0FkZHIIBQskdDAyNDczMjUzOQJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBQZhbW91bnQFA25pbAQLJHQwMjYyNTI2OTEJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFCyR0MDI2MjUyNjkxAl8xBAtzdGFraW5nQWRkcggFCyR0MDI2MjUyNjkxAl8yCQCWCgQFBGNhbGwFC3N0YWtpbmdBZGRyCQDMCAIFBmFtb3VudAkAzAgCCQDYBAEFB2Fzc2V0SWQFA25pbAUDbmlsAQ9jb2xsZWN0UGF5bWVudHMCA2FjYwdwYXltZW50BAskdDAyODUzMjg5NgUDYWNjBA5wYXltZW50QW1vdW50cwgFCyR0MDI4NTMyODk2Al8xBA9wYXltZW50QXNzZXRJZHMIBQskdDAyODUzMjg5NgJfMgkAlAoCCQDNCAIFDnBheW1lbnRBbW91bnRzCAUHcGF5bWVudAZhbW91bnQJAM0IAgUPcGF5bWVudEFzc2V0SWRzAwkAAAIIBQdwYXltZW50B2Fzc2V0SWQFBHVuaXQBAAgFB3BheW1lbnQHYXNzZXRJZAEMY29sbGVjdFN0YXRlAgZyZXN1bHQGc291cmNlBAckbWF0Y2gwBQZzb3VyY2UDAwkAAQIFByRtYXRjaDACBUlzc3VlBgMJAAECBQckbWF0Y2gwAgRCdXJuBgMJAAECBQckbWF0Y2gwAgdSZWlzc3VlBgMJAAECBQckbWF0Y2gwAg5TY3JpcHRUcmFuc2ZlcgYDCQABAgUHJG1hdGNoMAILQmluYXJ5RW50cnkGAwkAAQIFByRtYXRjaDACDEJvb2xlYW5FbnRyeQYDCQABAgUHJG1hdGNoMAILU3RyaW5nRW50cnkGCQABAgUHJG1hdGNoMAIMSW50ZWdlckVudHJ5BAFlBQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBZQUGcmVzdWx0AQtjb2xsZWN0RGF0YQIGcmVzdWx0BnNvdXJjZQQHJG1hdGNoMAUGc291cmNlAwkAAQIFByRtYXRjaDACBlN0cmluZwQBdgUHJG1hdGNoMAkAzQgCBQZyZXN1bHQFAXYDCQABAgUHJG1hdGNoMAIDSW50BAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgMJAAECBQckbWF0Y2gwAgRVbml0BAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgkBBXRocm93AAEKY2FsbENvbW1vbgQIZnVuY05hbWUGY2FsbGVyBGFyZ3MIcGF5bWVudHMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAECyR0MDM4MTYzOTAwCgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPY29sbGVjdFBheW1lbnRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA5wYXltZW50QW1vdW50cwgFCyR0MDM4MTYzOTAwAl8xBA9wYXltZW50QXNzZXRJZHMIBQskdDAzODE2MzkwMAJfMgQLJHQwMzkwNTQwNTMKAAFACQD9BwQFDGNwbW1Db250cmFjdAUIZnVuY05hbWUJAMwIAgUGY2FsbGVyCQDMCAIFBGFyZ3MJAMwIAgUOcGF5bWVudEFtb3VudHMJAMwIAgUPcGF5bWVudEFzc2V0SWRzBQNuaWwFA25pbAMJAAECBQFAAhYoTGlzdFtBbnldLCBMaXN0W0FueV0pBQFACQACAQkArAICCQADAQUBQAIrIGNvdWxkbid0IGJlIGNhc3QgdG8gKExpc3RbQW55XSwgTGlzdFtBbnldKQMJAAACBQskdDAzOTA1NDA1MwULJHQwMzkwNTQwNTMEBGRhdGEIBQskdDAzOTA1NDA1MwJfMgQHYWN0aW9ucwgFCyR0MDM5MDU0MDUzAl8xBAptYXBwZWREYXRhCgACJGwFBGRhdGEKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBC2NvbGxlY3REYXRhAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA1tYXBwZWRBY3Rpb25zCgACJGwFB2FjdGlvbnMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjJfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDGNvbGxlY3RTdGF0ZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMl8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjJfMgIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8JAJQKAgUNbWFwcGVkQWN0aW9ucwUKbWFwcGVkRGF0YQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLggBaQEMY2FsbEZ1bmN0aW9uAghmdW5jTmFtZQRhcmdzCQEKY2FsbENvbW1vbgQFCGZ1bmNOYW1lCAgFAWkGY2FsbGVyBWJ5dGVzBQRhcmdzCAUBaQhwYXltZW50cwFpAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEIBQFpD2NhbGxlclB1YmxpY0tleQMJAQEhAQUGYWN0aXZlCQACAQkArAICAiJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQdzdXNwZW5kAQIPUGF1c2VkIGJ5IGFkbWluAWkBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQgFAWkPY2FsbGVyUHVibGljS2V5AwUGYWN0aXZlCQACAQIWREFwcCBpcyBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwBaQEMc3Rha2VVbnN0YWtlAwVzdGFrZQZhbW91bnQNYXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIIBQFpBmNhbGxlcgUMY3BtbUNvbnRyYWN0CQACAQItT25seSBnbG9iYWwgQ29udHJhY3QgY2FuIGludm9rZSB0aGlzIGZ1bmN0aW9uAwkAAAIFDWFzc2V0SWRTdHJpbmcCBVdBVkVTBARwb29sCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUGb3JhY2xlBQxrTGVhc2luZ1Bvb2wCGU5vIGxlYXNpbmcgcG9vbCBpbiBvcmFjbGUECWxlYXNpbmdJZAkAnAgCBQR0aGlzBQprTGVhc2luZ0lkBA1sZWFzaW5nQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDmtMZWFzaW5nQW1vdW50AAAEDm5ld0xlYXNlQW1vdW50AwUFc3Rha2UJAGQCBQ1sZWFzaW5nQW1vdW50BQZhbW91bnQJAGUCBQ1sZWFzaW5nQW1vdW50BQZhbW91bnQECG5ld0xlYXNlCQDECAIFBHBvb2wFDm5ld0xlYXNlQW1vdW50BApuZXdMZWFzZUlkCQC5CAEFCG5ld0xlYXNlBAhiYXNlRXRyeQkAzAgCBQhuZXdMZWFzZQkAzAgCCQELQmluYXJ5RW50cnkCBQprTGVhc2luZ0lkBQpuZXdMZWFzZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5rTGVhc2luZ0Ftb3VudAUObmV3TGVhc2VBbW91bnQFA25pbAQHJG1hdGNoMAUJbGVhc2luZ0lkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEA2xJZAUHJG1hdGNoMAkAzggCCQDMCAIJAQtMZWFzZUNhbmNlbAEFA2xJZAUDbmlsBQhiYXNlRXRyeQUIYmFzZUV0cnkECyR0MDYwNDk2MTUyCQERY2FsY1N0YWtpbmdQYXJhbXMDBQVzdGFrZQUGYW1vdW50CQDZBAEFDWFzc2V0SWRTdHJpbmcEBGNhbGwIBQskdDA2MDQ5NjE1MgJfMQQEYWRkcggFCyR0MDYwNDk2MTUyAl8yBAZwYXJhbXMIBQskdDA2MDQ5NjE1MgJfMwQIcGF5bWVudHMIBQskdDA2MDQ5NjE1MgJfNAQDaW52CQD8BwQFBGFkZHIFBGNhbGwFBnBhcmFtcwUIcGF5bWVudHMDCQAAAgUDaW52BQNpbnYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFyZWlzc3VlU2hhcmVUb2tlbgEGYW1vdW50CQELdmFsdWVPckVsc2UCCQEOaXNHbG9iYWxDYWxsZXIBCAUBaQZjYWxsZXIJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDHNoYXJlQXNzZXRJZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQ1rU2hhcmVBc3NldElkCQDMCAIJAQdSZWlzc3VlAwUMc2hhcmVBc3NldElkBQZhbW91bnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGYW1vdW50BQxzaGFyZUFzc2V0SWQFA25pbAFpARZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zARFzbGlwcGFnZVRvbGVyYW5jZQkBCmNhbGxDb21tb24EAhZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAgFAWkIcGF5bWVudHMBaQEId2l0aGRyYXcACQEKY2FsbENvbW1vbgQCCHdpdGhkcmF3CAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAICATAFA25pbAgFAWkIcGF5bWVudHMBaQEIZXhjaGFuZ2UBEm1pbkFtb3VudFRvUmVjZWl2ZQkBCmNhbGxDb21tb24EAghleGNoYW5nZQgIBQFpBmNhbGxlcgVieXRlcwkAzAgCCQCkAwEFEm1pbkFtb3VudFRvUmVjZWl2ZQUDbmlsCAUBaQhwYXltZW50cwECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDGFkbWluUHViS2V5MgABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDGFkbWluUHViS2V5MwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgUTbXVsdGlTaWduZWRCeUFkbWlucwd2msk=", "height": 3397811, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7e2YnhKo89qd9duXcAgQJXvqGGzcKQXA24hH7TDB2XXW Next: 3wZ8EPYXdfGPL5bvr4fizxXcbrNKzPokkohVLrF7AiUo Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let version = "1.0.0"
5-
6-let kVersion = "version"
7-
84 let kActive = "active"
95
10-let kAssetIdA = "A_asset_id"
11-
12-let kAssetIdB = "B_asset_id"
13-
14-let kBalanceA = "A_asset_balance"
15-
16-let kBalanceB = "B_asset_balance"
17-
18-let kBalanceInitA = "A_asset_init"
19-
20-let kBalanceInitB = "B_asset_init"
21-
22-let kShareAssetId = "share_asset_id"
23-
24-let kShareAssetSupply = "share_asset_supply"
25-
26-let kFee = "commission"
27-
286 let kCause = "shutdown_cause"
29-
30-let kFirstHarvest = "first_harvest"
31-
32-let kFirstHarvestHeight = "first_harvest_height"
33-
34-let kShareLimit = "share_limit_on_first_harvest"
35-
36-let kBasePeriod = "base_period"
37-
38-let kPeriodLength = "period_length"
39-
40-let kStartHeight = "start_height"
417
428 let kUSDNAddress = "staking_usdnnsbt_address"
439
4915
5016 let kLeasingId = "leasing_id"
5117
52-let kDiscounts = "discounts"
53-
54-let kDiscountValues = "discount_values"
55-
56-let kUserSwopInGov = "_SWOP_amount"
57-
5818 let kAdminPubKey1 = "admin_pub_1"
5919
6020 let kAdminPubKey2 = "admin_pub_2"
6323
6424 let kAdminInvokePubKey = "admin_invoke_pub"
6525
66-let kMoneyBoxAddress = "money_box_address"
26+let kCpmmContract = "cpmm_contract"
6727
68-let kGovAddress = "governance_address"
28+let kUSDNAssetId = "usdn_asset_id"
29+
30+let kEURNAssetId = "eurn_asset_id"
31+
32+let kStakingAssets = "staking_assets"
33+
34+let kShareAssetId = "share_asset_id"
6935
7036 let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
7137
8349
8450 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
8551
86-let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
87-
88-let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
89-
90-let govAddress = Address(getBase58FromOracle(kGovAddress))
91-
92-let votingAddress = Address(base58'3PQZWxShKGRgBN1qoJw6B4s9YWS9FneZTPg')
93-
94-let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
95-
96-let SWOP = base58'Ehie5xYpeN8op1Cctc6aGUrqx8jq3jtf1DSjXDbfm7aT'
97-
98-let EURN = base58'DUk2YTxhRoAqMJLus4G2b3fR8hMHVh6eiyFx5r29VR6t'
99-
100-let stakingAssets = ["WAVES", toBase58String(USDN), toBase58String(EURN)]
52+let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
10153
10254 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
10355
10456 let stakingEURNAddress = Address(getBase58FromOracle(kEURNAddress))
10557
106-let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
58+let cpmmContract = Address(getBase58FromOracle(kCpmmContract))
10759
108-let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
60+let USDN = getBase58FromOracle(kUSDNAssetId)
10961
110-let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
62+let EURN = getBase58FromOracle(kEURNAssetId)
11163
112-let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
64+let stakingAssets = getStringValue(oracle, kStakingAssets)
11365
114-let active = getBooleanValue(this, kActive)
66+let active = valueOrElse(getBoolean(this, kActive), true)
11567
116-let strAssetIdA = getStringValue(this, kAssetIdA)
117-
118-let strAssetIdB = getStringValue(this, kAssetIdB)
119-
120-let assetIdA = if ((strAssetIdA == "WAVES"))
68+func isActive () = if (active)
12169 then unit
122- else fromBase58String(strAssetIdA)
123-
124-let assetIdB = if ((strAssetIdB == "WAVES"))
125- then unit
126- else fromBase58String(strAssetIdB)
127-
128-let assetNameA = match assetIdA {
129- case id: ByteVector =>
130- value(assetInfo(id)).name
131- case waves: Unit =>
132- "WAVES"
133- case _ =>
134- throw("Match error")
135-}
136-
137-let assetNameB = match assetIdB {
138- case id: ByteVector =>
139- value(assetInfo(id)).name
140- case waves: Unit =>
141- "WAVES"
142- case _ =>
143- throw("Match error")
144-}
145-
146-let balanceA = getIntegerValue(this, kBalanceA)
147-
148-let balanceB = getIntegerValue(this, kBalanceB)
149-
150-let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
151-
152-let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
153-
154-let fee = getIntegerValue(this, kFee)
155-
156-let feeGovernance = fraction(fee, 40, 100)
157-
158-let feeScale6 = 1000000
159-
160-let scaleValue3 = 1000
161-
162-let scaleValue8 = 100000000
163-
164-let slippageToleranceDelimiter = 1000
165-
166-let scaleValue8Digits = 8
167-
168-func accountBalance (assetId) = match assetId {
169- case id: ByteVector =>
170- assetBalance(this, id)
171- case waves: Unit =>
172- wavesBalance(this).available
173- case _ =>
174- throw("Match error")
175-}
70+ else throw("DApp is inactive at this moment")
17671
17772
178-func stakedAmount (assetId) = {
179- let stakedAmountCalculated = match assetId {
180- case aId: ByteVector =>
181- if ((aId == USDN))
182- then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
183- else if ((aId == EURN))
184- then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
185- else 0
186- case _: Unit =>
187- valueOrElse(getInteger(this, kLeasingAmount), 0)
188- case _ =>
189- throw("Match error")
190- }
191- match stakedAmountCalculated {
192- case i: Int =>
193- i
194- case _ =>
195- 0
196- }
197- }
73+func isGlobalCaller (caller) = if ((caller == cpmmContract))
74+ then unit
75+ else throw("Only global Contract can invoke this function")
19876
19977
200-let stakedAmountA = stakedAmount(assetIdA)
201-
202-let stakedAmountB = stakedAmount(assetIdB)
203-
204-let assetInitA = getIntegerValue(this, kBalanceInitA)
205-
206-let assetInitB = getIntegerValue(this, kBalanceInitB)
207-
208-let availableBalanceA = (balanceA - stakedAmountA)
209-
210-let availableBalanceB = (balanceB - stakedAmountB)
211-
212-let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
213-
214-let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
215-
216-let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
217- then (accountBalanceWithStakedB >= balanceB)
218- else false
219-
220-func getAssetInfo (assetId) = match assetId {
221- case id: ByteVector =>
222- let stringId = toBase58String(id)
223- let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
224- $Tuple3(stringId, info.name, info.decimals)
225- case waves: Unit =>
226- $Tuple3("WAVES", "WAVES", 8)
227- case _ =>
228- throw("Match error")
229-}
230-
231-
232-func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
233- then $Tuple3("WAVES", "WAVES", 8)
234- else {
235- let stringId = assetStr
236- let id = fromBase58String(assetStr)
237- let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
238- $Tuple3(stringId, info.name, info.decimals)
239- }
78+func isAdminCall (callerPubKey) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], callerPubKey))
79+ then unit
80+ else throw("Only admin can call this function")
24081
24182
24283 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
25394
25495 func calcStakingParams (stake,amount,assetId) = if (stake)
25596 then {
256- let $t062906356 = calcStakingFuncAndAddres(stake, assetId)
257- let call = $t062906356._1
258- let stakingAddr = $t062906356._2
97+ let $t024732539 = calcStakingFuncAndAddres(stake, assetId)
98+ let call = $t024732539._1
99+ let stakingAddr = $t024732539._2
259100 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
260101 }
261102 else {
262- let $t064426508 = calcStakingFuncAndAddres(stake, assetId)
263- let call = $t064426508._1
264- let stakingAddr = $t064426508._2
103+ let $t026252691 = calcStakingFuncAndAddres(stake, assetId)
104+ let call = $t026252691._1
105+ let stakingAddr = $t026252691._2
265106 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
266107 }
267108
268109
269-func calculateFeeDiscount (userAddr) = {
270- let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
271- let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
272- let discounts = split(getStringValue(oracle, kDiscounts), ",")
273- if (if ((swopAmount >= parseIntValue(discountValues[0])))
274- then (parseIntValue(discountValues[1]) > swopAmount)
275- else false)
276- then (feeScale6 - parseIntValue(discounts[0]))
277- else if (if ((swopAmount >= parseIntValue(discountValues[1])))
278- then (parseIntValue(discountValues[2]) > swopAmount)
279- else false)
280- then (feeScale6 - parseIntValue(discounts[1]))
281- else if (if ((swopAmount >= parseIntValue(discountValues[2])))
282- then (parseIntValue(discountValues[3]) > swopAmount)
283- else false)
284- then (feeScale6 - parseIntValue(discounts[2]))
285- else if (if ((swopAmount >= parseIntValue(discountValues[3])))
286- then (parseIntValue(discountValues[4]) > swopAmount)
287- else false)
288- then (feeScale6 - parseIntValue(discounts[3]))
289- else if ((swopAmount >= parseIntValue(discountValues[4])))
290- then (feeScale6 - parseIntValue(discounts[4]))
291- else feeScale6
110+func collectPayments (acc,payment) = {
111+ let $t028532896 = acc
112+ let paymentAmounts = $t028532896._1
113+ let paymentAssetIds = $t028532896._2
114+ $Tuple2((paymentAmounts :+ payment.amount), (paymentAssetIds :+ (if ((payment.assetId == unit))
115+ then base58''
116+ else payment.assetId)))
292117 }
293118
294119
295-func calculateFees (pmtAmount,minAmountToReceive,tokenFrom,tokenTo,caller) = {
296- let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
297- let feeDiscount = calculateFeeDiscount(caller)
298- let amountWithFee = fraction(amountWithoutFee, (feeScale6 - fraction(fee, feeDiscount, feeScale6, CEILING)), feeScale6)
299- let governanceReward = fraction(amountWithoutFee, fraction(feeGovernance, feeDiscount, feeScale6, CEILING), feeScale6)
300- if ((minAmountToReceive > amountWithFee))
301- then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
302- else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
303- }
120+func collectState (result,source) = match source {
121+ case e: Issue|Burn|Reissue|ScriptTransfer|BinaryEntry|BooleanEntry|StringEntry|IntegerEntry =>
122+ (result :+ e)
123+ case _ =>
124+ result
125+}
304126
305127
306-func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
128+func collectData (result,source) = match source {
129+ case v: String =>
130+ (result :+ v)
131+ case v: Int =>
132+ (result :+ v)
133+ case v: Boolean =>
134+ (result :+ v)
135+ case v: ByteVector =>
136+ (result :+ v)
137+ case v: Unit =>
138+ (result :+ v)
139+ case _ =>
140+ throw()
141+}
307142
308143
309-func isActive () = if (active)
310- then unit
311- else throw("DApp is inactive at this moment")
144+func callCommon (funcName,caller,args,payments) = valueOrElse(isActive(), {
145+ let $t038163900 = {
146+ let $l = payments
147+ let $s = size($l)
148+ let $acc0 = $Tuple2(nil, nil)
149+ func $f0_1 ($a,$i) = if (($i >= $s))
150+ then $a
151+ else collectPayments($a, $l[$i])
152+
153+ func $f0_2 ($a,$i) = if (($i >= $s))
154+ then $a
155+ else throw("List size exceeds 10")
156+
157+ $f0_2($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)
158+ }
159+ let paymentAmounts = $t038163900._1
160+ let paymentAssetIds = $t038163900._2
161+ let $t039054053 = {
162+ let @ = reentrantInvoke(cpmmContract, funcName, [caller, args, paymentAmounts, paymentAssetIds], nil)
163+ if ($isInstanceOf(@, "(List[Any], List[Any])"))
164+ then @
165+ else throw(($getType(@) + " couldn't be cast to (List[Any], List[Any])"))
166+ }
167+ if (($t039054053 == $t039054053))
168+ then {
169+ let data = $t039054053._2
170+ let actions = $t039054053._1
171+ let mappedData = {
172+ let $l = data
173+ let $s = size($l)
174+ let $acc0 = nil
175+ func $f1_1 ($a,$i) = if (($i >= $s))
176+ then $a
177+ else collectData($a, $l[$i])
178+
179+ func $f1_2 ($a,$i) = if (($i >= $s))
180+ then $a
181+ else throw("List size exceeds 10")
182+
183+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
184+ }
185+ let mappedActions = {
186+ let $l = actions
187+ let $s = size($l)
188+ let $acc0 = nil
189+ func $f2_1 ($a,$i) = if (($i >= $s))
190+ then $a
191+ else collectState($a, $l[$i])
192+
193+ func $f2_2 ($a,$i) = if (($i >= $s))
194+ then $a
195+ else throw("List size exceeds 15")
196+
197+ $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
198+ }
199+ $Tuple2(mappedActions, mappedData)
200+ }
201+ else throw("Strict value is not equal to itself.")
202+ })
312203
313204
314205 @Callable(i)
315-func init (firstHarvest) = {
316- let $t088358912 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
317- let pmtAmountA = $t088358912._1
318- let pmtAssetIdA = $t088358912._2
319- let $t089178994 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
320- let pmtAmountB = $t089178994._1
321- let pmtAssetIdB = $t089178994._2
322- let $t089999076 = getAssetInfo(pmtAssetIdA)
323- let pmtStrAssetIdA = $t089999076._1
324- let pmtAssetNameA = $t089999076._2
325- let pmtDecimalsA = $t089999076._3
326- let $t090819158 = getAssetInfo(pmtAssetIdB)
327- let pmtStrAssetIdB = $t090819158._1
328- let pmtAssetNameB = $t090819158._2
329- let pmtDecimalsB = $t090819158._3
330- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
331- then throw("Only admin can call this function")
332- else if (isDefined(getBoolean(this, kActive)))
333- then throw("DApp is already active")
334- else if ((pmtAssetIdA == pmtAssetIdB))
335- then throw("Assets must be different")
336- else {
337- let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
338- let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
339- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
340- let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
341- let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
342- let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
343- let shareInitialSupply = fraction(arg1, arg2, arg3)
344- let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
345- let shareIssueId = calculateAssetId(shareIssue)
346- let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
347- then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
348- else 0
349- if ((stake1 == stake1))
350- then {
351- let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
352- then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
353- else 0
354- if ((stake2 == stake2))
355- then {
356- let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
357- if (firstHarvest)
358- then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
359- else baseEntry
360- }
361- else throw("Strict value is not equal to itself.")
362- }
363- else throw("Strict value is not equal to itself.")
364- }
365- }
206+func callFunction (funcName,args) = callCommon(funcName, i.caller.bytes, args, i.payments)
366207
367208
368209
369210 @Callable(i)
370-func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
371- let $t01166311750 = getAssetInfoFromString(strAssetIdA)
372- let pmtStrAssetIdA = $t01166311750._1
373- let pmtAssetNameA = $t01166311750._2
374- let pmtDecimalsA = $t01166311750._3
375- let $t01175511842 = getAssetInfoFromString(strAssetIdB)
376- let pmtStrAssetIdB = $t01175511842._1
377- let pmtAssetNameB = $t01175511842._2
378- let pmtDecimalsB = $t01175511842._3
379- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
380- then throw("Only admin can call this function")
381- else if (isDefined(getBoolean(this, kActive)))
382- then throw("DApp is already active")
383- else if ((strAssetIdA == strAssetIdB))
384- then throw("Assets must be different")
385- else {
386- let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
387- let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
388- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
389- let shareInitialSupply = 0
390- let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
391- let shareIssueId = calculateAssetId(shareIssue)
392- let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceInitA, amtAssetA), IntegerEntry(kBalanceInitB, amtAssetB), IntegerEntry(kBalanceA, 0), IntegerEntry(kBalanceB, 0), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply)]
393- if (firstHarvest)
394- then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
395- else baseEntry
396- }
397- }
211+func shutdown () = valueOrElse(isAdminCall(i.callerPublicKey), if (!(active))
212+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
213+ else suspend("Paused by admin"))
398214
399215
400216
401217 @Callable(i)
402-func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
403- then throw("Only admin can call this function")
404- else [IntegerEntry(kShareLimit, shareLimit)])
218+func activate () = valueOrElse(isAdminCall(i.callerPublicKey), if (active)
219+ then throw("DApp is already active")
220+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
405221
406222
407223
408224 @Callable(i)
409-func replenishWithTwoTokens (slippageTolerance) = valueOrElse(isActive(), {
410- let pmtAssetIdA = i.payments[0].assetId
411- let pmtAssetIdB = i.payments[1].assetId
412- let pmtAmountA = i.payments[0].amount
413- let pmtAmountB = i.payments[1].amount
414- let $t01422114298 = getAssetInfo(pmtAssetIdA)
415- let pmtStrAssetIdA = $t01422114298._1
416- let pmtAssetNameA = $t01422114298._2
417- let pmtDecimalsA = $t01422114298._3
418- let $t01430314380 = getAssetInfo(pmtAssetIdB)
419- let pmtStrAssetIdB = $t01430314380._1
420- let pmtAssetNameB = $t01430314380._2
421- let pmtDecimalsB = $t01430314380._3
422- let inital = if (if ((balanceA == 0))
423- then (balanceB == 0)
424- else false)
425- then true
426- else false
427- let tokenRatio = if (inital)
428- then fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
429- else fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
430- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
431- let shareTokenToPayAmount = if (inital)
432- then fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
433- else fraction(min([fraction(pmtAmountA, scaleValue8, balanceA), fraction(pmtAmountB, scaleValue8, balanceB)]), shareAssetSupply, scaleValue8)
434- if (if ((0 > slippageTolerance))
435- then true
436- else (slippageTolerance > slippageToleranceDelimiter))
437- then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
438- else if ((size(i.payments) != 2))
439- then throw("Two attached assets expected")
440- else if (if ((pmtAssetIdA != assetIdA))
441- then true
442- else (pmtAssetIdB != assetIdB))
443- then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
444- else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
445- then true
446- else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
447- then throw("Incorrect assets amount: amounts must have the contract ratio")
448- else if ((shareTokenToPayAmount == 0))
449- then throw("Too small amount to replenish")
450- else if (!(hasEnoughBalance))
451- then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
452- else {
453- let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
454- then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
455- else 0
456- if ((stake1 == stake1))
457- then {
458- let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
459- then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
460- else 0
461- if ((stake2 == stake2))
462- then [Reissue(shareAssetId, shareTokenToPayAmount, true), IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
463- else throw("Strict value is not equal to itself.")
464- }
465- else throw("Strict value is not equal to itself.")
466- }
467- })
468-
469-
470-
471-@Callable(i)
472-func withdraw () = valueOrElse(isActive(), {
473- let $t01718017255 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474- let pmtAmount = $t01718017255._1
475- let pmtAssetId = $t01718017255._2
476- let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
477- let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
478- if ((size(i.payments) != 1))
479- then throw("One attached payment expected")
480- else if ((pmtAssetId != shareAssetId))
481- then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
482- else if (!(hasEnoughBalance))
483- then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
484- else {
485- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
486- then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
487- else 0
488- if ((stake1 == stake1))
489- then {
490- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
491- then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
492- else 0
493- if ((stake2 == stake2))
494- then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
495- else throw("Strict value is not equal to itself.")
496- }
497- else throw("Strict value is not equal to itself.")
498- }
499- })
500-
501-
502-
503-@Callable(i)
504-func exchange (minAmountToReceive) = valueOrElse(isActive(), {
505- let $t01855418629 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
506- let pmtAmount = $t01855418629._1
507- let pmtAssetId = $t01855418629._2
508- if (if ((balanceA == 0))
509- then true
510- else (balanceB == 0))
511- then throw("Can't exchange with zero balance")
512- else if ((0 >= minAmountToReceive))
513- then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
514- else if ((size(i.payments) != 1))
515- then throw("One attached payment expected")
516- else if (!(hasEnoughBalance))
517- then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
518- else if ((pmtAssetId == assetIdA))
519- then {
520- let assetIdSend = assetIdB
521- let $t01918019318 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB, i.originCaller)
522- let amountWithoutFee = $t01918019318._1
523- let amountWithFee = $t01918019318._2
524- let governanceReward = $t01918019318._3
525- let newBalanceA = (balanceA + pmtAmount)
526- let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
527- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
528- then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdA], nil)
529- else 0
530- if ((stake1 == stake1))
531- then {
532- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
533- then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdB], nil)
534- else 0
535- if ((stake2 == stake2))
536- then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
537- else throw("Strict value is not equal to itself.")
538- }
539- else throw("Strict value is not equal to itself.")
540- }
541- else if ((pmtAssetId == assetIdB))
542- then {
543- let assetIdSend = assetIdA
544- let $t02031020448 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA, i.originCaller)
545- let amountWithoutFee = $t02031020448._1
546- let amountWithFee = $t02031020448._2
547- let governanceReward = $t02031020448._3
548- let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
549- let newBalanceB = (balanceB + pmtAmount)
550- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
551- then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
552- else 0
553- if ((stake1 == stake1))
554- then {
555- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
556- then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
557- else 0
558- if ((stake2 == stake2))
559- then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
560- else throw("Strict value is not equal to itself.")
561- }
562- else throw("Strict value is not equal to itself.")
563- }
564- else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
565- })
566-
567-
568-
569-@Callable(i)
570-func shutdown () = if (!(active))
571- then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
572- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
573- then throw("Only admin can call this function")
574- else suspend("Paused by admin")
575-
576-
577-
578-@Callable(i)
579-func activate () = if (active)
580- then throw("DApp is already active")
581- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
582- then throw("Only admin can call this function")
583- else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
584-
585-
586-
587-@Callable(i)
588-func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
589- let amountEnrollA = (accountBalanceWithStakedA - balanceA)
590- let amountEnrollB = (accountBalanceWithStakedB - balanceB)
591- if ((i.caller != moneyBoxAddress))
592- then throw("Only the wallet can call this function")
593- else if (if ((0 > amountEnrollA))
594- then true
595- else (0 > amountEnrollB))
596- then suspend("Enroll amount negative")
597- else if (if ((amountEnrollA == 0))
598- then (amountEnrollB == 0)
599- else false)
600- then throw("No money to take")
601- else {
602- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
603- then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
604- else 0
605- if ((stake1 == stake1))
606- then {
607- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
608- then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
609- else 0
610- if ((stake2 == stake2))
611- then [IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
612- else throw("Strict value is not equal to itself.")
613- }
614- else throw("Strict value is not equal to itself.")
615- }
616- })
617-
618-
619-
620-@Callable(i)
621-func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
622- then throw("Only contract itself can invoke this function")
225+func stakeUnstake (stake,amount,assetIdString) = valueOrElse(isActive(), if ((i.caller != cpmmContract))
226+ then throw("Only global Contract can invoke this function")
623227 else if ((assetIdString == "WAVES"))
624228 then {
625229 let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, kLeasingPool), "No leasing pool in oracle"))
639243 }
640244 }
641245 else {
642- let $t02420224305 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
643- let call = $t02420224305._1
644- let addr = $t02420224305._2
645- let params = $t02420224305._3
646- let payments = $t02420224305._4
246+ let $t060496152 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
247+ let call = $t060496152._1
248+ let addr = $t060496152._2
249+ let params = $t060496152._3
250+ let payments = $t060496152._4
647251 let inv = invoke(addr, call, params, payments)
648252 if ((inv == inv))
649253 then nil
650254 else throw("Strict value is not equal to itself.")
651- }
255+ })
652256
653257
654258
655259 @Callable(i)
656-func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
657- then throw("Only admin can call this function")
658- else {
659- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
660- then {
661- let amountA = (balanceA - stakedAmountA)
662- if ((amountA > 0))
663- then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
664- else 0
665- }
666- else 0
667- if ((stake1 == stake1))
668- then {
669- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
670- then {
671- let amountB = (balanceB - stakedAmountB)
672- if ((amountB > 0))
673- then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
674- else 0
675- }
676- else 0
677- if ((stake2 == stake2))
678- then nil
679- else throw("Strict value is not equal to itself.")
680- }
681- else throw("Strict value is not equal to itself.")
682- })
260+func reissueShareToken (amount) = valueOrElse(isGlobalCaller(i.caller), valueOrElse(isActive(), {
261+ let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
262+[Reissue(shareAssetId, amount, true), ScriptTransfer(i.caller, amount, shareAssetId)]
263+ }))
264+
265+
266+
267+@Callable(i)
268+func replenishWithTwoTokens (slippageTolerance) = callCommon("replenishWithTwoTokens", i.caller.bytes, ["false", "0"], i.payments)
269+
270+
271+
272+@Callable(i)
273+func withdraw () = callCommon("withdraw", i.caller.bytes, ["0"], i.payments)
274+
275+
276+
277+@Callable(i)
278+func exchange (minAmountToReceive) = callCommon("exchange", i.caller.bytes, [toString(minAmountToReceive)], i.payments)
683279
684280
685281 @Verifier(tx)
696292 else 0
697293 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
698294 }
699- match tx {
700- case inv: InvokeScriptTransaction =>
701- let callTakeIntoAccount = if ((inv.dApp == this))
702- then (inv.function == "takeIntoAccountExtraFunds")
703- else false
704- let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
705- then true
706- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
707- then true
708- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
709- then true
710- else sigVerify(tx.bodyBytes, tx.proofs[0], adminInvokePubKey)
711- if (if (callTakeIntoAccount)
712- then signedByAdmin
713- else false)
714- then true
715- else multiSignedByAdmins
716- case _ =>
717- multiSignedByAdmins
718- }
295+ multiSignedByAdmins
719296 }
720297
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let version = "1.0.0"
5-
6-let kVersion = "version"
7-
84 let kActive = "active"
95
10-let kAssetIdA = "A_asset_id"
11-
12-let kAssetIdB = "B_asset_id"
13-
14-let kBalanceA = "A_asset_balance"
15-
16-let kBalanceB = "B_asset_balance"
17-
18-let kBalanceInitA = "A_asset_init"
19-
20-let kBalanceInitB = "B_asset_init"
21-
22-let kShareAssetId = "share_asset_id"
23-
24-let kShareAssetSupply = "share_asset_supply"
25-
26-let kFee = "commission"
27-
286 let kCause = "shutdown_cause"
29-
30-let kFirstHarvest = "first_harvest"
31-
32-let kFirstHarvestHeight = "first_harvest_height"
33-
34-let kShareLimit = "share_limit_on_first_harvest"
35-
36-let kBasePeriod = "base_period"
37-
38-let kPeriodLength = "period_length"
39-
40-let kStartHeight = "start_height"
417
428 let kUSDNAddress = "staking_usdnnsbt_address"
439
4410 let kEURNAddress = "staking_eurn_address"
4511
4612 let kLeasingPool = "leasing_address"
4713
4814 let kLeasingAmount = "leasing_amount"
4915
5016 let kLeasingId = "leasing_id"
5117
52-let kDiscounts = "discounts"
53-
54-let kDiscountValues = "discount_values"
55-
56-let kUserSwopInGov = "_SWOP_amount"
57-
5818 let kAdminPubKey1 = "admin_pub_1"
5919
6020 let kAdminPubKey2 = "admin_pub_2"
6121
6222 let kAdminPubKey3 = "admin_pub_3"
6323
6424 let kAdminInvokePubKey = "admin_invoke_pub"
6525
66-let kMoneyBoxAddress = "money_box_address"
26+let kCpmmContract = "cpmm_contract"
6727
68-let kGovAddress = "governance_address"
28+let kUSDNAssetId = "usdn_asset_id"
29+
30+let kEURNAssetId = "eurn_asset_id"
31+
32+let kStakingAssets = "staking_assets"
33+
34+let kShareAssetId = "share_asset_id"
6935
7036 let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
7137
7238 func getBase58FromOracle (key) = match getString(oracle, key) {
7339 case string: String =>
7440 fromBase58String(string)
7541 case nothing =>
7642 throw((key + "is empty"))
7743 }
7844
7945
8046 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
8147
8248 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
8349
8450 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
8551
86-let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
87-
88-let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
89-
90-let govAddress = Address(getBase58FromOracle(kGovAddress))
91-
92-let votingAddress = Address(base58'3PQZWxShKGRgBN1qoJw6B4s9YWS9FneZTPg')
93-
94-let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
95-
96-let SWOP = base58'Ehie5xYpeN8op1Cctc6aGUrqx8jq3jtf1DSjXDbfm7aT'
97-
98-let EURN = base58'DUk2YTxhRoAqMJLus4G2b3fR8hMHVh6eiyFx5r29VR6t'
99-
100-let stakingAssets = ["WAVES", toBase58String(USDN), toBase58String(EURN)]
52+let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
10153
10254 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
10355
10456 let stakingEURNAddress = Address(getBase58FromOracle(kEURNAddress))
10557
106-let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
58+let cpmmContract = Address(getBase58FromOracle(kCpmmContract))
10759
108-let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
60+let USDN = getBase58FromOracle(kUSDNAssetId)
10961
110-let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
62+let EURN = getBase58FromOracle(kEURNAssetId)
11163
112-let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
64+let stakingAssets = getStringValue(oracle, kStakingAssets)
11365
114-let active = getBooleanValue(this, kActive)
66+let active = valueOrElse(getBoolean(this, kActive), true)
11567
116-let strAssetIdA = getStringValue(this, kAssetIdA)
117-
118-let strAssetIdB = getStringValue(this, kAssetIdB)
119-
120-let assetIdA = if ((strAssetIdA == "WAVES"))
68+func isActive () = if (active)
12169 then unit
122- else fromBase58String(strAssetIdA)
123-
124-let assetIdB = if ((strAssetIdB == "WAVES"))
125- then unit
126- else fromBase58String(strAssetIdB)
127-
128-let assetNameA = match assetIdA {
129- case id: ByteVector =>
130- value(assetInfo(id)).name
131- case waves: Unit =>
132- "WAVES"
133- case _ =>
134- throw("Match error")
135-}
136-
137-let assetNameB = match assetIdB {
138- case id: ByteVector =>
139- value(assetInfo(id)).name
140- case waves: Unit =>
141- "WAVES"
142- case _ =>
143- throw("Match error")
144-}
145-
146-let balanceA = getIntegerValue(this, kBalanceA)
147-
148-let balanceB = getIntegerValue(this, kBalanceB)
149-
150-let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
151-
152-let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
153-
154-let fee = getIntegerValue(this, kFee)
155-
156-let feeGovernance = fraction(fee, 40, 100)
157-
158-let feeScale6 = 1000000
159-
160-let scaleValue3 = 1000
161-
162-let scaleValue8 = 100000000
163-
164-let slippageToleranceDelimiter = 1000
165-
166-let scaleValue8Digits = 8
167-
168-func accountBalance (assetId) = match assetId {
169- case id: ByteVector =>
170- assetBalance(this, id)
171- case waves: Unit =>
172- wavesBalance(this).available
173- case _ =>
174- throw("Match error")
175-}
70+ else throw("DApp is inactive at this moment")
17671
17772
178-func stakedAmount (assetId) = {
179- let stakedAmountCalculated = match assetId {
180- case aId: ByteVector =>
181- if ((aId == USDN))
182- then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
183- else if ((aId == EURN))
184- then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
185- else 0
186- case _: Unit =>
187- valueOrElse(getInteger(this, kLeasingAmount), 0)
188- case _ =>
189- throw("Match error")
190- }
191- match stakedAmountCalculated {
192- case i: Int =>
193- i
194- case _ =>
195- 0
196- }
197- }
73+func isGlobalCaller (caller) = if ((caller == cpmmContract))
74+ then unit
75+ else throw("Only global Contract can invoke this function")
19876
19977
200-let stakedAmountA = stakedAmount(assetIdA)
201-
202-let stakedAmountB = stakedAmount(assetIdB)
203-
204-let assetInitA = getIntegerValue(this, kBalanceInitA)
205-
206-let assetInitB = getIntegerValue(this, kBalanceInitB)
207-
208-let availableBalanceA = (balanceA - stakedAmountA)
209-
210-let availableBalanceB = (balanceB - stakedAmountB)
211-
212-let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
213-
214-let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
215-
216-let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
217- then (accountBalanceWithStakedB >= balanceB)
218- else false
219-
220-func getAssetInfo (assetId) = match assetId {
221- case id: ByteVector =>
222- let stringId = toBase58String(id)
223- let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
224- $Tuple3(stringId, info.name, info.decimals)
225- case waves: Unit =>
226- $Tuple3("WAVES", "WAVES", 8)
227- case _ =>
228- throw("Match error")
229-}
230-
231-
232-func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
233- then $Tuple3("WAVES", "WAVES", 8)
234- else {
235- let stringId = assetStr
236- let id = fromBase58String(assetStr)
237- let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
238- $Tuple3(stringId, info.name, info.decimals)
239- }
78+func isAdminCall (callerPubKey) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], callerPubKey))
79+ then unit
80+ else throw("Only admin can call this function")
24081
24182
24283 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
24384
24485
24586 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
24687 then if ((assetId == USDN))
24788 then $Tuple2("lockNeutrino", stakingUSDNAddress)
24889 else $Tuple2("startStaking", stakingEURNAddress)
24990 else if ((assetId == USDN))
25091 then $Tuple2("unlockNeutrino", stakingUSDNAddress)
25192 else $Tuple2("stopStaking", stakingEURNAddress)
25293
25394
25495 func calcStakingParams (stake,amount,assetId) = if (stake)
25596 then {
256- let $t062906356 = calcStakingFuncAndAddres(stake, assetId)
257- let call = $t062906356._1
258- let stakingAddr = $t062906356._2
97+ let $t024732539 = calcStakingFuncAndAddres(stake, assetId)
98+ let call = $t024732539._1
99+ let stakingAddr = $t024732539._2
259100 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
260101 }
261102 else {
262- let $t064426508 = calcStakingFuncAndAddres(stake, assetId)
263- let call = $t064426508._1
264- let stakingAddr = $t064426508._2
103+ let $t026252691 = calcStakingFuncAndAddres(stake, assetId)
104+ let call = $t026252691._1
105+ let stakingAddr = $t026252691._2
265106 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
266107 }
267108
268109
269-func calculateFeeDiscount (userAddr) = {
270- let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
271- let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
272- let discounts = split(getStringValue(oracle, kDiscounts), ",")
273- if (if ((swopAmount >= parseIntValue(discountValues[0])))
274- then (parseIntValue(discountValues[1]) > swopAmount)
275- else false)
276- then (feeScale6 - parseIntValue(discounts[0]))
277- else if (if ((swopAmount >= parseIntValue(discountValues[1])))
278- then (parseIntValue(discountValues[2]) > swopAmount)
279- else false)
280- then (feeScale6 - parseIntValue(discounts[1]))
281- else if (if ((swopAmount >= parseIntValue(discountValues[2])))
282- then (parseIntValue(discountValues[3]) > swopAmount)
283- else false)
284- then (feeScale6 - parseIntValue(discounts[2]))
285- else if (if ((swopAmount >= parseIntValue(discountValues[3])))
286- then (parseIntValue(discountValues[4]) > swopAmount)
287- else false)
288- then (feeScale6 - parseIntValue(discounts[3]))
289- else if ((swopAmount >= parseIntValue(discountValues[4])))
290- then (feeScale6 - parseIntValue(discounts[4]))
291- else feeScale6
110+func collectPayments (acc,payment) = {
111+ let $t028532896 = acc
112+ let paymentAmounts = $t028532896._1
113+ let paymentAssetIds = $t028532896._2
114+ $Tuple2((paymentAmounts :+ payment.amount), (paymentAssetIds :+ (if ((payment.assetId == unit))
115+ then base58''
116+ else payment.assetId)))
292117 }
293118
294119
295-func calculateFees (pmtAmount,minAmountToReceive,tokenFrom,tokenTo,caller) = {
296- let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
297- let feeDiscount = calculateFeeDiscount(caller)
298- let amountWithFee = fraction(amountWithoutFee, (feeScale6 - fraction(fee, feeDiscount, feeScale6, CEILING)), feeScale6)
299- let governanceReward = fraction(amountWithoutFee, fraction(feeGovernance, feeDiscount, feeScale6, CEILING), feeScale6)
300- if ((minAmountToReceive > amountWithFee))
301- then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
302- else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
303- }
120+func collectState (result,source) = match source {
121+ case e: Issue|Burn|Reissue|ScriptTransfer|BinaryEntry|BooleanEntry|StringEntry|IntegerEntry =>
122+ (result :+ e)
123+ case _ =>
124+ result
125+}
304126
305127
306-func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
128+func collectData (result,source) = match source {
129+ case v: String =>
130+ (result :+ v)
131+ case v: Int =>
132+ (result :+ v)
133+ case v: Boolean =>
134+ (result :+ v)
135+ case v: ByteVector =>
136+ (result :+ v)
137+ case v: Unit =>
138+ (result :+ v)
139+ case _ =>
140+ throw()
141+}
307142
308143
309-func isActive () = if (active)
310- then unit
311- else throw("DApp is inactive at this moment")
144+func callCommon (funcName,caller,args,payments) = valueOrElse(isActive(), {
145+ let $t038163900 = {
146+ let $l = payments
147+ let $s = size($l)
148+ let $acc0 = $Tuple2(nil, nil)
149+ func $f0_1 ($a,$i) = if (($i >= $s))
150+ then $a
151+ else collectPayments($a, $l[$i])
152+
153+ func $f0_2 ($a,$i) = if (($i >= $s))
154+ then $a
155+ else throw("List size exceeds 10")
156+
157+ $f0_2($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)
158+ }
159+ let paymentAmounts = $t038163900._1
160+ let paymentAssetIds = $t038163900._2
161+ let $t039054053 = {
162+ let @ = reentrantInvoke(cpmmContract, funcName, [caller, args, paymentAmounts, paymentAssetIds], nil)
163+ if ($isInstanceOf(@, "(List[Any], List[Any])"))
164+ then @
165+ else throw(($getType(@) + " couldn't be cast to (List[Any], List[Any])"))
166+ }
167+ if (($t039054053 == $t039054053))
168+ then {
169+ let data = $t039054053._2
170+ let actions = $t039054053._1
171+ let mappedData = {
172+ let $l = data
173+ let $s = size($l)
174+ let $acc0 = nil
175+ func $f1_1 ($a,$i) = if (($i >= $s))
176+ then $a
177+ else collectData($a, $l[$i])
178+
179+ func $f1_2 ($a,$i) = if (($i >= $s))
180+ then $a
181+ else throw("List size exceeds 10")
182+
183+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
184+ }
185+ let mappedActions = {
186+ let $l = actions
187+ let $s = size($l)
188+ let $acc0 = nil
189+ func $f2_1 ($a,$i) = if (($i >= $s))
190+ then $a
191+ else collectState($a, $l[$i])
192+
193+ func $f2_2 ($a,$i) = if (($i >= $s))
194+ then $a
195+ else throw("List size exceeds 15")
196+
197+ $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
198+ }
199+ $Tuple2(mappedActions, mappedData)
200+ }
201+ else throw("Strict value is not equal to itself.")
202+ })
312203
313204
314205 @Callable(i)
315-func init (firstHarvest) = {
316- let $t088358912 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
317- let pmtAmountA = $t088358912._1
318- let pmtAssetIdA = $t088358912._2
319- let $t089178994 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
320- let pmtAmountB = $t089178994._1
321- let pmtAssetIdB = $t089178994._2
322- let $t089999076 = getAssetInfo(pmtAssetIdA)
323- let pmtStrAssetIdA = $t089999076._1
324- let pmtAssetNameA = $t089999076._2
325- let pmtDecimalsA = $t089999076._3
326- let $t090819158 = getAssetInfo(pmtAssetIdB)
327- let pmtStrAssetIdB = $t090819158._1
328- let pmtAssetNameB = $t090819158._2
329- let pmtDecimalsB = $t090819158._3
330- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
331- then throw("Only admin can call this function")
332- else if (isDefined(getBoolean(this, kActive)))
333- then throw("DApp is already active")
334- else if ((pmtAssetIdA == pmtAssetIdB))
335- then throw("Assets must be different")
336- else {
337- let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
338- let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
339- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
340- let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
341- let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
342- let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
343- let shareInitialSupply = fraction(arg1, arg2, arg3)
344- let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
345- let shareIssueId = calculateAssetId(shareIssue)
346- let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
347- then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
348- else 0
349- if ((stake1 == stake1))
350- then {
351- let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
352- then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
353- else 0
354- if ((stake2 == stake2))
355- then {
356- let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
357- if (firstHarvest)
358- then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
359- else baseEntry
360- }
361- else throw("Strict value is not equal to itself.")
362- }
363- else throw("Strict value is not equal to itself.")
364- }
365- }
206+func callFunction (funcName,args) = callCommon(funcName, i.caller.bytes, args, i.payments)
366207
367208
368209
369210 @Callable(i)
370-func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
371- let $t01166311750 = getAssetInfoFromString(strAssetIdA)
372- let pmtStrAssetIdA = $t01166311750._1
373- let pmtAssetNameA = $t01166311750._2
374- let pmtDecimalsA = $t01166311750._3
375- let $t01175511842 = getAssetInfoFromString(strAssetIdB)
376- let pmtStrAssetIdB = $t01175511842._1
377- let pmtAssetNameB = $t01175511842._2
378- let pmtDecimalsB = $t01175511842._3
379- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
380- then throw("Only admin can call this function")
381- else if (isDefined(getBoolean(this, kActive)))
382- then throw("DApp is already active")
383- else if ((strAssetIdA == strAssetIdB))
384- then throw("Assets must be different")
385- else {
386- let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
387- let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
388- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
389- let shareInitialSupply = 0
390- let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
391- let shareIssueId = calculateAssetId(shareIssue)
392- let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceInitA, amtAssetA), IntegerEntry(kBalanceInitB, amtAssetB), IntegerEntry(kBalanceA, 0), IntegerEntry(kBalanceB, 0), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply)]
393- if (firstHarvest)
394- then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
395- else baseEntry
396- }
397- }
211+func shutdown () = valueOrElse(isAdminCall(i.callerPublicKey), if (!(active))
212+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
213+ else suspend("Paused by admin"))
398214
399215
400216
401217 @Callable(i)
402-func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
403- then throw("Only admin can call this function")
404- else [IntegerEntry(kShareLimit, shareLimit)])
218+func activate () = valueOrElse(isAdminCall(i.callerPublicKey), if (active)
219+ then throw("DApp is already active")
220+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
405221
406222
407223
408224 @Callable(i)
409-func replenishWithTwoTokens (slippageTolerance) = valueOrElse(isActive(), {
410- let pmtAssetIdA = i.payments[0].assetId
411- let pmtAssetIdB = i.payments[1].assetId
412- let pmtAmountA = i.payments[0].amount
413- let pmtAmountB = i.payments[1].amount
414- let $t01422114298 = getAssetInfo(pmtAssetIdA)
415- let pmtStrAssetIdA = $t01422114298._1
416- let pmtAssetNameA = $t01422114298._2
417- let pmtDecimalsA = $t01422114298._3
418- let $t01430314380 = getAssetInfo(pmtAssetIdB)
419- let pmtStrAssetIdB = $t01430314380._1
420- let pmtAssetNameB = $t01430314380._2
421- let pmtDecimalsB = $t01430314380._3
422- let inital = if (if ((balanceA == 0))
423- then (balanceB == 0)
424- else false)
425- then true
426- else false
427- let tokenRatio = if (inital)
428- then fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
429- else fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
430- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
431- let shareTokenToPayAmount = if (inital)
432- then fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
433- else fraction(min([fraction(pmtAmountA, scaleValue8, balanceA), fraction(pmtAmountB, scaleValue8, balanceB)]), shareAssetSupply, scaleValue8)
434- if (if ((0 > slippageTolerance))
435- then true
436- else (slippageTolerance > slippageToleranceDelimiter))
437- then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
438- else if ((size(i.payments) != 2))
439- then throw("Two attached assets expected")
440- else if (if ((pmtAssetIdA != assetIdA))
441- then true
442- else (pmtAssetIdB != assetIdB))
443- then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
444- else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
445- then true
446- else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
447- then throw("Incorrect assets amount: amounts must have the contract ratio")
448- else if ((shareTokenToPayAmount == 0))
449- then throw("Too small amount to replenish")
450- else if (!(hasEnoughBalance))
451- then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
452- else {
453- let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
454- then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
455- else 0
456- if ((stake1 == stake1))
457- then {
458- let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
459- then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
460- else 0
461- if ((stake2 == stake2))
462- then [Reissue(shareAssetId, shareTokenToPayAmount, true), IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
463- else throw("Strict value is not equal to itself.")
464- }
465- else throw("Strict value is not equal to itself.")
466- }
467- })
468-
469-
470-
471-@Callable(i)
472-func withdraw () = valueOrElse(isActive(), {
473- let $t01718017255 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474- let pmtAmount = $t01718017255._1
475- let pmtAssetId = $t01718017255._2
476- let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
477- let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
478- if ((size(i.payments) != 1))
479- then throw("One attached payment expected")
480- else if ((pmtAssetId != shareAssetId))
481- then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
482- else if (!(hasEnoughBalance))
483- then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
484- else {
485- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
486- then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
487- else 0
488- if ((stake1 == stake1))
489- then {
490- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
491- then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
492- else 0
493- if ((stake2 == stake2))
494- then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
495- else throw("Strict value is not equal to itself.")
496- }
497- else throw("Strict value is not equal to itself.")
498- }
499- })
500-
501-
502-
503-@Callable(i)
504-func exchange (minAmountToReceive) = valueOrElse(isActive(), {
505- let $t01855418629 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
506- let pmtAmount = $t01855418629._1
507- let pmtAssetId = $t01855418629._2
508- if (if ((balanceA == 0))
509- then true
510- else (balanceB == 0))
511- then throw("Can't exchange with zero balance")
512- else if ((0 >= minAmountToReceive))
513- then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
514- else if ((size(i.payments) != 1))
515- then throw("One attached payment expected")
516- else if (!(hasEnoughBalance))
517- then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
518- else if ((pmtAssetId == assetIdA))
519- then {
520- let assetIdSend = assetIdB
521- let $t01918019318 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB, i.originCaller)
522- let amountWithoutFee = $t01918019318._1
523- let amountWithFee = $t01918019318._2
524- let governanceReward = $t01918019318._3
525- let newBalanceA = (balanceA + pmtAmount)
526- let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
527- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
528- then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdA], nil)
529- else 0
530- if ((stake1 == stake1))
531- then {
532- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
533- then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdB], nil)
534- else 0
535- if ((stake2 == stake2))
536- then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
537- else throw("Strict value is not equal to itself.")
538- }
539- else throw("Strict value is not equal to itself.")
540- }
541- else if ((pmtAssetId == assetIdB))
542- then {
543- let assetIdSend = assetIdA
544- let $t02031020448 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA, i.originCaller)
545- let amountWithoutFee = $t02031020448._1
546- let amountWithFee = $t02031020448._2
547- let governanceReward = $t02031020448._3
548- let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
549- let newBalanceB = (balanceB + pmtAmount)
550- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
551- then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
552- else 0
553- if ((stake1 == stake1))
554- then {
555- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
556- then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
557- else 0
558- if ((stake2 == stake2))
559- then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
560- else throw("Strict value is not equal to itself.")
561- }
562- else throw("Strict value is not equal to itself.")
563- }
564- else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
565- })
566-
567-
568-
569-@Callable(i)
570-func shutdown () = if (!(active))
571- then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
572- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
573- then throw("Only admin can call this function")
574- else suspend("Paused by admin")
575-
576-
577-
578-@Callable(i)
579-func activate () = if (active)
580- then throw("DApp is already active")
581- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
582- then throw("Only admin can call this function")
583- else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
584-
585-
586-
587-@Callable(i)
588-func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
589- let amountEnrollA = (accountBalanceWithStakedA - balanceA)
590- let amountEnrollB = (accountBalanceWithStakedB - balanceB)
591- if ((i.caller != moneyBoxAddress))
592- then throw("Only the wallet can call this function")
593- else if (if ((0 > amountEnrollA))
594- then true
595- else (0 > amountEnrollB))
596- then suspend("Enroll amount negative")
597- else if (if ((amountEnrollA == 0))
598- then (amountEnrollB == 0)
599- else false)
600- then throw("No money to take")
601- else {
602- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
603- then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
604- else 0
605- if ((stake1 == stake1))
606- then {
607- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
608- then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
609- else 0
610- if ((stake2 == stake2))
611- then [IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
612- else throw("Strict value is not equal to itself.")
613- }
614- else throw("Strict value is not equal to itself.")
615- }
616- })
617-
618-
619-
620-@Callable(i)
621-func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
622- then throw("Only contract itself can invoke this function")
225+func stakeUnstake (stake,amount,assetIdString) = valueOrElse(isActive(), if ((i.caller != cpmmContract))
226+ then throw("Only global Contract can invoke this function")
623227 else if ((assetIdString == "WAVES"))
624228 then {
625229 let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, kLeasingPool), "No leasing pool in oracle"))
626230 let leasingId = getBinary(this, kLeasingId)
627231 let leasingAmount = valueOrElse(getInteger(this, kLeasingAmount), 0)
628232 let newLeaseAmount = if (stake)
629233 then (leasingAmount + amount)
630234 else (leasingAmount - amount)
631235 let newLease = Lease(pool, newLeaseAmount)
632236 let newLeaseId = calculateLeaseId(newLease)
633237 let baseEtry = [newLease, BinaryEntry(kLeasingId, newLeaseId), IntegerEntry(kLeasingAmount, newLeaseAmount)]
634238 match leasingId {
635239 case lId: ByteVector =>
636240 ([LeaseCancel(lId)] ++ baseEtry)
637241 case _ =>
638242 baseEtry
639243 }
640244 }
641245 else {
642- let $t02420224305 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
643- let call = $t02420224305._1
644- let addr = $t02420224305._2
645- let params = $t02420224305._3
646- let payments = $t02420224305._4
246+ let $t060496152 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
247+ let call = $t060496152._1
248+ let addr = $t060496152._2
249+ let params = $t060496152._3
250+ let payments = $t060496152._4
647251 let inv = invoke(addr, call, params, payments)
648252 if ((inv == inv))
649253 then nil
650254 else throw("Strict value is not equal to itself.")
651- }
255+ })
652256
653257
654258
655259 @Callable(i)
656-func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
657- then throw("Only admin can call this function")
658- else {
659- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
660- then {
661- let amountA = (balanceA - stakedAmountA)
662- if ((amountA > 0))
663- then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
664- else 0
665- }
666- else 0
667- if ((stake1 == stake1))
668- then {
669- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
670- then {
671- let amountB = (balanceB - stakedAmountB)
672- if ((amountB > 0))
673- then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
674- else 0
675- }
676- else 0
677- if ((stake2 == stake2))
678- then nil
679- else throw("Strict value is not equal to itself.")
680- }
681- else throw("Strict value is not equal to itself.")
682- })
260+func reissueShareToken (amount) = valueOrElse(isGlobalCaller(i.caller), valueOrElse(isActive(), {
261+ let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
262+[Reissue(shareAssetId, amount, true), ScriptTransfer(i.caller, amount, shareAssetId)]
263+ }))
264+
265+
266+
267+@Callable(i)
268+func replenishWithTwoTokens (slippageTolerance) = callCommon("replenishWithTwoTokens", i.caller.bytes, ["false", "0"], i.payments)
269+
270+
271+
272+@Callable(i)
273+func withdraw () = callCommon("withdraw", i.caller.bytes, ["0"], i.payments)
274+
275+
276+
277+@Callable(i)
278+func exchange (minAmountToReceive) = callCommon("exchange", i.caller.bytes, [toString(minAmountToReceive)], i.payments)
683279
684280
685281 @Verifier(tx)
686282 func verify () = {
687283 let multiSignedByAdmins = {
688284 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
689285 then 1
690286 else 0
691287 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
692288 then 1
693289 else 0
694290 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
695291 then 1
696292 else 0
697293 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
698294 }
699- match tx {
700- case inv: InvokeScriptTransaction =>
701- let callTakeIntoAccount = if ((inv.dApp == this))
702- then (inv.function == "takeIntoAccountExtraFunds")
703- else false
704- let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
705- then true
706- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
707- then true
708- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
709- then true
710- else sigVerify(tx.bodyBytes, tx.proofs[0], adminInvokePubKey)
711- if (if (callTakeIntoAccount)
712- then signedByAdmin
713- else false)
714- then true
715- else multiSignedByAdmins
716- case _ =>
717- multiSignedByAdmins
718- }
295+ multiSignedByAdmins
719296 }
720297

github/deemru/w8io/786bc32 
236.05 ms