tx · BF5G3c8BEV3y4UdRgNuHPstQpUvz7zxMZeJPz6pz4RtB 3PJUm112svcu4gPU9GKpsBGwYNEVQEPiQ1t: -0.01000000 Waves 2022.11.28 18:54 [3402633] smart account 3PJUm112svcu4gPU9GKpsBGwYNEVQEPiQ1t > SELF 0.00000000 Waves
{ "type": 13, "id": "BF5G3c8BEV3y4UdRgNuHPstQpUvz7zxMZeJPz6pz4RtB", "fee": 1000000, "feeAssetId": null, "timestamp": 1669650875841, "version": 2, "chainId": 87, "sender": "3PJUm112svcu4gPU9GKpsBGwYNEVQEPiQ1t", "senderPublicKey": "6BTduxfT4CkTidY6P35nYzafiLpun4QLUZCQUU6pcJQM", "proofs": [ "66fdPAU2JYPKS4eJQYwHYm9W9RnTMCNt7V6Na2vXczo7yvaAMbqa4Cbj6AxKfEzkTKed4q7sFd9YsHJH9U1ZRcMP" ], "script": "base64:BgIlCAISAwoBCBIDCgEEEgQKAgQIEgMKAQQSABIDCgEBEgASAwoBCBQABlNjYWxlNgDAhD0ABlNjYWxlOACAwtcvAAdTY2FsZTE2CQBoAgUGU2NhbGU4BQZTY2FsZTgACnZhbGlkYXRvcnMJAMwIAgIjM1BFcUM5NTMzaDZBRG5KdlhiOGN2WGNhU2tlY2Q5WVROdnoFA25pbAAHYXNzZXRJZAIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAAC3B1enpsZVBvb2xzCQDMCAICIzNQNERLNVZ6RHdMM3ZmYzVhaFVFaHRvZTVCeVpOeWFjSjNYCQDMCAICIzNQNHVBNWV0blppNEFtQmFiS2lucTJiTWlXVThLY25IWmRIBQNuaWwBCmdldEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIEVW5pdAQBeAUHJG1hdGNoMAgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkBBXZhbHVlAQUHYXNzZXRJZAEJdHJ5R2V0SW50AgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAmggCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABCXRyeUdldFN0cgIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJ0IAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYgUHJG1hdGNoMAUBYgIAAQ5nZXRBc3NldFN0cmluZwEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDYBAEFAWICBVdBVkVTARtnZXRQdXp6bGVQb29sU3VwcGxpZWRBbW91bnQBDnBvb2xBZGRyZXNzU3RyBAtwb29sQWRkcmVzcwkBB0FkZHJlc3MBCQDZBAEFDnBvb2xBZGRyZXNzU3RyBAZ0b2tlbnMEByRtYXRjaDAJAJ0IAgULcG9vbEFkZHJlc3MCDHNldHVwX3Rva2VucwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXIFByRtYXRjaDAJALUJAgUBcgIBLAkAAgEJAKwCAgIqQ2Fubm90IGZpbmQgc2V0dXBfdG9rZW5zIGluIHN0YXRlIG9mIHBvb2wgBQ5wb29sQWRkcmVzc1N0cgQKdG9rZW5JbmRleAQHJG1hdGNoMAkAzwgCBQZ0b2tlbnMFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFyBQckbWF0Y2gwBQFyCQACAQkArAICCQCsAgIJAKwCAgIMY2Fubm90IGZpbmQgBQdhc3NldElkAgggaW4gcG9vbAUOcG9vbEFkZHJlc3NTdHIEEnRva2VuUmF0ZXNSZXNwb25zZQkA/AcEBQtwb29sQWRkcmVzcwITY2FsY3VsYXRlVG9rZW5SYXRlcwkAzAgCBwUDbmlsBQNuaWwDCQAAAgUSdG9rZW5SYXRlc1Jlc3BvbnNlBRJ0b2tlblJhdGVzUmVzcG9uc2UEEXRva2Vuc1JhdGVzU3RyaW5nBAckbWF0Y2gwBRJ0b2tlblJhdGVzUmVzcG9uc2UDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFyBQckbWF0Y2gwBQFyCQACAQkArAICAjtGdW5jICdjYWxjdWxhdGVUb2tlblJhdGVzJyByZXR1cm5zIG5vdCBzdHJpbmcgdmFsdWUgaW4gcG9vbAUOcG9vbEFkZHJlc3NTdHIEDXN1cHBseVJhdGVTdHIJAJEDAgkAtQkCCQCRAwIJALUJAgURdG9rZW5zUmF0ZXNTdHJpbmcCASwFCnRva2VuSW5kZXgCAXwAAQQKc3VwcGx5UmF0ZQQHJG1hdGNoMAkAtgkBBQ1zdXBwbHlSYXRlU3RyAwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAUBdAkAAgECJ0Nhbm5vdCBwYXJzZSBzdXBwbHkgcmF0ZSBmcm9tIGRlZmkgcG9vbAQGc3VwcGx5CQEJdHJ5R2V0SW50AgULcG9vbEFkZHJlc3MJAKwCAgkArAICCQClCAEFBHRoaXMCCl9zdXBwbGllZF8FB2Fzc2V0SWQEBmFtb3VudAkAawMFBnN1cHBseQUKc3VwcGx5UmF0ZQUHU2NhbGUxNgUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARZnZXRUb3RhbFN1cHBsaWVkQW1vdW50AAQLY3VycmVudFBvb2wJAQl0cnlHZXRTdHICBQR0aGlzAgtjdXJyZW50UG9vbAMJAAACBQtjdXJyZW50UG9vbAIACQACAQkArAICAhlDYW5ub3QgZmluZCBwb29sIHdpdGggaWQgBQtjdXJyZW50UG9vbAkBG2dldFB1enpsZVBvb2xTdXBwbGllZEFtb3VudAEFC2N1cnJlbnRQb29sARZ3aXRoZHJhd0Zyb21QdXp6bGVQb29sAgZwb29sSWQGYW1vdW50BAtwb29sQWRkcmVzcwkBB0FkZHJlc3MBCQDZBAEFBnBvb2xJZAQKd2l0aGRyYXdUeAMJAGYCBQZhbW91bnQAAAkA/AcEBQtwb29sQWRkcmVzcwIId2l0aGRyYXcJAMwIAgUHYXNzZXRJZAkAzAgCBQZhbW91bnQFA25pbAUDbmlsAgADCQAAAgUKd2l0aGRyYXdUeAUKd2l0aGRyYXdUeAUKd2l0aGRyYXdUeAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEOd2l0aGRyYXdSZXN1bHQABAtjdXJyZW50UG9vbAkBCXRyeUdldFN0cgIFBHRoaXMCC2N1cnJlbnRQb29sAwkAAAIFC2N1cnJlbnRQb29sAgAJAAIBCQCsAgICGUNhbm5vdCBmaW5kIHBvb2wgd2l0aCBpZCAFC2N1cnJlbnRQb29sBAZhbW91bnQJARtnZXRQdXp6bGVQb29sU3VwcGxpZWRBbW91bnQBBQtjdXJyZW50UG9vbAQCdHgJARZ3aXRoZHJhd0Zyb21QdXp6bGVQb29sAgULY3VycmVudFBvb2wFBmFtb3VudAMJAAACBQJ0eAUCdHgFAnR4CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxzdXBwbHlSZXN1bHQBBnBvb2xJZAMJAAACCQDPCAIFC3B1enpsZVBvb2xzBQZwb29sSWQFBHVuaXQJAAIBCQCsAgICD1Vua25vd24gcG9vbElkIAUGcG9vbElkBAphc3NldEJ5dGVzCQDZBAEFB2Fzc2V0SWQEB2JhbGFuY2UJAQpnZXRCYWxhbmNlAQUKYXNzZXRCeXRlcwQDaW52CQD8BwQJAQdBZGRyZXNzAQkA2QQBBQZwb29sSWQCBnN1cHBseQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQphc3NldEJ5dGVzBQdiYWxhbmNlBQNuaWwDCQAAAgUDaW52BQNpbnYJAMwIAgkBC1N0cmluZ0VudHJ5AgILY3VycmVudFBvb2wFBnBvb2xJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ5jYWxjdWxhdGVTUmF0ZQAEDmxhc3RDaGVja1NSYXRlCQEJdHJ5R2V0SW50AgUEdGhpcwIVZ2xvYmFsX2xhc3RDaGVja1NSYXRlBAxzdGFrZWRBbW91bnQJAQl0cnlHZXRJbnQCBQR0aGlzAg1nbG9iYWxfc3Rha2VkBA9sYXN0Q2hlY2tIZWlnaHQJAQl0cnlHZXRJbnQCBQR0aGlzAhtnbG9iYWxfbGFzdENoZWNrU1JhdGVIZWlnaHQEBmJsb2NrcwkAZQIFBmhlaWdodAUPbGFzdENoZWNrSGVpZ2h0BA9zdGFraW5nRW1pc3Npb24JAGUCCQEWZ2V0VG90YWxTdXBwbGllZEFtb3VudAAFDHN0YWtlZEFtb3VudAMJAAACBQxzdGFrZWRBbW91bnQAAAUGU2NhbGU4CQBkAgUObGFzdENoZWNrU1JhdGUJAGsDCQBoAgUGYmxvY2tzBQZTY2FsZTgFD3N0YWtpbmdFbWlzc2lvbgUMc3Rha2VkQW1vdW50AQxyZWNhbGNSZXN1bHQBDHN0YWtlZENoYW5nZQQMc3Rha2VkQW1vdW50CQBkAgkBCXRyeUdldEludAIFBHRoaXMCDWdsb2JhbF9zdGFrZWQFDHN0YWtlZENoYW5nZQQFc1JhdGUJAQ5jYWxjdWxhdGVTUmF0ZQAJAMwIAgkBDEludGVnZXJFbnRyeQICDWdsb2JhbF9zdGFrZWQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgIVZ2xvYmFsX2xhc3RDaGVja1NSYXRlBQVzUmF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgIbZ2xvYmFsX2xhc3RDaGVja1NSYXRlSGVpZ2h0BQZoZWlnaHQFA25pbAEVY2FsY3VsYXRlU3Rha2VkQW1vdW50AQR1c2VyBAZhbW91bnQJAQl0cnlHZXRJbnQCBQR0aGlzCQCsAgIFBHVzZXICB19zdGFrZWQJAGsDBQZhbW91bnQJAQ5jYWxjdWxhdGVTUmF0ZQAFBlNjYWxlOAELc3Rha2VSZXN1bHQCBHVzZXIGYW1vdW50BAdzQW1vdW50CQBrAwUGYW1vdW50BQZTY2FsZTgJAQ5jYWxjdWxhdGVTUmF0ZQAJAM4IAgkBDHJlY2FsY1Jlc3VsdAEFB3NBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgIHX3N0YWtlZAkAZAIJAQl0cnlHZXRJbnQCBQR0aGlzCQCsAgIFBHVzZXICB19zdGFrZWQFB3NBbW91bnQFA25pbAENdW5zdGFrZVJlc3VsdAIEdXNlcgZhbW91bnQEBXNSYXRlCQEOY2FsY3VsYXRlU1JhdGUABAdzQW1vdW50AwkAAAIFBXNSYXRlAAAFBmFtb3VudAkAawMFBmFtb3VudAUGU2NhbGU4BQVzUmF0ZQQOY3VycmVudFNBbW91bnQJAQl0cnlHZXRJbnQCBQR0aGlzCQCsAgIFBHVzZXICB19zdGFrZWQDCQBmAgUHc0Ftb3VudAUOY3VycmVudFNBbW91bnQJAAIBAid0aGlzIGFtb3VudCBpcyBub3QgYXZhaWxhYmxlIHRvIHVuY2xhaW0JAM4IAgkBDHJlY2FsY1Jlc3VsdAEJAQEtAQUHc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyAgdfc3Rha2VkCQBlAgUOY3VycmVudFNBbW91bnQFB3NBbW91bnQFA25pbAgBaQEGaW52aXRlAQdhZGRyZXNzBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQMd2hpdGVMaXN0U3RyCQEJdHJ5R2V0U3RyAgUEdGhpcwIJd2hpdGVMaXN0BAl3aGl0ZUxpc3QJALUJAgUMd2hpdGVMaXN0U3RyAgEsAwMJAQIhPQIJAJEDAgUJd2hpdGVMaXN0AAACAAkAAAIJAM8IAgUJd2hpdGVMaXN0BQR1c2VyBQR1bml0BwkAAgECDWFjY2VzcyBkZW5pZWQDCQAAAgkApggBBQdhZGRyZXNzBQR1bml0CQACAQIPSW52YWxpZCBhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQICCXdoaXRlTGlzdAMJAAACCQCRAwIFCXdoaXRlTGlzdAAAAgAFB2FkZHJlc3MJAKwCAgkArAICBQx3aGl0ZUxpc3RTdHICASwFB2FkZHJlc3MFA25pbAFpAQhnZXRTUmF0ZQEFZGVidWcECXBhcmFtZXRlcgkBDmNhbGN1bGF0ZVNSYXRlAAMFBWRlYnVnCQACAQkApAMBBQlwYXJhbWV0ZXIJAJQKAgUDbmlsBQlwYXJhbWV0ZXIBaQEPZ2V0U3Rha2VkQW1vdW50AgVkZWJ1Zwt1c2VyQWRkcmVzcwQJcGFyYW1ldGVyCQEVY2FsY3VsYXRlU3Rha2VkQW1vdW50AQULdXNlckFkZHJlc3MDBQVkZWJ1ZwkAAgEJAKQDAQUJcGFyYW1ldGVyCQCUCgIFA25pbAUJcGFyYW1ldGVyAWkBFGdldFRvdGFsU3Rha2VkQW1vdW50AQVkZWJ1ZwQGYW1vdW50CQEJdHJ5R2V0SW50AgUEdGhpcwINZ2xvYmFsX3N0YWtlZAQJcGFyYW1ldGVyCQBrAwUGYW1vdW50CQEOY2FsY3VsYXRlU1JhdGUABQZTY2FsZTgDBQVkZWJ1ZwkAAgEJAKQDAQUJcGFyYW1ldGVyCQCUCgIFA25pbAUJcGFyYW1ldGVyAWkBBXN0YWtlAAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECXdoaXRlTGlzdAkAtQkCCQEJdHJ5R2V0U3RyAgUEdGhpcwIJd2hpdGVMaXN0AgEsAwMJAGcCAAAFBmFtb3VudAYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkA2QQBBQdhc3NldElkCQACAQIWaW52YWxpZCB0b2tlbiBhdHRhY2hlZAMJAAACCQDPCAIFCXdoaXRlTGlzdAUEdXNlcgUEdW5pdAkAAgECDWFjY2VzcyBkZW5pZWQEC2N1cnJlbnRQb29sCQEJdHJ5R2V0U3RyAgUEdGhpcwILY3VycmVudFBvb2wJAM4IAgkBDHN1cHBseVJlc3VsdAEFC2N1cnJlbnRQb29sCQELc3Rha2VSZXN1bHQCBQR1c2VyBQZhbW91bnQBaQEHdW5zdGFrZQEGYW1vdW50BAR1c2VyCQClCAEIBQFpBmNhbGxlcgQLY3VycmVudFBvb2wJAQl0cnlHZXRTdHICBQR0aGlzAgtjdXJyZW50UG9vbAQCdHgJARZ3aXRoZHJhd0Zyb21QdXp6bGVQb29sAgULY3VycmVudFBvb2wFBmFtb3VudAMJAAACBQJ0eAUCdHgJAM4IAgkBDXVuc3Rha2VSZXN1bHQCBQR1c2VyBQZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQJANkEAQUHYXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3AAMJAAACCQDPCAIFCnZhbGlkYXRvcnMJAKUIAQgFAWkGY2FsbGVyBQR1bml0CQACAQINQWNjZXNzIGRlbmllZAQKd2l0aGRyYXdUeAkBDndpdGhkcmF3UmVzdWx0AAMJAAACBQp3aXRoZHJhd1R4BQp3aXRoZHJhd1R4BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEGc3VwcGx5AQZwb29sSWQEC2N1cnJlbnRQb29sCQEJdHJ5R2V0U3RyAgUEdGhpcwILY3VycmVudFBvb2wDCQAAAgkAzwgCBQp2YWxpZGF0b3JzCQClCAEIBQFpBmNhbGxlcgUEdW5pdAkAAgECDUFjY2VzcyBkZW5pZWQDCQAAAgULY3VycmVudFBvb2wFBnBvb2xJZAkAAgEJAKwCAgITQWxyZWFkeSBzdXBwbGllZCB0bwULY3VycmVudFBvb2wJAQxzdXBwbHlSZXN1bHQBBQZwb29sSWQBAnR4AQZ2ZXJpZnkACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5uzI5jg==", "height": 3402633, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DAHgTn2FvumQtR31XBmRQqvFGFwVMZp9sGp6FJJCeJdC Next: 26kABmpNrHZtuBo1uiVXENTGWd6MU9HsVnFcWuyNnDtB Diff:
Old | New | Differences | |
---|---|---|---|
84 | 84 | ||
85 | 85 | ||
86 | 86 | func getTotalSuppliedAmount () = { | |
87 | - | func do (acc,pool) = (acc + getPuzzlePoolSuppliedAmount(pool)) | |
88 | - | ||
89 | - | let amount = { | |
90 | - | let $l = puzzlePools | |
91 | - | let $s = size($l) | |
92 | - | let $acc0 = 0 | |
93 | - | func $f0_1 ($a,$i) = if (($i >= $s)) | |
94 | - | then $a | |
95 | - | else do($a, $l[$i]) | |
96 | - | ||
97 | - | func $f0_2 ($a,$i) = if (($i >= $s)) | |
98 | - | then $a | |
99 | - | else throw("List size exceeds 2") | |
100 | - | ||
101 | - | $f0_2($f0_1($f0_1($acc0, 0), 1), 2) | |
102 | - | } | |
103 | - | amount | |
87 | + | let currentPool = tryGetStr(this, "currentPool") | |
88 | + | if ((currentPool == "")) | |
89 | + | then throw(("Cannot find pool with id " + currentPool)) | |
90 | + | else getPuzzlePoolSuppliedAmount(currentPool) | |
104 | 91 | } | |
105 | 92 | ||
106 | 93 | ||
116 | 103 | ||
117 | 104 | ||
118 | 105 | func withdrawResult () = { | |
119 | - | func doWithdraw (acc,pool) = { | |
120 | - | let amount = getPuzzlePoolSuppliedAmount(pool) | |
121 | - | let tx = withdrawFromPuzzlePool(pool, amount) | |
122 | - | if ((tx == tx)) | |
123 | - | then acc | |
124 | - | else throw("Strict value is not equal to itself.") | |
125 | - | } | |
126 | - | ||
127 | - | let withdraws = { | |
128 | - | let $l = puzzlePools | |
129 | - | let $s = size($l) | |
130 | - | let $acc0 = 0 | |
131 | - | func $f0_1 ($a,$i) = if (($i >= $s)) | |
132 | - | then $a | |
133 | - | else doWithdraw($a, $l[$i]) | |
134 | - | ||
135 | - | func $f0_2 ($a,$i) = if (($i >= $s)) | |
136 | - | then $a | |
137 | - | else throw("List size exceeds 2") | |
138 | - | ||
139 | - | $f0_2($f0_1($f0_1($acc0, 0), 1), 2) | |
140 | - | } | |
141 | - | if ((withdraws == withdraws)) | |
142 | - | then withdraws | |
143 | - | else throw("Strict value is not equal to itself.") | |
106 | + | let currentPool = tryGetStr(this, "currentPool") | |
107 | + | if ((currentPool == "")) | |
108 | + | then throw(("Cannot find pool with id " + currentPool)) | |
109 | + | else { | |
110 | + | let amount = getPuzzlePoolSuppliedAmount(currentPool) | |
111 | + | let tx = withdrawFromPuzzlePool(currentPool, amount) | |
112 | + | if ((tx == tx)) | |
113 | + | then tx | |
114 | + | else throw("Strict value is not equal to itself.") | |
115 | + | } | |
144 | 116 | } | |
145 | 117 | ||
146 | 118 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let Scale6 = 1000000 | |
5 | 5 | ||
6 | 6 | let Scale8 = 100000000 | |
7 | 7 | ||
8 | 8 | let Scale16 = (Scale8 * Scale8) | |
9 | 9 | ||
10 | 10 | let validators = ["3PEqC9533h6ADnJvXb8cvXcaSkecd9YTNvz"] | |
11 | 11 | ||
12 | 12 | let assetId = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" | |
13 | 13 | ||
14 | 14 | let puzzlePools = ["3P4DK5VzDwL3vfc5ahUEhtoe5ByZNyacJ3X", "3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH"] | |
15 | 15 | ||
16 | 16 | func getBalance (assetId) = match assetId { | |
17 | 17 | case x: Unit => | |
18 | 18 | wavesBalance(this).available | |
19 | 19 | case _ => | |
20 | 20 | assetBalance(this, value(assetId)) | |
21 | 21 | } | |
22 | 22 | ||
23 | 23 | ||
24 | 24 | func tryGetInt (address,key) = match getInteger(address, key) { | |
25 | 25 | case b: Int => | |
26 | 26 | b | |
27 | 27 | case _ => | |
28 | 28 | 0 | |
29 | 29 | } | |
30 | 30 | ||
31 | 31 | ||
32 | 32 | func tryGetStr (address,key) = match getString(address, key) { | |
33 | 33 | case b: String => | |
34 | 34 | b | |
35 | 35 | case _ => | |
36 | 36 | "" | |
37 | 37 | } | |
38 | 38 | ||
39 | 39 | ||
40 | 40 | func getAssetString (assetId) = match assetId { | |
41 | 41 | case b: ByteVector => | |
42 | 42 | toBase58String(b) | |
43 | 43 | case _ => | |
44 | 44 | "WAVES" | |
45 | 45 | } | |
46 | 46 | ||
47 | 47 | ||
48 | 48 | func getPuzzlePoolSuppliedAmount (poolAddressStr) = { | |
49 | 49 | let poolAddress = Address(fromBase58String(poolAddressStr)) | |
50 | 50 | let tokens = match getString(poolAddress, "setup_tokens") { | |
51 | 51 | case r: String => | |
52 | 52 | split(r, ",") | |
53 | 53 | case _ => | |
54 | 54 | throw(("Cannot find setup_tokens in state of pool " + poolAddressStr)) | |
55 | 55 | } | |
56 | 56 | let tokenIndex = match indexOf(tokens, assetId) { | |
57 | 57 | case r: Int => | |
58 | 58 | r | |
59 | 59 | case _ => | |
60 | 60 | throw(((("cannot find " + assetId) + " in pool") + poolAddressStr)) | |
61 | 61 | } | |
62 | 62 | let tokenRatesResponse = invoke(poolAddress, "calculateTokenRates", [false], nil) | |
63 | 63 | if ((tokenRatesResponse == tokenRatesResponse)) | |
64 | 64 | then { | |
65 | 65 | let tokensRatesString = match tokenRatesResponse { | |
66 | 66 | case r: String => | |
67 | 67 | r | |
68 | 68 | case _ => | |
69 | 69 | throw(("Func 'calculateTokenRates' returns not string value in pool" + poolAddressStr)) | |
70 | 70 | } | |
71 | 71 | let supplyRateStr = split(split(tokensRatesString, ",")[tokenIndex], "|")[1] | |
72 | 72 | let supplyRate = match parseInt(supplyRateStr) { | |
73 | 73 | case t: Int => | |
74 | 74 | t | |
75 | 75 | case _ => | |
76 | 76 | throw("Cannot parse supply rate from defi pool") | |
77 | 77 | } | |
78 | 78 | let supply = tryGetInt(poolAddress, ((toString(this) + "_supplied_") + assetId)) | |
79 | 79 | let amount = fraction(supply, supplyRate, Scale16) | |
80 | 80 | amount | |
81 | 81 | } | |
82 | 82 | else throw("Strict value is not equal to itself.") | |
83 | 83 | } | |
84 | 84 | ||
85 | 85 | ||
86 | 86 | func getTotalSuppliedAmount () = { | |
87 | - | func do (acc,pool) = (acc + getPuzzlePoolSuppliedAmount(pool)) | |
88 | - | ||
89 | - | let amount = { | |
90 | - | let $l = puzzlePools | |
91 | - | let $s = size($l) | |
92 | - | let $acc0 = 0 | |
93 | - | func $f0_1 ($a,$i) = if (($i >= $s)) | |
94 | - | then $a | |
95 | - | else do($a, $l[$i]) | |
96 | - | ||
97 | - | func $f0_2 ($a,$i) = if (($i >= $s)) | |
98 | - | then $a | |
99 | - | else throw("List size exceeds 2") | |
100 | - | ||
101 | - | $f0_2($f0_1($f0_1($acc0, 0), 1), 2) | |
102 | - | } | |
103 | - | amount | |
87 | + | let currentPool = tryGetStr(this, "currentPool") | |
88 | + | if ((currentPool == "")) | |
89 | + | then throw(("Cannot find pool with id " + currentPool)) | |
90 | + | else getPuzzlePoolSuppliedAmount(currentPool) | |
104 | 91 | } | |
105 | 92 | ||
106 | 93 | ||
107 | 94 | func withdrawFromPuzzlePool (poolId,amount) = { | |
108 | 95 | let poolAddress = Address(fromBase58String(poolId)) | |
109 | 96 | let withdrawTx = if ((amount > 0)) | |
110 | 97 | then invoke(poolAddress, "withdraw", [assetId, amount], nil) | |
111 | 98 | else "" | |
112 | 99 | if ((withdrawTx == withdrawTx)) | |
113 | 100 | then withdrawTx | |
114 | 101 | else throw("Strict value is not equal to itself.") | |
115 | 102 | } | |
116 | 103 | ||
117 | 104 | ||
118 | 105 | func withdrawResult () = { | |
119 | - | func doWithdraw (acc,pool) = { | |
120 | - | let amount = getPuzzlePoolSuppliedAmount(pool) | |
121 | - | let tx = withdrawFromPuzzlePool(pool, amount) | |
122 | - | if ((tx == tx)) | |
123 | - | then acc | |
124 | - | else throw("Strict value is not equal to itself.") | |
125 | - | } | |
126 | - | ||
127 | - | let withdraws = { | |
128 | - | let $l = puzzlePools | |
129 | - | let $s = size($l) | |
130 | - | let $acc0 = 0 | |
131 | - | func $f0_1 ($a,$i) = if (($i >= $s)) | |
132 | - | then $a | |
133 | - | else doWithdraw($a, $l[$i]) | |
134 | - | ||
135 | - | func $f0_2 ($a,$i) = if (($i >= $s)) | |
136 | - | then $a | |
137 | - | else throw("List size exceeds 2") | |
138 | - | ||
139 | - | $f0_2($f0_1($f0_1($acc0, 0), 1), 2) | |
140 | - | } | |
141 | - | if ((withdraws == withdraws)) | |
142 | - | then withdraws | |
143 | - | else throw("Strict value is not equal to itself.") | |
106 | + | let currentPool = tryGetStr(this, "currentPool") | |
107 | + | if ((currentPool == "")) | |
108 | + | then throw(("Cannot find pool with id " + currentPool)) | |
109 | + | else { | |
110 | + | let amount = getPuzzlePoolSuppliedAmount(currentPool) | |
111 | + | let tx = withdrawFromPuzzlePool(currentPool, amount) | |
112 | + | if ((tx == tx)) | |
113 | + | then tx | |
114 | + | else throw("Strict value is not equal to itself.") | |
115 | + | } | |
144 | 116 | } | |
145 | 117 | ||
146 | 118 | ||
147 | 119 | func supplyResult (poolId) = if ((indexOf(puzzlePools, poolId) == unit)) | |
148 | 120 | then throw(("Unknown poolId " + poolId)) | |
149 | 121 | else { | |
150 | 122 | let assetBytes = fromBase58String(assetId) | |
151 | 123 | let balance = getBalance(assetBytes) | |
152 | 124 | let inv = invoke(Address(fromBase58String(poolId)), "supply", nil, [AttachedPayment(assetBytes, balance)]) | |
153 | 125 | if ((inv == inv)) | |
154 | 126 | then [StringEntry("currentPool", poolId)] | |
155 | 127 | else throw("Strict value is not equal to itself.") | |
156 | 128 | } | |
157 | 129 | ||
158 | 130 | ||
159 | 131 | func calculateSRate () = { | |
160 | 132 | let lastCheckSRate = tryGetInt(this, "global_lastCheckSRate") | |
161 | 133 | let stakedAmount = tryGetInt(this, "global_staked") | |
162 | 134 | let lastCheckHeight = tryGetInt(this, "global_lastCheckSRateHeight") | |
163 | 135 | let blocks = (height - lastCheckHeight) | |
164 | 136 | let stakingEmission = (getTotalSuppliedAmount() - stakedAmount) | |
165 | 137 | if ((stakedAmount == 0)) | |
166 | 138 | then Scale8 | |
167 | 139 | else (lastCheckSRate + fraction((blocks * Scale8), stakingEmission, stakedAmount)) | |
168 | 140 | } | |
169 | 141 | ||
170 | 142 | ||
171 | 143 | func recalcResult (stakedChange) = { | |
172 | 144 | let stakedAmount = (tryGetInt(this, "global_staked") + stakedChange) | |
173 | 145 | let sRate = calculateSRate() | |
174 | 146 | [IntegerEntry("global_staked", stakedAmount), IntegerEntry("global_lastCheckSRate", sRate), IntegerEntry("global_lastCheckSRateHeight", height)] | |
175 | 147 | } | |
176 | 148 | ||
177 | 149 | ||
178 | 150 | func calculateStakedAmount (user) = { | |
179 | 151 | let amount = tryGetInt(this, (user + "_staked")) | |
180 | 152 | fraction(amount, calculateSRate(), Scale8) | |
181 | 153 | } | |
182 | 154 | ||
183 | 155 | ||
184 | 156 | func stakeResult (user,amount) = { | |
185 | 157 | let sAmount = fraction(amount, Scale8, calculateSRate()) | |
186 | 158 | (recalcResult(sAmount) ++ [IntegerEntry((user + "_staked"), (tryGetInt(this, (user + "_staked")) + sAmount))]) | |
187 | 159 | } | |
188 | 160 | ||
189 | 161 | ||
190 | 162 | func unstakeResult (user,amount) = { | |
191 | 163 | let sRate = calculateSRate() | |
192 | 164 | let sAmount = if ((sRate == 0)) | |
193 | 165 | then amount | |
194 | 166 | else fraction(amount, Scale8, sRate) | |
195 | 167 | let currentSAmount = tryGetInt(this, (user + "_staked")) | |
196 | 168 | if ((sAmount > currentSAmount)) | |
197 | 169 | then throw("this amount is not available to unclaim") | |
198 | 170 | else (recalcResult(-(sAmount)) ++ [IntegerEntry((user + "_staked"), (currentSAmount - sAmount))]) | |
199 | 171 | } | |
200 | 172 | ||
201 | 173 | ||
202 | 174 | @Callable(i) | |
203 | 175 | func invite (address) = { | |
204 | 176 | let user = toString(i.caller) | |
205 | 177 | let whiteListStr = tryGetStr(this, "whiteList") | |
206 | 178 | let whiteList = split(whiteListStr, ",") | |
207 | 179 | if (if ((whiteList[0] != "")) | |
208 | 180 | then (indexOf(whiteList, user) == unit) | |
209 | 181 | else false) | |
210 | 182 | then throw("access denied") | |
211 | 183 | else if ((addressFromString(address) == unit)) | |
212 | 184 | then throw("Invalid address") | |
213 | 185 | else [StringEntry("whiteList", if ((whiteList[0] == "")) | |
214 | 186 | then address | |
215 | 187 | else ((whiteListStr + ",") + address))] | |
216 | 188 | } | |
217 | 189 | ||
218 | 190 | ||
219 | 191 | ||
220 | 192 | @Callable(i) | |
221 | 193 | func getSRate (debug) = { | |
222 | 194 | let parameter = calculateSRate() | |
223 | 195 | if (debug) | |
224 | 196 | then throw(toString(parameter)) | |
225 | 197 | else $Tuple2(nil, parameter) | |
226 | 198 | } | |
227 | 199 | ||
228 | 200 | ||
229 | 201 | ||
230 | 202 | @Callable(i) | |
231 | 203 | func getStakedAmount (debug,userAddress) = { | |
232 | 204 | let parameter = calculateStakedAmount(userAddress) | |
233 | 205 | if (debug) | |
234 | 206 | then throw(toString(parameter)) | |
235 | 207 | else $Tuple2(nil, parameter) | |
236 | 208 | } | |
237 | 209 | ||
238 | 210 | ||
239 | 211 | ||
240 | 212 | @Callable(i) | |
241 | 213 | func getTotalStakedAmount (debug) = { | |
242 | 214 | let amount = tryGetInt(this, "global_staked") | |
243 | 215 | let parameter = fraction(amount, calculateSRate(), Scale8) | |
244 | 216 | if (debug) | |
245 | 217 | then throw(toString(parameter)) | |
246 | 218 | else $Tuple2(nil, parameter) | |
247 | 219 | } | |
248 | 220 | ||
249 | 221 | ||
250 | 222 | ||
251 | 223 | @Callable(i) | |
252 | 224 | func stake () = { | |
253 | 225 | let user = toString(i.caller) | |
254 | 226 | let amount = i.payments[0].amount | |
255 | 227 | let whiteList = split(tryGetStr(this, "whiteList"), ",") | |
256 | 228 | if (if ((0 >= amount)) | |
257 | 229 | then true | |
258 | 230 | else (i.payments[0].assetId != fromBase58String(assetId))) | |
259 | 231 | then throw("invalid token attached") | |
260 | 232 | else if ((indexOf(whiteList, user) == unit)) | |
261 | 233 | then throw("access denied") | |
262 | 234 | else { | |
263 | 235 | let currentPool = tryGetStr(this, "currentPool") | |
264 | 236 | (supplyResult(currentPool) ++ stakeResult(user, amount)) | |
265 | 237 | } | |
266 | 238 | } | |
267 | 239 | ||
268 | 240 | ||
269 | 241 | ||
270 | 242 | @Callable(i) | |
271 | 243 | func unstake (amount) = { | |
272 | 244 | let user = toString(i.caller) | |
273 | 245 | let currentPool = tryGetStr(this, "currentPool") | |
274 | 246 | let tx = withdrawFromPuzzlePool(currentPool, amount) | |
275 | 247 | if ((tx == tx)) | |
276 | 248 | then (unstakeResult(user, amount) ++ [ScriptTransfer(i.caller, amount, fromBase58String(assetId))]) | |
277 | 249 | else throw("Strict value is not equal to itself.") | |
278 | 250 | } | |
279 | 251 | ||
280 | 252 | ||
281 | 253 | ||
282 | 254 | @Callable(i) | |
283 | 255 | func withdraw () = if ((indexOf(validators, toString(i.caller)) == unit)) | |
284 | 256 | then throw("Access denied") | |
285 | 257 | else { | |
286 | 258 | let withdrawTx = withdrawResult() | |
287 | 259 | if ((withdrawTx == withdrawTx)) | |
288 | 260 | then nil | |
289 | 261 | else throw("Strict value is not equal to itself.") | |
290 | 262 | } | |
291 | 263 | ||
292 | 264 | ||
293 | 265 | ||
294 | 266 | @Callable(i) | |
295 | 267 | func supply (poolId) = { | |
296 | 268 | let currentPool = tryGetStr(this, "currentPool") | |
297 | 269 | if ((indexOf(validators, toString(i.caller)) == unit)) | |
298 | 270 | then throw("Access denied") | |
299 | 271 | else if ((currentPool == poolId)) | |
300 | 272 | then throw(("Already supplied to" + currentPool)) | |
301 | 273 | else supplyResult(poolId) | |
302 | 274 | } | |
303 | 275 | ||
304 | 276 | ||
305 | 277 | @Verifier(tx) | |
306 | 278 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
307 | 279 |
github/deemru/w8io/3ef1775 105.68 ms ◑