tx · FfCyS8xwSAAYPb9DTjHEHZhzGvJ2EfbVxbom5qMCQUts

3N91zFrRoofbPpkoDbWKrQsQSdLu2EgLL8c:  -0.01000000 Waves

2023.11.27 15:35 [2861819] smart account 3N91zFrRoofbPpkoDbWKrQsQSdLu2EgLL8c > SELF 0.00000000 Waves

{ "type": 13, "id": "FfCyS8xwSAAYPb9DTjHEHZhzGvJ2EfbVxbom5qMCQUts", "fee": 1000000, "feeAssetId": null, "timestamp": 1701088590114, "version": 2, "chainId": 84, "sender": "3N91zFrRoofbPpkoDbWKrQsQSdLu2EgLL8c", "senderPublicKey": "5FyjUYCR5Q8jvG6ri6Ysz574HerUK6r1LJzzQ7DvSkLk", "proofs": [ "HyzZMYCyc7J2gfHkYwQZ3TkEQU8K7GSwk1H6dxigSb62bddk8LKYKDboMKy6hj423faqyL3AxkLptSDtUJ1dQ2J" ], "script": "base64:BgIVCAISBgoEAgICARIECgIICBIDCgECIQAJc2VwYXJhdG9yAgJfXwAHY2hhaW5JZAkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQAIY2hhaW5JZFQBAVQACGNoYWluSWRXAQFXAQttdXN0QWRkcmVzcwIBaQdhZGRyZXNzAwkAAAIIBQFpBmNhbGxlcgUHYWRkcmVzcwYJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAEIbXVzdFRoaXMBAWkJAQttdXN0QWRkcmVzcwIFAWkFBHRoaXMAC3dhdmVzU3RyaW5nAgVXQVZFUwANcXVldWVJdGVtU2l6ZQAgAQxwYXJzZUFzc2V0SWQBBWlucHV0AwkAAAIFBWlucHV0BQt3YXZlc1N0cmluZwUEdW5pdAkA2QQBBQVpbnB1dAEPYXNzZXRJZFRvU3RyaW5nAQVpbnB1dAMJAAACBQVpbnB1dAUEdW5pdAULd2F2ZXNTdHJpbmcJANgEAQkBBXZhbHVlAQUFaW5wdXQAEWtTZXJ2aWNlUHVibGljS2V5AhQlc19fc2VydmljZVB1YmxpY0tleQANa0JvdFB1YmxpY0tleQIQJXNfX2JvdFB1YmxpY0tleQAOa0FjY291bnRTY3JpcHQCESVzX19hY2NvdW50U2NyaXB0AQ1hY2NvdW50U2NyaXB0AAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFBHRoaXMFDmtBY2NvdW50U2NyaXB0AhlhY2NvdW50IHNjcmlwdCBpcyBub3Qgc2V0AA1rUmV3YXJkQW1vdW50AhAlc19fcmV3YXJkQW1vdW50AQxyZXdhcmRBbW91bnQACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUNa1Jld2FyZEFtb3VudAIYcmV3YXJkIGFtb3VudCBpcyBub3Qgc2V0ABRSRVFVRVNUX1NUQVRVU19FTVBUWQAAABRSRVFVRVNUX1NUQVRVU19SRUFEWQABAQ5rUmVxdWVzdFN0YXR1cwEJcmVxdWVzdElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCCQDYBAEFCXJlcXVlc3RJZAkAzAgCAgZzdGF0dXMFA25pbAUJc2VwYXJhdG9yARhrQWNjb3VudENyZWF0b3JQdWJsaWNLZXkBDmFjY291bnRBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCCQClCAEFDmFjY291bnRBZGRyZXNzCQDMCAICEGNyZWF0b3JQdWJsaWNLZXkFA25pbAUJc2VwYXJhdG9yARZrUmVxdWVzdE93bmVyUHVibGljS2V5AQlyZXF1ZXN0SWQJALkJAgkAzAgCAgQlcyVzCQDMCAIJANgEAQUJcmVxdWVzdElkCQDMCAICDm93bmVyUHVibGljS2V5BQNuaWwFCXNlcGFyYXRvcgEVa1JlcXVlc3RBbW91bnRBc3NldElkAQlyZXF1ZXN0SWQJALkJAgkAzAgCAgQlcyVzCQDMCAIJANgEAQUJcmVxdWVzdElkCQDMCAICDWFtb3VudEFzc2V0SWQFA25pbAUJc2VwYXJhdG9yARRrUmVxdWVzdFByaWNlQXNzZXRJZAEJcmVxdWVzdElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCCQDYBAEFCXJlcXVlc3RJZAkAzAgCAgxwcmljZUFzc2V0SWQFA25pbAUJc2VwYXJhdG9yARxrUmVxdWVzdElkVG9BY2NvdW50UHVibGljS2V5AQlyZXF1ZXN0SWQJALkJAgkAzAgCAgQlcyVzCQDMCAIJANgEAQUJcmVxdWVzdElkCQDMCAICG3JlcXVlc3RJZFRvQWNjb3VudFB1YmxpY0tleQUDbmlsBQlzZXBhcmF0b3IBGmtBY2NvdW50QWRkcmVzc1RvUmVxdWVzdElkAQ5hY2NvdW50QWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgkApQgBBQ5hY2NvdW50QWRkcmVzcwkAzAgCAhlhY2NvdW50QWRkcmVzc1RvUmVxdWVzdElkBQNuaWwFCXNlcGFyYXRvcgEOa1JlcXVlc3RzUXVldWUACQC5CQIJAMwIAgICJXMJAMwIAgINcmVxdWVzdHNRdWV1ZQUDbmlsBQlzZXBhcmF0b3IBDXJlcXVlc3RzUXVldWUACQELdmFsdWVPckVsc2UCCQCcCAIFBHRoaXMJAQ5rUmVxdWVzdHNRdWV1ZQABAAEOa0FjY291bnRzUXVldWUACQC5CQIJAMwIAgICJXMJAMwIAgINYWNjb3VudHNRdWV1ZQUDbmlsBQlzZXBhcmF0b3IBDWFjY291bnRzUXVldWUACQELdmFsdWVPckVsc2UCCQCcCAIFBHRoaXMJAQ5rQWNjb3VudHNRdWV1ZQABAAEMa1BhaXJBbGxvd2VkAg1hbW91bnRBc3NldElkDHByaWNlQXNzZXRJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCCQEPYXNzZXRJZFRvU3RyaW5nAQUNYW1vdW50QXNzZXRJZAkAzAgCCQEPYXNzZXRJZFRvU3RyaW5nAQUMcHJpY2VBc3NldElkCQDMCAICC3BhaXJBbGxvd2VkBQNuaWwFCXNlcGFyYXRvcgELcGFpckFsbG93ZWQCDWFtb3VudEFzc2V0SWQMcHJpY2VBc3NldElkCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAQxrUGFpckFsbG93ZWQCBQ1hbW91bnRBc3NldElkBQxwcmljZUFzc2V0SWQHAA5zZXJ2aWNlQWRkcmVzcwkApwgBCQERQGV4dHJOYXRpdmUoMTA1MikCBQR0aGlzBRFrU2VydmljZVB1YmxpY0tleQAMYm90UHVibGljS2V5CQERQGV4dHJOYXRpdmUoMTA1MikCBQR0aGlzBQ1rQm90UHVibGljS2V5AwFpAQRpbml0BBBzZXJ2aWNlUHVibGljS2V5DGJvdFB1YmxpY0tleQ1hY2NvdW50U2NyaXB0DHJld2FyZEFtb3VudAQLY2hlY2tDYWxsZXIJAQhtdXN0VGhpcwEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyCQCUCgIJAMwIAgkBC0JpbmFyeUVudHJ5AgURa1NlcnZpY2VQdWJsaWNLZXkFEHNlcnZpY2VQdWJsaWNLZXkJAMwIAgkBC0JpbmFyeUVudHJ5AgUNa0JvdFB1YmxpY0tleQUMYm90UHVibGljS2V5CQDMCAIJAQtCaW5hcnlFbnRyeQIFDmtBY2NvdW50U2NyaXB0BQ1hY2NvdW50U2NyaXB0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rUmV3YXJkQW1vdW50BQxyZXdhcmRBbW91bnQFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5yZXF1ZXN0QWNjb3VudAIQYW1vdW50QXNzZXRJZFN0cg9wcmljZUFzc2V0SWRTdHIECXJlcXVlc3RJZAkA9wMBCQDLAQIJAMsBAggIBQFpBmNhbGxlcgVieXRlcwkA2QQBBRBhbW91bnRBc3NldElkU3RyCQDZBAEFD3ByaWNlQXNzZXRJZFN0cgQNYW1vdW50QXNzZXRJZAkBDHBhcnNlQXNzZXRJZAEFEGFtb3VudEFzc2V0SWRTdHIEDHByaWNlQXNzZXRJZAkBDHBhcnNlQXNzZXRJZAEFD3ByaWNlQXNzZXRJZFN0cgQGY2hlY2tzCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkAAgECFTEgcGF5bWVudCBpcyByZXF1aXJlZAkAzAgCAwkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUEdW5pdAYJAAIBAg1pbnZhbGlkIGFzc2V0CQDMCAIDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxyZXdhcmRBbW91bnQABgkAAgECDmludmFsaWQgYW1vdW50CQDMCAIDCQELcGFpckFsbG93ZWQCBQ1hbW91bnRBc3NldElkBQxwcmljZUFzc2V0SWQGCQACAQITcGFpciBpcyBub3QgYWxsb3dlZAkAzAgCAwkAAAIJAJoIAgUEdGhpcwkBDmtSZXF1ZXN0U3RhdHVzAQUJcmVxdWVzdElkBQR1bml0BgkAAgECGWFjY291bnQgaXMgYWxyZWFkeSBleGlzdHMFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQHYWN0aW9ucwMJAAACCQDIAQEJAQ1hY2NvdW50c1F1ZXVlAAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOa1JlcXVlc3RTdGF0dXMBBQlyZXF1ZXN0SWQFFFJFUVVFU1RfU1RBVFVTX0VNUFRZCQDMCAIJAQtCaW5hcnlFbnRyeQIJAQ5rUmVxdWVzdHNRdWV1ZQAJAMsBAgkBDXJlcXVlc3RzUXVldWUABQlyZXF1ZXN0SWQFA25pbAQQYWNjb3VudFB1YmxpY0tleQkAyQECCQENYWNjb3VudHNRdWV1ZQAFDXF1ZXVlSXRlbVNpemUEDmFjY291bnRBZGRyZXNzCQCnCAEFEGFjY291bnRQdWJsaWNLZXkEDmNyZWF0b3JBZGRyZXNzCQCnCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQR0aGlzCQEYa0FjY291bnRDcmVhdG9yUHVibGljS2V5AQUOYWNjb3VudEFkZHJlc3MCGmludmFsaWQgY3JlYXRvciBwdWJsaWMga2V5CQDMCAIJAQtCaW5hcnlFbnRyeQIJAQ5rQWNjb3VudHNRdWV1ZQAJAMoBAgkBDWFjY291bnRzUXVldWUABQ1xdWV1ZUl0ZW1TaXplCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOa1JlcXVlc3RTdGF0dXMBBQlyZXF1ZXN0SWQFFFJFUVVFU1RfU1RBVFVTX1JFQURZCQDMCAIJAQtCaW5hcnlFbnRyeQIJARxrUmVxdWVzdElkVG9BY2NvdW50UHVibGljS2V5AQUJcmVxdWVzdElkBRBhY2NvdW50UHVibGljS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprQWNjb3VudEFkZHJlc3NUb1JlcXVlc3RJZAEFDmFjY291bnRBZGRyZXNzCQDYBAEFCXJlcXVlc3RJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5jcmVhdG9yQWRkcmVzcwkBDHJld2FyZEFtb3VudAAFBHVuaXQFA25pbAkAlAoCCQDOCAIFB2FjdGlvbnMJAMwIAgkBC0JpbmFyeUVudHJ5AgkBFmtSZXF1ZXN0T3duZXJQdWJsaWNLZXkBBQlyZXF1ZXN0SWQIBQFpD2NhbGxlclB1YmxpY0tleQkAzAgCCQELU3RyaW5nRW50cnkCCQEVa1JlcXVlc3RBbW91bnRBc3NldElkAQUJcmVxdWVzdElkBRBhbW91bnRBc3NldElkU3RyCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrUmVxdWVzdFByaWNlQXNzZXRJZAEFCXJlcXVlc3RJZAUPcHJpY2VBc3NldElkU3RyBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKYWRkQWNjb3VudAEQY3JlYXRvclB1YmxpY0tleQQQYWNjb3VudFB1YmxpY0tleQgFAWkPY2FsbGVyUHVibGljS2V5BA5hY2NvdW50QWRkcmVzcwgFAWkGY2FsbGVyBA5jcmVhdG9yQWRkcmVzcwkApwgBBRBjcmVhdG9yUHVibGljS2V5BAZjaGVja3MJAMwIAgMJAAACCQCcCAIFBHRoaXMJARhrQWNjb3VudENyZWF0b3JQdWJsaWNLZXkBBQ5hY2NvdW50QWRkcmVzcwUEdW5pdAYJAAIBAhlhY2NvdW50IGlzIGFscmVhZHkgZXhpc3RzCQDMCAIDBAckbWF0Y2gwCQDxBwEFDmFjY291bnRBZGRyZXNzAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJAAACBQFiCQDxFQEJAQ1hY2NvdW50U2NyaXB0AAcGCQACAQIOaW52YWxpZCBzY3JpcHQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQHYWN0aW9ucwMJAAACCQDIAQEJAQ1yZXF1ZXN0c1F1ZXVlAAAACQDMCAIJAQtCaW5hcnlFbnRyeQIJAQ5rQWNjb3VudHNRdWV1ZQAJAMsBAgkBDWFjY291bnRzUXVldWUABRBhY2NvdW50UHVibGljS2V5BQNuaWwECXJlcXVlc3RJZAkAyQECCQENcmVxdWVzdHNRdWV1ZQAFDXF1ZXVlSXRlbVNpemUJAMwIAgkBC0JpbmFyeUVudHJ5AgkBDmtSZXF1ZXN0c1F1ZXVlAAkAygECCQENcmVxdWVzdHNRdWV1ZQAFDXF1ZXVlSXRlbVNpemUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rUmVxdWVzdFN0YXR1cwEFCXJlcXVlc3RJZAUUUkVRVUVTVF9TVEFUVVNfUkVBRFkJAMwIAgkBC0JpbmFyeUVudHJ5AgkBHGtSZXF1ZXN0SWRUb0FjY291bnRQdWJsaWNLZXkBBQlyZXF1ZXN0SWQFEGFjY291bnRQdWJsaWNLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBGmtBY2NvdW50QWRkcmVzc1RvUmVxdWVzdElkAQUOYWNjb3VudEFkZHJlc3MJANgEAQUJcmVxdWVzdElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDmNyZWF0b3JBZGRyZXNzCQEMcmV3YXJkQW1vdW50AAUEdW5pdAUDbmlsCQCUCgIJAM4IAgUHYWN0aW9ucwkAzAgCCQELQmluYXJ5RW50cnkCCQEYa0FjY291bnRDcmVhdG9yUHVibGljS2V5AQUOYWNjb3VudEFkZHJlc3MFEGNyZWF0b3JQdWJsaWNLZXkFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgDkfR+U", "height": 2861819, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7t3hKbDaEDscitJVr4p2E8VYHPpHPdBu2XdTzHaHbpfw Next: 5jp7TUAuSrb2N5aiXScgKDBiKk3ahQJf3GJ8CGxVzjLU Diff:
OldNewDifferences
1818
1919
2020 let wavesString = "WAVES"
21+
22+let queueItemSize = 32
2123
2224 func parseAssetId (input) = if ((input == wavesString))
2325 then unit
4345 func rewardAmount () = valueOrErrorMessage(getInteger(this, kRewardAmount), "reward amount is not set")
4446
4547
46-let ACCOUNT_STATUS_EMPTY = 0
48+let REQUEST_STATUS_EMPTY = 0
4749
48-let ACCOUNT_STATUS_READY = 1
50+let REQUEST_STATUS_READY = 1
4951
50-func kAccountStatus (accountId) = makeString(["%s%s", accountId, "status"], separator)
52+func kRequestStatus (requestId) = makeString(["%s%s", toBase58String(requestId), "status"], separator)
5153
5254
53-func accountStatus (accountId) = valueOrErrorMessage(getInteger(this, kAccountStatus(accountId)), "account is not found")
55+func kAccountCreatorPublicKey (accountAddress) = makeString(["%s%s", toString(accountAddress), "creatorPublicKey"], separator)
5456
5557
56-func kAccountCreatorPublicKey (accountId) = makeString(["%s%s", accountId, "creatorPublicKey"], separator)
58+func kRequestOwnerPublicKey (requestId) = makeString(["%s%s", toBase58String(requestId), "ownerPublicKey"], separator)
5759
5860
59-func kAccountOwnerPublicKey (accountId) = makeString(["%s%s", accountId, "ownerPublicKey"], separator)
61+func kRequestAmountAssetId (requestId) = makeString(["%s%s", toBase58String(requestId), "amountAssetId"], separator)
6062
6163
62-func kAccountAmountAssetId (accountId) = makeString(["%s%s", accountId, "amountAssetId"], separator)
64+func kRequestPriceAssetId (requestId) = makeString(["%s%s", toBase58String(requestId), "priceAssetId"], separator)
6365
6466
65-func kAccountPriceAssetId (accountId) = makeString(["%s%s", accountId, "priceAssetId"], separator)
67+func kRequestIdToAccountPublicKey (requestId) = makeString(["%s%s", toBase58String(requestId), "requestIdToAccountPublicKey"], separator)
6668
6769
68-func kAccountIdToAccountPublicKey (accountId) = makeString(["%s%s", accountId, "accountIdToAccountPublicKey"], separator)
70+func kAccountAddressToRequestId (accountAddress) = makeString(["%s%s", toString(accountAddress), "accountAddressToRequestId"], separator)
6971
7072
71-func kAccountAddressToAccountId (accountAddress) = makeString(["%s%s", toString(accountAddress), "accountAddressToAccountId"], separator)
73+func kRequestsQueue () = makeString(["%s", "requestsQueue"], separator)
74+
75+
76+func requestsQueue () = valueOrElse(getBinary(this, kRequestsQueue()), base58'')
77+
78+
79+func kAccountsQueue () = makeString(["%s", "accountsQueue"], separator)
80+
81+
82+func accountsQueue () = valueOrElse(getBinary(this, kAccountsQueue()), base58'')
7283
7384
7485 func kPairAllowed (amountAssetId,priceAssetId) = makeString(["%s%s%s", assetIdToString(amountAssetId), assetIdToString(priceAssetId), "pairAllowed"], separator)
92103
93104
94105 @Callable(i)
95-func request (amountAssetIdStr,priceAssetIdStr) = {
96- let accountId = makeString([toString(i.caller), amountAssetIdStr, priceAssetIdStr], ":")
106+func requestAccount (amountAssetIdStr,priceAssetIdStr) = {
107+ let requestId = sha256(((i.caller.bytes + fromBase58String(amountAssetIdStr)) + fromBase58String(priceAssetIdStr)))
97108 let amountAssetId = parseAssetId(amountAssetIdStr)
98109 let priceAssetId = parseAssetId(priceAssetIdStr)
99110 let checks = [if ((size(i.payments) == 1))
104115 then true
105116 else throw("invalid amount"), if (pairAllowed(amountAssetId, priceAssetId))
106117 then true
107- else throw("pair is not allowed"), if ((getInteger(this, kAccountStatus(accountId)) == unit))
118+ else throw("pair is not allowed"), if ((getInteger(this, kRequestStatus(requestId)) == unit))
108119 then true
109- else throw("account already exists")]
120+ else throw("account is already exists")]
110121 if ((checks == checks))
111- then $Tuple2([IntegerEntry(kAccountStatus(accountId), 0), BinaryEntry(kAccountOwnerPublicKey(accountId), i.callerPublicKey), StringEntry(kAccountAmountAssetId(accountId), amountAssetIdStr), StringEntry(kAccountPriceAssetId(accountId), priceAssetIdStr)], unit)
122+ then {
123+ let actions = if ((size(accountsQueue()) == 0))
124+ then [IntegerEntry(kRequestStatus(requestId), REQUEST_STATUS_EMPTY), BinaryEntry(kRequestsQueue(), (requestsQueue() + requestId))]
125+ else {
126+ let accountPublicKey = take(accountsQueue(), queueItemSize)
127+ let accountAddress = addressFromPublicKey(accountPublicKey)
128+ let creatorAddress = addressFromPublicKey(valueOrErrorMessage(getBinary(this, kAccountCreatorPublicKey(accountAddress)), "invalid creator public key"))
129+[BinaryEntry(kAccountsQueue(), drop(accountsQueue(), queueItemSize)), IntegerEntry(kRequestStatus(requestId), REQUEST_STATUS_READY), BinaryEntry(kRequestIdToAccountPublicKey(requestId), accountPublicKey), StringEntry(kAccountAddressToRequestId(accountAddress), toBase58String(requestId)), ScriptTransfer(creatorAddress, rewardAmount(), unit)]
130+ }
131+ $Tuple2((actions ++ [BinaryEntry(kRequestOwnerPublicKey(requestId), i.callerPublicKey), StringEntry(kRequestAmountAssetId(requestId), amountAssetIdStr), StringEntry(kRequestPriceAssetId(requestId), priceAssetIdStr)]), unit)
132+ }
112133 else throw("Strict value is not equal to itself.")
113134 }
114135
115136
116137
117138 @Callable(i)
118-func complete (accountId,creatorPublicKey) = {
139+func addAccount (creatorPublicKey) = {
119140 let accountPublicKey = i.callerPublicKey
120141 let accountAddress = i.caller
121- let checks = [if ((accountStatus(accountId) == ACCOUNT_STATUS_EMPTY))
142+ let creatorAddress = addressFromPublicKey(creatorPublicKey)
143+ let checks = [if ((getBinary(this, kAccountCreatorPublicKey(accountAddress)) == unit))
122144 then true
123145 else throw("account is already exists"), if ( match scriptHash(accountAddress) {
124146 case b: ByteVector =>
130152 else throw("invalid script")]
131153 if ((checks == checks))
132154 then {
133- let creatorAddress = addressFromPublicKey(creatorPublicKey)
134- $Tuple2([IntegerEntry(kAccountStatus(accountId), ACCOUNT_STATUS_READY), BinaryEntry(kAccountCreatorPublicKey(accountId), creatorPublicKey), BinaryEntry(kAccountIdToAccountPublicKey(accountId), accountPublicKey), StringEntry(kAccountAddressToAccountId(accountAddress), accountId), ScriptTransfer(creatorAddress, rewardAmount(), unit)], unit)
155+ let actions = if ((size(requestsQueue()) == 0))
156+ then [BinaryEntry(kAccountsQueue(), (accountsQueue() + accountPublicKey))]
157+ else {
158+ let requestId = take(requestsQueue(), queueItemSize)
159+[BinaryEntry(kRequestsQueue(), drop(requestsQueue(), queueItemSize)), IntegerEntry(kRequestStatus(requestId), REQUEST_STATUS_READY), BinaryEntry(kRequestIdToAccountPublicKey(requestId), accountPublicKey), StringEntry(kAccountAddressToRequestId(accountAddress), toBase58String(requestId)), ScriptTransfer(creatorAddress, rewardAmount(), unit)]
160+ }
161+ $Tuple2((actions ++ [BinaryEntry(kAccountCreatorPublicKey(accountAddress), creatorPublicKey)]), unit)
135162 }
136163 else throw("Strict value is not equal to itself.")
137164 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let chainId = take(drop(this.bytes, 1), 1)
77
88 let chainIdT = base58'2T'
99
1010 let chainIdW = base58'2W'
1111
1212 func mustAddress (i,address) = if ((i.caller == address))
1313 then true
1414 else throw("permission denied")
1515
1616
1717 func mustThis (i) = mustAddress(i, this)
1818
1919
2020 let wavesString = "WAVES"
21+
22+let queueItemSize = 32
2123
2224 func parseAssetId (input) = if ((input == wavesString))
2325 then unit
2426 else fromBase58String(input)
2527
2628
2729 func assetIdToString (input) = if ((input == unit))
2830 then wavesString
2931 else toBase58String(value(input))
3032
3133
3234 let kServicePublicKey = "%s__servicePublicKey"
3335
3436 let kBotPublicKey = "%s__botPublicKey"
3537
3638 let kAccountScript = "%s__accountScript"
3739
3840 func accountScript () = valueOrErrorMessage(getBinary(this, kAccountScript), "account script is not set")
3941
4042
4143 let kRewardAmount = "%s__rewardAmount"
4244
4345 func rewardAmount () = valueOrErrorMessage(getInteger(this, kRewardAmount), "reward amount is not set")
4446
4547
46-let ACCOUNT_STATUS_EMPTY = 0
48+let REQUEST_STATUS_EMPTY = 0
4749
48-let ACCOUNT_STATUS_READY = 1
50+let REQUEST_STATUS_READY = 1
4951
50-func kAccountStatus (accountId) = makeString(["%s%s", accountId, "status"], separator)
52+func kRequestStatus (requestId) = makeString(["%s%s", toBase58String(requestId), "status"], separator)
5153
5254
53-func accountStatus (accountId) = valueOrErrorMessage(getInteger(this, kAccountStatus(accountId)), "account is not found")
55+func kAccountCreatorPublicKey (accountAddress) = makeString(["%s%s", toString(accountAddress), "creatorPublicKey"], separator)
5456
5557
56-func kAccountCreatorPublicKey (accountId) = makeString(["%s%s", accountId, "creatorPublicKey"], separator)
58+func kRequestOwnerPublicKey (requestId) = makeString(["%s%s", toBase58String(requestId), "ownerPublicKey"], separator)
5759
5860
59-func kAccountOwnerPublicKey (accountId) = makeString(["%s%s", accountId, "ownerPublicKey"], separator)
61+func kRequestAmountAssetId (requestId) = makeString(["%s%s", toBase58String(requestId), "amountAssetId"], separator)
6062
6163
62-func kAccountAmountAssetId (accountId) = makeString(["%s%s", accountId, "amountAssetId"], separator)
64+func kRequestPriceAssetId (requestId) = makeString(["%s%s", toBase58String(requestId), "priceAssetId"], separator)
6365
6466
65-func kAccountPriceAssetId (accountId) = makeString(["%s%s", accountId, "priceAssetId"], separator)
67+func kRequestIdToAccountPublicKey (requestId) = makeString(["%s%s", toBase58String(requestId), "requestIdToAccountPublicKey"], separator)
6668
6769
68-func kAccountIdToAccountPublicKey (accountId) = makeString(["%s%s", accountId, "accountIdToAccountPublicKey"], separator)
70+func kAccountAddressToRequestId (accountAddress) = makeString(["%s%s", toString(accountAddress), "accountAddressToRequestId"], separator)
6971
7072
71-func kAccountAddressToAccountId (accountAddress) = makeString(["%s%s", toString(accountAddress), "accountAddressToAccountId"], separator)
73+func kRequestsQueue () = makeString(["%s", "requestsQueue"], separator)
74+
75+
76+func requestsQueue () = valueOrElse(getBinary(this, kRequestsQueue()), base58'')
77+
78+
79+func kAccountsQueue () = makeString(["%s", "accountsQueue"], separator)
80+
81+
82+func accountsQueue () = valueOrElse(getBinary(this, kAccountsQueue()), base58'')
7283
7384
7485 func kPairAllowed (amountAssetId,priceAssetId) = makeString(["%s%s%s", assetIdToString(amountAssetId), assetIdToString(priceAssetId), "pairAllowed"], separator)
7586
7687
7788 func pairAllowed (amountAssetId,priceAssetId) = valueOrElse(getBoolean(this, kPairAllowed(amountAssetId, priceAssetId)), false)
7889
7990
8091 let serviceAddress = addressFromPublicKey(getBinaryValue(this, kServicePublicKey))
8192
8293 let botPublicKey = getBinaryValue(this, kBotPublicKey)
8394
8495 @Callable(i)
8596 func init (servicePublicKey,botPublicKey,accountScript,rewardAmount) = {
8697 let checkCaller = mustThis(i)
8798 if ((checkCaller == checkCaller))
8899 then $Tuple2([BinaryEntry(kServicePublicKey, servicePublicKey), BinaryEntry(kBotPublicKey, botPublicKey), BinaryEntry(kAccountScript, accountScript), IntegerEntry(kRewardAmount, rewardAmount)], unit)
89100 else throw("Strict value is not equal to itself.")
90101 }
91102
92103
93104
94105 @Callable(i)
95-func request (amountAssetIdStr,priceAssetIdStr) = {
96- let accountId = makeString([toString(i.caller), amountAssetIdStr, priceAssetIdStr], ":")
106+func requestAccount (amountAssetIdStr,priceAssetIdStr) = {
107+ let requestId = sha256(((i.caller.bytes + fromBase58String(amountAssetIdStr)) + fromBase58String(priceAssetIdStr)))
97108 let amountAssetId = parseAssetId(amountAssetIdStr)
98109 let priceAssetId = parseAssetId(priceAssetIdStr)
99110 let checks = [if ((size(i.payments) == 1))
100111 then true
101112 else throw("1 payment is required"), if ((i.payments[0].assetId == unit))
102113 then true
103114 else throw("invalid asset"), if ((i.payments[0].amount == rewardAmount()))
104115 then true
105116 else throw("invalid amount"), if (pairAllowed(amountAssetId, priceAssetId))
106117 then true
107- else throw("pair is not allowed"), if ((getInteger(this, kAccountStatus(accountId)) == unit))
118+ else throw("pair is not allowed"), if ((getInteger(this, kRequestStatus(requestId)) == unit))
108119 then true
109- else throw("account already exists")]
120+ else throw("account is already exists")]
110121 if ((checks == checks))
111- then $Tuple2([IntegerEntry(kAccountStatus(accountId), 0), BinaryEntry(kAccountOwnerPublicKey(accountId), i.callerPublicKey), StringEntry(kAccountAmountAssetId(accountId), amountAssetIdStr), StringEntry(kAccountPriceAssetId(accountId), priceAssetIdStr)], unit)
122+ then {
123+ let actions = if ((size(accountsQueue()) == 0))
124+ then [IntegerEntry(kRequestStatus(requestId), REQUEST_STATUS_EMPTY), BinaryEntry(kRequestsQueue(), (requestsQueue() + requestId))]
125+ else {
126+ let accountPublicKey = take(accountsQueue(), queueItemSize)
127+ let accountAddress = addressFromPublicKey(accountPublicKey)
128+ let creatorAddress = addressFromPublicKey(valueOrErrorMessage(getBinary(this, kAccountCreatorPublicKey(accountAddress)), "invalid creator public key"))
129+[BinaryEntry(kAccountsQueue(), drop(accountsQueue(), queueItemSize)), IntegerEntry(kRequestStatus(requestId), REQUEST_STATUS_READY), BinaryEntry(kRequestIdToAccountPublicKey(requestId), accountPublicKey), StringEntry(kAccountAddressToRequestId(accountAddress), toBase58String(requestId)), ScriptTransfer(creatorAddress, rewardAmount(), unit)]
130+ }
131+ $Tuple2((actions ++ [BinaryEntry(kRequestOwnerPublicKey(requestId), i.callerPublicKey), StringEntry(kRequestAmountAssetId(requestId), amountAssetIdStr), StringEntry(kRequestPriceAssetId(requestId), priceAssetIdStr)]), unit)
132+ }
112133 else throw("Strict value is not equal to itself.")
113134 }
114135
115136
116137
117138 @Callable(i)
118-func complete (accountId,creatorPublicKey) = {
139+func addAccount (creatorPublicKey) = {
119140 let accountPublicKey = i.callerPublicKey
120141 let accountAddress = i.caller
121- let checks = [if ((accountStatus(accountId) == ACCOUNT_STATUS_EMPTY))
142+ let creatorAddress = addressFromPublicKey(creatorPublicKey)
143+ let checks = [if ((getBinary(this, kAccountCreatorPublicKey(accountAddress)) == unit))
122144 then true
123145 else throw("account is already exists"), if ( match scriptHash(accountAddress) {
124146 case b: ByteVector =>
125147 (b == blake2b256_32Kb(accountScript()))
126148 case _ =>
127149 false
128150 })
129151 then true
130152 else throw("invalid script")]
131153 if ((checks == checks))
132154 then {
133- let creatorAddress = addressFromPublicKey(creatorPublicKey)
134- $Tuple2([IntegerEntry(kAccountStatus(accountId), ACCOUNT_STATUS_READY), BinaryEntry(kAccountCreatorPublicKey(accountId), creatorPublicKey), BinaryEntry(kAccountIdToAccountPublicKey(accountId), accountPublicKey), StringEntry(kAccountAddressToAccountId(accountAddress), accountId), ScriptTransfer(creatorAddress, rewardAmount(), unit)], unit)
155+ let actions = if ((size(requestsQueue()) == 0))
156+ then [BinaryEntry(kAccountsQueue(), (accountsQueue() + accountPublicKey))]
157+ else {
158+ let requestId = take(requestsQueue(), queueItemSize)
159+[BinaryEntry(kRequestsQueue(), drop(requestsQueue(), queueItemSize)), IntegerEntry(kRequestStatus(requestId), REQUEST_STATUS_READY), BinaryEntry(kRequestIdToAccountPublicKey(requestId), accountPublicKey), StringEntry(kAccountAddressToRequestId(accountAddress), toBase58String(requestId)), ScriptTransfer(creatorAddress, rewardAmount(), unit)]
160+ }
161+ $Tuple2((actions ++ [BinaryEntry(kAccountCreatorPublicKey(accountAddress), creatorPublicKey)]), unit)
135162 }
136163 else throw("Strict value is not equal to itself.")
137164 }
138165
139166

github/deemru/w8io/169f3d6 
55.36 ms