tx · jfgpPEEwCUBLbdRbH6KsSP7qa5PT9BrVeugnF5xu6Lt

3PJUm112svcu4gPU9GKpsBGwYNEVQEPiQ1t:  -0.01000000 Waves

2022.11.30 16:14 [3405349] smart account 3PJUm112svcu4gPU9GKpsBGwYNEVQEPiQ1t > SELF 0.00000000 Waves

{ "type": 13, "id": "jfgpPEEwCUBLbdRbH6KsSP7qa5PT9BrVeugnF5xu6Lt", "fee": 1000000, "feeAssetId": null, "timestamp": 1669814130754, "version": 2, "chainId": 87, "sender": "3PJUm112svcu4gPU9GKpsBGwYNEVQEPiQ1t", "senderPublicKey": "6BTduxfT4CkTidY6P35nYzafiLpun4QLUZCQUU6pcJQM", "proofs": [ "25B9MwseH4NoEEyHNC5m5JLeuARM3vStdndyY1wb2ABX4dkfmTzybhEsDwzM6m3MguhDKQN1PwoYYvJJm1d9QqfF" ], "script": "base64:BgIeCAISABIDCgEBEgMKAQgSAwoBBBIECgIECBIDCgEEFQAGU2NhbGU2AMCEPQAGU2NhbGU4AIDC1y8AB1NjYWxlMTYJAGgCBQZTY2FsZTgFBlNjYWxlOAATcG9maXRBY2NvdW50QWRkcmVzcwkBB0FkZHJlc3MBARoBV6lAs/JQjYpYhnwlRsr973lVvk50FZ4aQwAHYXNzZXRJZAIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAACnZhbGlkYXRvcnMJAMwIAgIjM1BFcUM5NTMzaDZBRG5KdlhiOGN2WGNhU2tlY2Q5WVROdnoFA25pbAALcHV6emxlUG9vbHMJAMwIAgIjM1A0REs1VnpEd0wzdmZjNWFoVUVodG9lNUJ5Wk55YWNKM1gJAMwIAgIjM1A0dUE1ZXRuWmk0QW1CYWJLaW5xMmJNaVdVOEtjbkhaZEgFA25pbAEKZ2V0QmFsYW5jZQEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgRVbml0BAF4BQckbWF0Y2gwCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkA8AcCBQR0aGlzCQEFdmFsdWUBBQdhc3NldElkAQl0cnlHZXRJbnQCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCaCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAEJdHJ5R2V0U3RyAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFiBQckbWF0Y2gwBQFiAgABDmdldEFzc2V0U3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgIFV0FWRVMBG2dldFB1enpsZVBvb2xTdXBwbGllZEFtb3VudAEOcG9vbEFkZHJlc3NTdHIEC3Bvb2xBZGRyZXNzCQEHQWRkcmVzcwEJANkEAQUOcG9vbEFkZHJlc3NTdHIEBnRva2VucwQHJG1hdGNoMAkAnQgCBQtwb29sQWRkcmVzcwIMc2V0dXBfdG9rZW5zAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcgUHJG1hdGNoMAkAtQkCBQFyAgEsCQACAQkArAICAipDYW5ub3QgZmluZCBzZXR1cF90b2tlbnMgaW4gc3RhdGUgb2YgcG9vbCAFDnBvb2xBZGRyZXNzU3RyBAp0b2tlbkluZGV4BAckbWF0Y2gwCQDPCAIFBnRva2VucwUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgNJbnQEAXIFByRtYXRjaDAFAXIJAAIBCQCsAgIJAKwCAgkArAICAgxjYW5ub3QgZmluZCAFB2Fzc2V0SWQCCCBpbiBwb29sBQ5wb29sQWRkcmVzc1N0cgQSdG9rZW5SYXRlc1Jlc3BvbnNlCQD8BwQFC3Bvb2xBZGRyZXNzAhNjYWxjdWxhdGVUb2tlblJhdGVzCQDMCAIHBQNuaWwFA25pbAMJAAACBRJ0b2tlblJhdGVzUmVzcG9uc2UFEnRva2VuUmF0ZXNSZXNwb25zZQQRdG9rZW5zUmF0ZXNTdHJpbmcEByRtYXRjaDAFEnRva2VuUmF0ZXNSZXNwb25zZQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXIFByRtYXRjaDAFAXIJAAIBCQCsAgICO0Z1bmMgJ2NhbGN1bGF0ZVRva2VuUmF0ZXMnIHJldHVybnMgbm90IHN0cmluZyB2YWx1ZSBpbiBwb29sBQ5wb29sQWRkcmVzc1N0cgQNc3VwcGx5UmF0ZVN0cgkAkQMCCQC1CQIJAJEDAgkAtQkCBRF0b2tlbnNSYXRlc1N0cmluZwIBLAUKdG9rZW5JbmRleAIBfAABBApzdXBwbHlSYXRlBAckbWF0Y2gwCQC2CQEFDXN1cHBseVJhdGVTdHIDCQABAgUHJG1hdGNoMAIDSW50BAF0BQckbWF0Y2gwBQF0CQACAQInQ2Fubm90IHBhcnNlIHN1cHBseSByYXRlIGZyb20gZGVmaSBwb29sBAZzdXBwbHkJAQl0cnlHZXRJbnQCBQtwb29sQWRkcmVzcwkArAICCQCsAgIJAKUIAQUEdGhpcwIKX3N1cHBsaWVkXwUHYXNzZXRJZAQGYW1vdW50CQBrAwUGc3VwcGx5BQpzdXBwbHlSYXRlBQdTY2FsZTE2BQZhbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BFmdldFRvdGFsU3VwcGxpZWRBbW91bnQABAtjdXJyZW50UG9vbAkBCXRyeUdldFN0cgIFBHRoaXMCC2N1cnJlbnRQb29sAwkAAAIFC2N1cnJlbnRQb29sAgAJAAIBCQCsAgICGUNhbm5vdCBmaW5kIHBvb2wgd2l0aCBpZCAFC2N1cnJlbnRQb29sCQEbZ2V0UHV6emxlUG9vbFN1cHBsaWVkQW1vdW50AQULY3VycmVudFBvb2wBFndpdGhkcmF3RnJvbVB1enpsZVBvb2wCBnBvb2xJZAZhbW91bnQEC3Bvb2xBZGRyZXNzCQEHQWRkcmVzcwEJANkEAQUGcG9vbElkBAp3aXRoZHJhd1R4AwkAZgIFBmFtb3VudAAACQD8BwQFC3Bvb2xBZGRyZXNzAgh3aXRoZHJhdwkAzAgCBQdhc3NldElkCQDMCAIFBmFtb3VudAUDbmlsBQNuaWwCAAMJAAACBQp3aXRoZHJhd1R4BQp3aXRoZHJhd1R4BQp3aXRoZHJhd1R4CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ53aXRoZHJhd1Jlc3VsdAAEC2N1cnJlbnRQb29sCQEJdHJ5R2V0U3RyAgUEdGhpcwILY3VycmVudFBvb2wDCQAAAgULY3VycmVudFBvb2wCAAkAAgEJAKwCAgIZQ2Fubm90IGZpbmQgcG9vbCB3aXRoIGlkIAULY3VycmVudFBvb2wEBmFtb3VudAkBG2dldFB1enpsZVBvb2xTdXBwbGllZEFtb3VudAEFC2N1cnJlbnRQb29sBAJ0eAkBFndpdGhkcmF3RnJvbVB1enpsZVBvb2wCBQtjdXJyZW50UG9vbAUGYW1vdW50AwkAAAIFAnR4BQJ0eAUCdHgJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDHN1cHBseVJlc3VsdAEGcG9vbElkAwkAAAIJAM8IAgULcHV6emxlUG9vbHMFBnBvb2xJZAUEdW5pdAkAAgEJAKwCAgIPVW5rbm93biBwb29sSWQgBQZwb29sSWQECmFzc2V0Qnl0ZXMJANkEAQUHYXNzZXRJZAQHYmFsYW5jZQkBCmdldEJhbGFuY2UBBQphc3NldEJ5dGVzBANpbnYJAPwHBAkBB0FkZHJlc3MBCQDZBAEFBnBvb2xJZAIGc3VwcGx5BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCmFzc2V0Qnl0ZXMFB2JhbGFuY2UFA25pbAMJAAACBQNpbnYFA2ludgkAzAgCCQELU3RyaW5nRW50cnkCAgtjdXJyZW50UG9vbAUGcG9vbElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDmNhbGN1bGF0ZVNSYXRlAAQObGFzdENoZWNrU1JhdGUJAQl0cnlHZXRJbnQCBQR0aGlzAhVnbG9iYWxfbGFzdENoZWNrU1JhdGUEDHN0YWtlZEFtb3VudAkBCXRyeUdldEludAIFBHRoaXMCDWdsb2JhbF9zdGFrZWQED2xhc3RDaGVja0hlaWdodAkBCXRyeUdldEludAIFBHRoaXMCG2dsb2JhbF9sYXN0Q2hlY2tTUmF0ZUhlaWdodAQGYmxvY2tzCQBlAgUGaGVpZ2h0BQ9sYXN0Q2hlY2tIZWlnaHQECGVtaXNzaW9uCQBlAgkBFmdldFRvdGFsU3VwcGxpZWRBbW91bnQACQBrAwUMc3Rha2VkQW1vdW50BQ5sYXN0Q2hlY2tTUmF0ZQUGU2NhbGU4BA9zdGFraW5nRW1pc3Npb24JAGsDBQhlbWlzc2lvbgDAq6YtBQZTY2FsZTgDCQAAAgUMc3Rha2VkQW1vdW50AAAFBlNjYWxlOAQFc1JhdGUJAGQCBQ5sYXN0Q2hlY2tTUmF0ZQkAawMJAGgCBQZibG9ja3MFBlNjYWxlOAUPc3Rha2luZ0VtaXNzaW9uBQxzdGFrZWRBbW91bnQDCQBmAgUGU2NhbGU4BQVzUmF0ZQUGU2NhbGU4BQVzUmF0ZQEMcmVjYWxjUmVzdWx0AQxzdGFrZWRDaGFuZ2UEDHN0YWtlZEFtb3VudAkBCXRyeUdldEludAIFBHRoaXMCDWdsb2JhbF9zdGFrZWQEBXNSYXRlCQEOY2FsY3VsYXRlU1JhdGUABAZwcm9maXQJAGUCCQEWZ2V0VG90YWxTdXBwbGllZEFtb3VudAAJAGsDBQxzdGFrZWRBbW91bnQFBXNSYXRlBQZTY2FsZTgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTcG9maXRBY2NvdW50QWRkcmVzcwMJAGYCBQZwcm9maXQAAAUGcHJvZml0AAAJANkEAQUHYXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgINZ2xvYmFsX3N0YWtlZAkAZAIFDHN0YWtlZEFtb3VudAUMc3Rha2VkQ2hhbmdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhVnbG9iYWxfbGFzdENoZWNrU1JhdGUFBXNSYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhtnbG9iYWxfbGFzdENoZWNrU1JhdGVIZWlnaHQFBmhlaWdodAUDbmlsARVjYWxjdWxhdGVTdGFrZWRBbW91bnQBBHVzZXIEBmFtb3VudAkBCXRyeUdldEludAIFBHRoaXMJAKwCAgUEdXNlcgIHX3N0YWtlZAkAawMFBmFtb3VudAkBDmNhbGN1bGF0ZVNSYXRlAAUGU2NhbGU4AQtzdGFrZVJlc3VsdAIEdXNlcgZhbW91bnQEB3NBbW91bnQJAGsDBQZhbW91bnQFBlNjYWxlOAkBDmNhbGN1bGF0ZVNSYXRlAAkAzggCCQEMcmVjYWxjUmVzdWx0AQUHc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyAgdfc3Rha2VkCQBkAgkBCXRyeUdldEludAIFBHRoaXMJAKwCAgUEdXNlcgIHX3N0YWtlZAUHc0Ftb3VudAUDbmlsAQ11bnN0YWtlUmVzdWx0AgR1c2VyBmFtb3VudAQFc1JhdGUJAQ5jYWxjdWxhdGVTUmF0ZQAEB3NBbW91bnQDCQAAAgUFc1JhdGUAAAUGYW1vdW50CQBrAwUGYW1vdW50BQZTY2FsZTgFBXNSYXRlBAp1c2VyU3Rha2VkCQEJdHJ5R2V0SW50AgUEdGhpcwkArAICBQR1c2VyAgdfc3Rha2VkBA5jdXJyZW50U0Ftb3VudAMJAAACBQVzUmF0ZQAABQp1c2VyU3Rha2VkCQBrAwUKdXNlclN0YWtlZAUGU2NhbGU4BQVzUmF0ZQQNdW5zdGFrZUFtb3VudAMJAGYCBQdzQW1vdW50BQ5jdXJyZW50U0Ftb3VudAUOY3VycmVudFNBbW91bnQFB3NBbW91bnQJAM4IAgkBDHJlY2FsY1Jlc3VsdAEJAQEtAQUHc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyAgdfc3Rha2VkCQBlAgUOY3VycmVudFNBbW91bnQFDXVuc3Rha2VBbW91bnQFA25pbAYBaQEFc3Rha2UABAR1c2VyCQClCAEIBQFpBmNhbGxlcgQGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAMDCQBnAgAABQZhbW91bnQGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJANkEAQUHYXNzZXRJZAkAAgECFmludmFsaWQgdG9rZW4gYXR0YWNoZWQEC2N1cnJlbnRQb29sCQEJdHJ5R2V0U3RyAgUEdGhpcwILY3VycmVudFBvb2wJAM4IAgkBC3N0YWtlUmVzdWx0AgUEdXNlcgUGYW1vdW50CQEMc3VwcGx5UmVzdWx0AQULY3VycmVudFBvb2wBaQEHdW5zdGFrZQEGYW1vdW50BAR1c2VyCQClCAEIBQFpBmNhbGxlcgQLY3VycmVudFBvb2wJAQl0cnlHZXRTdHICBQR0aGlzAgtjdXJyZW50UG9vbAQCdHgJARZ3aXRoZHJhd0Zyb21QdXp6bGVQb29sAgULY3VycmVudFBvb2wFBmFtb3VudAMJAAACBQJ0eAUCdHgJAM4IAgkBDXVuc3Rha2VSZXN1bHQCBQR1c2VyBQZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQJANkEAQUHYXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXJlYmFsYW5jZQEGcG9vbElkBAtjdXJyZW50UG9vbAkBCXRyeUdldFN0cgIFBHRoaXMCC2N1cnJlbnRQb29sAwkAAAIJAM8IAgUKdmFsaWRhdG9ycwkApQgBCAUBaQZjYWxsZXIFBHVuaXQJAAIBAg1BY2Nlc3MgZGVuaWVkAwkAAAIFC2N1cnJlbnRQb29sBQZwb29sSWQJAAIBCQCsAgICE0FscmVhZHkgc3VwcGxpZWQgdG8FC2N1cnJlbnRQb29sBAp3aXRoZHJhd1R4CQEOd2l0aGRyYXdSZXN1bHQAAwkAAAIFCndpdGhkcmF3VHgFCndpdGhkcmF3VHgJAM4IAgkBDHN1cHBseVJlc3VsdAEFBnBvb2xJZAkBDHJlY2FsY1Jlc3VsdAEAAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhnZXRTUmF0ZQEFZGVidWcECXBhcmFtZXRlcgkBDmNhbGN1bGF0ZVNSYXRlAAMFBWRlYnVnCQACAQkApAMBBQlwYXJhbWV0ZXIJAJQKAgUDbmlsBQlwYXJhbWV0ZXIBaQEPZ2V0U3Rha2VkQW1vdW50AgVkZWJ1Zwt1c2VyQWRkcmVzcwQJcGFyYW1ldGVyCQEVY2FsY3VsYXRlU3Rha2VkQW1vdW50AQULdXNlckFkZHJlc3MDBQVkZWJ1ZwkAAgEJAKQDAQUJcGFyYW1ldGVyCQCUCgIFA25pbAUJcGFyYW1ldGVyAWkBFGdldFRvdGFsU3Rha2VkQW1vdW50AQVkZWJ1ZwQGYW1vdW50CQEJdHJ5R2V0SW50AgUEdGhpcwINZ2xvYmFsX3N0YWtlZAQJcGFyYW1ldGVyCQBrAwUGYW1vdW50CQEOY2FsY3VsYXRlU1JhdGUABQZTY2FsZTgDBQVkZWJ1ZwkAAgEJAKQDAQUJcGFyYW1ldGVyCQCUCgIFA25pbAUJcGFyYW1ldGVyAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tlebXiQiI=", "height": 3405349, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7q4BHjpunpKDeB4rA25QLxWvwsd3n5wcvN7LMKgyC9qU Next: 7VKvLJ8DaojteokigZpo9gREVsfZwrmeALZuzCHR8eme Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let Scale6 = 1000000
55
66 let Scale8 = 100000000
77
88 let Scale16 = (Scale8 * Scale8)
99
1010 let pofitAccountAddress = Address(base58'3PHMpSJXoCTAJTmdVXgxXAFrkHBRyjNRuMU')
1111
1212 let assetId = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p"
1313
1414 let validators = ["3PEqC9533h6ADnJvXb8cvXcaSkecd9YTNvz"]
1515
1616 let puzzlePools = ["3P4DK5VzDwL3vfc5ahUEhtoe5ByZNyacJ3X", "3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH"]
1717
1818 func getBalance (assetId) = match assetId {
1919 case x: Unit =>
2020 wavesBalance(this).available
2121 case _ =>
2222 assetBalance(this, value(assetId))
2323 }
2424
2525
2626 func tryGetInt (address,key) = match getInteger(address, key) {
2727 case b: Int =>
2828 b
2929 case _ =>
3030 0
3131 }
3232
3333
3434 func tryGetStr (address,key) = match getString(address, key) {
3535 case b: String =>
3636 b
3737 case _ =>
3838 ""
3939 }
4040
4141
4242 func getAssetString (assetId) = match assetId {
4343 case b: ByteVector =>
4444 toBase58String(b)
4545 case _ =>
4646 "WAVES"
4747 }
4848
4949
5050 func getPuzzlePoolSuppliedAmount (poolAddressStr) = {
5151 let poolAddress = Address(fromBase58String(poolAddressStr))
5252 let tokens = match getString(poolAddress, "setup_tokens") {
5353 case r: String =>
5454 split(r, ",")
5555 case _ =>
5656 throw(("Cannot find setup_tokens in state of pool " + poolAddressStr))
5757 }
5858 let tokenIndex = match indexOf(tokens, assetId) {
5959 case r: Int =>
6060 r
6161 case _ =>
6262 throw(((("cannot find " + assetId) + " in pool") + poolAddressStr))
6363 }
6464 let tokenRatesResponse = invoke(poolAddress, "calculateTokenRates", [false], nil)
6565 if ((tokenRatesResponse == tokenRatesResponse))
6666 then {
6767 let tokensRatesString = match tokenRatesResponse {
6868 case r: String =>
6969 r
7070 case _ =>
7171 throw(("Func 'calculateTokenRates' returns not string value in pool" + poolAddressStr))
7272 }
7373 let supplyRateStr = split(split(tokensRatesString, ",")[tokenIndex], "|")[1]
7474 let supplyRate = match parseInt(supplyRateStr) {
7575 case t: Int =>
7676 t
7777 case _ =>
7878 throw("Cannot parse supply rate from defi pool")
7979 }
8080 let supply = tryGetInt(poolAddress, ((toString(this) + "_supplied_") + assetId))
8181 let amount = fraction(supply, supplyRate, Scale16)
8282 amount
8383 }
8484 else throw("Strict value is not equal to itself.")
8585 }
8686
8787
8888 func getTotalSuppliedAmount () = {
8989 let currentPool = tryGetStr(this, "currentPool")
9090 if ((currentPool == ""))
9191 then throw(("Cannot find pool with id " + currentPool))
9292 else getPuzzlePoolSuppliedAmount(currentPool)
9393 }
9494
9595
9696 func withdrawFromPuzzlePool (poolId,amount) = {
9797 let poolAddress = Address(fromBase58String(poolId))
9898 let withdrawTx = if ((amount > 0))
9999 then invoke(poolAddress, "withdraw", [assetId, amount], nil)
100100 else ""
101101 if ((withdrawTx == withdrawTx))
102102 then withdrawTx
103103 else throw("Strict value is not equal to itself.")
104104 }
105105
106106
107107 func withdrawResult () = {
108108 let currentPool = tryGetStr(this, "currentPool")
109109 if ((currentPool == ""))
110110 then throw(("Cannot find pool with id " + currentPool))
111111 else {
112112 let amount = getPuzzlePoolSuppliedAmount(currentPool)
113113 let tx = withdrawFromPuzzlePool(currentPool, amount)
114114 if ((tx == tx))
115115 then tx
116116 else throw("Strict value is not equal to itself.")
117117 }
118118 }
119119
120120
121121 func supplyResult (poolId) = if ((indexOf(puzzlePools, poolId) == unit))
122122 then throw(("Unknown poolId " + poolId))
123123 else {
124124 let assetBytes = fromBase58String(assetId)
125125 let balance = getBalance(assetBytes)
126126 let inv = invoke(Address(fromBase58String(poolId)), "supply", nil, [AttachedPayment(assetBytes, balance)])
127127 if ((inv == inv))
128128 then [StringEntry("currentPool", poolId)]
129129 else throw("Strict value is not equal to itself.")
130130 }
131131
132132
133133 func calculateSRate () = {
134134 let lastCheckSRate = tryGetInt(this, "global_lastCheckSRate")
135135 let stakedAmount = tryGetInt(this, "global_staked")
136136 let lastCheckHeight = tryGetInt(this, "global_lastCheckSRateHeight")
137137 let blocks = (height - lastCheckHeight)
138138 let emission = (getTotalSuppliedAmount() - fraction(stakedAmount, lastCheckSRate, Scale8))
139139 let stakingEmission = fraction(emission, 95000000, Scale8)
140140 if ((stakedAmount == 0))
141141 then Scale8
142142 else {
143143 let sRate = (lastCheckSRate + fraction((blocks * Scale8), stakingEmission, stakedAmount))
144144 if ((Scale8 > sRate))
145145 then Scale8
146146 else sRate
147147 }
148148 }
149149
150150
151151 func recalcResult (stakedChange) = {
152152 let stakedAmount = tryGetInt(this, "global_staked")
153153 let sRate = calculateSRate()
154154 let profit = (getTotalSuppliedAmount() - fraction(stakedAmount, sRate, Scale8))
155155 [ScriptTransfer(pofitAccountAddress, if ((profit > 0))
156156 then profit
157157 else 0, fromBase58String(assetId)), IntegerEntry("global_staked", (stakedAmount + stakedChange)), IntegerEntry("global_lastCheckSRate", sRate), IntegerEntry("global_lastCheckSRateHeight", height)]
158158 }
159159
160160
161161 func calculateStakedAmount (user) = {
162162 let amount = tryGetInt(this, (user + "_staked"))
163163 fraction(amount, calculateSRate(), Scale8)
164164 }
165165
166166
167167 func stakeResult (user,amount) = {
168168 let sAmount = fraction(amount, Scale8, calculateSRate())
169169 (recalcResult(sAmount) ++ [IntegerEntry((user + "_staked"), (tryGetInt(this, (user + "_staked")) + sAmount))])
170170 }
171171
172172
173173 func unstakeResult (user,amount) = {
174174 let sRate = calculateSRate()
175175 let sAmount = if ((sRate == 0))
176176 then amount
177177 else fraction(amount, Scale8, sRate)
178178 let userStaked = tryGetInt(this, (user + "_staked"))
179179 let currentSAmount = if ((sRate == 0))
180180 then userStaked
181181 else fraction(userStaked, Scale8, sRate)
182182 let unstakeAmount = if ((sAmount > currentSAmount))
183183 then currentSAmount
184184 else sAmount
185185 (recalcResult(-(sAmount)) ++ [IntegerEntry((user + "_staked"), (currentSAmount - unstakeAmount))])
186186 }
187187
188188
189189 @Callable(i)
190190 func stake () = {
191191 let user = toString(i.caller)
192192 let amount = i.payments[0].amount
193193 if (if ((0 >= amount))
194194 then true
195195 else (i.payments[0].assetId != fromBase58String(assetId)))
196196 then throw("invalid token attached")
197197 else {
198198 let currentPool = tryGetStr(this, "currentPool")
199199 (stakeResult(user, amount) ++ supplyResult(currentPool))
200200 }
201201 }
202202
203203
204204
205205 @Callable(i)
206206 func unstake (amount) = {
207207 let user = toString(i.caller)
208208 let currentPool = tryGetStr(this, "currentPool")
209209 let tx = withdrawFromPuzzlePool(currentPool, amount)
210210 if ((tx == tx))
211211 then (unstakeResult(user, amount) ++ [ScriptTransfer(i.caller, amount, fromBase58String(assetId))])
212212 else throw("Strict value is not equal to itself.")
213213 }
214214
215215
216216
217217 @Callable(i)
218218 func rebalance (poolId) = {
219219 let currentPool = tryGetStr(this, "currentPool")
220220 if ((indexOf(validators, toString(i.caller)) == unit))
221221 then throw("Access denied")
222222 else if ((currentPool == poolId))
223223 then throw(("Already supplied to" + currentPool))
224224 else {
225225 let withdrawTx = withdrawResult()
226226 if ((withdrawTx == withdrawTx))
227227 then (supplyResult(poolId) ++ recalcResult(0))
228228 else throw("Strict value is not equal to itself.")
229229 }
230230 }
231231
232232
233233
234234 @Callable(i)
235235 func getSRate (debug) = {
236236 let parameter = calculateSRate()
237237 if (debug)
238238 then throw(toString(parameter))
239239 else $Tuple2(nil, parameter)
240240 }
241241
242242
243243
244244 @Callable(i)
245245 func getStakedAmount (debug,userAddress) = {
246246 let parameter = calculateStakedAmount(userAddress)
247247 if (debug)
248248 then throw(toString(parameter))
249249 else $Tuple2(nil, parameter)
250250 }
251251
252252
253253
254254 @Callable(i)
255255 func getTotalStakedAmount (debug) = {
256256 let amount = tryGetInt(this, "global_staked")
257257 let parameter = fraction(amount, calculateSRate(), Scale8)
258258 if (debug)
259259 then throw(toString(parameter))
260260 else $Tuple2(nil, parameter)
261261 }
262262
263263
264264 @Verifier(tx)
265265 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
266266

github/deemru/w8io/6500d08 
53.50 ms