tx · xFHmzfUQPcoZ5B6hFrU74ZvzYtn1Qhh7Fd6jebNwY3j 3N9tKixzqTYWnEXQxrDQ5pBTGvQd6sFsvmV: -0.05000000 Waves 2023.06.09 11:39 [2614907] smart account 3N9tKixzqTYWnEXQxrDQ5pBTGvQd6sFsvmV > SELF 0.00000000 Waves
{ "type": 13, "id": "xFHmzfUQPcoZ5B6hFrU74ZvzYtn1Qhh7Fd6jebNwY3j", "fee": 5000000, "feeAssetId": null, "timestamp": 1686299993040, "version": 2, "chainId": 84, "sender": "3N9tKixzqTYWnEXQxrDQ5pBTGvQd6sFsvmV", "senderPublicKey": "DS6HkopS9zypvxX6VhkdNvv6v4wcPZuChRvTwKJeacxE", "proofs": [ "3at4sjAeM1vCq8A7MSY8mWKbAgBWcMfqecycdZfhcoLAejrEaLPLgj2w11nXn9udyLUjv8mkm9Sn1UQW6VGahc4y" ], "script": "base64:BgISCAISAwoBCBIDCgEIEgQKAggIDAARQUlfVE9LRU5fQVNTRVRfSUQBIJPhcjhxBJtq6JpjHwQkt2RTlyw+vGYLg3SvaLskjeJCAAtTVEFUVVNfT1BFTgIEb3BlbgASU1RBVFVTX0NIRUNLRURfT1VUAgtjaGVja2VkX291dAALU1RBVFVTX0RPTkUCBGRvbmUADkNIRUNLRURfT1VUX0JZAg9fY2hlY2tlZF9vdXRfYnkAE1NJTVBMRV9DSEFUR1BUX1RBU0sCFHNpbWlwbGVfQ2hhdEdQVF90YXNrABBDSEVDS19PVVRfSEVJR0hUAhFfY2hlY2tfb3V0X2hlaWdodAAPUkVHSVNURVJfSEVJR0hUAhBfcmVnaXN0ZXJfaGVpZ2h0AA1DT01NSVRfSEVJR0hUAg5fY29tbWl0X2hlaWdodAEPY2FuQmVDaGVja2VkT3V0AQZ0YXNrSWQEBnN0YXR1cwkAnQgCBQR0aGlzCQCsAgIFBnRhc2tJZAIHX3N0YXR1cwkAAAIFBnN0YXR1cwULU1RBVFVTX09QRU4BDmlzQ29ycmVjdEFnZW50AgZ0YXNrSWQHYWdlbnRJZAQPY2hlY2tvdXRBZ2VudElkCQCdCAIFBHRoaXMJAKwCAgUGdGFza0lkBQ5DSEVDS0VEX09VVF9CWQkAAAIFD2NoZWNrb3V0QWdlbnRJZAUHYWdlbnRJZAEJZ2V0VGFza0lkAQR0eElkBA9jYWxsZXJQdWJsaWNLZXkEByRtYXRjaDAJAJ0IAgUEdGhpcwkArAICBQR0eElkAgxfaW5pdGlhbGl6ZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANzdHIFByRtYXRjaDAFA3N0cgIABAckbWF0Y2gwCQCdCAIFBHRoaXMJAKwCAgkArAICBQR0eElkAgFfBQ9jYWxsZXJQdWJsaWNLZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANzdHIFByRtYXRjaDAFA3N0cgIAAwFpARNyZWdpc3RlckNoYXRHUFRUYXNrAQtkZXNjcmlwdGlvbgQQbnVtYmVyT2ZQYXltZW50cwkAkAMBCAUBaQhwYXltZW50cwMJAQIhPQIFEG51bWJlck9mUGF5bWVudHMAAQkAAgECElBheW1lbnQgbmVjZXNzYXJ5IQQPY2FsbGVyUHVibGljS2V5CQCwCQEIBQFpD2NhbGxlclB1YmxpY0tleQQEdHhJZAkAsAkBCAUBaQ10cmFuc2FjdGlvbklkBAdwYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEA2ZlZQgFB3BheW1lbnQGYW1vdW50BApmZWVBc3NldElkCAUHcGF5bWVudAdhc3NldElkBAZ0YXNrSWQJAKwCAgkArAICBQR0eElkAgFfBQ9jYWxsZXJQdWJsaWNLZXkECXRpbWVzdGFtcAgFCWxhc3RCbG9jawl0aW1lc3RhbXADCQECIT0CBQpmZWVBc3NldElkBRFBSV9UT0tFTl9BU1NFVF9JRAkAAgECJlBheW1lbnQgb25seSBwb3NzaWJsZSBpbiB0aGUgQUkgVG9rZW4hAwkAZgIAgK3iBAUDZmVlCQACAQIqUGF5bWVudCBuZWVkcyB0byBiZSBhdCBsZWFzdCAwLjEgQUkgVG9rZW4hCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAgxfZGVzY3JpcHRpb24FC2Rlc2NyaXB0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEdHhJZAIMX2luaXRpYWxpemVyBQ9jYWxsZXJQdWJsaWNLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCB19zdGF0dXMFC1NUQVRVU19PUEVOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAgVfdHlwZQUTU0lNUExFX0NIQVRHUFRfVEFTSwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQZ0YXNrSWQFD1JFR0lTVEVSX0hFSUdIVAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBnRhc2tJZAIScmVnaXN0ZXJfdGltZXN0YW1wBQl0aW1lc3RhbXAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgIFb3Blbl8FBnRhc2tJZAYFA25pbAFpARNjaGVja291dENoYXRHUFRUYXNrAQR0eElkBAZ0YXNrSWQJAQlnZXRUYXNrSWQBBQR0eElkBA9jYWxsZXJQdWJsaWNLZXkJALAJAQgFAWkPY2FsbGVyUHVibGljS2V5BA10YXNrU3RpbGxPcGVuCQEPY2FuQmVDaGVja2VkT3V0AQUGdGFza0lkBAl0aW1lc3RhbXAIBQlsYXN0QmxvY2sJdGltZXN0YW1wAwkBASEBBQ10YXNrU3RpbGxPcGVuCQACAQIbVGFzayBub3Qgb3BlbiBmb3IgY2hlY2tvdXQhCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkBQ5DSEVDS0VEX09VVF9CWQUPY2FsbGVyUHVibGljS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAgdfc3RhdHVzBRJTVEFUVVNfQ0hFQ0tFRF9PVVQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUGdGFza0lkBRBDSEVDS19PVVRfSEVJR0hUBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUGdGFza0lkAhRfY2hlY2tfb3V0X3RpbWVzdGFtcAUJdGltZXN0YW1wCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgIFb3Blbl8FBnRhc2tJZAUDbmlsAWkBEWNvbW1pdENoYXRHUFRUYXNrAgR0eElkCHJlc3BvbnNlBAZ0YXNrSWQJAQlnZXRUYXNrSWQBBQR0eElkBA9jYWxsZXJQdWJsaWNLZXkJALAJAQgFAWkPY2FsbGVyUHVibGljS2V5BAxjb3JyZWN0QWdlbnQJAQ5pc0NvcnJlY3RBZ2VudAIFBnRhc2tJZAUPY2FsbGVyUHVibGljS2V5BAl0aW1lc3RhbXAIBQlsYXN0QmxvY2sJdGltZXN0YW1wAwkBASEBBQxjb3JyZWN0QWdlbnQJAAIBAkFUYXNrIG1heSBvbmx5IGJlIHN1Ym1pdHRlZCBieSB0aGUgYWdlbnQgd2hvIGNoZWNrZWQgdGhlIHRhc2sgb3V0IQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIHX3N0YXR1cwULU1RBVFVTX0RPTkUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCB19yZXN1bHQFCHJlc3BvbnNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBnRhc2tJZAUNQ09NTUlUX0hFSUdIVAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBnRhc2tJZAIRX2NvbW1pdF90aW1lc3RhbXAFCXRpbWVzdGFtcAUDbmlsAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tlecGIuFY=", "height": 2614907, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5QieAPFibJjRStRtjoFYnsznM3J9AMo288W2GjskhD3q Next: F15DaJuwt6pvsydjQ8nFzmDu6xKXdemFADBNLtbUwLR4 Diff:
Old | New | Differences | |
---|---|---|---|
64 | 64 | then throw("Payment only possible in the AI Token!") | |
65 | 65 | else if ((10000000 > fee)) | |
66 | 66 | then throw("Payment needs to be at least 0.1 AI Token!") | |
67 | - | else [StringEntry((taskId + "_description"), description), StringEntry((txId + "_initializer"), callerPublicKey), StringEntry((taskId + "_status"), STATUS_OPEN), StringEntry((taskId + "_type"), SIMPLE_CHATGPT_TASK), IntegerEntry((taskId + REGISTER_HEIGHT), height), IntegerEntry((taskId + "register_timestamp"), timestamp)] | |
67 | + | else [StringEntry((taskId + "_description"), description), StringEntry((txId + "_initializer"), callerPublicKey), StringEntry((taskId + "_status"), STATUS_OPEN), StringEntry((taskId + "_type"), SIMPLE_CHATGPT_TASK), IntegerEntry((taskId + REGISTER_HEIGHT), height), IntegerEntry((taskId + "register_timestamp"), timestamp), BooleanEntry(("open_" + taskId), true)] | |
68 | 68 | } | |
69 | 69 | } | |
70 | 70 | ||
78 | 78 | let timestamp = lastBlock.timestamp | |
79 | 79 | if (!(taskStillOpen)) | |
80 | 80 | then throw("Task not open for checkout!") | |
81 | - | else [StringEntry((taskId + CHECKED_OUT_BY), callerPublicKey), StringEntry((taskId + "_status"), STATUS_CHECKED_OUT), IntegerEntry((taskId + CHECK_OUT_HEIGHT), height), IntegerEntry((taskId + "_check_out_timestamp"), timestamp)] | |
81 | + | else [StringEntry((taskId + CHECKED_OUT_BY), callerPublicKey), StringEntry((taskId + "_status"), STATUS_CHECKED_OUT), IntegerEntry((taskId + CHECK_OUT_HEIGHT), height), IntegerEntry((taskId + "_check_out_timestamp"), timestamp), DeleteEntry(("open_" + taskId))] | |
82 | 82 | } | |
83 | 83 | ||
84 | 84 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let AI_TOKEN_ASSET_ID = base58'AxGKQRxKo4F2EbhrRq6N2tdLsxtMnpzQsS4QemV6V1W1' | |
5 | 5 | ||
6 | 6 | let STATUS_OPEN = "open" | |
7 | 7 | ||
8 | 8 | let STATUS_CHECKED_OUT = "checked_out" | |
9 | 9 | ||
10 | 10 | let STATUS_DONE = "done" | |
11 | 11 | ||
12 | 12 | let CHECKED_OUT_BY = "_checked_out_by" | |
13 | 13 | ||
14 | 14 | let SIMPLE_CHATGPT_TASK = "simiple_ChatGPT_task" | |
15 | 15 | ||
16 | 16 | let CHECK_OUT_HEIGHT = "_check_out_height" | |
17 | 17 | ||
18 | 18 | let REGISTER_HEIGHT = "_register_height" | |
19 | 19 | ||
20 | 20 | let COMMIT_HEIGHT = "_commit_height" | |
21 | 21 | ||
22 | 22 | func canBeCheckedOut (taskId) = { | |
23 | 23 | let status = getString(this, (taskId + "_status")) | |
24 | 24 | (status == STATUS_OPEN) | |
25 | 25 | } | |
26 | 26 | ||
27 | 27 | ||
28 | 28 | func isCorrectAgent (taskId,agentId) = { | |
29 | 29 | let checkoutAgentId = getString(this, (taskId + CHECKED_OUT_BY)) | |
30 | 30 | (checkoutAgentId == agentId) | |
31 | 31 | } | |
32 | 32 | ||
33 | 33 | ||
34 | 34 | func getTaskId (txId) = { | |
35 | 35 | let callerPublicKey = match getString(this, (txId + "_initializer")) { | |
36 | 36 | case str: String => | |
37 | 37 | str | |
38 | 38 | case _ => | |
39 | 39 | "" | |
40 | 40 | } | |
41 | 41 | match getString(this, ((txId + "_") + callerPublicKey)) { | |
42 | 42 | case str: String => | |
43 | 43 | str | |
44 | 44 | case _ => | |
45 | 45 | "" | |
46 | 46 | } | |
47 | 47 | } | |
48 | 48 | ||
49 | 49 | ||
50 | 50 | @Callable(i) | |
51 | 51 | func registerChatGPTTask (description) = { | |
52 | 52 | let numberOfPayments = size(i.payments) | |
53 | 53 | if ((numberOfPayments != 1)) | |
54 | 54 | then throw("Payment necessary!") | |
55 | 55 | else { | |
56 | 56 | let callerPublicKey = toUtf8String(i.callerPublicKey) | |
57 | 57 | let txId = toUtf8String(i.transactionId) | |
58 | 58 | let payment = i.payments[0] | |
59 | 59 | let fee = payment.amount | |
60 | 60 | let feeAssetId = payment.assetId | |
61 | 61 | let taskId = ((txId + "_") + callerPublicKey) | |
62 | 62 | let timestamp = lastBlock.timestamp | |
63 | 63 | if ((feeAssetId != AI_TOKEN_ASSET_ID)) | |
64 | 64 | then throw("Payment only possible in the AI Token!") | |
65 | 65 | else if ((10000000 > fee)) | |
66 | 66 | then throw("Payment needs to be at least 0.1 AI Token!") | |
67 | - | else [StringEntry((taskId + "_description"), description), StringEntry((txId + "_initializer"), callerPublicKey), StringEntry((taskId + "_status"), STATUS_OPEN), StringEntry((taskId + "_type"), SIMPLE_CHATGPT_TASK), IntegerEntry((taskId + REGISTER_HEIGHT), height), IntegerEntry((taskId + "register_timestamp"), timestamp)] | |
67 | + | else [StringEntry((taskId + "_description"), description), StringEntry((txId + "_initializer"), callerPublicKey), StringEntry((taskId + "_status"), STATUS_OPEN), StringEntry((taskId + "_type"), SIMPLE_CHATGPT_TASK), IntegerEntry((taskId + REGISTER_HEIGHT), height), IntegerEntry((taskId + "register_timestamp"), timestamp), BooleanEntry(("open_" + taskId), true)] | |
68 | 68 | } | |
69 | 69 | } | |
70 | 70 | ||
71 | 71 | ||
72 | 72 | ||
73 | 73 | @Callable(i) | |
74 | 74 | func checkoutChatGPTTask (txId) = { | |
75 | 75 | let taskId = getTaskId(txId) | |
76 | 76 | let callerPublicKey = toUtf8String(i.callerPublicKey) | |
77 | 77 | let taskStillOpen = canBeCheckedOut(taskId) | |
78 | 78 | let timestamp = lastBlock.timestamp | |
79 | 79 | if (!(taskStillOpen)) | |
80 | 80 | then throw("Task not open for checkout!") | |
81 | - | else [StringEntry((taskId + CHECKED_OUT_BY), callerPublicKey), StringEntry((taskId + "_status"), STATUS_CHECKED_OUT), IntegerEntry((taskId + CHECK_OUT_HEIGHT), height), IntegerEntry((taskId + "_check_out_timestamp"), timestamp)] | |
81 | + | else [StringEntry((taskId + CHECKED_OUT_BY), callerPublicKey), StringEntry((taskId + "_status"), STATUS_CHECKED_OUT), IntegerEntry((taskId + CHECK_OUT_HEIGHT), height), IntegerEntry((taskId + "_check_out_timestamp"), timestamp), DeleteEntry(("open_" + taskId))] | |
82 | 82 | } | |
83 | 83 | ||
84 | 84 | ||
85 | 85 | ||
86 | 86 | @Callable(i) | |
87 | 87 | func commitChatGPTTask (txId,response) = { | |
88 | 88 | let taskId = getTaskId(txId) | |
89 | 89 | let callerPublicKey = toUtf8String(i.callerPublicKey) | |
90 | 90 | let correctAgent = isCorrectAgent(taskId, callerPublicKey) | |
91 | 91 | let timestamp = lastBlock.timestamp | |
92 | 92 | if (!(correctAgent)) | |
93 | 93 | then throw("Task may only be submitted by the agent who checked the task out!") | |
94 | 94 | else [StringEntry((taskId + "_status"), STATUS_DONE), StringEntry((taskId + "_result"), response), IntegerEntry((taskId + COMMIT_HEIGHT), height), IntegerEntry((taskId + "_commit_timestamp"), timestamp)] | |
95 | 95 | } | |
96 | 96 | ||
97 | 97 | ||
98 | 98 | @Verifier(tx) | |
99 | 99 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
100 | 100 |
github/deemru/w8io/026f985 31.27 ms ◑