tx · GiVAXqKK9S95Kuu9jMqqdBeXcL1WCRBLc3Xk6yq5HFuL 3N5Z4dAWzfkEp4kNJZKQk6zf3uTVFFz5MFF: -0.01500000 Waves 2024.04.02 11:36 [3044919] smart account 3N5Z4dAWzfkEp4kNJZKQk6zf3uTVFFz5MFF > SELF 0.00000000 Waves
{ "type": 13, "id": "GiVAXqKK9S95Kuu9jMqqdBeXcL1WCRBLc3Xk6yq5HFuL", "fee": 1500000, "feeAssetId": null, "timestamp": 1712046921623, "version": 2, "chainId": 84, "sender": "3N5Z4dAWzfkEp4kNJZKQk6zf3uTVFFz5MFF", "senderPublicKey": "8Vp8fmB3ZGVRre7Cw5j9z6qXo3yD8ohPQ6agZ9mtVY5E", "proofs": [ "3gQDJa6ZxM2icg38of9H7DfiMKfJWRBJoZmfX285Dohm9CNZzcLfAMV9sVFaDcbqrAfLfkMU22N6kp6x7bArzUU7" ], "script": "base64:BwIyCAISBgoEAQgICBIAEgMKAQgSBQoDAQgBEgMKAQESBQoDCAgIEgASABIDCgEIEgMKAQg3AAlTRVBBUkFUT1ICAl9fAAxLRVlfTVVMVElTSUcCCE1VTFRJU0lHAApLRVlfU1RBVFVTAgZTVEFUVVMACEtFWV9JTklUAgRJTklUAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgAJS0VZX0NIQUlOAgVDSEFJTgAUS0VZX0dBVEVXQVlfQ09OVFJBQ1QCEEdBVEVXQVlfQ09OVFJBQ1QAE0tFWV9TV0FWRVNfQ09OVFJBQ1QCD1NXQVZFU19DT05UUkFDVAAQS0VZX1NXQVZFU19BU1NFVAIFQVNTRVQADEtFWV9SRVNFUlZFUwIIUkVTRVJWRVMADEZVTkNfREVQT1NJVAIHZGVwb3NpdAAXRlVOQ19SRVFVRVNUX1dJVEhEUkFXQUwCEXJlcXVlc3RXaXRoZHJhd2FsABdGVU5DX0VYRUNVVEVfV0lUSERSQVdBTAIRZXhlY3V0ZVdpdGhkcmF3YWwADUZVTkNfR0VUX1JBVEUCB2dldFJhdGUADUZVTkNfV0lUSERSQVcCCHdpdGhkcmF3AAVXQVZFUwIFV0FWRVMADldBVkVTX0RFQ0lNQUxTAAgADERFWF9ERUNJTUFMUwAIAAdNQVhfSU5UAP//////////fwASU1dBVkVTX1JBVEVfRkFDVE9SCQC2AgEAgKCUpY0dARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8DCQAAAgUIYXNzZXRJZF8FBVdBVkVTBgQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDF92YWxpZGF0ZUludAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfAwMJAGYCBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAGYCBQR2YWxfBQ51cHBlckJvdW5kYXJ5XwkAAgEFBGVycl8GAQ9fdmFsaWRhdGVTdHJpbmcCBHZhbF8EZXJyXwMDCQBnAgAACQCxAgEFBHZhbF8GCQEIY29udGFpbnMCBQR2YWxfBQlTRVBBUkFUT1IJAAIBBQRlcnJfBgEVX3ZhbGlkYXRlUGF5bWVudHNTaXplAwlwYXltZW50c18HdGFyZ2V0XwRlcnJfAwkBAiE9AgkAkAMBBQlwYXltZW50c18FB3RhcmdldF8JAAIBBQRlcnJfBgELX2Fzc2V0VG9TdHIBBmFzc2V0XwQHJG1hdGNoMAUGYXNzZXRfAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQUFV0FWRVMBC19zdHJUb0Fzc2V0AQZhc3NldF8DCQAAAgUGYXNzZXRfBQVXQVZFUwUEdW5pdAkA2QQBBQZhc3NldF8BDF9nZXREZWNpbWFscwEIYXNzZXRJZF8DCQAAAgUIYXNzZXRJZF8FBVdBVkVTBQ5XQVZFU19ERUNJTUFMUwQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwCAUBYQhkZWNpbWFscwkAAgEJAKwCAgIXX2dldERlY2ltYWxzOiBubyBhc3NldD0FCGFzc2V0SWRfARJfbm9ybWFsaXplRGVjaW1hbHMDB2Ftb3VudF8Pc291cmNlRGVjaW1hbHNfD3RhcmdldERlY2ltYWxzXwMJAGcCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwkAaQIFB2Ftb3VudF8JAGwGAAoAAAkAZQIFD3NvdXJjZURlY2ltYWxzXwUPdGFyZ2V0RGVjaW1hbHNfAAAAAAUERE9XTgkAaAIFB2Ftb3VudF8JAGwGAAoAAAkAZQIFD3RhcmdldERlY2ltYWxzXwUPc291cmNlRGVjaW1hbHNfAAAAAAUERE9XTgEJX2xvYWRJbml0AAQHJG1hdGNoMAkAoAgBBQhLRVlfSU5JVAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEJX3NhdmVJbml0AQdpc0luaXRfCQDMCAIJAQxCb29sZWFuRW50cnkCBQhLRVlfSU5JVAUHaXNJbml0XwUDbmlsAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDF9sb2FkQ2hhaW5JZAAEByRtYXRjaDAJAJ8IAQUJS0VZX0NIQUlOAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQxfc2F2ZUNoYWluSWQBCGNoYWluSWRfCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlLRVlfQ0hBSU4FCGNoYWluSWRfBQNuaWwBFF9sb2FkR2F0ZXdheUNvbnRyYWN0AAQHJG1hdGNoMAkAoggBBRRLRVlfR0FURVdBWV9DT05UUkFDVAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAARRfc2F2ZUdhdGV3YXlDb250cmFjdAEQZ2F0ZXdheUNvbnRyYWN0XwkAzAgCCQELU3RyaW5nRW50cnkCBRRLRVlfR0FURVdBWV9DT05UUkFDVAkApQgBBRBnYXRld2F5Q29udHJhY3RfBQNuaWwBE19sb2FkU1dhdmVzQ29udHJhY3QABAckbWF0Y2gwCQCiCAEFE0tFWV9TV0FWRVNfQ09OVFJBQ1QDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAETX3NhdmVTV2F2ZXNDb250cmFjdAEPc1dhdmVzQ29udHJhY3RfCQDMCAIJAQtTdHJpbmdFbnRyeQIFE0tFWV9TV0FWRVNfQ09OVFJBQ1QJAKUIAQUPc1dhdmVzQ29udHJhY3RfBQNuaWwBEF9sb2FkU1dhdmVzQXNzZXQBCWNvbnRyYWN0XwQHJG1hdGNoMAkAnQgCBQljb250cmFjdF8FEEtFWV9TV0FWRVNfQVNTRVQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQDZBAEFAWEJAAIBAhhfbG9hZFNXYXZlc0Fzc2V0OiByZXZlcnQBDV9sb2FkUmVzZXJ2ZXMBBmFzc2V0XwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUMS0VZX1JFU0VSVkVTCQDMCAIFBmFzc2V0XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABDV9zYXZlUmVzZXJ2ZXMCBmFzc2V0XwlyZXNlcnZlc18JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBQxLRVlfUkVTRVJWRVMJAMwIAgUGYXNzZXRfBQNuaWwFCVNFUEFSQVRPUgUJcmVzZXJ2ZXNfBQNuaWwBEV9vbmx5VGhpc0NvbnRyYWN0AQdjYWxsZXJfAwkBAiE9AgUHY2FsbGVyXwUEdGhpcwkAAgECGV9vbmx5VGhpc0NvbnRyYWN0OiByZXZlcnQGARBfd2hlbk11bHRpc2lnU2V0AAMJAAACCQENX2xvYWRNdWx0aXNpZwAJAQdBZGRyZXNzAQEACQACAQIYX3doZW5NdWx0aXNpZ1NldDogcmV2ZXJ0BgETX3doZW5Ob3RJbml0aWFsaXplZAADCQEJX2xvYWRJbml0AAkAAgECG193aGVuTm90SW5pdGlhbGl6ZWQ6IHJldmVydAYBEF93aGVuSW5pdGlhbGl6ZWQAAwkBASEBCQEJX2xvYWRJbml0AAkAAgECGF93aGVuSW5pdGlhbGl6ZWQ6IHJldmVydAYBDl93aGVuTm90UGF1c2VkAAMJAQpfbG9hZFBhdXNlAAkAAgECFl93aGVuTm90UGF1c2VkOiByZXZlcnQGAQtfd2hlblBhdXNlZAADCQEBIQEJAQpfbG9hZFBhdXNlAAkAAgECE193aGVuUGF1c2VkOiByZXZlcnQGAQtfb25seVBhdXNlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQtfbG9hZFBhdXNlcgAJAAIBAhNfb25seVBhdXNlcjogcmV2ZXJ0BgEQX3ZhbGlkYXRlR2F0ZXdheQIGY2FsbGVyBGVycl8DCQECIT0CCQEUX2xvYWRHYXRld2F5Q29udHJhY3QABQZjYWxsZXIJAAIBBQRlcnJfBgoBaQEEaW5pdAQIY2hhaW5JZF8HcGF1c2VyXxBnYXRld2F5Q29udHJhY3RfD3NXYXZlc0NvbnRyYWN0XwQDZXJyAwMDAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARNfd2hlbk5vdEluaXRpYWxpemVkAAcJARBfd2hlbk11bHRpc2lnU2V0AAcJAQxfdmFsaWRhdGVJbnQEBQhjaGFpbklkXwAABQdNQVhfSU5UAhVpbml0OiBpbnZhbGlkIGNoYWluSWQHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB3BhdXNlcl8CFGluaXQ6IGludmFsaWQgcGF1c2VyBwkBEF92YWxpZGF0ZUFkZHJlc3MCBRBnYXRld2F5Q29udHJhY3RfAh1pbml0OiBpbnZhbGlkIGdhdGV3YXlDb250cmFjdAcJARBfdmFsaWRhdGVBZGRyZXNzAgUPc1dhdmVzQ29udHJhY3RfAhxpbml0OiBpbnZhbGlkIHNXYXZlc0NvbnRyYWN0BwMJAAACBQNlcnIFA2VycgkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAQlfc2F2ZUluaXQBBgkBDF9zYXZlQ2hhaW5JZAEFCGNoYWluSWRfCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfCQEUX3NhdmVHYXRld2F5Q29udHJhY3QBCQERQGV4dHJOYXRpdmUoMTA2MikBBRBnYXRld2F5Q29udHJhY3RfCQETX3NhdmVTV2F2ZXNDb250cmFjdAEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFD3NXYXZlc0NvbnRyYWN0XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdkZXBvc2l0AAQDZXJyAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEVX3ZhbGlkYXRlUGF5bWVudHNTaXplAwgFAWkIcGF5bWVudHMAAQITZGVwb3NpdDogbm8gcGF5bWVudAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABQdNQVhfSU5UAhlkZXBvc2l0OiBuZWdhdGl2ZSBwYXltZW50BwMJAAACBQNlcnIFA2VycgQGY2FsbGVyCQClCAEIBQFpBmNhbGxlcgQFYXNzZXQJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFBWFzc2V0BAZhbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMDCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYXNzZXREZWNpbWFscwUMREVYX0RFQ0lNQUxTBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUGYW1vdW50AAEFB01BWF9JTlQCH2RlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhbW91bnQDCQAAAgUEZXJyMQUEZXJyMQQRZ2F0ZXdheUludm9jYXRpb24JAPwHBAkBFF9sb2FkR2F0ZXdheUNvbnRyYWN0AAUMRlVOQ19ERVBPU0lUCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQZjYWxsZXIJAMwIAgUGY2FsbGVyCQDMCAIJAKQDAQkBDF9sb2FkQ2hhaW5JZAAJAMwIAgUFYXNzZXQJAMwIAgkApAMBBQZhbW91bnQFA25pbAUDbmlsAwkAAAIFEWdhdGV3YXlJbnZvY2F0aW9uBRFnYXRld2F5SW52b2NhdGlvbgQRc3Rha2luZ0ludm9jYXRpb24DCQAAAgUFYXNzZXQFBVdBVkVTCQD8BwQJARNfbG9hZFNXYXZlc0NvbnRyYWN0AAUMRlVOQ19ERVBPU0lUBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQNuaWwFBHVuaXQDCQAAAgURc3Rha2luZ0ludm9jYXRpb24FEXN0YWtpbmdJbnZvY2F0aW9uCQCUCgIJAQ1fc2F2ZVJlc2VydmVzAgUFYXNzZXQJAGQCCQENX2xvYWRSZXNlcnZlcwEFBWFzc2V0BQZhbW91bnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJZGVwb3NpdFRvAQN0b18EA2VycgMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARVfdmFsaWRhdGVQYXltZW50c1NpemUDCAUBaQhwYXltZW50cwABAhVkZXBvc2l0VG86IG5vIHBheW1lbnQHCQEMX3ZhbGlkYXRlSW50BAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAUHTUFYX0lOVAIbZGVwb3NpdFRvOiBuZWdhdGl2ZSBwYXltZW50BwkBD192YWxpZGF0ZVN0cmluZwIFA3RvXwIVZGVwb3NpdFRvOiBpbnZhbGlkIHRvBwMJAAACBQNlcnIFA2VycgQGY2FsbGVyCQClCAEIBQFpBmNhbGxlcgQFYXNzZXQJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFBWFzc2V0BAZhbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMDCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYXNzZXREZWNpbWFscwUMREVYX0RFQ0lNQUxTBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUGYW1vdW50AAEFB01BWF9JTlQCIWRlcG9zaXRUbzogaW52YWxpZCBwYXltZW50IGFtb3VudAMJAAACBQRlcnIxBQRlcnIxBBFnYXRld2F5SW52b2NhdGlvbgkA/AcECQEUX2xvYWRHYXRld2F5Q29udHJhY3QABQxGVU5DX0RFUE9TSVQJAMwIAgkApQgBBQR0aGlzCQDMCAIFBmNhbGxlcgkAzAgCBQN0b18JAMwIAgkApAMBCQEMX2xvYWRDaGFpbklkAAkAzAgCBQVhc3NldAkAzAgCCQCkAwEFBmFtb3VudAUDbmlsBQNuaWwDCQAAAgURZ2F0ZXdheUludm9jYXRpb24FEWdhdGV3YXlJbnZvY2F0aW9uBBFzdGFraW5nSW52b2NhdGlvbgMJAAACBQVhc3NldAUFV0FWRVMJAPwHBAkBE19sb2FkU1dhdmVzQ29udHJhY3QABQxGVU5DX0RFUE9TSVQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFA25pbAUEdW5pdAMJAAACBRFzdGFraW5nSW52b2NhdGlvbgURc3Rha2luZ0ludm9jYXRpb24JAJQKAgkBDV9zYXZlUmVzZXJ2ZXMCBQVhc3NldAkAZAIJAQ1fbG9hZFJlc2VydmVzAQUFYXNzZXQFBmFtb3VudAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFyZXF1ZXN0V2l0aGRyYXdhbAMKdG9DaGFpbklkXwZhc3NldF8HYW1vdW50XwQDZXJyAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQxfdmFsaWRhdGVJbnQEBQp0b0NoYWluSWRfAAAFB01BWF9JTlQCJHJlcXVlc3RXaXRoZHJhd2FsOiBpbnZhbGlkIHRvQ2hhaW5JZAcJAQ9fdmFsaWRhdGVTdHJpbmcCBQZhc3NldF8CIHJlcXVlc3RXaXRoZHJhd2FsOiBpbnZhbGlkIGFzc2V0BwkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAQUHTUFYX0lOVAIicmVxdWVzdFdpdGhkcmF3YWw6IG5lZ2F0aXZlIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIEE3JlcXVlc3RXaXRoZHJhd2FsSWQEByRtYXRjaDAJAPwHBAkBFF9sb2FkR2F0ZXdheUNvbnRyYWN0AAUXRlVOQ19SRVFVRVNUX1dJVEhEUkFXQUwJAMwIAgkApQgBBQR0aGlzCQDMCAIFBmNhbGxlcgkAzAgCBQZjYWxsZXIJAMwIAgkApAMBCQEMX2xvYWRDaGFpbklkAAkAzAgCCQCkAwEFCnRvQ2hhaW5JZF8JAMwIAgUGYXNzZXRfCQDMCAIJAKQDAQUHYW1vdW50XwUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhCQACAQIocmVxdWVzdFdpdGhkcmF3YWw6IGNhbGwgcmV2ZXJ0ZWQgZnJvbSBndwMJAAACBRNyZXF1ZXN0V2l0aGRyYXdhbElkBRNyZXF1ZXN0V2l0aGRyYXdhbElkCQCUCgIFA25pbAUTcmVxdWVzdFdpdGhkcmF3YWxJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFleGVjdXRlV2l0aGRyYXdhbAEUcmVxdWVzdFdpdGhkcmF3YWxJZF8EA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDF92YWxpZGF0ZUludAQFFHJlcXVlc3RXaXRoZHJhd2FsSWRfAAAFB01BWF9JTlQCJGV4ZWN1dGVXaXRoZHJhd2FsOiBpbnZhbGlkIHJlcXVlc3RJZAcDCQAAAgUDZXJyBQNlcnIEEWdhdGV3YXlJbnZvY2F0aW9uCQD9BwQJARRfbG9hZEdhdGV3YXlDb250cmFjdAAFF0ZVTkNfRVhFQ1VURV9XSVRIRFJBV0FMCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQCkAwEJAQxfbG9hZENoYWluSWQACQDMCAIJAKQDAQUUcmVxdWVzdFdpdGhkcmF3YWxJZF8FA25pbAUDbmlsAwkAAAIFEWdhdGV3YXlJbnZvY2F0aW9uBRFnYXRld2F5SW52b2NhdGlvbgkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcDA3RvXwZhc3NldF8HYW1vdW50XwQGYW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUHYW1vdW50XwIYd2l0aGRyYXc6IGFtb3VudCBub3QgaW50BANlcnIDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJARBfdmFsaWRhdGVHYXRld2F5AggFAWkGY2FsbGVyAhl3aXRoZHJhdzogaW52YWxpZCBnYXRld2F5BwkBEF92YWxpZGF0ZUFkZHJlc3MCBQN0b18CGXdpdGhkcmF3OiBpbnZhbGlkIGFkZHJlc3MHCQEOX3ZhbGlkYXRlQXNzZXQCBQZhc3NldF8CF3dpdGhkcmF3OiBpbnZhbGlkIGFzc2V0BwkBDF92YWxpZGF0ZUludAQFBmFtb3VudAAABQdNQVhfSU5UAhl3aXRoZHJhdzogbmVnYXRpdmUgYW1vdW50BwMJAAACBQNlcnIFA2VycgQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFBmFzc2V0XwQQYW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwMFBmFtb3VudAUMREVYX0RFQ0lNQUxTBQ1hc3NldERlY2ltYWxzBAtuZXdSZXNlcnZlcwkAZQIJAQ1fbG9hZFJlc2VydmVzAQUGYXNzZXRfBQZhbW91bnQEBGVycjEDCQEMX3ZhbGlkYXRlSW50BAUQYW1vdW50Tm9ybWFsaXplZAABBQdNQVhfSU5UAhh3aXRoZHJhdzogaW52YWxpZCBhbW91bnQJAQxfdmFsaWRhdGVJbnQEBQtuZXdSZXNlcnZlcwAABQdNQVhfSU5UAh53aXRoZHJhdzogbmVnYXRpdmUgbmV3UmVzZXJ2ZXMHAwkAAAIFBGVycjEFBGVycjEEE3Vuc3Rha2luZ0ludm9jYXRpb24DCQAAAgUGYXNzZXRfBQVXQVZFUwQOc1dhdmVzQ29udHJhY3QJARNfbG9hZFNXYXZlc0NvbnRyYWN0AAQLc1dhdmVzQXNzZXQJARBfbG9hZFNXYXZlc0Fzc2V0AQUOc1dhdmVzQ29udHJhY3QECmludm9jYXRpb24JAPwHBAUOc1dhdmVzQ29udHJhY3QFDUZVTkNfR0VUX1JBVEUFA25pbAUDbmlsBARyYXRlBAckbWF0Y2gwBQppbnZvY2F0aW9uAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhCQACAQIhd2l0aGRyYXc6IHNXYXZlcyBnZXRSYXRlKCkgcmV2ZXJ0BBBzV2F2ZXNUb1dpdGhkcmF3CQCgAwEJAL0CBAkAtgIBBRBhbW91bnROb3JtYWxpemVkBRJTV0FWRVNfUkFURV9GQUNUT1IFBHJhdGUFB0NFSUxJTkcJAPwHBAUOc1dhdmVzQ29udHJhY3QFDUZVTkNfV0lUSERSQVcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULc1dhdmVzQXNzZXQFEHNXYXZlc1RvV2l0aGRyYXcFA25pbAUEdW5pdAMJAAACBRN1bnN0YWtpbmdJbnZvY2F0aW9uBRN1bnN0YWtpbmdJbnZvY2F0aW9uCQCUCgIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQN0b18FEGFtb3VudE5vcm1hbGl6ZWQJAQtfc3RyVG9Bc3NldAEFBmFzc2V0XwUDbmlsCQENX3NhdmVSZXNlcnZlcwIFBmFzc2V0XwULbmV3UmVzZXJ2ZXMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFcGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEGBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3VucGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQELX3doZW5QYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEHBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHVwZGF0ZVBhdXNlcgEHcGF1c2VyXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhx1cGRhdGVQYXVzZXI6IGludmFsaWQgcGF1c2VyBwMJAAACBQNlcnIFA2VycgkAlAoCCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3NldE11bHRpc2lnAQltdWx0aXNpZ18EA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF92YWxpZGF0ZUFkZHJlc3MCBQltdWx0aXNpZ18CHXNldE11bHRpc2lnOiBpbnZhbGlkIG11bHRpc2lnBwMJAAACBQNlcnIFA2VycgkAlAoCCQENX3NhdmVNdWx0aXNpZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW11bHRpc2lnXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIbXVsdGlzaWcJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQDYBAEIBQJ0eAJpZAUDbmlsBQlTRVBBUkFUT1IHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5JMA49A==", "height": 3044919, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8ZpwoXb6QNkssXRBiiiQA75wQC6cdwbpRagafWLKgM5e Next: EzydaTK6rzUmknGewLy9YWPQxjW3yL3SAZFYnmsB9YE9 Diff:
Old | New | Differences | |
---|---|---|---|
343 | 343 | ||
344 | 344 | ||
345 | 345 | @Callable(i) | |
346 | - | func requestWithdrawal (asset_,amount_) = { | |
347 | - | let err = if (if (_whenInitialized()) | |
348 | - | then _ | |
346 | + | func requestWithdrawal (toChainId_,asset_,amount_) = { | |
347 | + | let err = if (if (if (_whenInitialized()) | |
348 | + | then _validateInt(toChainId_, 0, MAX_INT, "requestWithdrawal: invalid toChainId") | |
349 | 349 | else false) | |
350 | - | then _validateInt(amount_, 0, MAX_INT, "requestWithdrawal: negative amount") | |
350 | + | then _validateString(asset_, "requestWithdrawal: invalid asset") | |
351 | + | else false) | |
352 | + | then _validateInt(amount_, 1, MAX_INT, "requestWithdrawal: negative amount") | |
351 | 353 | else false | |
352 | 354 | if ((err == err)) | |
353 | 355 | then { | |
354 | 356 | let caller = toString(i.caller) | |
355 | - | let assetDecimals = _getDecimals(asset_) | |
356 | - | let amount = _normalizeDecimals(amount_, assetDecimals, DEX_DECIMALS) | |
357 | - | let err1 = _validateInt(amount, 1, MAX_INT, "requestWithdrawal: invalid amount") | |
358 | - | if ((err1 == err1)) | |
359 | - | then { | |
360 | - | let requestWithdrawalId = match invoke(_loadGatewayContract(), FUNC_REQUEST_WITHDRAWAL, [toString(this), caller, caller, toString(_loadChainId()), asset_, toString(amount)], nil) { | |
361 | - | case a: Int => | |
362 | - | a | |
363 | - | case _ => | |
364 | - | throw("requestWithdrawal: call reverted from gw") | |
365 | - | } | |
366 | - | if ((requestWithdrawalId == requestWithdrawalId)) | |
367 | - | then $Tuple2(nil, requestWithdrawalId) | |
368 | - | else throw("Strict value is not equal to itself.") | |
369 | - | } | |
357 | + | let requestWithdrawalId = match invoke(_loadGatewayContract(), FUNC_REQUEST_WITHDRAWAL, [toString(this), caller, caller, toString(_loadChainId()), toString(toChainId_), asset_, toString(amount_)], nil) { | |
358 | + | case a: Int => | |
359 | + | a | |
360 | + | case _ => | |
361 | + | throw("requestWithdrawal: call reverted from gw") | |
362 | + | } | |
363 | + | if ((requestWithdrawalId == requestWithdrawalId)) | |
364 | + | then $Tuple2(nil, requestWithdrawalId) | |
370 | 365 | else throw("Strict value is not equal to itself.") | |
371 | 366 | } | |
372 | 367 | else throw("Strict value is not equal to itself.") |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 7 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let SEPARATOR = "__" | |
5 | 5 | ||
6 | 6 | let KEY_MULTISIG = "MULTISIG" | |
7 | 7 | ||
8 | 8 | let KEY_STATUS = "STATUS" | |
9 | 9 | ||
10 | 10 | let KEY_INIT = "INIT" | |
11 | 11 | ||
12 | 12 | let KEY_PAUSED = "PAUSED" | |
13 | 13 | ||
14 | 14 | let KEY_PAUSER = "PAUSER" | |
15 | 15 | ||
16 | 16 | let KEY_CHAIN = "CHAIN" | |
17 | 17 | ||
18 | 18 | let KEY_GATEWAY_CONTRACT = "GATEWAY_CONTRACT" | |
19 | 19 | ||
20 | 20 | let KEY_SWAVES_CONTRACT = "SWAVES_CONTRACT" | |
21 | 21 | ||
22 | 22 | let KEY_SWAVES_ASSET = "ASSET" | |
23 | 23 | ||
24 | 24 | let KEY_RESERVES = "RESERVES" | |
25 | 25 | ||
26 | 26 | let FUNC_DEPOSIT = "deposit" | |
27 | 27 | ||
28 | 28 | let FUNC_REQUEST_WITHDRAWAL = "requestWithdrawal" | |
29 | 29 | ||
30 | 30 | let FUNC_EXECUTE_WITHDRAWAL = "executeWithdrawal" | |
31 | 31 | ||
32 | 32 | let FUNC_GET_RATE = "getRate" | |
33 | 33 | ||
34 | 34 | let FUNC_WITHDRAW = "withdraw" | |
35 | 35 | ||
36 | 36 | let WAVES = "WAVES" | |
37 | 37 | ||
38 | 38 | let WAVES_DECIMALS = 8 | |
39 | 39 | ||
40 | 40 | let DEX_DECIMALS = 8 | |
41 | 41 | ||
42 | 42 | let MAX_INT = 9223372036854775807 | |
43 | 43 | ||
44 | 44 | let SWAVES_RATE_FACTOR = toBigInt(1000000000000) | |
45 | 45 | ||
46 | 46 | func _validateAddress (address_,err_) = match addressFromString(address_) { | |
47 | 47 | case a: Address => | |
48 | 48 | true | |
49 | 49 | case _ => | |
50 | 50 | throw(err_) | |
51 | 51 | } | |
52 | 52 | ||
53 | 53 | ||
54 | 54 | func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES)) | |
55 | 55 | then true | |
56 | 56 | else match assetInfo(fromBase58String(assetId_)) { | |
57 | 57 | case a: Asset => | |
58 | 58 | true | |
59 | 59 | case _ => | |
60 | 60 | throw(err_) | |
61 | 61 | } | |
62 | 62 | ||
63 | 63 | ||
64 | 64 | func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_)) | |
65 | 65 | then true | |
66 | 66 | else (val_ > upperBoundary_)) | |
67 | 67 | then throw(err_) | |
68 | 68 | else true | |
69 | 69 | ||
70 | 70 | ||
71 | 71 | func _validateString (val_,err_) = if (if ((0 >= size(val_))) | |
72 | 72 | then true | |
73 | 73 | else contains(val_, SEPARATOR)) | |
74 | 74 | then throw(err_) | |
75 | 75 | else true | |
76 | 76 | ||
77 | 77 | ||
78 | 78 | func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_)) | |
79 | 79 | then throw(err_) | |
80 | 80 | else true | |
81 | 81 | ||
82 | 82 | ||
83 | 83 | func _assetToStr (asset_) = match asset_ { | |
84 | 84 | case a: ByteVector => | |
85 | 85 | toBase58String(a) | |
86 | 86 | case _ => | |
87 | 87 | WAVES | |
88 | 88 | } | |
89 | 89 | ||
90 | 90 | ||
91 | 91 | func _strToAsset (asset_) = if ((asset_ == WAVES)) | |
92 | 92 | then unit | |
93 | 93 | else fromBase58String(asset_) | |
94 | 94 | ||
95 | 95 | ||
96 | 96 | func _getDecimals (assetId_) = if ((assetId_ == WAVES)) | |
97 | 97 | then WAVES_DECIMALS | |
98 | 98 | else match assetInfo(fromBase58String(assetId_)) { | |
99 | 99 | case a: Asset => | |
100 | 100 | a.decimals | |
101 | 101 | case _ => | |
102 | 102 | throw(("_getDecimals: no asset=" + assetId_)) | |
103 | 103 | } | |
104 | 104 | ||
105 | 105 | ||
106 | 106 | func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_) = if ((sourceDecimals_ >= targetDecimals_)) | |
107 | 107 | then (amount_ / pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN)) | |
108 | 108 | else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN)) | |
109 | 109 | ||
110 | 110 | ||
111 | 111 | func _loadInit () = match getBoolean(KEY_INIT) { | |
112 | 112 | case a: Boolean => | |
113 | 113 | a | |
114 | 114 | case _ => | |
115 | 115 | false | |
116 | 116 | } | |
117 | 117 | ||
118 | 118 | ||
119 | 119 | func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)] | |
120 | 120 | ||
121 | 121 | ||
122 | 122 | func _loadPause () = match getBoolean(KEY_PAUSED) { | |
123 | 123 | case a: Boolean => | |
124 | 124 | a | |
125 | 125 | case _ => | |
126 | 126 | false | |
127 | 127 | } | |
128 | 128 | ||
129 | 129 | ||
130 | 130 | func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)] | |
131 | 131 | ||
132 | 132 | ||
133 | 133 | func _loadPauser () = match getString(KEY_PAUSER) { | |
134 | 134 | case a: String => | |
135 | 135 | addressFromStringValue(a) | |
136 | 136 | case _ => | |
137 | 137 | Address(base58'') | |
138 | 138 | } | |
139 | 139 | ||
140 | 140 | ||
141 | 141 | func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))] | |
142 | 142 | ||
143 | 143 | ||
144 | 144 | func _loadMultisig () = match getString(KEY_MULTISIG) { | |
145 | 145 | case a: String => | |
146 | 146 | addressFromStringValue(a) | |
147 | 147 | case _ => | |
148 | 148 | Address(base58'') | |
149 | 149 | } | |
150 | 150 | ||
151 | 151 | ||
152 | 152 | func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))] | |
153 | 153 | ||
154 | 154 | ||
155 | 155 | func _loadChainId () = match getInteger(KEY_CHAIN) { | |
156 | 156 | case a: Int => | |
157 | 157 | a | |
158 | 158 | case _ => | |
159 | 159 | 0 | |
160 | 160 | } | |
161 | 161 | ||
162 | 162 | ||
163 | 163 | func _saveChainId (chainId_) = [IntegerEntry(KEY_CHAIN, chainId_)] | |
164 | 164 | ||
165 | 165 | ||
166 | 166 | func _loadGatewayContract () = match getString(KEY_GATEWAY_CONTRACT) { | |
167 | 167 | case a: String => | |
168 | 168 | addressFromStringValue(a) | |
169 | 169 | case _ => | |
170 | 170 | Address(base58'') | |
171 | 171 | } | |
172 | 172 | ||
173 | 173 | ||
174 | 174 | func _saveGatewayContract (gatewayContract_) = [StringEntry(KEY_GATEWAY_CONTRACT, toString(gatewayContract_))] | |
175 | 175 | ||
176 | 176 | ||
177 | 177 | func _loadSWavesContract () = match getString(KEY_SWAVES_CONTRACT) { | |
178 | 178 | case a: String => | |
179 | 179 | addressFromStringValue(a) | |
180 | 180 | case _ => | |
181 | 181 | Address(base58'') | |
182 | 182 | } | |
183 | 183 | ||
184 | 184 | ||
185 | 185 | func _saveSWavesContract (sWavesContract_) = [StringEntry(KEY_SWAVES_CONTRACT, toString(sWavesContract_))] | |
186 | 186 | ||
187 | 187 | ||
188 | 188 | func _loadSWavesAsset (contract_) = match getString(contract_, KEY_SWAVES_ASSET) { | |
189 | 189 | case a: String => | |
190 | 190 | fromBase58String(a) | |
191 | 191 | case _ => | |
192 | 192 | throw("_loadSWavesAsset: revert") | |
193 | 193 | } | |
194 | 194 | ||
195 | 195 | ||
196 | 196 | func _loadReserves (asset_) = match getInteger(makeString([KEY_RESERVES, asset_], SEPARATOR)) { | |
197 | 197 | case a: Int => | |
198 | 198 | a | |
199 | 199 | case _ => | |
200 | 200 | 0 | |
201 | 201 | } | |
202 | 202 | ||
203 | 203 | ||
204 | 204 | func _saveReserves (asset_,reserves_) = [IntegerEntry(makeString([KEY_RESERVES, asset_], SEPARATOR), reserves_)] | |
205 | 205 | ||
206 | 206 | ||
207 | 207 | func _onlyThisContract (caller_) = if ((caller_ != this)) | |
208 | 208 | then throw("_onlyThisContract: revert") | |
209 | 209 | else true | |
210 | 210 | ||
211 | 211 | ||
212 | 212 | func _whenMultisigSet () = if ((_loadMultisig() == Address(base58''))) | |
213 | 213 | then throw("_whenMultisigSet: revert") | |
214 | 214 | else true | |
215 | 215 | ||
216 | 216 | ||
217 | 217 | func _whenNotInitialized () = if (_loadInit()) | |
218 | 218 | then throw("_whenNotInitialized: revert") | |
219 | 219 | else true | |
220 | 220 | ||
221 | 221 | ||
222 | 222 | func _whenInitialized () = if (!(_loadInit())) | |
223 | 223 | then throw("_whenInitialized: revert") | |
224 | 224 | else true | |
225 | 225 | ||
226 | 226 | ||
227 | 227 | func _whenNotPaused () = if (_loadPause()) | |
228 | 228 | then throw("_whenNotPaused: revert") | |
229 | 229 | else true | |
230 | 230 | ||
231 | 231 | ||
232 | 232 | func _whenPaused () = if (!(_loadPause())) | |
233 | 233 | then throw("_whenPaused: revert") | |
234 | 234 | else true | |
235 | 235 | ||
236 | 236 | ||
237 | 237 | func _onlyPauser (caller_) = if ((caller_ != _loadPauser())) | |
238 | 238 | then throw("_onlyPauser: revert") | |
239 | 239 | else true | |
240 | 240 | ||
241 | 241 | ||
242 | 242 | func _validateGateway (caller,err_) = if ((_loadGatewayContract() != caller)) | |
243 | 243 | then throw(err_) | |
244 | 244 | else true | |
245 | 245 | ||
246 | 246 | ||
247 | 247 | @Callable(i) | |
248 | 248 | func init (chainId_,pauser_,gatewayContract_,sWavesContract_) = { | |
249 | 249 | let err = if (if (if (if (if (if (_onlyThisContract(i.caller)) | |
250 | 250 | then _whenNotInitialized() | |
251 | 251 | else false) | |
252 | 252 | then _whenMultisigSet() | |
253 | 253 | else false) | |
254 | 254 | then _validateInt(chainId_, 0, MAX_INT, "init: invalid chainId") | |
255 | 255 | else false) | |
256 | 256 | then _validateAddress(pauser_, "init: invalid pauser") | |
257 | 257 | else false) | |
258 | 258 | then _validateAddress(gatewayContract_, "init: invalid gatewayContract") | |
259 | 259 | else false) | |
260 | 260 | then _validateAddress(sWavesContract_, "init: invalid sWavesContract") | |
261 | 261 | else false | |
262 | 262 | if ((err == err)) | |
263 | 263 | then $Tuple2(((((_saveInit(true) ++ _saveChainId(chainId_)) ++ _savePauser(addressFromStringValue(pauser_))) ++ _saveGatewayContract(addressFromStringValue(gatewayContract_))) ++ _saveSWavesContract(addressFromStringValue(sWavesContract_))), unit) | |
264 | 264 | else throw("Strict value is not equal to itself.") | |
265 | 265 | } | |
266 | 266 | ||
267 | 267 | ||
268 | 268 | ||
269 | 269 | @Callable(i) | |
270 | 270 | func deposit () = { | |
271 | 271 | let err = if (if (if (_whenInitialized()) | |
272 | 272 | then _whenNotPaused() | |
273 | 273 | else false) | |
274 | 274 | then _validatePaymentsSize(i.payments, 1, "deposit: no payment") | |
275 | 275 | else false) | |
276 | 276 | then _validateInt(i.payments[0].amount, 0, MAX_INT, "deposit: negative payment") | |
277 | 277 | else false | |
278 | 278 | if ((err == err)) | |
279 | 279 | then { | |
280 | 280 | let caller = toString(i.caller) | |
281 | 281 | let asset = _assetToStr(i.payments[0].assetId) | |
282 | 282 | let assetDecimals = _getDecimals(asset) | |
283 | 283 | let amount = _normalizeDecimals(i.payments[0].amount, assetDecimals, DEX_DECIMALS) | |
284 | 284 | let err1 = _validateInt(amount, 1, MAX_INT, "deposit: invalid payment amount") | |
285 | 285 | if ((err1 == err1)) | |
286 | 286 | then { | |
287 | 287 | let gatewayInvocation = invoke(_loadGatewayContract(), FUNC_DEPOSIT, [toString(this), caller, caller, toString(_loadChainId()), asset, toString(amount)], nil) | |
288 | 288 | if ((gatewayInvocation == gatewayInvocation)) | |
289 | 289 | then { | |
290 | 290 | let stakingInvocation = if ((asset == WAVES)) | |
291 | 291 | then invoke(_loadSWavesContract(), FUNC_DEPOSIT, nil, [AttachedPayment(unit, i.payments[0].amount)]) | |
292 | 292 | else unit | |
293 | 293 | if ((stakingInvocation == stakingInvocation)) | |
294 | 294 | then $Tuple2(_saveReserves(asset, (_loadReserves(asset) + amount)), unit) | |
295 | 295 | else throw("Strict value is not equal to itself.") | |
296 | 296 | } | |
297 | 297 | else throw("Strict value is not equal to itself.") | |
298 | 298 | } | |
299 | 299 | else throw("Strict value is not equal to itself.") | |
300 | 300 | } | |
301 | 301 | else throw("Strict value is not equal to itself.") | |
302 | 302 | } | |
303 | 303 | ||
304 | 304 | ||
305 | 305 | ||
306 | 306 | @Callable(i) | |
307 | 307 | func depositTo (to_) = { | |
308 | 308 | let err = if (if (if (if (_whenInitialized()) | |
309 | 309 | then _whenNotPaused() | |
310 | 310 | else false) | |
311 | 311 | then _validatePaymentsSize(i.payments, 1, "depositTo: no payment") | |
312 | 312 | else false) | |
313 | 313 | then _validateInt(i.payments[0].amount, 0, MAX_INT, "depositTo: negative payment") | |
314 | 314 | else false) | |
315 | 315 | then _validateString(to_, "depositTo: invalid to") | |
316 | 316 | else false | |
317 | 317 | if ((err == err)) | |
318 | 318 | then { | |
319 | 319 | let caller = toString(i.caller) | |
320 | 320 | let asset = _assetToStr(i.payments[0].assetId) | |
321 | 321 | let assetDecimals = _getDecimals(asset) | |
322 | 322 | let amount = _normalizeDecimals(i.payments[0].amount, assetDecimals, DEX_DECIMALS) | |
323 | 323 | let err1 = _validateInt(amount, 1, MAX_INT, "depositTo: invalid payment amount") | |
324 | 324 | if ((err1 == err1)) | |
325 | 325 | then { | |
326 | 326 | let gatewayInvocation = invoke(_loadGatewayContract(), FUNC_DEPOSIT, [toString(this), caller, to_, toString(_loadChainId()), asset, toString(amount)], nil) | |
327 | 327 | if ((gatewayInvocation == gatewayInvocation)) | |
328 | 328 | then { | |
329 | 329 | let stakingInvocation = if ((asset == WAVES)) | |
330 | 330 | then invoke(_loadSWavesContract(), FUNC_DEPOSIT, nil, [AttachedPayment(unit, i.payments[0].amount)]) | |
331 | 331 | else unit | |
332 | 332 | if ((stakingInvocation == stakingInvocation)) | |
333 | 333 | then $Tuple2(_saveReserves(asset, (_loadReserves(asset) + amount)), unit) | |
334 | 334 | else throw("Strict value is not equal to itself.") | |
335 | 335 | } | |
336 | 336 | else throw("Strict value is not equal to itself.") | |
337 | 337 | } | |
338 | 338 | else throw("Strict value is not equal to itself.") | |
339 | 339 | } | |
340 | 340 | else throw("Strict value is not equal to itself.") | |
341 | 341 | } | |
342 | 342 | ||
343 | 343 | ||
344 | 344 | ||
345 | 345 | @Callable(i) | |
346 | - | func requestWithdrawal (asset_,amount_) = { | |
347 | - | let err = if (if (_whenInitialized()) | |
348 | - | then _ | |
346 | + | func requestWithdrawal (toChainId_,asset_,amount_) = { | |
347 | + | let err = if (if (if (_whenInitialized()) | |
348 | + | then _validateInt(toChainId_, 0, MAX_INT, "requestWithdrawal: invalid toChainId") | |
349 | 349 | else false) | |
350 | - | then _validateInt(amount_, 0, MAX_INT, "requestWithdrawal: negative amount") | |
350 | + | then _validateString(asset_, "requestWithdrawal: invalid asset") | |
351 | + | else false) | |
352 | + | then _validateInt(amount_, 1, MAX_INT, "requestWithdrawal: negative amount") | |
351 | 353 | else false | |
352 | 354 | if ((err == err)) | |
353 | 355 | then { | |
354 | 356 | let caller = toString(i.caller) | |
355 | - | let assetDecimals = _getDecimals(asset_) | |
356 | - | let amount = _normalizeDecimals(amount_, assetDecimals, DEX_DECIMALS) | |
357 | - | let err1 = _validateInt(amount, 1, MAX_INT, "requestWithdrawal: invalid amount") | |
358 | - | if ((err1 == err1)) | |
359 | - | then { | |
360 | - | let requestWithdrawalId = match invoke(_loadGatewayContract(), FUNC_REQUEST_WITHDRAWAL, [toString(this), caller, caller, toString(_loadChainId()), asset_, toString(amount)], nil) { | |
361 | - | case a: Int => | |
362 | - | a | |
363 | - | case _ => | |
364 | - | throw("requestWithdrawal: call reverted from gw") | |
365 | - | } | |
366 | - | if ((requestWithdrawalId == requestWithdrawalId)) | |
367 | - | then $Tuple2(nil, requestWithdrawalId) | |
368 | - | else throw("Strict value is not equal to itself.") | |
369 | - | } | |
357 | + | let requestWithdrawalId = match invoke(_loadGatewayContract(), FUNC_REQUEST_WITHDRAWAL, [toString(this), caller, caller, toString(_loadChainId()), toString(toChainId_), asset_, toString(amount_)], nil) { | |
358 | + | case a: Int => | |
359 | + | a | |
360 | + | case _ => | |
361 | + | throw("requestWithdrawal: call reverted from gw") | |
362 | + | } | |
363 | + | if ((requestWithdrawalId == requestWithdrawalId)) | |
364 | + | then $Tuple2(nil, requestWithdrawalId) | |
370 | 365 | else throw("Strict value is not equal to itself.") | |
371 | 366 | } | |
372 | 367 | else throw("Strict value is not equal to itself.") | |
373 | 368 | } | |
374 | 369 | ||
375 | 370 | ||
376 | 371 | ||
377 | 372 | @Callable(i) | |
378 | 373 | func executeWithdrawal (requestWithdrawalId_) = { | |
379 | 374 | let err = if (_whenInitialized()) | |
380 | 375 | then _validateInt(requestWithdrawalId_, 0, MAX_INT, "executeWithdrawal: invalid requestId") | |
381 | 376 | else false | |
382 | 377 | if ((err == err)) | |
383 | 378 | then { | |
384 | 379 | let gatewayInvocation = reentrantInvoke(_loadGatewayContract(), FUNC_EXECUTE_WITHDRAWAL, [toString(this), toString(_loadChainId()), toString(requestWithdrawalId_)], nil) | |
385 | 380 | if ((gatewayInvocation == gatewayInvocation)) | |
386 | 381 | then $Tuple2(nil, unit) | |
387 | 382 | else throw("Strict value is not equal to itself.") | |
388 | 383 | } | |
389 | 384 | else throw("Strict value is not equal to itself.") | |
390 | 385 | } | |
391 | 386 | ||
392 | 387 | ||
393 | 388 | ||
394 | 389 | @Callable(i) | |
395 | 390 | func withdraw (to_,asset_,amount_) = { | |
396 | 391 | let amount = valueOrErrorMessage(parseInt(amount_), "withdraw: amount not int") | |
397 | 392 | let err = if (if (if (if (_whenInitialized()) | |
398 | 393 | then _validateGateway(i.caller, "withdraw: invalid gateway") | |
399 | 394 | else false) | |
400 | 395 | then _validateAddress(to_, "withdraw: invalid address") | |
401 | 396 | else false) | |
402 | 397 | then _validateAsset(asset_, "withdraw: invalid asset") | |
403 | 398 | else false) | |
404 | 399 | then _validateInt(amount, 0, MAX_INT, "withdraw: negative amount") | |
405 | 400 | else false | |
406 | 401 | if ((err == err)) | |
407 | 402 | then { | |
408 | 403 | let assetDecimals = _getDecimals(asset_) | |
409 | 404 | let amountNormalized = _normalizeDecimals(amount, DEX_DECIMALS, assetDecimals) | |
410 | 405 | let newReserves = (_loadReserves(asset_) - amount) | |
411 | 406 | let err1 = if (_validateInt(amountNormalized, 1, MAX_INT, "withdraw: invalid amount")) | |
412 | 407 | then _validateInt(newReserves, 0, MAX_INT, "withdraw: negative newReserves") | |
413 | 408 | else false | |
414 | 409 | if ((err1 == err1)) | |
415 | 410 | then { | |
416 | 411 | let unstakingInvocation = if ((asset_ == WAVES)) | |
417 | 412 | then { | |
418 | 413 | let sWavesContract = _loadSWavesContract() | |
419 | 414 | let sWavesAsset = _loadSWavesAsset(sWavesContract) | |
420 | 415 | let invocation = invoke(sWavesContract, FUNC_GET_RATE, nil, nil) | |
421 | 416 | let rate = match invocation { | |
422 | 417 | case a: String => | |
423 | 418 | parseBigIntValue(a) | |
424 | 419 | case _ => | |
425 | 420 | throw("withdraw: sWaves getRate() revert") | |
426 | 421 | } | |
427 | 422 | let sWavesToWithdraw = toInt(fraction(toBigInt(amountNormalized), SWAVES_RATE_FACTOR, rate, CEILING)) | |
428 | 423 | invoke(sWavesContract, FUNC_WITHDRAW, nil, [AttachedPayment(sWavesAsset, sWavesToWithdraw)]) | |
429 | 424 | } | |
430 | 425 | else unit | |
431 | 426 | if ((unstakingInvocation == unstakingInvocation)) | |
432 | 427 | then $Tuple2(([ScriptTransfer(addressFromStringValue(to_), amountNormalized, _strToAsset(asset_))] ++ _saveReserves(asset_, newReserves)), unit) | |
433 | 428 | else throw("Strict value is not equal to itself.") | |
434 | 429 | } | |
435 | 430 | else throw("Strict value is not equal to itself.") | |
436 | 431 | } | |
437 | 432 | else throw("Strict value is not equal to itself.") | |
438 | 433 | } | |
439 | 434 | ||
440 | 435 | ||
441 | 436 | ||
442 | 437 | @Callable(i) | |
443 | 438 | func pause () = { | |
444 | 439 | let err = if (if (_onlyPauser(i.caller)) | |
445 | 440 | then _whenInitialized() | |
446 | 441 | else false) | |
447 | 442 | then _whenNotPaused() | |
448 | 443 | else false | |
449 | 444 | if ((err == err)) | |
450 | 445 | then $Tuple2(_savePause(true), unit) | |
451 | 446 | else throw("Strict value is not equal to itself.") | |
452 | 447 | } | |
453 | 448 | ||
454 | 449 | ||
455 | 450 | ||
456 | 451 | @Callable(i) | |
457 | 452 | func unpause () = { | |
458 | 453 | let err = if (if (_onlyPauser(i.caller)) | |
459 | 454 | then _whenInitialized() | |
460 | 455 | else false) | |
461 | 456 | then _whenPaused() | |
462 | 457 | else false | |
463 | 458 | if ((err == err)) | |
464 | 459 | then $Tuple2(_savePause(false), unit) | |
465 | 460 | else throw("Strict value is not equal to itself.") | |
466 | 461 | } | |
467 | 462 | ||
468 | 463 | ||
469 | 464 | ||
470 | 465 | @Callable(i) | |
471 | 466 | func updatePauser (pauser_) = { | |
472 | 467 | let err = if (if (_onlyThisContract(i.caller)) | |
473 | 468 | then _whenInitialized() | |
474 | 469 | else false) | |
475 | 470 | then _validateAddress(pauser_, "updatePauser: invalid pauser") | |
476 | 471 | else false | |
477 | 472 | if ((err == err)) | |
478 | 473 | then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit) | |
479 | 474 | else throw("Strict value is not equal to itself.") | |
480 | 475 | } | |
481 | 476 | ||
482 | 477 | ||
483 | 478 | ||
484 | 479 | @Callable(i) | |
485 | 480 | func setMultisig (multisig_) = { | |
486 | 481 | let err = if (_onlyThisContract(i.caller)) | |
487 | 482 | then _validateAddress(multisig_, "setMultisig: invalid multisig") | |
488 | 483 | else false | |
489 | 484 | if ((err == err)) | |
490 | 485 | then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit) | |
491 | 486 | else throw("Strict value is not equal to itself.") | |
492 | 487 | } | |
493 | 488 | ||
494 | 489 | ||
495 | 490 | @Verifier(tx) | |
496 | 491 | func verify () = match getString(KEY_MULTISIG) { | |
497 | 492 | case multisig: String => | |
498 | 493 | valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false) | |
499 | 494 | case _ => | |
500 | 495 | sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
501 | 496 | } | |
502 | 497 |
github/deemru/w8io/3ef1775 61.30 ms ◑