tx · 9jHv5oDfMCDxpgAAs7dhEV46ZZx6TXN1qpXqFqX6p2av

3Mzj8MyE3E3G55SLVE6Dgd6ew2uERLxiE4U:  -0.01300000 Waves

2022.10.06 13:00 [2260312] smart account 3Mzj8MyE3E3G55SLVE6Dgd6ew2uERLxiE4U > SELF 0.00000000 Waves

{ "type": 13, "id": "9jHv5oDfMCDxpgAAs7dhEV46ZZx6TXN1qpXqFqX6p2av", "fee": 1300000, "feeAssetId": null, "timestamp": 1665050450953, "version": 1, "sender": "3Mzj8MyE3E3G55SLVE6Dgd6ew2uERLxiE4U", "senderPublicKey": "8E1ZoUTJyyA7ybXtP2NxUZKdAwvR1ruiQUxZD2bYJJMF", "proofs": [ "4T7ZkPNMySRf67wwFzyQin1XdJ5bfb5T6UsXJbH9ToGexiPuKeqGgajneMGh1EuouTv6jhjdzrkDTiGqbev9Leut" ], "script": "base64:BgIyCAISAwoBARIDCgEBEgMKAQESAwoBARIDCgEBEgQKAggIEgASABIECgIBARIDCgEIEgAdAA9kZWNpbWFsUGFydFVTRE4AwIQ9AA9kZWNpbWFsUGFydFVTRFQAwIQ9ARBrZXlXaXRoZHJhd0RlbGF5AAIRJXNfX3dpdGhkcmF3RGVsYXkBDXdpdGhkcmF3RGVsYXkACQEFdmFsdWUBCQCfCAEJARBrZXlXaXRoZHJhd0RlbGF5AAEaa2V5TWluaW1hbEFtb3VudFRvU3dhcFVzZHQAAhslc19fbWluaW1hbEFtb3VudFRvU3dhcFVzZHQBGmtleU1pbmltYWxBbW91bnRUb1N3YXBVc2RuAAIbJXNfX21pbmltYWxBbW91bnRUb1N3YXBVc2RuAQdtaW5Vc2R0AAkBBXZhbHVlAQkAnwgBCQEaa2V5TWluaW1hbEFtb3VudFRvU3dhcFVzZHQAAQdtaW5Vc2RuAAkBBXZhbHVlAQkAnwgBCQEaa2V5TWluaW1hbEFtb3VudFRvU3dhcFVzZG4AARNrZXlNYW5hZ2VyUHVibGljS2V5AAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQ5rZXlVc2R0QXNzZXRJZAACDyVzX191c2R0QXNzZXRJZAEOa2V5VXNkbkFzc2V0SWQAAg8lc19fdXNkbkFzc2V0SWQBDWtleURlcG9zaXRGZWUAAg4lc19fZGVwb3NpdEZlZQEOa2V5V2l0aGRyYXdGZWUAAg8lc19fd2l0aGRyYXdGZWUBBHVzZHQACQDZBAEJAQV2YWx1ZQEJAKIIAQkBDmtleVVzZHRBc3NldElkAAEEdXNkbgAJANkEAQkBBXZhbHVlAQkAoggBCQEOa2V5VXNkbkFzc2V0SWQAARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAR1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBCmNvbGxlY3RLZXkDB2FkZHJlc3MRYW1vdW50VG9Td2FwSW5LZXkVYWxsb3dUb1dpdGhkcmF3SGVpZ2h0CQC5CQIJAMwIAgUHYWRkcmVzcwkAzAgCAghXSVRIRFJBVwkAzAgCCQCkAwEFEWFtb3VudFRvU3dhcEluS2V5CQDMCAICBkhFSUdIVAkAzAgCCQCkAwEFFWFsbG93VG9XaXRoZHJhd0hlaWdodAUDbmlsAgFfARFjb2xsZWN0QmFsYW5jZUtleQEHYWRkcmVzcwkAuQkCCQDMCAIFB2FkZHJlc3MJAMwIAgIHYmFsYW5jZQUDbmlsAgFfARhjb2xsZWN0QmFsYW5jZUtleVdpdGhGZWUBB2FkZHJlc3MJALkJAgkAzAgCBQdhZGRyZXNzCQDMCAICEGJhbGFuY2Vfd2l0aF9mZWUFA25pbAIBXwEUdXNkdFRvVXNkbkFzc2V0RXJyb3IACQACAQI0VG8gc3dhcCBVU0RUIHRvIFVTRE4geW91IG5lZWQgYXR0YWNoIHBheW1lbnQgaW4gVVNEVAEUdXNkblRvVXNkdEFzc2V0RXJyb3IACQACAQI0VG8gc3dhcCBVU0ROIHRvIFVTRFQgeW91IG5lZWQgYXR0YWNoIHBheW1lbnQgaW4gVVNETgEXdXNkdFRvVXNkbkxvd0xpbWl0RXJyb3IACQACAQkArAICCQCsAgICFnlvdSBjYW4gc3dhcCBhdCBsZWFzdCAJAKQDAQkAaQIJAQdtaW5Vc2R0AAUPZGVjaW1hbFBhcnRVU0RUAgcgdG9rZW5zAQNhYnMBAW4DCQBmAgAABQFuCQBoAgUBbgD///////////8BBQFuARVnZXRXaXRob3V0RmVlV2l0aGRyYXcCBmFtb3VudBFiYWxhbmNlV2l0aG91dEZlZQkAlwMBCQDMCAIFBmFtb3VudAkAzAgCBRFiYWxhbmNlV2l0aG91dEZlZQUDbmlsARdnZXRMaXN0RWxlbWVudE9yRGVmYXVsdAMEbGlzdAVpbmRleAdkZWZhdWx0AwkAZgIJAJADAQUEbGlzdAUFaW5kZXgJAJEDAgUEbGlzdAUFaW5kZXgFB2RlZmF1bHQBEmN1cnJlbnRXaXRoZHJhd2FscwIHYWRkcmVzcwZhbW91bnQECmJhbGFuY2VLZXkJARFjb2xsZWN0QmFsYW5jZUtleQEFB2FkZHJlc3MEEWJhbGFuY2VXaXRoRmVlS2V5CQEYY29sbGVjdEJhbGFuY2VLZXlXaXRoRmVlAQUHYWRkcmVzcwQUY3VycmVudENsaWVudEJhbGFuY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUKYmFsYW5jZUtleQAABBtjdXJyZW50Q2xpZW50QmFsYW5jZVdpdGhGZWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURYmFsYW5jZVdpdGhGZWVLZXkAAAQLdXNlckJhbGFuY2UJAGQCBRRjdXJyZW50Q2xpZW50QmFsYW5jZQUbY3VycmVudENsaWVudEJhbGFuY2VXaXRoRmVlAwMJAGYCBQZhbW91bnQFC3VzZXJCYWxhbmNlBgkAZgIJAQdtaW5Vc2RuAAUGYW1vdW50CQACAQIvU3dhcCBhbW91bnQgZmFpbCwgYW1vdW50IGlzIHRvIHNtYWxsIG9yIHRvIGJpZy4EFHRvV2l0aGRyYXdXaXRob3V0RmVlCQEVZ2V0V2l0aG91dEZlZVdpdGhkcmF3AgUGYW1vdW50BRRjdXJyZW50Q2xpZW50QmFsYW5jZQQRdG9XaXRoZHJhd1dpdGhGZWUJAGUCBQZhbW91bnQFFHRvV2l0aGRyYXdXaXRob3V0RmVlBANmZWUJAGgCCQBpAgURdG9XaXRoZHJhd1dpdGhGZWUAZAkBBXZhbHVlAQkAnwgBCQEOa2V5V2l0aGRyYXdGZWUACQDMCAIFFHRvV2l0aGRyYXdXaXRob3V0RmVlCQDMCAIFEXRvV2l0aGRyYXdXaXRoRmVlCQDMCAIFA2ZlZQUDbmlsAQttdXN0TWFuYWdlcgEBaQQCcGQJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUCcGsGBQJwZAMJAAECBQckbWF0Y2gwAgRVbml0AwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYFAnBkCQACAQILTWF0Y2ggZXJyb3ILAWkBEHNldFdpdGhkcmF3RGVsYXkBEG5ld1dpdGhkcmF3RGVsYXkEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleVdpdGhkcmF3RGVsYXkABRBuZXdXaXRoZHJhd0RlbGF5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEac2V0TWluaW1hbEFtb3VudFRvU3dhcFVzZHQBEG5ld01pbmltYWxBbW91bnQEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmtleU1pbmltYWxBbW91bnRUb1N3YXBVc2R0AAUQbmV3TWluaW1hbEFtb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGnNldE1pbmltYWxBbW91bnRUb1N3YXBVc2RuARBuZXdNaW5pbWFsQW1vdW50BAtjaGVja0NhbGxlcgkBC211c3RNYW5hZ2VyAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARprZXlNaW5pbWFsQW1vdW50VG9Td2FwVXNkbgAFEG5ld01pbmltYWxBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5zZXRXaXRoZHJhd0ZlZQEGbmV3RmVlBAtjaGVja0NhbGxlcgkBC211c3RNYW5hZ2VyAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rZXlXaXRoZHJhd0ZlZQAFBm5ld0ZlZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDXNldERlcG9zaXRGZWUBBm5ld0ZlZQQLY2hlY2tDYWxsZXIJAQttdXN0TWFuYWdlcgEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5RGVwb3NpdEZlZQAFBm5ld0ZlZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2NvbnN0cnVjdG9yAgt1c2R0QXNzZXRJZAt1c2RuQXNzZXRJZAQLY2hlY2tDYWxsZXIJAQttdXN0TWFuYWdlcgEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlVc2R0QXNzZXRJZAAFC3VzZHRBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlVc2RuQXNzZXRJZAAFC3VzZG5Bc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4GaW52b2tlAQ5zd2FwVVNEVHRvVVNETgAECmJhbGFuY2VLZXkJARhjb2xsZWN0QmFsYW5jZUtleVdpdGhGZWUBCQClCAEIBQZpbnZva2UGY2FsbGVyBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQZpbnZva2UIcGF5bWVudHMAAAMJAQIhPQIIBQdwYXltZW50B2Fzc2V0SWQJAQR1c2R0AAkBFHVzZHRUb1VzZG5Bc3NldEVycm9yAAQGYW1vdW50CAUHcGF5bWVudAZhbW91bnQEA2ZlZQkAaAIJAGkCBQZhbW91bnQAZAkBBXZhbHVlAQkAnwgBCQENa2V5RGVwb3NpdEZlZQAEGGN1cnJlbnRDbGllbnRCYWxhbmNlVVNEVAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQpiYWxhbmNlS2V5AAADCQBmAgkBB21pblVzZHQABQZhbW91bnQJARd1c2R0VG9Vc2RuTG93TGltaXRFcnJvcgAJAMwIAgkBDEludGVnZXJFbnRyeQIFCmJhbGFuY2VLZXkJAGQCBRhjdXJyZW50Q2xpZW50QmFsYW5jZVVTRFQFBmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUGaW52b2tlBmNhbGxlcgkAZQIFBmFtb3VudAUDZmVlCQEEdXNkbgAFA25pbAZpbnZva2UBHGluaXRpYWxpemF0aW9uVVNETnRvVVNEVHN3YXAABAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQZpbnZva2UIcGF5bWVudHMAAAQHYWRkcmVzcwkApQgBCAUGaW52b2tlBmNhbGxlcgMJAQIhPQIIBQdwYXltZW50B2Fzc2V0SWQJAQR1c2RuAAkBFHVzZG5Ub1VzZHRBc3NldEVycm9yAAQGYW1vdW50CAUHcGF5bWVudAZhbW91bnQECmJhbGFuY2VLZXkJARFjb2xsZWN0QmFsYW5jZUtleQEFB2FkZHJlc3MEEWJhbGFuY2VXaXRoRmVlS2V5CQEYY29sbGVjdEJhbGFuY2VLZXlXaXRoRmVlAQUHYWRkcmVzcwQUY3VycmVudENsaWVudEJhbGFuY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUKYmFsYW5jZUtleQAABBtjdXJyZW50Q2xpZW50QmFsYW5jZVdpdGhGZWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURYmFsYW5jZVdpdGhGZWVLZXkAAAQLdXNlckJhbGFuY2UJAGQCBRRjdXJyZW50Q2xpZW50QmFsYW5jZQUbY3VycmVudENsaWVudEJhbGFuY2VXaXRoRmVlBARkYXRhCQESY3VycmVudFdpdGhkcmF3YWxzAgkApQgBCAUGaW52b2tlBmNhbGxlcgUGYW1vdW50BBR0b1dpdGhkcmF3V2l0aG91dEZlZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCRAwIFBGRhdGEAAAIiV3JvbmcgJ2N1cnJlbnRXaXRoZHJhd2FscycgbWV0aG9kIQQRdG9XaXRoZHJhd1dpdGhGZWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAkQMCBQRkYXRhAAECIldyb25nICdjdXJyZW50V2l0aGRyYXdhbHMnIG1ldGhvZCEEA2ZlZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCRAwIFBGRhdGEAAgIiV3JvbmcgJ2N1cnJlbnRXaXRoZHJhd2FscycgbWV0aG9kIQQFdG90YWwJAGUCCQBkAgURdG9XaXRoZHJhd1dpdGhGZWUFFHRvV2l0aGRyYXdXaXRob3V0RmVlBQNmZWUEFWFsbG93VG9XaXRoRHJhd0hlaWdodAkAZAIFBmhlaWdodAkBDXdpdGhkcmF3RGVsYXkAAwkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkBCmNvbGxlY3RLZXkDCQClCAEIBQZpbnZva2UGY2FsbGVyBQZhbW91bnQFFWFsbG93VG9XaXRoRHJhd0hlaWdodAkAAgECPVlvdSBoYXZlIGFscmVhZHkgc3RhcnRlZCB3aXRoZHJhd2FsIHByb2Nlc3MsIHdhaXQgbmV4dCBibG9jay4JAMwIAgkBDEludGVnZXJFbnRyeQIFCmJhbGFuY2VLZXkJAGUCBRRjdXJyZW50Q2xpZW50QmFsYW5jZQUUdG9XaXRoZHJhd1dpdGhvdXRGZWUJAMwIAgkBDEludGVnZXJFbnRyeQIFEWJhbGFuY2VXaXRoRmVlS2V5CQBlAgUbY3VycmVudENsaWVudEJhbGFuY2VXaXRoRmVlBRF0b1dpdGhkcmF3V2l0aEZlZQkAzAgCCQELU3RyaW5nRW50cnkCCQEKY29sbGVjdEtleQMJAKUIAQgFBmludm9rZQZjYWxsZXIFBmFtb3VudAUVYWxsb3dUb1dpdGhEcmF3SGVpZ2h0CQC5CQIJAMwIAgINbm90X3dpdGhkcmF3bgkAzAgCCQCkAwEJAGUCBQZhbW91bnQFA2ZlZQUDbmlsAgFfBQNuaWwGaW52b2tlAQ5zd2FwVVNETnRvVVNEVAIGYW1vdW50C2hlaWdodEluS2V5BANrZXkJAQpjb2xsZWN0S2V5AwkApQgBCAUGaW52b2tlBmNhbGxlcgUGYW1vdW50BQtoZWlnaHRJbktleQQNd2l0aGRyYXduSW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFA2tleQkArAICCQCsAgIJAKwCAgIYVGhpcyBrZXkgZG9lc24ndCBleGlzdHMgBQNrZXkCDSBhdCBhZGRyZXNzICAJAKUIAQUEdGhpcwQKdG9XaXRoZHJhdwkBF2dldExpc3RFbGVtZW50T3JEZWZhdWx0AwkAtQkCBQ13aXRoZHJhd25JbmZvAgFfAAIJAKQDAQUGYW1vdW50AwMJAGcCBQZoZWlnaHQFC2hlaWdodEluS2V5CQEIY29udGFpbnMCBQ13aXRoZHJhd25JbmZvAg1ub3Rfd2l0aGRyYXduBwkAzAgCCQELRGVsZXRlRW50cnkBBQNrZXkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFBmludm9rZQZjYWxsZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBBQp0b1dpdGhkcmF3AhRXcm9uZyB3aXRoZHJhdyBkYXRhIQkBBHVzZHQABQNuaWwJAAIBCQCsAgIJAKwCAgIdV2l0aGRyYXdhbCBpcyBwb3NzaWJsZSBhZnRlciAJAKQDAQULaGVpZ2h0SW5LZXkCKyBoZWlnaHQgb3IgeW91IGhhdmUgYWxyZWFkeSB3aXRoZHJhd24gVVNEVC4BaQEKc2V0TWFuYWdlcgEXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDZBAEFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAIFFWNoZWNrTWFuYWdlclB1YmxpY0tleQUVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY29uZmlybU1hbmFnZXIABAJwbQkBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQFaGFzUE0DCQEJaXNEZWZpbmVkAQUCcG0GCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFBWhhc1BNBQVoYXNQTQQHY2hlY2tQTQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAnBtBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQdjaGVja1BNBQdjaGVja1BNCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlNYW5hZ2VyUHVibGljS2V5AAkA2AQBCQEFdmFsdWUBBQJwbQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXnjqRI8", "chainId": 84, "height": 2260312, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BgAWhTVAB8txyCkXQynBZC4vz46AgD4QrHb5Pw4yU2kt Next: 9Lf5GmCuun9BS4LwrKkw5dmLhePGexTRFDuwtAbp1jnn Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let decimalPartUSDN = 1000000
5+
6+let decimalPartUSDT = 1000000
7+
8+func keyWithdrawDelay () = "%s__withdrawDelay"
9+
10+
11+func withdrawDelay () = value(getInteger(keyWithdrawDelay()))
12+
13+
14+func keyMinimalAmountToSwapUsdt () = "%s__minimalAmountToSwapUsdt"
15+
16+
17+func keyMinimalAmountToSwapUsdn () = "%s__minimalAmountToSwapUsdn"
18+
19+
20+func minUsdt () = value(getInteger(keyMinimalAmountToSwapUsdt()))
21+
22+
23+func minUsdn () = value(getInteger(keyMinimalAmountToSwapUsdn()))
24+
25+
426 func keyManagerPublicKey () = "%s__managerPublicKey"
527
628
729 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
30+
31+
32+func keyUsdtAssetId () = "%s__usdtAssetId"
33+
34+
35+func keyUsdnAssetId () = "%s__usdnAssetId"
36+
37+
38+func keyDepositFee () = "%s__depositFee"
39+
40+
41+func keyWithdrawFee () = "%s__withdrawFee"
42+
43+
44+func usdt () = fromBase58String(value(getString(keyUsdtAssetId())))
45+
46+
47+func usdn () = fromBase58String(value(getString(keyUsdnAssetId())))
848
949
1050 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
2767 }
2868
2969
70+func collectKey (address,amountToSwapInKey,allowToWithdrawHeight) = makeString([address, "WITHDRAW", toString(amountToSwapInKey), "HEIGHT", toString(allowToWithdrawHeight)], "_")
71+
72+
73+func collectBalanceKey (address) = makeString([address, "balance"], "_")
74+
75+
76+func collectBalanceKeyWithFee (address) = makeString([address, "balance_with_fee"], "_")
77+
78+
79+func usdtToUsdnAssetError () = throw("To swap USDT to USDN you need attach payment in USDT")
80+
81+
82+func usdnToUsdtAssetError () = throw("To swap USDN to USDT you need attach payment in USDN")
83+
84+
85+func usdtToUsdnLowLimitError () = throw((("you can swap at least " + toString((minUsdt() / decimalPartUSDT))) + " tokens"))
86+
87+
88+func abs (n) = if ((0 > n))
89+ then (n * -1)
90+ else n
91+
92+
93+func getWithoutFeeWithdraw (amount,balanceWithoutFee) = min([amount, balanceWithoutFee])
94+
95+
96+func getListElementOrDefault (list,index,default) = if ((size(list) > index))
97+ then list[index]
98+ else default
99+
100+
101+func currentWithdrawals (address,amount) = {
102+ let balanceKey = collectBalanceKey(address)
103+ let balanceWithFeeKey = collectBalanceKeyWithFee(address)
104+ let currentClientBalance = valueOrElse(getInteger(this, balanceKey), 0)
105+ let currentClientBalanceWithFee = valueOrElse(getInteger(this, balanceWithFeeKey), 0)
106+ let userBalance = (currentClientBalance + currentClientBalanceWithFee)
107+ if (if ((amount > userBalance))
108+ then true
109+ else (minUsdn() > amount))
110+ then throw("Swap amount fail, amount is to small or to big.")
111+ else {
112+ let toWithdrawWithoutFee = getWithoutFeeWithdraw(amount, currentClientBalance)
113+ let toWithdrawWithFee = (amount - toWithdrawWithoutFee)
114+ let fee = ((toWithdrawWithFee / 100) * value(getInteger(keyWithdrawFee())))
115+[toWithdrawWithoutFee, toWithdrawWithFee, fee]
116+ }
117+ }
118+
119+
30120 func mustManager (i) = {
31121 let pd = throw("Permission denied")
32122 match managerPublicKeyOrUnit() {
42132 throw("Match error")
43133 }
44134 }
135+
136+
137+@Callable(i)
138+func setWithdrawDelay (newWithdrawDelay) = {
139+ let checkCaller = mustManager(i)
140+ if ((checkCaller == checkCaller))
141+ then [IntegerEntry(keyWithdrawDelay(), newWithdrawDelay)]
142+ else throw("Strict value is not equal to itself.")
143+ }
144+
145+
146+
147+@Callable(i)
148+func setMinimalAmountToSwapUsdt (newMinimalAmount) = {
149+ let checkCaller = mustManager(i)
150+ if ((checkCaller == checkCaller))
151+ then [IntegerEntry(keyMinimalAmountToSwapUsdt(), newMinimalAmount)]
152+ else throw("Strict value is not equal to itself.")
153+ }
154+
155+
156+
157+@Callable(i)
158+func setMinimalAmountToSwapUsdn (newMinimalAmount) = {
159+ let checkCaller = mustManager(i)
160+ if ((checkCaller == checkCaller))
161+ then [IntegerEntry(keyMinimalAmountToSwapUsdn(), newMinimalAmount)]
162+ else throw("Strict value is not equal to itself.")
163+ }
164+
165+
166+
167+@Callable(i)
168+func setWithdrawFee (newFee) = {
169+ let checkCaller = mustManager(i)
170+ if ((checkCaller == checkCaller))
171+ then [IntegerEntry(keyWithdrawFee(), newFee)]
172+ else throw("Strict value is not equal to itself.")
173+ }
174+
175+
176+
177+@Callable(i)
178+func setDepositFee (newFee) = {
179+ let checkCaller = mustManager(i)
180+ if ((checkCaller == checkCaller))
181+ then [IntegerEntry(keyDepositFee(), newFee)]
182+ else throw("Strict value is not equal to itself.")
183+ }
184+
185+
186+
187+@Callable(i)
188+func constructor (usdtAssetId,usdnAssetId) = {
189+ let checkCaller = mustManager(i)
190+ if ((checkCaller == checkCaller))
191+ then [StringEntry(keyUsdtAssetId(), usdtAssetId), StringEntry(keyUsdnAssetId(), usdnAssetId)]
192+ else throw("Strict value is not equal to itself.")
193+ }
194+
195+
196+
197+@Callable(invoke)
198+func swapUSDTtoUSDN () = {
199+ let balanceKey = collectBalanceKeyWithFee(toString(invoke.caller))
200+ let payment = value(invoke.payments[0])
201+ if ((payment.assetId != usdt()))
202+ then usdtToUsdnAssetError()
203+ else {
204+ let amount = payment.amount
205+ let fee = ((amount / 100) * value(getInteger(keyDepositFee())))
206+ let currentClientBalanceUSDT = valueOrElse(getInteger(this, balanceKey), 0)
207+ if ((minUsdt() > amount))
208+ then usdtToUsdnLowLimitError()
209+ else [IntegerEntry(balanceKey, (currentClientBalanceUSDT + amount)), ScriptTransfer(invoke.caller, (amount - fee), usdn())]
210+ }
211+ }
212+
213+
214+
215+@Callable(invoke)
216+func initializationUSDNtoUSDTswap () = {
217+ let payment = value(invoke.payments[0])
218+ let address = toString(invoke.caller)
219+ if ((payment.assetId != usdn()))
220+ then usdnToUsdtAssetError()
221+ else {
222+ let amount = payment.amount
223+ let balanceKey = collectBalanceKey(address)
224+ let balanceWithFeeKey = collectBalanceKeyWithFee(address)
225+ let currentClientBalance = valueOrElse(getInteger(this, balanceKey), 0)
226+ let currentClientBalanceWithFee = valueOrElse(getInteger(this, balanceWithFeeKey), 0)
227+ let userBalance = (currentClientBalance + currentClientBalanceWithFee)
228+ let data = currentWithdrawals(toString(invoke.caller), amount)
229+ let toWithdrawWithoutFee = valueOrErrorMessage(data[0], "Wrong 'currentWithdrawals' method!")
230+ let toWithdrawWithFee = valueOrErrorMessage(data[1], "Wrong 'currentWithdrawals' method!")
231+ let fee = valueOrErrorMessage(data[2], "Wrong 'currentWithdrawals' method!")
232+ let total = ((toWithdrawWithFee + toWithdrawWithoutFee) - fee)
233+ let allowToWithDrawHeight = (height + withdrawDelay())
234+ if (isDefined(getString(this, collectKey(toString(invoke.caller), amount, allowToWithDrawHeight))))
235+ then throw("You have already started withdrawal process, wait next block.")
236+ else [IntegerEntry(balanceKey, (currentClientBalance - toWithdrawWithoutFee)), IntegerEntry(balanceWithFeeKey, (currentClientBalanceWithFee - toWithdrawWithFee)), StringEntry(collectKey(toString(invoke.caller), amount, allowToWithDrawHeight), makeString(["not_withdrawn", toString((amount - fee))], "_"))]
237+ }
238+ }
239+
240+
241+
242+@Callable(invoke)
243+func swapUSDNtoUSDT (amount,heightInKey) = {
244+ let key = collectKey(toString(invoke.caller), amount, heightInKey)
245+ let withdrawnInfo = valueOrErrorMessage(getString(this, key), ((("This key doesn't exists " + key) + " at address ") + toString(this)))
246+ let toWithdraw = getListElementOrDefault(split(withdrawnInfo, "_"), 2, toString(amount))
247+ if (if ((height >= heightInKey))
248+ then contains(withdrawnInfo, "not_withdrawn")
249+ else false)
250+ then [DeleteEntry(key), ScriptTransfer(invoke.caller, valueOrErrorMessage(parseInt(toWithdraw), "Wrong withdraw data!"), usdt())]
251+ else throw((("Withdrawal is possible after " + toString(heightInKey)) + " height or you have already withdrawn USDT."))
252+ }
253+
45254
46255
47256 @Callable(i)
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let decimalPartUSDN = 1000000
5+
6+let decimalPartUSDT = 1000000
7+
8+func keyWithdrawDelay () = "%s__withdrawDelay"
9+
10+
11+func withdrawDelay () = value(getInteger(keyWithdrawDelay()))
12+
13+
14+func keyMinimalAmountToSwapUsdt () = "%s__minimalAmountToSwapUsdt"
15+
16+
17+func keyMinimalAmountToSwapUsdn () = "%s__minimalAmountToSwapUsdn"
18+
19+
20+func minUsdt () = value(getInteger(keyMinimalAmountToSwapUsdt()))
21+
22+
23+func minUsdn () = value(getInteger(keyMinimalAmountToSwapUsdn()))
24+
25+
426 func keyManagerPublicKey () = "%s__managerPublicKey"
527
628
729 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
30+
31+
32+func keyUsdtAssetId () = "%s__usdtAssetId"
33+
34+
35+func keyUsdnAssetId () = "%s__usdnAssetId"
36+
37+
38+func keyDepositFee () = "%s__depositFee"
39+
40+
41+func keyWithdrawFee () = "%s__withdrawFee"
42+
43+
44+func usdt () = fromBase58String(value(getString(keyUsdtAssetId())))
45+
46+
47+func usdn () = fromBase58String(value(getString(keyUsdnAssetId())))
848
949
1050 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
1151 case s: String =>
1252 fromBase58String(s)
1353 case _: Unit =>
1454 unit
1555 case _ =>
1656 throw("Match error")
1757 }
1858
1959
2060 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
2161 case s: String =>
2262 fromBase58String(s)
2363 case _: Unit =>
2464 unit
2565 case _ =>
2666 throw("Match error")
2767 }
2868
2969
70+func collectKey (address,amountToSwapInKey,allowToWithdrawHeight) = makeString([address, "WITHDRAW", toString(amountToSwapInKey), "HEIGHT", toString(allowToWithdrawHeight)], "_")
71+
72+
73+func collectBalanceKey (address) = makeString([address, "balance"], "_")
74+
75+
76+func collectBalanceKeyWithFee (address) = makeString([address, "balance_with_fee"], "_")
77+
78+
79+func usdtToUsdnAssetError () = throw("To swap USDT to USDN you need attach payment in USDT")
80+
81+
82+func usdnToUsdtAssetError () = throw("To swap USDN to USDT you need attach payment in USDN")
83+
84+
85+func usdtToUsdnLowLimitError () = throw((("you can swap at least " + toString((minUsdt() / decimalPartUSDT))) + " tokens"))
86+
87+
88+func abs (n) = if ((0 > n))
89+ then (n * -1)
90+ else n
91+
92+
93+func getWithoutFeeWithdraw (amount,balanceWithoutFee) = min([amount, balanceWithoutFee])
94+
95+
96+func getListElementOrDefault (list,index,default) = if ((size(list) > index))
97+ then list[index]
98+ else default
99+
100+
101+func currentWithdrawals (address,amount) = {
102+ let balanceKey = collectBalanceKey(address)
103+ let balanceWithFeeKey = collectBalanceKeyWithFee(address)
104+ let currentClientBalance = valueOrElse(getInteger(this, balanceKey), 0)
105+ let currentClientBalanceWithFee = valueOrElse(getInteger(this, balanceWithFeeKey), 0)
106+ let userBalance = (currentClientBalance + currentClientBalanceWithFee)
107+ if (if ((amount > userBalance))
108+ then true
109+ else (minUsdn() > amount))
110+ then throw("Swap amount fail, amount is to small or to big.")
111+ else {
112+ let toWithdrawWithoutFee = getWithoutFeeWithdraw(amount, currentClientBalance)
113+ let toWithdrawWithFee = (amount - toWithdrawWithoutFee)
114+ let fee = ((toWithdrawWithFee / 100) * value(getInteger(keyWithdrawFee())))
115+[toWithdrawWithoutFee, toWithdrawWithFee, fee]
116+ }
117+ }
118+
119+
30120 func mustManager (i) = {
31121 let pd = throw("Permission denied")
32122 match managerPublicKeyOrUnit() {
33123 case pk: ByteVector =>
34124 if ((i.callerPublicKey == pk))
35125 then true
36126 else pd
37127 case _: Unit =>
38128 if ((i.caller == this))
39129 then true
40130 else pd
41131 case _ =>
42132 throw("Match error")
43133 }
44134 }
135+
136+
137+@Callable(i)
138+func setWithdrawDelay (newWithdrawDelay) = {
139+ let checkCaller = mustManager(i)
140+ if ((checkCaller == checkCaller))
141+ then [IntegerEntry(keyWithdrawDelay(), newWithdrawDelay)]
142+ else throw("Strict value is not equal to itself.")
143+ }
144+
145+
146+
147+@Callable(i)
148+func setMinimalAmountToSwapUsdt (newMinimalAmount) = {
149+ let checkCaller = mustManager(i)
150+ if ((checkCaller == checkCaller))
151+ then [IntegerEntry(keyMinimalAmountToSwapUsdt(), newMinimalAmount)]
152+ else throw("Strict value is not equal to itself.")
153+ }
154+
155+
156+
157+@Callable(i)
158+func setMinimalAmountToSwapUsdn (newMinimalAmount) = {
159+ let checkCaller = mustManager(i)
160+ if ((checkCaller == checkCaller))
161+ then [IntegerEntry(keyMinimalAmountToSwapUsdn(), newMinimalAmount)]
162+ else throw("Strict value is not equal to itself.")
163+ }
164+
165+
166+
167+@Callable(i)
168+func setWithdrawFee (newFee) = {
169+ let checkCaller = mustManager(i)
170+ if ((checkCaller == checkCaller))
171+ then [IntegerEntry(keyWithdrawFee(), newFee)]
172+ else throw("Strict value is not equal to itself.")
173+ }
174+
175+
176+
177+@Callable(i)
178+func setDepositFee (newFee) = {
179+ let checkCaller = mustManager(i)
180+ if ((checkCaller == checkCaller))
181+ then [IntegerEntry(keyDepositFee(), newFee)]
182+ else throw("Strict value is not equal to itself.")
183+ }
184+
185+
186+
187+@Callable(i)
188+func constructor (usdtAssetId,usdnAssetId) = {
189+ let checkCaller = mustManager(i)
190+ if ((checkCaller == checkCaller))
191+ then [StringEntry(keyUsdtAssetId(), usdtAssetId), StringEntry(keyUsdnAssetId(), usdnAssetId)]
192+ else throw("Strict value is not equal to itself.")
193+ }
194+
195+
196+
197+@Callable(invoke)
198+func swapUSDTtoUSDN () = {
199+ let balanceKey = collectBalanceKeyWithFee(toString(invoke.caller))
200+ let payment = value(invoke.payments[0])
201+ if ((payment.assetId != usdt()))
202+ then usdtToUsdnAssetError()
203+ else {
204+ let amount = payment.amount
205+ let fee = ((amount / 100) * value(getInteger(keyDepositFee())))
206+ let currentClientBalanceUSDT = valueOrElse(getInteger(this, balanceKey), 0)
207+ if ((minUsdt() > amount))
208+ then usdtToUsdnLowLimitError()
209+ else [IntegerEntry(balanceKey, (currentClientBalanceUSDT + amount)), ScriptTransfer(invoke.caller, (amount - fee), usdn())]
210+ }
211+ }
212+
213+
214+
215+@Callable(invoke)
216+func initializationUSDNtoUSDTswap () = {
217+ let payment = value(invoke.payments[0])
218+ let address = toString(invoke.caller)
219+ if ((payment.assetId != usdn()))
220+ then usdnToUsdtAssetError()
221+ else {
222+ let amount = payment.amount
223+ let balanceKey = collectBalanceKey(address)
224+ let balanceWithFeeKey = collectBalanceKeyWithFee(address)
225+ let currentClientBalance = valueOrElse(getInteger(this, balanceKey), 0)
226+ let currentClientBalanceWithFee = valueOrElse(getInteger(this, balanceWithFeeKey), 0)
227+ let userBalance = (currentClientBalance + currentClientBalanceWithFee)
228+ let data = currentWithdrawals(toString(invoke.caller), amount)
229+ let toWithdrawWithoutFee = valueOrErrorMessage(data[0], "Wrong 'currentWithdrawals' method!")
230+ let toWithdrawWithFee = valueOrErrorMessage(data[1], "Wrong 'currentWithdrawals' method!")
231+ let fee = valueOrErrorMessage(data[2], "Wrong 'currentWithdrawals' method!")
232+ let total = ((toWithdrawWithFee + toWithdrawWithoutFee) - fee)
233+ let allowToWithDrawHeight = (height + withdrawDelay())
234+ if (isDefined(getString(this, collectKey(toString(invoke.caller), amount, allowToWithDrawHeight))))
235+ then throw("You have already started withdrawal process, wait next block.")
236+ else [IntegerEntry(balanceKey, (currentClientBalance - toWithdrawWithoutFee)), IntegerEntry(balanceWithFeeKey, (currentClientBalanceWithFee - toWithdrawWithFee)), StringEntry(collectKey(toString(invoke.caller), amount, allowToWithDrawHeight), makeString(["not_withdrawn", toString((amount - fee))], "_"))]
237+ }
238+ }
239+
240+
241+
242+@Callable(invoke)
243+func swapUSDNtoUSDT (amount,heightInKey) = {
244+ let key = collectKey(toString(invoke.caller), amount, heightInKey)
245+ let withdrawnInfo = valueOrErrorMessage(getString(this, key), ((("This key doesn't exists " + key) + " at address ") + toString(this)))
246+ let toWithdraw = getListElementOrDefault(split(withdrawnInfo, "_"), 2, toString(amount))
247+ if (if ((height >= heightInKey))
248+ then contains(withdrawnInfo, "not_withdrawn")
249+ else false)
250+ then [DeleteEntry(key), ScriptTransfer(invoke.caller, valueOrErrorMessage(parseInt(toWithdraw), "Wrong withdraw data!"), usdt())]
251+ else throw((("Withdrawal is possible after " + toString(heightInKey)) + " height or you have already withdrawn USDT."))
252+ }
253+
45254
46255
47256 @Callable(i)
48257 func setManager (pendingManagerPublicKey) = {
49258 let checkCaller = mustManager(i)
50259 if ((checkCaller == checkCaller))
51260 then {
52261 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
53262 if ((checkManagerPublicKey == checkManagerPublicKey))
54263 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
55264 else throw("Strict value is not equal to itself.")
56265 }
57266 else throw("Strict value is not equal to itself.")
58267 }
59268
60269
61270
62271 @Callable(i)
63272 func confirmManager () = {
64273 let pm = pendingManagerPublicKeyOrUnit()
65274 let hasPM = if (isDefined(pm))
66275 then true
67276 else throw("No pending manager")
68277 if ((hasPM == hasPM))
69278 then {
70279 let checkPM = if ((i.callerPublicKey == value(pm)))
71280 then true
72281 else throw("You are not pending manager")
73282 if ((checkPM == checkPM))
74283 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
75284 else throw("Strict value is not equal to itself.")
76285 }
77286 else throw("Strict value is not equal to itself.")
78287 }
79288
80289
81290 @Verifier(tx)
82291 func verify () = {
83292 let targetPublicKey = match managerPublicKeyOrUnit() {
84293 case pk: ByteVector =>
85294 pk
86295 case _: Unit =>
87296 tx.senderPublicKey
88297 case _ =>
89298 throw("Match error")
90299 }
91300 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
92301 }
93302

github/deemru/w8io/169f3d6 
36.07 ms