tx · 4YgSGVZwbca4HfimSHJ6dvaLUfAMKTdMLQGfi5nU4rRb

3NAfzeA3URU6oCV6HvtAiNwqGXsTs87ZpHh:  -0.04000000 Waves

2022.08.23 14:58 [2197101] smart account 3NAfzeA3URU6oCV6HvtAiNwqGXsTs87ZpHh > SELF 0.00000000 Waves

{ "type": 13, "id": "4YgSGVZwbca4HfimSHJ6dvaLUfAMKTdMLQGfi5nU4rRb", "fee": 4000000, "feeAssetId": null, "timestamp": 1661256053081, "version": 1, "sender": "3NAfzeA3URU6oCV6HvtAiNwqGXsTs87ZpHh", "senderPublicKey": "HiTi1JT7GQRqLNxg4yZhD1mV42y1Mv2AYvRx92JQRbwX", "proofs": [ "KGHAUon3u5DgFLFbVnZSXwCk1sHznzJU8gDHjdLEKYwnSKPXteMcXJfjJ4rcg9Djq2cvcLQA8x4iW6k8cpFUwUP" ], "script": "base64:BgIuCAISAwoBARIFCgMIAQESBQoDCAEBEgMKAQgSBAoCCAESBQoDCAEIEgUKAwgBCGgABkVVTEVSOADWic+BAQAFTVVMVDYAwIQ9AAZNVUxUWDYJALYCAQDAhD0ABU1VTFQ4AIDC1y8ABk1VTFRYOAkAtgIBAIDC1y8AB01VTFRYMTAJALYCAQCAyK+gJQAGTVVMVDEyAICglKWNHQAHTVVMVFgxNgkAtgIBAICAhP6m3uERAAZNVUxUMTgJALYCAQCAgJC7utat8A0AA1NFUAICX18AEURFRkFVTFRTV0FQRkVFTjJXAIgnABFERUZBVUxUU1dBUEZFRVcyTgCgnAEAC0JSUFJPVEVDVEVEAKCNBgAHV0FWRVNJRAkA2QQBAgVXQVZFUwESa2V5TmV1dHJpbm9Bc3NldElkAAIRbmV1dHJpbm9fYXNzZXRfaWQBDmtleU5zYnRBc3NldElkAAINYm9uZF9hc3NldF9pZAEOa2V5U3VyZkFzc2V0SWQAAg1zdXJmX2Fzc2V0X2lkARBrZXlCYWxhbmNlTG9ja2VkAAINYmFsYW5jZV9sb2NrXwEVa2V5V2F2ZXNMb2NrZWRCYWxhbmNlAAkArAICCQEQa2V5QmFsYW5jZUxvY2tlZAACBXdhdmVzARhrZXlOZXV0cmlub0xvY2tlZEJhbGFuY2UACQCsAgIJARBrZXlCYWxhbmNlTG9ja2VkAAIIbmV1dHJpbm8BFWtleU1pbldhdmVzU3dhcEFtb3VudAACFW1pbl93YXZlc19zd2FwX2Ftb3VudAEYa2V5TWluTmV1dHJpbm9Td2FwQW1vdW50AAIYbWluX25ldXRyaW5vX3N3YXBfYW1vdW50ARJrZXlXYXZlc091dEZlZVBhcnQAAhV3YXZlc091dF9zd2FwX2ZlZVBhcnQBFWtleU5ldXRyaW5vT3V0RmVlUGFydAACGG5ldXRyaW5vT3V0X3N3YXBfZmVlUGFydAETa2V5U3dhcEFtb3VudEFQYXJhbQACGCVzJXNfX2NvbmZpZ19fc3dhcEFQYXJhbQETa2V5U3dhcEFtb3VudEJQYXJhbQACGCVzJXNfX2NvbmZpZ19fc3dhcEJQYXJhbQETa2V5TnNidExvY2tDb250cmFjdAACFCVzX19uc2J0TG9ja0NvbnRyYWN0AQ9rZXlNYXRoQ29udHJhY3QAAhAlc19fbWF0aENvbnRyYWN0ARtrZXlCYWxhbmNlV2F2ZXNMb2NrSW50ZXJ2YWwAAhtiYWxhbmNlX3dhdmVzX2xvY2tfaW50ZXJ2YWwBHmtleUJhbGFuY2VOZXV0cmlub0xvY2tJbnRlcnZhbAACHmJhbGFuY2VfbmV1dHJpbm9fbG9ja19pbnRlcnZhbAEIa2V5UHJpY2UAAgVwcmljZQEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgILcGFyYW1CeVVzZXIJAMwIAgULdXNlckFkZHJlc3MJAMwIAgIFc3RhcnQFA25pbAUDU0VQAQtrZXlIYWxmTGlmZQACDCVzX19oYWxmTGlmZQEQa2V5TWluTG9ja0Ftb3VudAACESVzX19taW5Mb2NrQW1vdW50ARVrZXlNaW5XYXZlc0Zvck5zYnRCdXkAAhJtaW5fd2F2ZXNfbnNidF9idXkBDmtleU1pbk5zYnRTZWxsAAINbWluX25zYnRfc2VsbAEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgABDGdldEludE9yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQ1nZXRCb29sT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCbCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgABFmNvbnZlcnROZXV0cmlub1RvV2F2ZXMCBmFtb3VudAVwcmljZQkAawMFBmFtb3VudAUFTVVMVDgFBXByaWNlARZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAgZhbW91bnQFcHJpY2UJAGsDBQZhbW91bnQFBXByaWNlBQVNVUxUOAEJYXNBbnlMaXN0AQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAglMaXN0W0FueV0ECnZhbEFueUxpc3QFByRtYXRjaDAFCnZhbEFueUxpc3QJAAIBAhtmYWlsIHRvIGNhc3QgaW50byBMaXN0W0FueV0BBWFzSW50AQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgNJbnQEBnZhbEludAUHJG1hdGNoMAUGdmFsSW50CQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQhhc1N0cmluZwEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZ2YWxTdHIFByRtYXRjaDAFBnZhbFN0cgkAAgECGGZhaWwgdG8gY2FzdCBpbnRvIFN0cmluZwEMYXNUdXBsZTJJbnRzAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBAF2BQckbWF0Y2gwBQF2CQACAQIdZmFpbCB0byBjYXN0IGludG8gVHVwbGUyIGludHMBEmFzU3dhcFBhcmFtc1NUUlVDVAEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIjKEludCwgSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEludCkEBnN0cnVjdAUHJG1hdGNoMAUGc3RydWN0CQACAQIiZmFpbCB0byBjYXN0IGludG8gU3dhcFBhcmFtc1NUUlVDVAEWYXNXaXRoZHJhd1Jlc3VsdFNUUlVDVAEDdmFsBAckbWF0Y2gwBQN2YWwDAwkAAQIFByRtYXRjaDACJChJbnQsIFVuaXQsIEludCwgSW50LCBJbnQsIEludCwgSW50KQYJAAECBQckbWF0Y2gwAiooSW50LCBCeXRlVmVjdG9yLCBJbnQsIEludCwgSW50LCBJbnQsIEludCkEBnN0cnVjdAUHJG1hdGNoMAUGc3RydWN0CQACAQIgZmFpbCB0byBjYXN0IGludG8gV2l0aGRyYXdSZXN1bHQBC3RvVGltZXN0YW1wAQVzdGFydAMJAGYCAAAFBXN0YXJ0AP///////////wEEByRtYXRjaDAJAO0HAQUFc3RhcnQDCQABAgUHJG1hdGNoMAIJQmxvY2tJbmZvBAVibG9jawUHJG1hdGNoMAgFBWJsb2NrCXRpbWVzdGFtcAD///////////8BAQV0b1gxOAIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQC8AgMJALYCAQUHb3JpZ1ZhbAUGTVVMVDE4CQC2AgEFDW9yaWdTY2FsZU11bHQBB2Zyb21YMTgCA3ZhbA9yZXN1bHRTY2FsZU11bHQJAKADAQkAvAIDBQN2YWwJALYCAQUPcmVzdWx0U2NhbGVNdWx0BQZNVUxUMTgAD25NZXRyaWNJZHhQcmljZQAAABtuTWV0cmljSWR4VXNkbkxvY2tlZEJhbGFuY2UAAQAcbk1ldHJpY0lkeFdhdmVzTG9ja2VkQmFsYW5jZQACABFuTWV0cmljSWR4UmVzZXJ2ZQADABduTWV0cmljSWR4UmVzZXJ2ZUluVXNkbgAEABRuTWV0cmljSWR4VXNkblN1cHBseQAFABFuTWV0cmljSWR4U3VycGx1cwAGABhuTWV0cmljSWR4U3VycGx1c1BlcmNlbnQABwAMbk1ldHJpY0lkeEJSAAgAFG5NZXRyaWNJZHhOc2J0U3VwcGx5AAkAF25NZXRyaWNJZHhNYXhOc2J0U3VwcGx5AAoAFG5NZXRyaWNJZHhTdXJmU3VwcGx5AAsAGUlkeENvbnRyb2xDZmdOZXV0cmlub0RhcHAAAQAYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAIAFElkeENvbnRyb2xDZmdScGREYXBwAAMAFUlkeENvbnRyb2xDZmdNYXRoRGFwcAAEABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAUAFUlkeENvbnRyb2xDZmdSZXN0RGFwcAAGAB1JZHhDb250cm9sQ2ZnTm9kZVJlZ2lzdHJ5RGFwcAAHABxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwAAgAGUlkeENvbnRyb2xDZmdNZWRpYXRvckRhcHAACQAcSWR4Q29udHJvbENmZ1N1cmZTdGFraW5nRGFwcAAKACBJZHhDb250cm9sQ2ZnR25zYnRDb250cm9sbGVyRGFwcAALAAxiRnVuY0lkeFN1cmYAAAANYkZ1bmNJZHhXYXZlcwABAAxiRnVuY0lkeFVzZG4AAgAUYkZ1bmNJZHhSZXNlcnZlU3RhcnQAAwATYkZ1bmNJZHhTdXBwbHlTdGFydAAEAA9iRnVuY0lkeEJSU3RhcnQABQASYkZ1bmNJZHhSZXNlcnZlRW5kAAYAEWJGdW5jSWR4U3VwcGx5RW5kAAcADWJGdW5jSWR4QlJFbmQACAAMYkZ1bmNJZHhSZXN0AAkAEmJGdW5jSWR4V2F2ZXNQcmljZQAKARFrZXlDb250cm9sQWRkcmVzcwACHCVzJXNfX2NvbmZpZ19fY29udHJvbEFkZHJlc3MBDWtleUNvbnRyb2xDZmcAAhElc19fY29udHJvbENvbmZpZwEUcmVhZENvbnRyb2xDZmdPckZhaWwBB2NvbnRyb2wJALUJAgkBD2dldFN0cmluZ09yRmFpbAIFB2NvbnRyb2wJAQ1rZXlDb250cm9sQ2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCCmNvbnRyb2xDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQpjb250cm9sQ2ZnBQNpZHgJAKwCAgItQ29udHJvbCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAPY29udHJvbENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJARFrZXlDb250cm9sQWRkcmVzcwACIzNONE5TN2Q0Sm85YTZGMTRMaUZVS0tZVmRVa2tmMmVQNFp4AApjb250cm9sQ2ZnCQEUcmVhZENvbnRyb2xDZmdPckZhaWwBBQ9jb250cm9sQ29udHJhY3QADG1hdGhDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCmNvbnRyb2xDZmcFFUlkeENvbnRyb2xDZmdNYXRoRGFwcAAQbmV1dHJpbm9Db250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCmNvbnRyb2xDZmcFGUlkeENvbnRyb2xDZmdOZXV0cmlub0RhcHAAD2F1Y3Rpb25Db250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCmNvbnRyb2xDZmcFGElkeENvbnRyb2xDZmdBdWN0aW9uRGFwcAATbGlxdWlkYXRpb25Db250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCmNvbnRyb2xDZmcFHElkeENvbnRyb2xDZmdMaXF1aWRhdGlvbkRhcHAAC3JwZENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUUSWR4Q29udHJvbENmZ1JwZERhcHAAE25zYnRTdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwABNzdXJmU3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUcSWR4Q29udHJvbENmZ1N1cmZTdGFraW5nRGFwcAAXZ25zYnRDb250cm9sbGVyQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBSBJZHhDb250cm9sQ2ZnR25zYnRDb250cm9sbGVyRGFwcAAVbmV1dHJpbm9Bc3NldElkU3RyaW5nCQEPZ2V0U3RyaW5nT3JGYWlsAgUQbmV1dHJpbm9Db250cmFjdAkBEmtleU5ldXRyaW5vQXNzZXRJZAAAD25ldXRyaW5vQXNzZXRJZAkA2QQBBRVuZXV0cmlub0Fzc2V0SWRTdHJpbmcADm5zYnRBc3NldElkU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBRBuZXV0cmlub0NvbnRyYWN0CQEOa2V5TnNidEFzc2V0SWQAAAtuc2J0QXNzZXRJZAkA2QQBBQ5uc2J0QXNzZXRJZFN0cgAOc3VyZkFzc2V0SWRTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFD2F1Y3Rpb25Db250cmFjdAkBDmtleVN1cmZBc3NldElkAAALc3VyZkFzc2V0SWQJANkEAQUOc3VyZkFzc2V0SWRTdHIHAWkBGHJldmVyc2VTd2FwTGltaXRSRUFET05MWQEDbGltBAVnTnNidAMJAGcCAAAFA2xpbQAABAhhUGFyYW1YOAkAtgIBCQEMZ2V0SW50T3JGYWlsAgUMbWF0aENvbnRyYWN0CQETa2V5U3dhcEFtb3VudEFQYXJhbQAECWJQYXJhbVgxNgkAtgIBCQEMZ2V0SW50T3JGYWlsAgUMbWF0aENvbnRyYWN0CQETa2V5U3dhcEFtb3VudEJQYXJhbQAECWxpbURpdkFYOAkAvAIDCQC2AgEFA2xpbQUHTVVMVFgxMAUIYVBhcmFtWDgEB3JldkJYMTYJALwCAwUHTVVMVFgxNgUHTVVMVFgxNgUJYlBhcmFtWDE2CQCgAwEJAHYGBQlsaW1EaXZBWDgACAUHcmV2QlgxNgAQAAYFB0NFSUxJTkcJAJQKAgUDbmlsBQVnTnNidAFpARFnbnNidEluZm9JTlRFUk5BTAMVdXNlckFkZHJlc3NTdHJPckVtcHR5G2FkZGl0aW9uYWxOc2J0VG9TdGFrZU9yWmVybxthZGRpdGlvbmFsU3VyZlRvU3Rha2VPclplcm8EEXVzZXJBZGRyZXNzT3JUaGlzAwkBAiE9AgUVdXNlckFkZHJlc3NTdHJPckVtcHR5AgAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQUEdGhpcwQMY3VycmVudFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9jb250cm9sQ29udHJhY3QJAQhrZXlQcmljZQAEEWduc2J0RnJvbU5zYnREaWZmBRthZGRpdGlvbmFsTnNidFRvU3Rha2VPclplcm8EEWduc2J0RnJvbVN1cmZEaWZmCQEFYXNJbnQBCQD8BwQFE3N1cmZTdGFraW5nQ29udHJhY3QCGGduc2J0RnJvbVN1cmZTWVNSRUFET05MWQkAzAgCBRthZGRpdGlvbmFsU3VyZlRvU3Rha2VPclplcm8FA25pbAUDbmlsBAlnTnNidERpZmYJAGQCBRFnbnNidEZyb21Oc2J0RGlmZgURZ25zYnRGcm9tU3VyZkRpZmYED3N3YXBQYXJhbXNUdXBsZQkBEmFzU3dhcFBhcmFtc1NUUlVDVAEJAPwHBAUQbmV1dHJpbm9Db250cmFjdAIbc3dhcFBhcmFtc0J5VXNlclNZU1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQkAzAgCAAAFA25pbAUDbmlsBA5ibGNrczJMbXRSZXNldAgFD3N3YXBQYXJhbXNUdXBsZQJfMwQIZ25zYnRBbXQIBQ9zd2FwUGFyYW1zVHVwbGUCXzQEDWduc2J0QW10VG90YWwIBQ9zd2FwUGFyYW1zVHVwbGUCXzUEDWxpbWl0TWF4V2F2ZXMIBQ9zd2FwUGFyYW1zVHVwbGUCXzYEDGxpbWl0TWF4VXNkbggFD3N3YXBQYXJhbXNUdXBsZQJfNwQSc3dhcFBhcmFtc1R1cGxlTkVXCQESYXNTd2FwUGFyYW1zU1RSVUNUAQkA/AcEBRBuZXV0cmlub0NvbnRyYWN0Ahtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAMwIAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5CQDMCAIFCWdOc2J0RGlmZgUDbmlsBQNuaWwEEWJsY2tzMkxtdFJlc2V0TkVXCAUSc3dhcFBhcmFtc1R1cGxlTkVXAl8zBAtnbnNidEFtdE5FVwgFEnN3YXBQYXJhbXNUdXBsZU5FVwJfNAQQZ25zYnRBbXRUb3RhbE5FVwgFEnN3YXBQYXJhbXNUdXBsZU5FVwJfNQQQbGltaXRNYXhXYXZlc05FVwgFEnN3YXBQYXJhbXNUdXBsZU5FVwJfNgQPbGltaXRNYXhVc2RuTkVXCAUSc3dhcFBhcmFtc1R1cGxlTkVXAl83BAtuc2J0QmFsYW5jZQMJAQIhPQIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQIACQDwBwIFEXVzZXJBZGRyZXNzT3JUaGlzBQtuc2J0QXNzZXRJZAAABAtzdXJmQmFsYW5jZQMJAQIhPQIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQIACQDwBwIFEXVzZXJBZGRyZXNzT3JUaGlzBQtzdXJmQXNzZXRJZAAABA9uc2J0QmFsYW5jZURpZmYDCQBnAgUbYWRkaXRpb25hbE5zYnRUb1N0YWtlT3JaZXJvAAAFG2FkZGl0aW9uYWxOc2J0VG9TdGFrZU9yWmVybwQRbnNidFVuc3Rha2luZ0RhdGEJAQlhc0FueUxpc3QBCQD8BwQFE25zYnRTdGFraW5nQ29udHJhY3QCGG5zYnRVbnN0YWtpbmdTWVNSRUFET05MWQkAzAgCBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkJAMwIAgkAaAIA////////////AQUbYWRkaXRpb25hbE5zYnRUb1N0YWtlT3JaZXJvBQNuaWwFA25pbAQRbnNidFJlY2VpdmVBbW91bnQJAQVhc0ludAEJAJEDAgURbnNidFVuc3Rha2luZ0RhdGEAAgQGcmVzdWx0CQEBLQEFEW5zYnRSZWNlaXZlQW1vdW50BQZyZXN1bHQEDm5zYnRCYWxhbmNlTmV3CQBlAgULbnNidEJhbGFuY2UFD25zYnRCYWxhbmNlRGlmZgQOc3VyZkJhbGFuY2VOZXcJAGUCBQtzdXJmQmFsYW5jZQUbYWRkaXRpb25hbFN1cmZUb1N0YWtlT3JaZXJvBAlnbnNidERhdGEJAQlhc0FueUxpc3QBCQD8BwQFF2duc2J0Q29udHJvbGxlckNvbnRyYWN0AhRnbnNidEluZm9TWVNSRUFET05MWQkAzAgCBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkJAMwIAgUbYWRkaXRpb25hbE5zYnRUb1N0YWtlT3JaZXJvCQDMCAIFG2FkZGl0aW9uYWxTdXJmVG9TdGFrZU9yWmVybwUDbmlsBQNuaWwECWduc2J0VXNlcgkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEAAAQKZ25zYnRUb3RhbAkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEAAQQIbnNidERhdGEJAQlhc0FueUxpc3QBCQCRAwIFCWduc2J0RGF0YQACBAhzdXJmRGF0YQkBCWFzQW55TGlzdAEJAJEDAgUJZ25zYnREYXRhAAMEEXZwRWZmZWN0aXZlSGVpZ2h0CQEFYXNJbnQBCQCRAwIFCWduc2J0RGF0YQAEBBR2cEVmZmVjdGl2ZUhlaWdodE5FVwkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEABQQQZ25zYnRBbXRGcm9tTnNidAkBBWFzSW50AQkAkQMCBQhuc2J0RGF0YQACBBBnbnNidEFtdEZyb21TdXJmCQEFYXNJbnQBCQCRAwIFCHN1cmZEYXRhAAIEE2duc2J0QW10RnJvbU5zYnRORVcJAGQCBRBnbnNidEFtdEZyb21Oc2J0BRFnbnNidEZyb21Oc2J0RGlmZgQTZ25zYnRBbXRGcm9tU3VyZk5FVwkAZAIFEGduc2J0QW10RnJvbVN1cmYFEWduc2J0RnJvbVN1cmZEaWZmBBJnbnNidEZyb21Oc2J0VG90YWwJAQVhc0ludAEJAJEDAgUIbnNidERhdGEAAwQSZ25zYnRGcm9tU3VyZlRvdGFsCQEFYXNJbnQBCQCRAwIFCHN1cmZEYXRhAAMEGGduc2J0RnJvbVN1cmZBY3RpdmVUb3RhbAAABBhnbnNidEZyb21TdXJmRnJvemVuVG90YWwFEmduc2J0RnJvbVN1cmZUb3RhbAQVZ25zYnRGcm9tTnNidFRvdGFsTkVXCQBkAgUSZ25zYnRGcm9tTnNidFRvdGFsBRFnbnNidEZyb21Oc2J0RGlmZgQVZ25zYnRGcm9tU3VyZlRvdGFsTkVXCQBkAgUSZ25zYnRGcm9tU3VyZlRvdGFsBRFnbnNidEZyb21TdXJmRGlmZgQbZ25zYnRGcm9tU3VyZkZyb3plblRvdGFsTkVXBRVnbnNidEZyb21TdXJmVG90YWxORVcEC3ZvdGluZ1Bvd2VyCQBrAwUQZ25zYnRBbXRGcm9tTnNidAUFTVVMVDgJAGQCBRJnbnNidEZyb21Oc2J0VG90YWwFGGduc2J0RnJvbVN1cmZBY3RpdmVUb3RhbAQOdm90aW5nUG93ZXJOZXcJAGsDBRNnbnNidEFtdEZyb21Oc2J0TkVXBQVNVUxUOAkAZAIFFWduc2J0RnJvbU5zYnRUb3RhbE5FVwUYZ25zYnRGcm9tU3VyZkFjdGl2ZVRvdGFsBA52b3RpbmdQb3dlck1heAkAawMJAGQCBRBnbnNidEFtdEZyb21Oc2J0BRBnbnNidEFtdEZyb21TdXJmBQVNVUxUOAkAZAIJAGQCBRJnbnNidEZyb21Oc2J0VG90YWwFGGduc2J0RnJvbVN1cmZBY3RpdmVUb3RhbAUYZ25zYnRGcm9tU3VyZkZyb3plblRvdGFsBBF2b3RpbmdQb3dlck1heE5ldwkAawMJAGQCBRNnbnNidEFtdEZyb21Oc2J0TkVXBRNnbnNidEFtdEZyb21TdXJmTkVXBQVNVUxUOAkAZAIJAGQCBRVnbnNidEZyb21Oc2J0VG90YWxORVcFGGduc2J0RnJvbVN1cmZBY3RpdmVUb3RhbAUbZ25zYnRGcm9tU3VyZkZyb3plblRvdGFsTkVXBA52b3RpbmdQb3dlckV0YQMJAAACBRF2cEVmZmVjdGl2ZUhlaWdodAAABQZoZWlnaHQFEXZwRWZmZWN0aXZlSGVpZ2h0BBF2b3RpbmdQb3dlckV0YU5ldwMJAAACBRR2cEVmZmVjdGl2ZUhlaWdodE5FVwAABQZoZWlnaHQFFHZwRWZmZWN0aXZlSGVpZ2h0TkVXCQCUCgIFA25pbAkAzAgCAAAJAMwIAgULbnNidEJhbGFuY2UJAMwIAgULc3VyZkJhbGFuY2UJAMwIAgUObnNidEJhbGFuY2VOZXcJAMwIAgUOc3VyZkJhbGFuY2VOZXcJAMwIAgUQZ25zYnRBbXRGcm9tTnNidAkAzAgCBRBnbnNidEFtdEZyb21TdXJmCQDMCAIFE2duc2J0QW10RnJvbU5zYnRORVcJAMwIAgUTZ25zYnRBbXRGcm9tU3VyZk5FVwkAzAgCBRJnbnNidEZyb21Oc2J0VG90YWwJAMwIAgUSZ25zYnRGcm9tU3VyZlRvdGFsCQDMCAIFFWduc2J0RnJvbU5zYnRUb3RhbE5FVwkAzAgCBRVnbnNidEZyb21TdXJmVG90YWxORVcJAMwIAgUMbGltaXRNYXhVc2RuCQDMCAIFDWxpbWl0TWF4V2F2ZXMJAMwIAgUPbGltaXRNYXhVc2RuTkVXCQDMCAIFEGxpbWl0TWF4V2F2ZXNORVcJAMwIAgUOYmxja3MyTG10UmVzZXQJAMwIAgURYmxja3MyTG10UmVzZXRORVcJAMwIAgULdm90aW5nUG93ZXIJAMwIAgUOdm90aW5nUG93ZXJOZXcJAMwIAgUOdm90aW5nUG93ZXJNYXgJAMwIAgURdm90aW5nUG93ZXJNYXhOZXcJAMwIAgUOdm90aW5nUG93ZXJFdGEJAMwIAgURdm90aW5nUG93ZXJFdGFOZXcFA25pbAFpARFnbnNidEluZm9SRUFET05MWQMVdXNlckFkZHJlc3NTdHJPckVtcHR5G2FkZGl0aW9uYWxOc2J0VG9TdGFrZU9yWmVybxthZGRpdGlvbmFsU3VyZlRvU3Rha2VPclplcm8EDWduc2J0SW5mb0RBVEEJAQlhc0FueUxpc3QBCQD8BwQFBHRoaXMCEWduc2J0SW5mb0lOVEVSTkFMCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQkAzAgCBRthZGRpdGlvbmFsTnNidFRvU3Rha2VPclplcm8JAMwIAgUbYWRkaXRpb25hbFN1cmZUb1N0YWtlT3JaZXJvBQNuaWwFA25pbAkAlAoCBQNuaWwJALkJAgkAzAgCAjAlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAAQkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQACCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAMJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEABAkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAFCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAYJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEABwkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAICQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAkJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEACgkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQALCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAwJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEADQkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAOCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAA8JAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAEAkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQARCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBABIJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAEwkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAUCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBABUJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAFgkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAXCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBABgFA25pbAUDU0VQAWkBEnJld2FyZEluZm9SRUFET05MWQEVdXNlckFkZHJlc3NTdHJPckVtcHR5BAtyZXdhcmRzRGF0YQkBCWFzQW55TGlzdAEJAPwHBAUXZ25zYnRDb250cm9sbGVyQ29udHJhY3QCF2duc2J0UmV3YXJkc1NZU1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQUDbmlsBQNuaWwJAJQKAgUDbmlsCQC5CQIJAMwIAgIEJXMlcwkAzAgCCQEIYXNTdHJpbmcBCQCRAwIFC3Jld2FyZHNEYXRhAAAJAMwIAgkBCGFzU3RyaW5nAQkAkQMCBQtyZXdhcmRzRGF0YQABBQNuaWwFA1NFUAFpARFtZXJnZU5zYnRSRUFET05MWQIUdXNlckFkZHJlc3NNYW5kYXRvcnkJbmV3QW1vdW50BAhuc2J0RGF0YQkBCWFzQW55TGlzdAEJAPwHBAUTbnNidFN0YWtpbmdDb250cmFjdAIWbnNidFN0YWtpbmdTWVNSRUFET05MWQkAzAgCBRR1c2VyQWRkcmVzc01hbmRhdG9yeQkAzAgCBQluZXdBbW91bnQFA25pbAUDbmlsBAdhbW91bnQwCQEFYXNJbnQBCQCRAwIFCG5zYnREYXRhAAAEC3N0YXJ0SGVpZ2h0AwkAZwIAAAUHYW1vdW50MAD///////////8BCQEFYXNJbnQBCQCRAwIFCG5zYnREYXRhAAIEDnN0YXJ0VGltZXN0YW1wCQELdG9UaW1lc3RhbXABBQtzdGFydEhlaWdodAQOc3RhcnRIZWlnaHROZXcDCQBnAgAABQluZXdBbW91bnQFC3N0YXJ0SGVpZ2h0BAhoYWxmTGlmZQkBDGdldEludE9yRmFpbAIFE25zYnRTdGFraW5nQ29udHJhY3QJAQtrZXlIYWxmTGlmZQAJAQVhc0ludAEJAPwHBAUMbWF0aENvbnRyYWN0AhNtZXJnZVN0YWtlc1JFQURPTkxZCQDMCAIFB2Ftb3VudDAJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUJbmV3QW1vdW50CQDMCAIFBmhlaWdodAkAzAgCBQhoYWxmTGlmZQUDbmlsBQNuaWwEEXN0YXJ0VGltZXN0YW1wTmV3CQELdG9UaW1lc3RhbXABBQ5zdGFydEhlaWdodE5ldwkAlAoCBQNuaWwJALkJAgkAzAgCAgglZCVkJWQlZAkAzAgCCQCkAwEFC3N0YXJ0SGVpZ2h0CQDMCAIJAKQDAQUOc3RhcnRUaW1lc3RhbXAJAMwIAgkApAMBBQ5zdGFydEhlaWdodE5ldwkAzAgCCQCkAwEFEXN0YXJ0VGltZXN0YW1wTmV3BQNuaWwFA1NFUAFpARtzd2FwTGltaXRDYWxjdWxhdG9yUkVBRE9OTFkDEXVzZXJBZGRyZXNzU3RyT3B0C2xpbWl0V2FudGVkCmFzc2V0SWRTdHIEDGdOc2J0Q3VycmVudAMJAAACBRF1c2VyQWRkcmVzc1N0ck9wdAIAAAAJAQVhc0ludAEICQESYXNTd2FwUGFyYW1zU1RSVUNUAQkA/AcEBRBuZXV0cmlub0NvbnRyYWN0Ahtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAMwIAgURdXNlckFkZHJlc3NTdHJPcHQJAMwIAgAABQNuaWwFA25pbAJfNAQPbGltaXRXYW50ZWRVc2RuAwkAAAIFCmFzc2V0SWRTdHICBVdBVkVTCQEWY29udmVydFdhdmVzVG9OZXV0cmlubwIFC2xpbWl0V2FudGVkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9jb250cm9sQ29udHJhY3QJAQhrZXlQcmljZQAFC2xpbWl0V2FudGVkBAtnTnNidE5lZWRlZAkBBWFzSW50AQkA/AcEBQR0aGlzAhhyZXZlcnNlU3dhcExpbWl0UkVBRE9OTFkJAMwIAgUPbGltaXRXYW50ZWRVc2RuBQNuaWwFA25pbAQKZ05zYnREZWx0YQkAZQIFC2dOc2J0TmVlZGVkBQxnTnNidEN1cnJlbnQJAJQKAgUDbmlsCQC5CQIJAMwIAgIEJXMlcwkAzAgCCQCkAwEFDGdOc2J0Q3VycmVudAkAzAgCCQCkAwEFCmdOc2J0RGVsdGEFA25pbAUDU0VQAWkBEHN3YXBJbmZvUkVBRE9OTFkDFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQZhbW91bnQKYXNzZXRJZFN0cgQPbmV1dHJpbm9NZXRyaWNzCQEJYXNBbnlMaXN0AQkA/AcEBQxtYXRoQ29udHJhY3QCGmNhbGNOZXV0aW5vTWV0cmljc1JFQURPTkxZBQNuaWwFA25pbAQFcHJpY2UJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBQ9uTWV0cmljSWR4UHJpY2UED3N3YXBQYXJhbXNUdXBsZQkBEmFzU3dhcFBhcmFtc1NUUlVDVAEJAPwHBAUQbmV1dHJpbm9Db250cmFjdAIbc3dhcFBhcmFtc0J5VXNlclNZU1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQkAzAgCAAAFA25pbAUDbmlsBA5ibGNrczJMbXRSZXNldAgFD3N3YXBQYXJhbXNUdXBsZQJfMwQNbGltaXRNYXhXYXZlcwgFD3N3YXBQYXJhbXNUdXBsZQJfNgQMbGltaXRNYXhVc2RuCAUPc3dhcFBhcmFtc1R1cGxlAl83BAdhc3NldElkCQDZBAEFCmFzc2V0SWRTdHIECHN3YXBUeXBlAwkAAAIFB2Fzc2V0SWQFB1dBVkVTSUQCBXdhdmVzAwkAAAIFB2Fzc2V0SWQFD25ldXRyaW5vQXNzZXRJZAIIbmV1dHJpbm8JAAIBCQCsAgICE0Nhbid0IHN3YXAgYXNzZXRJZD0FCmFzc2V0SWRTdHIEDXdpdGhkcmF3VHVwbGUJARZhc1dpdGhkcmF3UmVzdWx0U1RSVUNUAQkA/AcEBRBuZXV0cmlub0NvbnRyYWN0Ah1jYWxjV2l0aGRyYXdSZXN1bHRTWVNSRUFET05MWQkAzAgCBQhzd2FwVHlwZQkAzAgCBQZhbW91bnQJAMwIAgUFcHJpY2UFA25pbAUDbmlsBAxvdXROZXRBbW91bnQIBQ13aXRoZHJhd1R1cGxlAl8xBApvdXRBc3NldElkCAUNd2l0aGRyYXdUdXBsZQJfMgQKb3V0U3VyZkFtdAgFDXdpdGhkcmF3VHVwbGUCXzMED2luQW10VG9TdXJmUGFydAgFDXdpdGhkcmF3VHVwbGUCXzQECnVubGVhc2VBbXQIBQ13aXRoZHJhd1R1cGxlAl81BAxvdXRGZWVBbW91bnQIBQ13aXRoZHJhd1R1cGxlAl82BAtvdXRBbXRHcm9zcwgFDXdpdGhkcmF3VHVwbGUCXzcJAJQKAgUDbmlsCQC5CQIJAMwIAgIOJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQxvdXROZXRBbW91bnQJAMwIAgkApAMBBQpvdXRTdXJmQW10CQDMCAIJAKQDAQUMb3V0RmVlQW1vdW50CQDMCAIJAKQDAQUFcHJpY2UJAMwIAgkApAMBBQ5ibGNrczJMbXRSZXNldAkAzAgCCQCkAwEFDWxpbWl0TWF4V2F2ZXMJAMwIAgkApAMBBQxsaW1pdE1heFVzZG4FA25pbAUDU0VQAOUCsGA=", "chainId": 84, "height": 2197101, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BrB2GWcz86YLVmAHaAB9RWrsu2ASrCbzoZm6rMtgqLG7 Next: 3CtyKjMEYhTH2qrnCL5CRR9ecg3R3aUZwtNRJ8L78RdL Diff:
OldNewDifferences
2020 let MULT18 = toBigInt(1000000000000000000)
2121
2222 let SEP = "__"
23+
24+let DEFAULTSWAPFEEN2W = 5000
25+
26+let DEFAULTSWAPFEEW2N = 20000
27+
28+let BRPROTECTED = 100000
2329
2430 let WAVESID = fromBase58String("WAVES")
2531
137143
138144
139145 func asSwapParamsSTRUCT (val) = match val {
140- case struct: (Int, Int, Int, Int, Int) =>
146+ case struct: (Int, Int, Int, Int, Int, Int, Int) =>
141147 struct
142148 case _ =>
143- throw("fail to cast into Tuple5 ints")
149+ throw("fail to cast into SwapParamsSTRUCT")
150+}
151+
152+
153+func asWithdrawResultSTRUCT (val) = match val {
154+ case struct: (Int, Unit, Int, Int, Int, Int, Int)|(Int, ByteVector, Int, Int, Int, Int, Int) =>
155+ struct
156+ case _ =>
157+ throw("fail to cast into WithdrawResult")
144158 }
145159
146160
159173
160174 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULT18))
161175
176+
177+let nMetricIdxPrice = 0
178+
179+let nMetricIdxUsdnLockedBalance = 1
180+
181+let nMetricIdxWavesLockedBalance = 2
182+
183+let nMetricIdxReserve = 3
184+
185+let nMetricIdxReserveInUsdn = 4
186+
187+let nMetricIdxUsdnSupply = 5
188+
189+let nMetricIdxSurplus = 6
190+
191+let nMetricIdxSurplusPercent = 7
192+
193+let nMetricIdxBR = 8
194+
195+let nMetricIdxNsbtSupply = 9
196+
197+let nMetricIdxMaxNsbtSupply = 10
198+
199+let nMetricIdxSurfSupply = 11
162200
163201 let IdxControlCfgNeutrinoDapp = 1
164202
181219 let IdxControlCfgSurfStakingDapp = 10
182220
183221 let IdxControlCfgGnsbtControllerDapp = 11
222+
223+let bFuncIdxSurf = 0
224+
225+let bFuncIdxWaves = 1
226+
227+let bFuncIdxUsdn = 2
228+
229+let bFuncIdxReserveStart = 3
230+
231+let bFuncIdxSupplyStart = 4
232+
233+let bFuncIdxBRStart = 5
234+
235+let bFuncIdxReserveEnd = 6
236+
237+let bFuncIdxSupplyEnd = 7
238+
239+let bFuncIdxBREnd = 8
240+
241+let bFuncIdxRest = 9
242+
243+let bFuncIdxWavesPrice = 10
184244
185245 func keyControlAddress () = "%s%s__config__controlAddress"
186246
252312 let gnsbtFromSurfDiff = asInt(invoke(surfStakingContract, "gnsbtFromSurfSYSREADONLY", [additionalSurfToStakeOrZero], nil))
253313 let gNsbtDiff = (gnsbtFromNsbtDiff + gnsbtFromSurfDiff)
254314 let swapParamsTuple = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
255- let limitMaxUsdn = swapParamsTuple._1
256- let limitSpent = swapParamsTuple._2
257315 let blcks2LmtReset = swapParamsTuple._3
258316 let gnsbtAmt = swapParamsTuple._4
259317 let gnsbtAmtTotal = swapParamsTuple._5
318+ let limitMaxWaves = swapParamsTuple._6
319+ let limitMaxUsdn = swapParamsTuple._7
260320 let swapParamsTupleNEW = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, gNsbtDiff], nil))
261- let limitMaxUsdnNEW = swapParamsTupleNEW._1
262- let limitSpentNEW = swapParamsTupleNEW._2
263321 let blcks2LmtResetNEW = swapParamsTupleNEW._3
264322 let gnsbtAmtNEW = swapParamsTupleNEW._4
265323 let gnsbtAmtTotalNEW = swapParamsTupleNEW._5
266- let limitMaxWaves = convertNeutrinoToWaves(limitMaxUsdn, currentPrice)
267- let limitMaxWavesNEW = convertNeutrinoToWaves(limitMaxUsdnNEW, currentPrice)
324+ let limitMaxWavesNEW = swapParamsTupleNEW._6
325+ let limitMaxUsdnNEW = swapParamsTupleNEW._7
268326 let nsbtBalance = if ((userAddressStrOrEmpty != ""))
269327 then assetBalance(userAddressOrThis, nsbtAssetId)
270328 else 0
364422 }
365423
366424
425+
426+@Callable(i)
427+func swapInfoREADONLY (userAddressStrOrEmpty,amount,assetIdStr) = {
428+ let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
429+ let price = asInt(neutrinoMetrics[nMetricIdxPrice])
430+ let swapParamsTuple = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
431+ let blcks2LmtReset = swapParamsTuple._3
432+ let limitMaxWaves = swapParamsTuple._6
433+ let limitMaxUsdn = swapParamsTuple._7
434+ let assetId = fromBase58String(assetIdStr)
435+ let swapType = if ((assetId == WAVESID))
436+ then "waves"
437+ else if ((assetId == neutrinoAssetId))
438+ then "neutrino"
439+ else throw(("Can't swap assetId=" + assetIdStr))
440+ let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amount, price], nil))
441+ let outNetAmount = withdrawTuple._1
442+ let outAssetId = withdrawTuple._2
443+ let outSurfAmt = withdrawTuple._3
444+ let inAmtToSurfPart = withdrawTuple._4
445+ let unleaseAmt = withdrawTuple._5
446+ let outFeeAmount = withdrawTuple._6
447+ let outAmtGross = withdrawTuple._7
448+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outNetAmount), toString(outSurfAmt), toString(outFeeAmount), toString(price), toString(blcks2LmtReset), toString(limitMaxWaves), toString(limitMaxUsdn)], SEP))
449+ }
450+
451+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let EULER8 = 271828182
55
66 let MULT6 = 1000000
77
88 let MULTX6 = toBigInt(1000000)
99
1010 let MULT8 = 100000000
1111
1212 let MULTX8 = toBigInt(100000000)
1313
1414 let MULTX10 = toBigInt(10000000000)
1515
1616 let MULT12 = 1000000000000
1717
1818 let MULTX16 = toBigInt(10000000000000000)
1919
2020 let MULT18 = toBigInt(1000000000000000000)
2121
2222 let SEP = "__"
23+
24+let DEFAULTSWAPFEEN2W = 5000
25+
26+let DEFAULTSWAPFEEW2N = 20000
27+
28+let BRPROTECTED = 100000
2329
2430 let WAVESID = fromBase58String("WAVES")
2531
2632 func keyNeutrinoAssetId () = "neutrino_asset_id"
2733
2834
2935 func keyNsbtAssetId () = "bond_asset_id"
3036
3137
3238 func keySurfAssetId () = "surf_asset_id"
3339
3440
3541 func keyBalanceLocked () = "balance_lock_"
3642
3743
3844 func keyWavesLockedBalance () = (keyBalanceLocked() + "waves")
3945
4046
4147 func keyNeutrinoLockedBalance () = (keyBalanceLocked() + "neutrino")
4248
4349
4450 func keyMinWavesSwapAmount () = "min_waves_swap_amount"
4551
4652
4753 func keyMinNeutrinoSwapAmount () = "min_neutrino_swap_amount"
4854
4955
5056 func keyWavesOutFeePart () = "wavesOut_swap_feePart"
5157
5258
5359 func keyNeutrinoOutFeePart () = "neutrinoOut_swap_feePart"
5460
5561
5662 func keySwapAmountAParam () = "%s%s__config__swapAParam"
5763
5864
5965 func keySwapAmountBParam () = "%s%s__config__swapBParam"
6066
6167
6268 func keyNsbtLockContract () = "%s__nsbtLockContract"
6369
6470
6571 func keyMathContract () = "%s__mathContract"
6672
6773
6874 func keyBalanceWavesLockInterval () = "balance_waves_lock_interval"
6975
7076
7177 func keyBalanceNeutrinoLockInterval () = "balance_neutrino_lock_interval"
7278
7379
7480 func keyPrice () = "price"
7581
7682
7783 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "start"], SEP)
7884
7985
8086 func keyHalfLife () = "%s__halfLife"
8187
8288
8389 func keyMinLockAmount () = "%s__minLockAmount"
8490
8591
8692 func keyMinWavesForNsbtBuy () = "min_waves_nsbt_buy"
8793
8894
8995 func keyMinNsbtSell () = "min_nsbt_sell"
9096
9197
9298 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
9399
94100
95101 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
96102
97103
98104 func getBoolOrFail (address,key) = valueOrErrorMessage(getBoolean(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
99105
100106
101107 func convertNeutrinoToWaves (amount,price) = fraction(amount, MULT8, price)
102108
103109
104110 func convertWavesToNeutrino (amount,price) = fraction(amount, price, MULT8)
105111
106112
107113 func asAnyList (val) = match val {
108114 case valAnyList: List[Any] =>
109115 valAnyList
110116 case _ =>
111117 throw("fail to cast into List[Any]")
112118 }
113119
114120
115121 func asInt (val) = match val {
116122 case valInt: Int =>
117123 valInt
118124 case _ =>
119125 throw("fail to cast into Int")
120126 }
121127
122128
123129 func asString (val) = match val {
124130 case valStr: String =>
125131 valStr
126132 case _ =>
127133 throw("fail to cast into String")
128134 }
129135
130136
131137 func asTuple2Ints (val) = match val {
132138 case v: (Int, Int) =>
133139 v
134140 case _ =>
135141 throw("fail to cast into Tuple2 ints")
136142 }
137143
138144
139145 func asSwapParamsSTRUCT (val) = match val {
140- case struct: (Int, Int, Int, Int, Int) =>
146+ case struct: (Int, Int, Int, Int, Int, Int, Int) =>
141147 struct
142148 case _ =>
143- throw("fail to cast into Tuple5 ints")
149+ throw("fail to cast into SwapParamsSTRUCT")
150+}
151+
152+
153+func asWithdrawResultSTRUCT (val) = match val {
154+ case struct: (Int, Unit, Int, Int, Int, Int, Int)|(Int, ByteVector, Int, Int, Int, Int, Int) =>
155+ struct
156+ case _ =>
157+ throw("fail to cast into WithdrawResult")
144158 }
145159
146160
147161 func toTimestamp (start) = if ((0 > start))
148162 then -1
149163 else match blockInfoByHeight(start) {
150164 case block: BlockInfo =>
151165 block.timestamp
152166 case _ =>
153167 -1
154168 }
155169
156170
157171 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULT18, toBigInt(origScaleMult))
158172
159173
160174 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULT18))
161175
176+
177+let nMetricIdxPrice = 0
178+
179+let nMetricIdxUsdnLockedBalance = 1
180+
181+let nMetricIdxWavesLockedBalance = 2
182+
183+let nMetricIdxReserve = 3
184+
185+let nMetricIdxReserveInUsdn = 4
186+
187+let nMetricIdxUsdnSupply = 5
188+
189+let nMetricIdxSurplus = 6
190+
191+let nMetricIdxSurplusPercent = 7
192+
193+let nMetricIdxBR = 8
194+
195+let nMetricIdxNsbtSupply = 9
196+
197+let nMetricIdxMaxNsbtSupply = 10
198+
199+let nMetricIdxSurfSupply = 11
162200
163201 let IdxControlCfgNeutrinoDapp = 1
164202
165203 let IdxControlCfgAuctionDapp = 2
166204
167205 let IdxControlCfgRpdDapp = 3
168206
169207 let IdxControlCfgMathDapp = 4
170208
171209 let IdxControlCfgLiquidationDapp = 5
172210
173211 let IdxControlCfgRestDapp = 6
174212
175213 let IdxControlCfgNodeRegistryDapp = 7
176214
177215 let IdxControlCfgNsbtStakingDapp = 8
178216
179217 let IdxControlCfgMediatorDapp = 9
180218
181219 let IdxControlCfgSurfStakingDapp = 10
182220
183221 let IdxControlCfgGnsbtControllerDapp = 11
222+
223+let bFuncIdxSurf = 0
224+
225+let bFuncIdxWaves = 1
226+
227+let bFuncIdxUsdn = 2
228+
229+let bFuncIdxReserveStart = 3
230+
231+let bFuncIdxSupplyStart = 4
232+
233+let bFuncIdxBRStart = 5
234+
235+let bFuncIdxReserveEnd = 6
236+
237+let bFuncIdxSupplyEnd = 7
238+
239+let bFuncIdxBREnd = 8
240+
241+let bFuncIdxRest = 9
242+
243+let bFuncIdxWavesPrice = 10
184244
185245 func keyControlAddress () = "%s%s__config__controlAddress"
186246
187247
188248 func keyControlCfg () = "%s__controlConfig"
189249
190250
191251 func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
192252
193253
194254 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
195255
196256
197257 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
198258
199259 let controlCfg = readControlCfgOrFail(controlContract)
200260
201261 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
202262
203263 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
204264
205265 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
206266
207267 let liquidationContract = getContractAddressOrFail(controlCfg, IdxControlCfgLiquidationDapp)
208268
209269 let rpdContract = getContractAddressOrFail(controlCfg, IdxControlCfgRpdDapp)
210270
211271 let nsbtStakingContract = getContractAddressOrFail(controlCfg, IdxControlCfgNsbtStakingDapp)
212272
213273 let surfStakingContract = getContractAddressOrFail(controlCfg, IdxControlCfgSurfStakingDapp)
214274
215275 let gnsbtControllerContract = getContractAddressOrFail(controlCfg, IdxControlCfgGnsbtControllerDapp)
216276
217277 let neutrinoAssetIdString = getStringOrFail(neutrinoContract, keyNeutrinoAssetId())
218278
219279 let neutrinoAssetId = fromBase58String(neutrinoAssetIdString)
220280
221281 let nsbtAssetIdStr = getStringValue(neutrinoContract, keyNsbtAssetId())
222282
223283 let nsbtAssetId = fromBase58String(nsbtAssetIdStr)
224284
225285 let surfAssetIdStr = getStringValue(auctionContract, keySurfAssetId())
226286
227287 let surfAssetId = fromBase58String(surfAssetIdStr)
228288
229289 @Callable(i)
230290 func reverseSwapLimitREADONLY (lim) = {
231291 let gNsbt = if ((0 >= lim))
232292 then 0
233293 else {
234294 let aParamX8 = toBigInt(getIntOrFail(mathContract, keySwapAmountAParam()))
235295 let bParamX16 = toBigInt(getIntOrFail(mathContract, keySwapAmountBParam()))
236296 let limDivAX8 = fraction(toBigInt(lim), MULTX10, aParamX8)
237297 let revBX16 = fraction(MULTX16, MULTX16, bParamX16)
238298 toInt(pow(limDivAX8, 8, revBX16, 16, 6, CEILING))
239299 }
240300 $Tuple2(nil, gNsbt)
241301 }
242302
243303
244304
245305 @Callable(i)
246306 func gnsbtInfoINTERNAL (userAddressStrOrEmpty,additionalNsbtToStakeOrZero,additionalSurfToStakeOrZero) = {
247307 let userAddressOrThis = if ((userAddressStrOrEmpty != ""))
248308 then addressFromStringValue(userAddressStrOrEmpty)
249309 else this
250310 let currentPrice = getIntegerValue(controlContract, keyPrice())
251311 let gnsbtFromNsbtDiff = additionalNsbtToStakeOrZero
252312 let gnsbtFromSurfDiff = asInt(invoke(surfStakingContract, "gnsbtFromSurfSYSREADONLY", [additionalSurfToStakeOrZero], nil))
253313 let gNsbtDiff = (gnsbtFromNsbtDiff + gnsbtFromSurfDiff)
254314 let swapParamsTuple = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
255- let limitMaxUsdn = swapParamsTuple._1
256- let limitSpent = swapParamsTuple._2
257315 let blcks2LmtReset = swapParamsTuple._3
258316 let gnsbtAmt = swapParamsTuple._4
259317 let gnsbtAmtTotal = swapParamsTuple._5
318+ let limitMaxWaves = swapParamsTuple._6
319+ let limitMaxUsdn = swapParamsTuple._7
260320 let swapParamsTupleNEW = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, gNsbtDiff], nil))
261- let limitMaxUsdnNEW = swapParamsTupleNEW._1
262- let limitSpentNEW = swapParamsTupleNEW._2
263321 let blcks2LmtResetNEW = swapParamsTupleNEW._3
264322 let gnsbtAmtNEW = swapParamsTupleNEW._4
265323 let gnsbtAmtTotalNEW = swapParamsTupleNEW._5
266- let limitMaxWaves = convertNeutrinoToWaves(limitMaxUsdn, currentPrice)
267- let limitMaxWavesNEW = convertNeutrinoToWaves(limitMaxUsdnNEW, currentPrice)
324+ let limitMaxWavesNEW = swapParamsTupleNEW._6
325+ let limitMaxUsdnNEW = swapParamsTupleNEW._7
268326 let nsbtBalance = if ((userAddressStrOrEmpty != ""))
269327 then assetBalance(userAddressOrThis, nsbtAssetId)
270328 else 0
271329 let surfBalance = if ((userAddressStrOrEmpty != ""))
272330 then assetBalance(userAddressOrThis, surfAssetId)
273331 else 0
274332 let nsbtBalanceDiff = if ((additionalNsbtToStakeOrZero >= 0))
275333 then additionalNsbtToStakeOrZero
276334 else {
277335 let nsbtUnstakingData = asAnyList(invoke(nsbtStakingContract, "nsbtUnstakingSYSREADONLY", [userAddressStrOrEmpty, (-1 * additionalNsbtToStakeOrZero)], nil))
278336 let nsbtReceiveAmount = asInt(nsbtUnstakingData[2])
279337 let result = -(nsbtReceiveAmount)
280338 result
281339 }
282340 let nsbtBalanceNew = (nsbtBalance - nsbtBalanceDiff)
283341 let surfBalanceNew = (surfBalance - additionalSurfToStakeOrZero)
284342 let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStrOrEmpty, additionalNsbtToStakeOrZero, additionalSurfToStakeOrZero], nil))
285343 let gnsbtUser = asInt(gnsbtData[0])
286344 let gnsbtTotal = asInt(gnsbtData[1])
287345 let nsbtData = asAnyList(gnsbtData[2])
288346 let surfData = asAnyList(gnsbtData[3])
289347 let vpEffectiveHeight = asInt(gnsbtData[4])
290348 let vpEffectiveHeightNEW = asInt(gnsbtData[5])
291349 let gnsbtAmtFromNsbt = asInt(nsbtData[2])
292350 let gnsbtAmtFromSurf = asInt(surfData[2])
293351 let gnsbtAmtFromNsbtNEW = (gnsbtAmtFromNsbt + gnsbtFromNsbtDiff)
294352 let gnsbtAmtFromSurfNEW = (gnsbtAmtFromSurf + gnsbtFromSurfDiff)
295353 let gnsbtFromNsbtTotal = asInt(nsbtData[3])
296354 let gnsbtFromSurfTotal = asInt(surfData[3])
297355 let gnsbtFromSurfActiveTotal = 0
298356 let gnsbtFromSurfFrozenTotal = gnsbtFromSurfTotal
299357 let gnsbtFromNsbtTotalNEW = (gnsbtFromNsbtTotal + gnsbtFromNsbtDiff)
300358 let gnsbtFromSurfTotalNEW = (gnsbtFromSurfTotal + gnsbtFromSurfDiff)
301359 let gnsbtFromSurfFrozenTotalNEW = gnsbtFromSurfTotalNEW
302360 let votingPower = fraction(gnsbtAmtFromNsbt, MULT8, (gnsbtFromNsbtTotal + gnsbtFromSurfActiveTotal))
303361 let votingPowerNew = fraction(gnsbtAmtFromNsbtNEW, MULT8, (gnsbtFromNsbtTotalNEW + gnsbtFromSurfActiveTotal))
304362 let votingPowerMax = fraction((gnsbtAmtFromNsbt + gnsbtAmtFromSurf), MULT8, ((gnsbtFromNsbtTotal + gnsbtFromSurfActiveTotal) + gnsbtFromSurfFrozenTotal))
305363 let votingPowerMaxNew = fraction((gnsbtAmtFromNsbtNEW + gnsbtAmtFromSurfNEW), MULT8, ((gnsbtFromNsbtTotalNEW + gnsbtFromSurfActiveTotal) + gnsbtFromSurfFrozenTotalNEW))
306364 let votingPowerEta = if ((vpEffectiveHeight == 0))
307365 then height
308366 else vpEffectiveHeight
309367 let votingPowerEtaNew = if ((vpEffectiveHeightNEW == 0))
310368 then height
311369 else vpEffectiveHeightNEW
312370 $Tuple2(nil, [0, nsbtBalance, surfBalance, nsbtBalanceNew, surfBalanceNew, gnsbtAmtFromNsbt, gnsbtAmtFromSurf, gnsbtAmtFromNsbtNEW, gnsbtAmtFromSurfNEW, gnsbtFromNsbtTotal, gnsbtFromSurfTotal, gnsbtFromNsbtTotalNEW, gnsbtFromSurfTotalNEW, limitMaxUsdn, limitMaxWaves, limitMaxUsdnNEW, limitMaxWavesNEW, blcks2LmtReset, blcks2LmtResetNEW, votingPower, votingPowerNew, votingPowerMax, votingPowerMaxNew, votingPowerEta, votingPowerEtaNew])
313371 }
314372
315373
316374
317375 @Callable(i)
318376 func gnsbtInfoREADONLY (userAddressStrOrEmpty,additionalNsbtToStakeOrZero,additionalSurfToStakeOrZero) = {
319377 let gnsbtInfoDATA = asAnyList(invoke(this, "gnsbtInfoINTERNAL", [userAddressStrOrEmpty, additionalNsbtToStakeOrZero, additionalSurfToStakeOrZero], nil))
320378 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", toString(asInt(gnsbtInfoDATA[1])), toString(asInt(gnsbtInfoDATA[2])), toString(asInt(gnsbtInfoDATA[3])), toString(asInt(gnsbtInfoDATA[4])), toString(asInt(gnsbtInfoDATA[5])), toString(asInt(gnsbtInfoDATA[6])), toString(asInt(gnsbtInfoDATA[7])), toString(asInt(gnsbtInfoDATA[8])), toString(asInt(gnsbtInfoDATA[9])), toString(asInt(gnsbtInfoDATA[10])), toString(asInt(gnsbtInfoDATA[11])), toString(asInt(gnsbtInfoDATA[12])), toString(asInt(gnsbtInfoDATA[13])), toString(asInt(gnsbtInfoDATA[14])), toString(asInt(gnsbtInfoDATA[15])), toString(asInt(gnsbtInfoDATA[16])), toString(asInt(gnsbtInfoDATA[17])), toString(asInt(gnsbtInfoDATA[18])), toString(asInt(gnsbtInfoDATA[19])), toString(asInt(gnsbtInfoDATA[20])), toString(asInt(gnsbtInfoDATA[21])), toString(asInt(gnsbtInfoDATA[22])), toString(asInt(gnsbtInfoDATA[23])), toString(asInt(gnsbtInfoDATA[24]))], SEP))
321379 }
322380
323381
324382
325383 @Callable(i)
326384 func rewardInfoREADONLY (userAddressStrOrEmpty) = {
327385 let rewardsData = asAnyList(invoke(gnsbtControllerContract, "gnsbtRewardsSYSREADONLY", [userAddressStrOrEmpty], nil))
328386 $Tuple2(nil, makeString(["%s%s", asString(rewardsData[0]), asString(rewardsData[1])], SEP))
329387 }
330388
331389
332390
333391 @Callable(i)
334392 func mergeNsbtREADONLY (userAddressMandatory,newAmount) = {
335393 let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddressMandatory, newAmount], nil))
336394 let amount0 = asInt(nsbtData[0])
337395 let startHeight = if ((0 >= amount0))
338396 then -1
339397 else asInt(nsbtData[2])
340398 let startTimestamp = toTimestamp(startHeight)
341399 let startHeightNew = if ((0 >= newAmount))
342400 then startHeight
343401 else {
344402 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
345403 asInt(invoke(mathContract, "mergeStakesREADONLY", [amount0, startHeight, newAmount, height, halfLife], nil))
346404 }
347405 let startTimestampNew = toTimestamp(startHeightNew)
348406 $Tuple2(nil, makeString(["%d%d%d%d", toString(startHeight), toString(startTimestamp), toString(startHeightNew), toString(startTimestampNew)], SEP))
349407 }
350408
351409
352410
353411 @Callable(i)
354412 func swapLimitCalculatorREADONLY (userAddressStrOpt,limitWanted,assetIdStr) = {
355413 let gNsbtCurrent = if ((userAddressStrOpt == ""))
356414 then 0
357415 else asInt(asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))._4)
358416 let limitWantedUsdn = if ((assetIdStr == "WAVES"))
359417 then convertWavesToNeutrino(limitWanted, getIntegerValue(controlContract, keyPrice()))
360418 else limitWanted
361419 let gNsbtNeeded = asInt(invoke(this, "reverseSwapLimitREADONLY", [limitWantedUsdn], nil))
362420 let gNsbtDelta = (gNsbtNeeded - gNsbtCurrent)
363421 $Tuple2(nil, makeString(["%s%s", toString(gNsbtCurrent), toString(gNsbtDelta)], SEP))
364422 }
365423
366424
425+
426+@Callable(i)
427+func swapInfoREADONLY (userAddressStrOrEmpty,amount,assetIdStr) = {
428+ let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
429+ let price = asInt(neutrinoMetrics[nMetricIdxPrice])
430+ let swapParamsTuple = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
431+ let blcks2LmtReset = swapParamsTuple._3
432+ let limitMaxWaves = swapParamsTuple._6
433+ let limitMaxUsdn = swapParamsTuple._7
434+ let assetId = fromBase58String(assetIdStr)
435+ let swapType = if ((assetId == WAVESID))
436+ then "waves"
437+ else if ((assetId == neutrinoAssetId))
438+ then "neutrino"
439+ else throw(("Can't swap assetId=" + assetIdStr))
440+ let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amount, price], nil))
441+ let outNetAmount = withdrawTuple._1
442+ let outAssetId = withdrawTuple._2
443+ let outSurfAmt = withdrawTuple._3
444+ let inAmtToSurfPart = withdrawTuple._4
445+ let unleaseAmt = withdrawTuple._5
446+ let outFeeAmount = withdrawTuple._6
447+ let outAmtGross = withdrawTuple._7
448+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outNetAmount), toString(outSurfAmt), toString(outFeeAmount), toString(price), toString(blcks2LmtReset), toString(limitMaxWaves), toString(limitMaxUsdn)], SEP))
449+ }
450+
451+

github/deemru/w8io/026f985 
61.88 ms