tx · AVWXDfVQ5gV91vi1HDxDwwLcnW4eTDoHGL7LjAfRqUwk 3P6QCup9ZgsBg8LLzk7dCa8MnCZBCLYQoXP: -0.01100000 Waves 2024.02.24 10:02 [4055792] smart account 3P6QCup9ZgsBg8LLzk7dCa8MnCZBCLYQoXP > SELF 0.00000000 Waves
{ "type": 13, "id": "AVWXDfVQ5gV91vi1HDxDwwLcnW4eTDoHGL7LjAfRqUwk", "fee": 1100000, "feeAssetId": null, "timestamp": 1708758222070, "version": 2, "chainId": 87, "sender": "3P6QCup9ZgsBg8LLzk7dCa8MnCZBCLYQoXP", "senderPublicKey": "Gz4W9Y9UMEEZzMBu6GHyXY7BRsLXdbzFDwRPak18TW7u", "proofs": [ "2EbxopnBzjCr2kj76kmmBmXPk8fnkWbSQMbVNc3vvUTBS85u8HqUm93BRC1WUBiDcV5maKAc2vQhxp9mDToMKSPr" ], "script": "base64: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MV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgADRmVlCQENdHJ5R2V0SW50ZWdlcgECCnN0YXRpY19mZWUABlNjYWxlOACAwtcvAAhGZWVTY2FsZQCQTgESY2FsY3VsYXRlT3V0QW1vdW50BQhBbW91bnRJbgdhc3NldEluCGFzc2V0T3V0CUJhbGFuY2VJbgpCYWxhbmNlT3V0BAdJbmRleEluCQEFdmFsdWUBCQDPCAIFCGFzc2V0SWRzBQdhc3NldEluBAhJbmRleE91dAkBBXZhbHVlAQkAzwgCBQhhc3NldElkcwUIYXNzZXRPdXQDCQAAAgUHSW5kZXhJbgUISW5kZXhPdXQFCEFtb3VudEluCQBuBAUKQmFsYW5jZU91dAkAZQIJAGgCBQZTY2FsZTgFBlNjYWxlOAkAoAMBCQB2BgkAvQIECQC2AgEFCUJhbGFuY2VJbgkAtgIBCQBoAgUGU2NhbGU4BQZTY2FsZTgJALYCAQkAZAIFCUJhbGFuY2VJbgUIQW1vdW50SW4FBkhBTEZVUAAQCQC2AgEJAGsDCQCRAwIFDUFzc2V0c1dlaWdodHMFB0luZGV4SW4AkE4JAJEDAgUNQXNzZXRzV2VpZ2h0cwUISW5kZXhPdXQABAAQBQdDRUlMSU5HCQBoAgUGU2NhbGU4BQZTY2FsZTgFBERPV04BDmNhbGN1bGF0ZVNSYXRlAAQPc3Rha2luZ0VtaXNzaW9uBAckbWF0Y2gwCQD8BwQJAQdBZGRyZXNzAQEaAVcR/V5nkS5nnRcHEFUPDfNTvyVUcY73eO4CF2dldFN0YWtpbmdCbG9ja0VtaXNzaW9uCQDMCAIHBQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgNJbnQEAmluBQckbWF0Y2gwBQJpbgkAAgECCmJhZCBpbnZva2UDCQAAAgUPc3Rha2luZ0VtaXNzaW9uBQ9zdGFraW5nRW1pc3Npb24EDmxhc3RDaGVja1NSYXRlCQEOdHJ5R2V0SW50ZWdlcjICBQdwbHV0b1NDAhVnbG9iYWxfbGFzdENoZWNrU1JhdGUEDHNQbHV0b0Ftb3VudAkBDnRyeUdldEludGVnZXIyAgUHcGx1dG9TQwINZ2xvYmFsX3NQbHV0bwQPbGFzdENoZWNrSGVpZ2h0CQEOdHJ5R2V0SW50ZWdlcjICBQdwbHV0b1NDAhtnbG9iYWxfbGFzdENoZWNrU1JhdGVIZWlnaHQEBmJsb2NrcwkAZQIFBmhlaWdodAUPbGFzdENoZWNrSGVpZ2h0AwkAAAIFDHNQbHV0b0Ftb3VudAAABQZTY2FsZTgJAGQCCQEOdHJ5R2V0SW50ZWdlcjICBQdwbHV0b1NDAhVnbG9iYWxfbGFzdENoZWNrU1JhdGUJAGsDCQBoAgUGYmxvY2tzBQZTY2FsZTgFD3N0YWtpbmdFbWlzc2lvbgUMc1BsdXRvQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARVjYWxjdWxhdGVTdGFrZWRBbW91bnQABAZhbW91bnQJAQ50cnlHZXRJbnRlZ2VyMgIFB3BsdXRvU0MJAKwCAgkApQgBBQR0aGlzAgdfc1BsdXRvCQBrAwUGYW1vdW50CQEOY2FsY3VsYXRlU1JhdGUABQZTY2FsZTgADHB1enpsZVN0YWtlZAkBDnRyeUdldEludGVnZXIyAgUNcHV6emxlU3Rha2luZwkArAICCQClCAEFBHRoaXMCB19zdGFrZWQAC3dhdmVzSW5Td29wCQBrAwkBDnRyeUdldEludGVnZXIyAgUGc3dvcFNDAg9BX2Fzc2V0X2JhbGFuY2UJAQ50cnlHZXRJbnRlZ2VyMgIFBnN3b3BTQwkArAICCQCsAgICJDNQSGFOZ29tQmtydkVMMlFudUphclFWSmE3MXdqdzlxaXFHXwkApQgBBQR0aGlzAhRfc2hhcmVfdG9rZW5zX2xvY2tlZAkBDnRyeUdldEludGVnZXIyAgUGc3dvcFNDAhJzaGFyZV9hc3NldF9zdXBwbHkACXh0bkluU3dvcAkAawMJAQ50cnlHZXRJbnRlZ2VyMgIFBnN3b3BTQwIPQl9hc3NldF9iYWxhbmNlCQEOdHJ5R2V0SW50ZWdlcjICBQZzd29wU0MJAKwCAgkArAICAiQzUEhhTmdvbUJrcnZFTDJRbnVKYXJRVkphNzF3anc5cWlxR18JAKUIAQUEdGhpcwIUX3NoYXJlX3Rva2Vuc19sb2NrZWQJAQ50cnlHZXRJbnRlZ2VyMgIFBnN3b3BTQwISc2hhcmVfYXNzZXRfc3VwcGx5AQ9nZXRUb2tlbkJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBdAUHJG1hdGNoMAkAZAIJAPAHAgUEdGhpcwUBdAMJAAACBQdhc3NldElkBQVwbHV0bwkBFWNhbGN1bGF0ZVN0YWtlZEFtb3VudAAJAGQCAAADCQAAAgUHYXNzZXRJZAUGcHV6emxlBQxwdXp6bGVTdGFrZWQJAGQCAAADCQAAAgUHYXNzZXRJZAUDeHRuBQl4dG5JblN3b3AAAAkAZAIICQDvBwEFBHRoaXMHcmVndWxhcgULd2F2ZXNJblN3b3ABA3N1bQIFYWNjdW0BbgkAZAIFBWFjY3VtCQENcGFyc2VJbnRWYWx1ZQEFAW4BCmlzU2h1dGRvd24ABAckbWF0Y2gwCQCbCAIFBHRoaXMCC2lzX3NodXRkb3duAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAXgFByRtYXRjaDAFAXgHBQFpAQhzaHV0ZG93bgEIc2h1dGRvd24DCQAAAggFAWkGY2FsbGVyBQR0aGlzCQDMCAIJAQxCb29sZWFuRW50cnkCAgtpc19zaHV0ZG93bgUIc2h1dGRvd24FA25pbAkAAgECCmFkbWluIG9ubHkBaQEHcHJlSW5pdAMLYXNzZXRJZHNTdHIPYXNzZXRXZWlnaHRzU3RyA2ZlZQMJAQppc1NodXRkb3duAAkAAgECE2NvbnRyYWN0IGlzIG9uIHN0b3ADCQECIT0CBQR0aGlzCAUBaQZjYWxsZXIJAAIBAgphZG1pbiBvbmx5AwMJAGYCBQNmZWUA9AMGCQBmAgABBQNmZWUJAAIBAi1mZWUgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDUwMCAoMC4wMS01JSkEAnNiCQD8BwQFBHRoaXMCDHN0YXJ0QmFsYW5jZQUDbmlsBQNuaWwDCQAAAgUCc2IFAnNiBA1hc3NldElkc1N0ckxpCQC1CQIF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dHJ5AgITc3RhdGljX3Rva2Vuc0Ftb3VudAkAkAMBBQphc3NldElkc0xpCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgpzdGF0aWNfZmVlBQNmZWUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQRzd2FwAghhc3NldE91dAdtaW5pbXVtAwMJAAACCQEKaXNTaHV0ZG93bgAGCQECIT0CCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQEaAVfpZiEq0gbg3BaK6whal9SfnWKjf/fCWkwHCQACAQIUY29udHJhY3QgaXMgc2h1dGRvd24EA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECIXBsZWFzZSBhdHRhY2ggZXhhY3RseSBvbmUgcGF5bWVudAQIQW1vdW50SW4JAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAdBc3NldEluCAUDcG10B2Fzc2V0SWQECEFzc2V0T3V0CQENZ2V0QXNzZXRCeXRlcwEFCGFzc2V0T3V0BA5Bc3NldEluQmFsYW5jZQkBD2dldFRva2VuQmFsYW5jZQEFB0Fzc2V0SW4ED0Fzc2V0T3V0QmFsYW5jZQkBD2dldFRva2VuQmFsYW5jZQEFCEFzc2V0T3V0BAtmZWVBbW91bnRJbgkAawMFCEFtb3VudEluBQNGZWUFCEZlZVNjYWxlBA1jbGVhbkFtb3VudEluCQBlAgUIQW1vdW50SW4FC2ZlZUFtb3VudEluBAlBbW91bnRPdXQJARJjYWxjdWxhdGVPdXRBbW91bnQFBQ1jbGVhbkFtb3VudEluBQdBc3NldEluBQhBc3NldE91dAUOQXNzZXRJbkJhbGFuY2UFD0Fzc2V0T3V0QmFsYW5jZQQDdXBsAwkAAAIFCEFzc2V0T3V0BQVwbHV0bwkA/AcEBQdwbHV0b1NDAgd1bnN0YWtlCQDMCAIFCUFtb3VudE91dAUDbmlsBQNuaWwFBHVuaXQDCQAAAgUDdXBsBQN1cGwEA3NwbAMJAAACBQdBc3NldEluBQVwbHV0bwkA/AcEBQdwbHV0b1NDAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQVwbHV0bwUIQW1vdW50SW4FA25pbAUEdW5pdAMJAAACBQNzcGwFA3NwbAQDY3B1AwkAAAIFCEFzc2V0T3V0BQZwdXp6bGUJAPwHBAUNcHV6emxlU3Rha2luZwILY2xhaW1SZXdhcmQFA25pbAUDbmlsBQR1bml0AwkAAAIFA2NwdQUDY3B1BAN1cHUDCQAAAgUIQXNzZXRPdXQFBnB1enpsZQkA/AcEBQ1wdXp6bGVTdGFraW5nAgd1blN0YWtlCQDMCAIJAGUCBQlBbW91bnRPdXQJAPAHAgUEdGhpcwUGcHV6emxlBQNuaWwFA25pbAUEdW5pdAMJAAACBQN1cHUFA3VwdQQDc3B1AwkAAAIFB0Fzc2V0SW4FBnB1enpsZQkA/AcEBQ1wdXp6bGVTdGFraW5nAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQZwdXp6bGUJAPAHAgUEdGhpcwUGcHV6emxlBQNuaWwFBHVuaXQDCQAAAgUDc3B1BQNzcHUEGHNoYXJlQW1vdW50V2l0aGRyYXdXYXZlcwkAbgQJAGUCBQlBbW91bnRPdXQICQDvBwEFBHRoaXMHcmVndWxhcgABCQBrAwkBDnRyeUdldEludGVnZXIyAgUGc3dvcFNDAg9BX2Fzc2V0X2JhbGFuY2UAAQkBDnRyeUdldEludGVnZXIyAgUGc3dvcFNDAhJzaGFyZV9hc3NldF9zdXBwbHkFB0NFSUxJTkcEA3V3cwMJAAACBQhBc3NldE91dAUFd2F2ZXMJAPwHBAUGc3dvcFNDAgxjYWxsRnVuY3Rpb24JAMwIAgIId2l0aGRyYXcJAMwIAgkAzAgCCQCkAwEFGHNoYXJlQW1vdW50V2l0aGRyYXdXYXZlcwUDbmlsBQNuaWwFA25pbAUEdW5pdAMJAAACBQN1d3MFA3V3cwQWc2hhcmVBbW91bnRXaXRoZHJhd1h0bgkAbgQJAGUCBQlBbW91bnRPdXQJAPAHAgUEdGhpcwUDeHRuAAEJAGsDCQEOdHJ5R2V0SW50ZWdlcjICBQZzd29wU0MCD0JfYXNzZXRfYmFsYW5jZQABCQEOdHJ5R2V0SW50ZWdlcjICBQZzd29wU0MCEnNoYXJlX2Fzc2V0X3N1cHBseQUHQ0VJTElORwQDdXhzAwkAAAIFCEFzc2V0T3V0BQN4dG4JAPwHBAUGc3dvcFNDAgxjYWxsRnVuY3Rpb24JAMwIAgIId2l0aGRyYXcJAMwIAgkAzAgCCQCkAwEFFnNoYXJlQW1vdW50V2l0aGRyYXdYdG4FA25pbAUDbmlsBQNuaWwFBHVuaXQDCQAAAgUDdXhzBQN1eHMEBHN3eHMDAwMDCQECIT0CBQhBc3NldE91dAUDeHRuCQECIT0CBQhBc3NldE91dAUFd2F2ZXMHCQBmAgkBD2dldFRva2VuQmFsYW5jZQEFA3h0bgAABwkAZgIJAQ9nZXRUb2tlbkJhbGFuY2UBBQV3YXZlcwAABwkA/AcEBQZzd29wU0MCDGNhbGxGdW5jdGlvbgkAzAgCAhZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zCQDMCAICBHRydWUJAMwIAgIBMAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQR1bml0CAkA7wcBBQR0aGlzB3JlZ3VsYXIJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFA3h0bgkA8AcCBQR0aGlzBQN4dG4FA25pbAUEdW5pdAMJAAACBQRzd3hzBQRzd3hzAwkAZgIFB21pbmltdW0FCUFtb3VudE91dAkAAgECJ2Ftb3VudCB0byByZWNlaXZlIGlzIGxvd2VyIHRoYW4gbWluaW11bQMJAAACBQhBc3NldE91dAUHQXNzZXRJbgkAAgECGHRoaXMgc3dhcCBpcyBub3QgYWxsb3dlZAMJAGYCAAAJAGUCBQ9Bc3NldE91dEJhbGFuY2UFCUFtb3VudE91dAkAAgECE3N3YXAgc21hbGxlciBhbW91bnQDCQEKaXNTaHV0ZG93bgAJAAIBAhNjb250cmFjdCBpcyBvbiBzdG9wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUJQW1vdW50T3V0BQhBc3NldE91dAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHN0YXJ0QmFsYW5jZQADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhxhY2Nlc3Mgb25seSBieSBwcm9qZWN0IG93bmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrZXlCdXJueHRuUwkBD2dldFRva2VuQmFsYW5jZQEFB2J1cm54dG4JAMwIAgkBDEludGVnZXJFbnRyeQIFCWtleVBsdXRvUwkBD2dldFRva2VuQmFsYW5jZQEFBXBsdXRvCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQprZXlQdXp6bGVTCQEPZ2V0VG9rZW5CYWxhbmNlAQUGcHV6emxlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrZXlXYXZlc1MJAQ9nZXRUb2tlbkJhbGFuY2UBBQR1bml0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rZXlXaGlybHBvb2xTCQEPZ2V0VG9rZW5CYWxhbmNlAQUJd2hpcmxwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQhrZXlSb21lUwkBD2dldFRva2VuQmFsYW5jZQEFBHJvbWUJAMwIAgkBDEludGVnZXJFbnRyeQIFB2tleVh0blMJAQ9nZXRUb2tlbkJhbGFuY2UBBQN4dG4FA25pbAFpARRjdXJyZW50QmFsYW5jZVByb2ZpdAADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhxhY2Nlc3Mgb25seSBieSBwcm9qZWN0IG93bmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhhCVVJOLVhUTiBjdXJyZW50IGJhbGFuY2UJAQ9nZXRUb2tlbkJhbGFuY2UBBQdidXJueHRuCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhVQTFVUTyBjdXJyZW50IGJhbGFuY2UJAQ9nZXRUb2tlbkJhbGFuY2UBBQVwbHV0bwkAzAgCCQEMSW50ZWdlckVudHJ5AgIWUFVaWkxFIGN1cnJlbnQgYmFsYW5jZQkBD2dldFRva2VuQmFsYW5jZQEFBnB1enpsZQkAzAgCCQEMSW50ZWdlckVudHJ5AgIVV0FWRVMgY3VycmVudCBiYWxhbmNlCQEPZ2V0VG9rZW5CYWxhbmNlAQUFd2F2ZXMJAMwIAgkBDEludGVnZXJFbnRyeQICGVdISVJMUE9PTCBjdXJyZW50IGJhbGFuY2UJAQ9nZXRUb2tlbkJhbGFuY2UBBQl3aGlybHBvb2wJAMwIAgkBDEludGVnZXJFbnRyeQICFFJPTUUgY3VycmVudCBiYWxhbmNlCQEPZ2V0VG9rZW5CYWxhbmNlAQUEcm9tZQkAzAgCCQEMSW50ZWdlckVudHJ5AgITWFROIGN1cnJlbnQgYmFsYW5jZQkBD2dldFRva2VuQmFsYW5jZQEFA3h0bgkAzAgCCQEMSW50ZWdlckVudHJ5AgIPQlVSTi1YVE4gcHJvZml0CQBlAgkBD2dldFRva2VuQmFsYW5jZQEFB2J1cm54dG4JAQ10cnlHZXRJbnRlZ2VyAQULa2V5QnVybnh0blMJAMwIAgkBDEludGVnZXJFbnRyeQICDFBMVVRPIHByb2ZpdAkAZQIJAQ9nZXRUb2tlbkJhbGFuY2UBBQVwbHV0bwkBDXRyeUdldEludGVnZXIBBQlrZXlQbHV0b1MJAMwIAgkBDEludGVnZXJFbnRyeQICDVBVWlpMRSBwcm9maXQJAGUCCQEPZ2V0VG9rZW5CYWxhbmNlAQUGcHV6emxlCQENdHJ5R2V0SW50ZWdlcgEFCmtleVB1enpsZVMJAMwIAgkBDEludGVnZXJFbnRyeQICC1dBVkVTIHByb2Z0CQBlAgkBD2dldFRva2VuQmFsYW5jZQEFBXdhdmVzCQENdHJ5R2V0SW50ZWdlcgEFCWtleVdhdmVzUwkAzAgCCQEMSW50ZWdlckVudHJ5AgIQV0hJUkxQT09MIHByb2ZpdAkAZQIJAQ9nZXRUb2tlbkJhbGFuY2UBBQl3aGlybHBvb2wJAQ10cnlHZXRJbnRlZ2VyAQUNa2V5V2hpcmxwb29sUwkAzAgCCQEMSW50ZWdlckVudHJ5AgILUk9NRSBwcm9maXQJAGUCCQEPZ2V0VG9rZW5CYWxhbmNlAQUEcm9tZQkBDXRyeUdldEludGVnZXIBBQhrZXlSb21lUwkAzAgCCQEMSW50ZWdlckVudHJ5AgIKWFROIHByb2Z0aQkAZQIJAQ9nZXRUb2tlbkJhbGFuY2UBBQN4dG4JAQ10cnlHZXRJbnRlZ2VyAQUHa2V5WHRuUwUDbmlsACfF7D0=", "height": 4055792, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8tMoQ6kL9aCdunJ5ppyTqDeVL4wfRQZGjdLKXmbzmD5d Next: Am6Lqm7vECUUwGZVXSHZsW9aZ79xuiUWq6s1VLJL3zXb Diff:
Old | New | Differences | |
---|---|---|---|
196 | 196 | else if (if ((fee > 500)) | |
197 | 197 | then true | |
198 | 198 | else (1 > fee)) | |
199 | - | then throw("fee value must be between | |
199 | + | then throw("fee value must be between 1 and 500 (0.01-5%)") | |
200 | 200 | else { | |
201 | - | let assetIdsStrLi = split(assetIdsStr, ",") | |
202 | - | let assetIdsLi = { | |
203 | - | let $l = assetIdsStrLi | |
204 | - | let $s = size($l) | |
205 | - | let $acc0 = nil | |
206 | - | func $f4_1 ($a,$i) = if (($i >= $s)) | |
207 | - | then $a | |
208 | - | else addAssetBytesToList($a, $l[$i]) | |
201 | + | let sb = invoke(this, "startBalance", nil, nil) | |
202 | + | if ((sb == sb)) | |
203 | + | then { | |
204 | + | let assetIdsStrLi = split(assetIdsStr, ",") | |
205 | + | let assetIdsLi = { | |
206 | + | let $l = assetIdsStrLi | |
207 | + | let $s = size($l) | |
208 | + | let $acc0 = nil | |
209 | + | func $f4_1 ($a,$i) = if (($i >= $s)) | |
210 | + | then $a | |
211 | + | else addAssetBytesToList($a, $l[$i]) | |
209 | 212 | ||
210 | - | func $f4_2 ($a,$i) = if (($i >= $s)) | |
211 | - | then $a | |
212 | - | else throw("List size exceeds 10") | |
213 | + | func $f4_2 ($a,$i) = if (($i >= $s)) | |
214 | + | then $a | |
215 | + | else throw("List size exceeds 10") | |
213 | 216 | ||
214 | - | $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
215 | - | } | |
216 | - | let assetWeightsStrLi = split(assetWeightsStr, ",") | |
217 | - | let assetWeightsSum = { | |
218 | - | let $l = assetWeightsStrLi | |
219 | - | let $s = size($l) | |
220 | - | let $acc0 = 0 | |
221 | - | func $f5_1 ($a,$i) = if (($i >= $s)) | |
222 | - | then $a | |
223 | - | else sum($a, $l[$i]) | |
217 | + | $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
218 | + | } | |
219 | + | let assetWeightsStrLi = split(assetWeightsStr, ",") | |
220 | + | let assetWeightsSum = { | |
221 | + | let $l = assetWeightsStrLi | |
222 | + | let $s = size($l) | |
223 | + | let $acc0 = 0 | |
224 | + | func $f5_1 ($a,$i) = if (($i >= $s)) | |
225 | + | then $a | |
226 | + | else sum($a, $l[$i]) | |
224 | 227 | ||
225 | - | func $f5_2 ($a,$i) = if (($i >= $s)) | |
226 | - | then $a | |
227 | - | else throw("List size exceeds 10") | |
228 | + | func $f5_2 ($a,$i) = if (($i >= $s)) | |
229 | + | then $a | |
230 | + | else throw("List size exceeds 10") | |
228 | 231 | ||
229 | - | $f5_2($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
230 | - | } | |
231 | - | func addTokenDataEntries (accum,assetNum) = if ((assetNum >= size(assetIdsLi))) | |
232 | - | then accum | |
233 | - | else { | |
234 | - | let assetDecimals = match assetIdsLi[assetNum] { | |
235 | - | case x: ByteVector => | |
236 | - | value(assetInfo(x)).decimals | |
237 | - | case _ => | |
238 | - | 8 | |
232 | + | $f5_2($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
233 | + | } | |
234 | + | func addTokenDataEntries (accum,assetNum) = if ((assetNum >= size(assetIdsLi))) | |
235 | + | then accum | |
236 | + | else { | |
237 | + | let assetDecimals = match assetIdsLi[assetNum] { | |
238 | + | case x: ByteVector => | |
239 | + | value(assetInfo(x)).decimals | |
240 | + | case _ => | |
241 | + | 8 | |
242 | + | } | |
243 | + | (accum ++ [IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_scale"), pow(10, 0, assetDecimals, 0, 0, DOWN)), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_decimals"), assetDecimals), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_weight"), value(parseInt(assetWeightsStrLi[assetNum])))]) | |
244 | + | } | |
245 | + | ||
246 | + | if ((assetWeightsSum != 10000)) | |
247 | + | then throw("sum of token weights must be equal to 10000") | |
248 | + | else ({ | |
249 | + | let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
250 | + | let $s = size($l) | |
251 | + | let $acc0 = nil | |
252 | + | func $f6_1 ($a,$i) = if (($i >= $s)) | |
253 | + | then $a | |
254 | + | else addTokenDataEntries($a, $l[$i]) | |
255 | + | ||
256 | + | func $f6_2 ($a,$i) = if (($i >= $s)) | |
257 | + | then $a | |
258 | + | else throw("List size exceeds 10") | |
259 | + | ||
260 | + | $f6_2($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
261 | + | } ++ [StringEntry("static_tokenIds", assetIdsStr), StringEntry("static_tokenWeights", assetWeightsStr), IntegerEntry("static_tokensAmount", size(assetIdsLi)), IntegerEntry("static_fee", fee)]) | |
239 | 262 | } | |
240 | - | (accum ++ [IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_scale"), pow(10, 0, assetDecimals, 0, 0, DOWN)), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_decimals"), assetDecimals), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_weight"), value(parseInt(assetWeightsStrLi[assetNum])))]) | |
241 | - | } | |
242 | - | ||
243 | - | if ((assetWeightsSum != 10000)) | |
244 | - | then throw("sum of token weights must be equal to 10000") | |
245 | - | else ({ | |
246 | - | let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
247 | - | let $s = size($l) | |
248 | - | let $acc0 = nil | |
249 | - | func $f6_1 ($a,$i) = if (($i >= $s)) | |
250 | - | then $a | |
251 | - | else addTokenDataEntries($a, $l[$i]) | |
252 | - | ||
253 | - | func $f6_2 ($a,$i) = if (($i >= $s)) | |
254 | - | then $a | |
255 | - | else throw("List size exceeds 10") | |
256 | - | ||
257 | - | $f6_2($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
258 | - | } ++ [StringEntry("static_tokenIds", assetIdsStr), StringEntry("static_tokenWeights", assetWeightsStr), IntegerEntry("static_tokensAmount", size(assetIdsLi)), IntegerEntry("static_fee", fee)]) | |
263 | + | else throw("Strict value is not equal to itself.") | |
259 | 264 | } | |
260 | 265 | ||
261 | 266 | ||
355 | 360 | @Callable(i) | |
356 | 361 | func startBalance () = if ((i.caller != this)) | |
357 | 362 | then throw("access only by project owner") | |
358 | - | else [IntegerEntry(keyBurnxtnS, getTokenBalance(burnxtn)), IntegerEntry(keyPlutoS, getTokenBalance(pluto)), IntegerEntry(keyPuzzleS, getTokenBalance(puzzle)), IntegerEntry(keyWavesS, getTokenBalance( | |
363 | + | else [IntegerEntry(keyBurnxtnS, getTokenBalance(burnxtn)), IntegerEntry(keyPlutoS, getTokenBalance(pluto)), IntegerEntry(keyPuzzleS, getTokenBalance(puzzle)), IntegerEntry(keyWavesS, getTokenBalance(unit)), IntegerEntry(keyWhirlpoolS, getTokenBalance(whirlpool)), IntegerEntry(keyRomeS, getTokenBalance(rome)), IntegerEntry(keyXtnS, getTokenBalance(xtn))] | |
359 | 364 | ||
360 | 365 | ||
361 | 366 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let pluto = base58'Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5' | |
5 | 5 | ||
6 | 6 | let xtn = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
7 | 7 | ||
8 | 8 | let puzzle = base58'HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS' | |
9 | 9 | ||
10 | 10 | let waves = base58'WAVES' | |
11 | 11 | ||
12 | 12 | let burnxtn = base58'3SjxA2YLdfF9fTRbzLm9xFn27C6MW34W1YsdJ6Axefns' | |
13 | 13 | ||
14 | 14 | let whirlpool = base58'73tY3E6Gd5AWYmsuq8m8Kek7KnJNAYyS3GoveTbc6jCi' | |
15 | 15 | ||
16 | 16 | let rome = base58'AP4Cb5xLYGH6ZigHreCZHoXpQTWDkPsG2BHqfDUx6taJ' | |
17 | 17 | ||
18 | 18 | let plutoSC = Address(base58'3P7dGTVZp8VLDYy3XEaUQbiqfi9cMK1Ly5q') | |
19 | 19 | ||
20 | 20 | let swopSC = Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG') | |
21 | 21 | ||
22 | 22 | let puzzleStaking = Address(base58'3PFTbywqxtFfukX3HyT881g4iW5K4QL3FAS') | |
23 | 23 | ||
24 | 24 | let keyPlutoS = "PLUTO starting balance" | |
25 | 25 | ||
26 | 26 | let keyXtnS = "XTN starting balance" | |
27 | 27 | ||
28 | 28 | let keyPuzzleS = "PUZZLE starting balance" | |
29 | 29 | ||
30 | 30 | let keyWavesS = "WAVES starting balance" | |
31 | 31 | ||
32 | 32 | let keyBurnxtnS = "BURN-XTN starting balance" | |
33 | 33 | ||
34 | 34 | let keyWhirlpoolS = "WHIRLPOOL starting balance" | |
35 | 35 | ||
36 | 36 | let keyRomeS = "ROME starting balance" | |
37 | 37 | ||
38 | 38 | func tryGetInteger (key) = match getInteger(this, key) { | |
39 | 39 | case b: Int => | |
40 | 40 | b | |
41 | 41 | case _ => | |
42 | 42 | 0 | |
43 | 43 | } | |
44 | 44 | ||
45 | 45 | ||
46 | 46 | func tryGetInteger2 (address,key) = match getInteger(address, key) { | |
47 | 47 | case b: Int => | |
48 | 48 | b | |
49 | 49 | case _ => | |
50 | 50 | 0 | |
51 | 51 | } | |
52 | 52 | ||
53 | 53 | ||
54 | 54 | func tryGetString (key) = match getString(this, key) { | |
55 | 55 | case b: String => | |
56 | 56 | b | |
57 | 57 | case _ => | |
58 | 58 | "" | |
59 | 59 | } | |
60 | 60 | ||
61 | 61 | ||
62 | 62 | func getAssetString (assetId) = match assetId { | |
63 | 63 | case b: ByteVector => | |
64 | 64 | toBase58String(b) | |
65 | 65 | case _ => | |
66 | 66 | "WAVES" | |
67 | 67 | } | |
68 | 68 | ||
69 | 69 | ||
70 | 70 | func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES")) | |
71 | 71 | then unit | |
72 | 72 | else fromBase58String(assetIdStr) | |
73 | 73 | ||
74 | 74 | ||
75 | 75 | func addAssetBytesToList (accum,item) = (accum ++ [getAssetBytes(item)]) | |
76 | 76 | ||
77 | 77 | ||
78 | 78 | func addAssetWeightToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_weight"))]) | |
79 | 79 | ||
80 | 80 | ||
81 | 81 | let assetIds = { | |
82 | 82 | let $l = split(tryGetString("static_tokenIds"), ",") | |
83 | 83 | let $s = size($l) | |
84 | 84 | let $acc0 = nil | |
85 | 85 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
86 | 86 | then $a | |
87 | 87 | else addAssetBytesToList($a, $l[$i]) | |
88 | 88 | ||
89 | 89 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
90 | 90 | then $a | |
91 | 91 | else throw("List size exceeds 10") | |
92 | 92 | ||
93 | 93 | $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) | |
94 | 94 | } | |
95 | 95 | ||
96 | 96 | let AssetsWeights = { | |
97 | 97 | let $l = assetIds | |
98 | 98 | let $s = size($l) | |
99 | 99 | let $acc0 = nil | |
100 | 100 | func $f1_1 ($a,$i) = if (($i >= $s)) | |
101 | 101 | then $a | |
102 | 102 | else addAssetWeightToList($a, $l[$i]) | |
103 | 103 | ||
104 | 104 | func $f1_2 ($a,$i) = if (($i >= $s)) | |
105 | 105 | then $a | |
106 | 106 | else throw("List size exceeds 10") | |
107 | 107 | ||
108 | 108 | $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) | |
109 | 109 | } | |
110 | 110 | ||
111 | 111 | let Fee = tryGetInteger("static_fee") | |
112 | 112 | ||
113 | 113 | let Scale8 = 100000000 | |
114 | 114 | ||
115 | 115 | let FeeScale = 10000 | |
116 | 116 | ||
117 | 117 | func calculateOutAmount (AmountIn,assetIn,assetOut,BalanceIn,BalanceOut) = { | |
118 | 118 | let IndexIn = value(indexOf(assetIds, assetIn)) | |
119 | 119 | let IndexOut = value(indexOf(assetIds, assetOut)) | |
120 | 120 | if ((IndexIn == IndexOut)) | |
121 | 121 | then AmountIn | |
122 | 122 | else fraction(BalanceOut, ((Scale8 * Scale8) - toInt(pow(fraction(toBigInt(BalanceIn), toBigInt((Scale8 * Scale8)), toBigInt((BalanceIn + AmountIn)), HALFUP), 16, toBigInt(fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut])), 4, 16, CEILING))), (Scale8 * Scale8), DOWN) | |
123 | 123 | } | |
124 | 124 | ||
125 | 125 | ||
126 | 126 | func calculateSRate () = { | |
127 | 127 | let stakingEmission = match invoke(Address(base58'3P3a1jssxc2CGdyC7SGbTJc9ZvTjZ5jBMLZ'), "getStakingBlockEmission", [false], nil) { | |
128 | 128 | case in: Int => | |
129 | 129 | in | |
130 | 130 | case _ => | |
131 | 131 | throw("bad invoke") | |
132 | 132 | } | |
133 | 133 | if ((stakingEmission == stakingEmission)) | |
134 | 134 | then { | |
135 | 135 | let lastCheckSRate = tryGetInteger2(plutoSC, "global_lastCheckSRate") | |
136 | 136 | let sPlutoAmount = tryGetInteger2(plutoSC, "global_sPluto") | |
137 | 137 | let lastCheckHeight = tryGetInteger2(plutoSC, "global_lastCheckSRateHeight") | |
138 | 138 | let blocks = (height - lastCheckHeight) | |
139 | 139 | if ((sPlutoAmount == 0)) | |
140 | 140 | then Scale8 | |
141 | 141 | else (tryGetInteger2(plutoSC, "global_lastCheckSRate") + fraction((blocks * Scale8), stakingEmission, sPlutoAmount)) | |
142 | 142 | } | |
143 | 143 | else throw("Strict value is not equal to itself.") | |
144 | 144 | } | |
145 | 145 | ||
146 | 146 | ||
147 | 147 | func calculateStakedAmount () = { | |
148 | 148 | let amount = tryGetInteger2(plutoSC, (toString(this) + "_sPluto")) | |
149 | 149 | fraction(amount, calculateSRate(), Scale8) | |
150 | 150 | } | |
151 | 151 | ||
152 | 152 | ||
153 | 153 | let puzzleStaked = tryGetInteger2(puzzleStaking, (toString(this) + "_staked")) | |
154 | 154 | ||
155 | 155 | let wavesInSwop = fraction(tryGetInteger2(swopSC, "A_asset_balance"), tryGetInteger2(swopSC, (("3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG_" + toString(this)) + "_share_tokens_locked")), tryGetInteger2(swopSC, "share_asset_supply")) | |
156 | 156 | ||
157 | 157 | let xtnInSwop = fraction(tryGetInteger2(swopSC, "B_asset_balance"), tryGetInteger2(swopSC, (("3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG_" + toString(this)) + "_share_tokens_locked")), tryGetInteger2(swopSC, "share_asset_supply")) | |
158 | 158 | ||
159 | 159 | func getTokenBalance (assetId) = match assetId { | |
160 | 160 | case t: ByteVector => | |
161 | 161 | (assetBalance(this, t) + (if ((assetId == pluto)) | |
162 | 162 | then calculateStakedAmount() | |
163 | 163 | else (0 + (if ((assetId == puzzle)) | |
164 | 164 | then puzzleStaked | |
165 | 165 | else (0 + (if ((assetId == xtn)) | |
166 | 166 | then xtnInSwop | |
167 | 167 | else 0)))))) | |
168 | 168 | case _ => | |
169 | 169 | (wavesBalance(this).regular + wavesInSwop) | |
170 | 170 | } | |
171 | 171 | ||
172 | 172 | ||
173 | 173 | func sum (accum,n) = (accum + parseIntValue(n)) | |
174 | 174 | ||
175 | 175 | ||
176 | 176 | func isShutdown () = match getBoolean(this, "is_shutdown") { | |
177 | 177 | case x: Boolean => | |
178 | 178 | x | |
179 | 179 | case _ => | |
180 | 180 | false | |
181 | 181 | } | |
182 | 182 | ||
183 | 183 | ||
184 | 184 | @Callable(i) | |
185 | 185 | func shutdown (shutdown) = if ((i.caller == this)) | |
186 | 186 | then [BooleanEntry("is_shutdown", shutdown)] | |
187 | 187 | else throw("admin only") | |
188 | 188 | ||
189 | 189 | ||
190 | 190 | ||
191 | 191 | @Callable(i) | |
192 | 192 | func preInit (assetIdsStr,assetWeightsStr,fee) = if (isShutdown()) | |
193 | 193 | then throw("contract is on stop") | |
194 | 194 | else if ((this != i.caller)) | |
195 | 195 | then throw("admin only") | |
196 | 196 | else if (if ((fee > 500)) | |
197 | 197 | then true | |
198 | 198 | else (1 > fee)) | |
199 | - | then throw("fee value must be between | |
199 | + | then throw("fee value must be between 1 and 500 (0.01-5%)") | |
200 | 200 | else { | |
201 | - | let assetIdsStrLi = split(assetIdsStr, ",") | |
202 | - | let assetIdsLi = { | |
203 | - | let $l = assetIdsStrLi | |
204 | - | let $s = size($l) | |
205 | - | let $acc0 = nil | |
206 | - | func $f4_1 ($a,$i) = if (($i >= $s)) | |
207 | - | then $a | |
208 | - | else addAssetBytesToList($a, $l[$i]) | |
201 | + | let sb = invoke(this, "startBalance", nil, nil) | |
202 | + | if ((sb == sb)) | |
203 | + | then { | |
204 | + | let assetIdsStrLi = split(assetIdsStr, ",") | |
205 | + | let assetIdsLi = { | |
206 | + | let $l = assetIdsStrLi | |
207 | + | let $s = size($l) | |
208 | + | let $acc0 = nil | |
209 | + | func $f4_1 ($a,$i) = if (($i >= $s)) | |
210 | + | then $a | |
211 | + | else addAssetBytesToList($a, $l[$i]) | |
209 | 212 | ||
210 | - | func $f4_2 ($a,$i) = if (($i >= $s)) | |
211 | - | then $a | |
212 | - | else throw("List size exceeds 10") | |
213 | + | func $f4_2 ($a,$i) = if (($i >= $s)) | |
214 | + | then $a | |
215 | + | else throw("List size exceeds 10") | |
213 | 216 | ||
214 | - | $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
215 | - | } | |
216 | - | let assetWeightsStrLi = split(assetWeightsStr, ",") | |
217 | - | let assetWeightsSum = { | |
218 | - | let $l = assetWeightsStrLi | |
219 | - | let $s = size($l) | |
220 | - | let $acc0 = 0 | |
221 | - | func $f5_1 ($a,$i) = if (($i >= $s)) | |
222 | - | then $a | |
223 | - | else sum($a, $l[$i]) | |
217 | + | $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
218 | + | } | |
219 | + | let assetWeightsStrLi = split(assetWeightsStr, ",") | |
220 | + | let assetWeightsSum = { | |
221 | + | let $l = assetWeightsStrLi | |
222 | + | let $s = size($l) | |
223 | + | let $acc0 = 0 | |
224 | + | func $f5_1 ($a,$i) = if (($i >= $s)) | |
225 | + | then $a | |
226 | + | else sum($a, $l[$i]) | |
224 | 227 | ||
225 | - | func $f5_2 ($a,$i) = if (($i >= $s)) | |
226 | - | then $a | |
227 | - | else throw("List size exceeds 10") | |
228 | + | func $f5_2 ($a,$i) = if (($i >= $s)) | |
229 | + | then $a | |
230 | + | else throw("List size exceeds 10") | |
228 | 231 | ||
229 | - | $f5_2($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
230 | - | } | |
231 | - | func addTokenDataEntries (accum,assetNum) = if ((assetNum >= size(assetIdsLi))) | |
232 | - | then accum | |
233 | - | else { | |
234 | - | let assetDecimals = match assetIdsLi[assetNum] { | |
235 | - | case x: ByteVector => | |
236 | - | value(assetInfo(x)).decimals | |
237 | - | case _ => | |
238 | - | 8 | |
232 | + | $f5_2($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
233 | + | } | |
234 | + | func addTokenDataEntries (accum,assetNum) = if ((assetNum >= size(assetIdsLi))) | |
235 | + | then accum | |
236 | + | else { | |
237 | + | let assetDecimals = match assetIdsLi[assetNum] { | |
238 | + | case x: ByteVector => | |
239 | + | value(assetInfo(x)).decimals | |
240 | + | case _ => | |
241 | + | 8 | |
242 | + | } | |
243 | + | (accum ++ [IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_scale"), pow(10, 0, assetDecimals, 0, 0, DOWN)), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_decimals"), assetDecimals), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_weight"), value(parseInt(assetWeightsStrLi[assetNum])))]) | |
244 | + | } | |
245 | + | ||
246 | + | if ((assetWeightsSum != 10000)) | |
247 | + | then throw("sum of token weights must be equal to 10000") | |
248 | + | else ({ | |
249 | + | let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
250 | + | let $s = size($l) | |
251 | + | let $acc0 = nil | |
252 | + | func $f6_1 ($a,$i) = if (($i >= $s)) | |
253 | + | then $a | |
254 | + | else addTokenDataEntries($a, $l[$i]) | |
255 | + | ||
256 | + | func $f6_2 ($a,$i) = if (($i >= $s)) | |
257 | + | then $a | |
258 | + | else throw("List size exceeds 10") | |
259 | + | ||
260 | + | $f6_2($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
261 | + | } ++ [StringEntry("static_tokenIds", assetIdsStr), StringEntry("static_tokenWeights", assetWeightsStr), IntegerEntry("static_tokensAmount", size(assetIdsLi)), IntegerEntry("static_fee", fee)]) | |
239 | 262 | } | |
240 | - | (accum ++ [IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_scale"), pow(10, 0, assetDecimals, 0, 0, DOWN)), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_decimals"), assetDecimals), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_weight"), value(parseInt(assetWeightsStrLi[assetNum])))]) | |
241 | - | } | |
242 | - | ||
243 | - | if ((assetWeightsSum != 10000)) | |
244 | - | then throw("sum of token weights must be equal to 10000") | |
245 | - | else ({ | |
246 | - | let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
247 | - | let $s = size($l) | |
248 | - | let $acc0 = nil | |
249 | - | func $f6_1 ($a,$i) = if (($i >= $s)) | |
250 | - | then $a | |
251 | - | else addTokenDataEntries($a, $l[$i]) | |
252 | - | ||
253 | - | func $f6_2 ($a,$i) = if (($i >= $s)) | |
254 | - | then $a | |
255 | - | else throw("List size exceeds 10") | |
256 | - | ||
257 | - | $f6_2($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
258 | - | } ++ [StringEntry("static_tokenIds", assetIdsStr), StringEntry("static_tokenWeights", assetWeightsStr), IntegerEntry("static_tokensAmount", size(assetIdsLi)), IntegerEntry("static_fee", fee)]) | |
263 | + | else throw("Strict value is not equal to itself.") | |
259 | 264 | } | |
260 | 265 | ||
261 | 266 | ||
262 | 267 | ||
263 | 268 | @Callable(i) | |
264 | 269 | func swap (assetOut,minimum) = if (if ((isShutdown() == true)) | |
265 | 270 | then (i.caller != Address(base58'3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3')) | |
266 | 271 | else false) | |
267 | 272 | then throw("contract is shutdown") | |
268 | 273 | else { | |
269 | 274 | let pmt = if ((size(i.payments) == 1)) | |
270 | 275 | then value(i.payments[0]) | |
271 | 276 | else throw("please attach exactly one payment") | |
272 | 277 | let AmountIn = value(i.payments[0].amount) | |
273 | 278 | let AssetIn = pmt.assetId | |
274 | 279 | let AssetOut = getAssetBytes(assetOut) | |
275 | 280 | let AssetInBalance = getTokenBalance(AssetIn) | |
276 | 281 | let AssetOutBalance = getTokenBalance(AssetOut) | |
277 | 282 | let feeAmountIn = fraction(AmountIn, Fee, FeeScale) | |
278 | 283 | let cleanAmountIn = (AmountIn - feeAmountIn) | |
279 | 284 | let AmountOut = calculateOutAmount(cleanAmountIn, AssetIn, AssetOut, AssetInBalance, AssetOutBalance) | |
280 | 285 | let upl = if ((AssetOut == pluto)) | |
281 | 286 | then invoke(plutoSC, "unstake", [AmountOut], nil) | |
282 | 287 | else unit | |
283 | 288 | if ((upl == upl)) | |
284 | 289 | then { | |
285 | 290 | let spl = if ((AssetIn == pluto)) | |
286 | 291 | then invoke(plutoSC, "stake", nil, [AttachedPayment(pluto, AmountIn)]) | |
287 | 292 | else unit | |
288 | 293 | if ((spl == spl)) | |
289 | 294 | then { | |
290 | 295 | let cpu = if ((AssetOut == puzzle)) | |
291 | 296 | then invoke(puzzleStaking, "claimReward", nil, nil) | |
292 | 297 | else unit | |
293 | 298 | if ((cpu == cpu)) | |
294 | 299 | then { | |
295 | 300 | let upu = if ((AssetOut == puzzle)) | |
296 | 301 | then invoke(puzzleStaking, "unStake", [(AmountOut - assetBalance(this, puzzle))], nil) | |
297 | 302 | else unit | |
298 | 303 | if ((upu == upu)) | |
299 | 304 | then { | |
300 | 305 | let spu = if ((AssetIn == puzzle)) | |
301 | 306 | then invoke(puzzleStaking, "stake", nil, [AttachedPayment(puzzle, assetBalance(this, puzzle))]) | |
302 | 307 | else unit | |
303 | 308 | if ((spu == spu)) | |
304 | 309 | then { | |
305 | 310 | let shareAmountWithdrawWaves = fraction((AmountOut - wavesBalance(this).regular), 1, fraction(tryGetInteger2(swopSC, "A_asset_balance"), 1, tryGetInteger2(swopSC, "share_asset_supply")), CEILING) | |
306 | 311 | let uws = if ((AssetOut == waves)) | |
307 | 312 | then invoke(swopSC, "callFunction", ["withdraw", [toString(shareAmountWithdrawWaves)]], nil) | |
308 | 313 | else unit | |
309 | 314 | if ((uws == uws)) | |
310 | 315 | then { | |
311 | 316 | let shareAmountWithdrawXtn = fraction((AmountOut - assetBalance(this, xtn)), 1, fraction(tryGetInteger2(swopSC, "B_asset_balance"), 1, tryGetInteger2(swopSC, "share_asset_supply")), CEILING) | |
312 | 317 | let uxs = if ((AssetOut == xtn)) | |
313 | 318 | then invoke(swopSC, "callFunction", ["withdraw", [toString(shareAmountWithdrawXtn)]], nil) | |
314 | 319 | else unit | |
315 | 320 | if ((uxs == uxs)) | |
316 | 321 | then { | |
317 | 322 | let swxs = if (if (if (if ((AssetOut != xtn)) | |
318 | 323 | then (AssetOut != waves) | |
319 | 324 | else false) | |
320 | 325 | then (getTokenBalance(xtn) > 0) | |
321 | 326 | else false) | |
322 | 327 | then (getTokenBalance(waves) > 0) | |
323 | 328 | else false) | |
324 | 329 | then invoke(swopSC, "callFunction", ["replenishWithTwoTokens", "true", "0"], [AttachedPayment(unit, wavesBalance(this).regular), AttachedPayment(xtn, assetBalance(this, xtn))]) | |
325 | 330 | else unit | |
326 | 331 | if ((swxs == swxs)) | |
327 | 332 | then if ((minimum > AmountOut)) | |
328 | 333 | then throw("amount to receive is lower than minimum") | |
329 | 334 | else if ((AssetOut == AssetIn)) | |
330 | 335 | then throw("this swap is not allowed") | |
331 | 336 | else if ((0 > (AssetOutBalance - AmountOut))) | |
332 | 337 | then throw("swap smaller amount") | |
333 | 338 | else if (isShutdown()) | |
334 | 339 | then throw("contract is on stop") | |
335 | 340 | else [ScriptTransfer(i.caller, AmountOut, AssetOut)] | |
336 | 341 | else throw("Strict value is not equal to itself.") | |
337 | 342 | } | |
338 | 343 | else throw("Strict value is not equal to itself.") | |
339 | 344 | } | |
340 | 345 | else throw("Strict value is not equal to itself.") | |
341 | 346 | } | |
342 | 347 | else throw("Strict value is not equal to itself.") | |
343 | 348 | } | |
344 | 349 | else throw("Strict value is not equal to itself.") | |
345 | 350 | } | |
346 | 351 | else throw("Strict value is not equal to itself.") | |
347 | 352 | } | |
348 | 353 | else throw("Strict value is not equal to itself.") | |
349 | 354 | } | |
350 | 355 | else throw("Strict value is not equal to itself.") | |
351 | 356 | } | |
352 | 357 | ||
353 | 358 | ||
354 | 359 | ||
355 | 360 | @Callable(i) | |
356 | 361 | func startBalance () = if ((i.caller != this)) | |
357 | 362 | then throw("access only by project owner") | |
358 | - | else [IntegerEntry(keyBurnxtnS, getTokenBalance(burnxtn)), IntegerEntry(keyPlutoS, getTokenBalance(pluto)), IntegerEntry(keyPuzzleS, getTokenBalance(puzzle)), IntegerEntry(keyWavesS, getTokenBalance( | |
363 | + | else [IntegerEntry(keyBurnxtnS, getTokenBalance(burnxtn)), IntegerEntry(keyPlutoS, getTokenBalance(pluto)), IntegerEntry(keyPuzzleS, getTokenBalance(puzzle)), IntegerEntry(keyWavesS, getTokenBalance(unit)), IntegerEntry(keyWhirlpoolS, getTokenBalance(whirlpool)), IntegerEntry(keyRomeS, getTokenBalance(rome)), IntegerEntry(keyXtnS, getTokenBalance(xtn))] | |
359 | 364 | ||
360 | 365 | ||
361 | 366 | ||
362 | 367 | @Callable(i) | |
363 | 368 | func currentBalanceProfit () = if ((i.caller != this)) | |
364 | 369 | then throw("access only by project owner") | |
365 | 370 | else [IntegerEntry("BURN-XTN current balance", getTokenBalance(burnxtn)), IntegerEntry("PLUTO current balance", getTokenBalance(pluto)), IntegerEntry("PUZZLE current balance", getTokenBalance(puzzle)), IntegerEntry("WAVES current balance", getTokenBalance(waves)), IntegerEntry("WHIRLPOOL current balance", getTokenBalance(whirlpool)), IntegerEntry("ROME current balance", getTokenBalance(rome)), IntegerEntry("XTN current balance", getTokenBalance(xtn)), IntegerEntry("BURN-XTN profit", (getTokenBalance(burnxtn) - tryGetInteger(keyBurnxtnS))), IntegerEntry("PLUTO profit", (getTokenBalance(pluto) - tryGetInteger(keyPlutoS))), IntegerEntry("PUZZLE profit", (getTokenBalance(puzzle) - tryGetInteger(keyPuzzleS))), IntegerEntry("WAVES proft", (getTokenBalance(waves) - tryGetInteger(keyWavesS))), IntegerEntry("WHIRLPOOL profit", (getTokenBalance(whirlpool) - tryGetInteger(keyWhirlpoolS))), IntegerEntry("ROME profit", (getTokenBalance(rome) - tryGetInteger(keyRomeS))), IntegerEntry("XTN profti", (getTokenBalance(xtn) - tryGetInteger(keyXtnS)))] | |
366 | 371 | ||
367 | 372 |
github/deemru/w8io/3ef1775 71.30 ms ◑