forked from muttoni/fcl-js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsend-execute-script.js
75 lines (52 loc) · 2.43 KB
/
send-execute-script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import {invariant} from "@onflow/util-invariant"
import {ExecuteScriptAtLatestBlockRequest, ExecuteScriptAtBlockIDRequest, ExecuteScriptAtBlockHeightRequest, AccessAPI} from "@onflow/protobuf"
import {response} from "../response/response.js"
import {unary as defaultUnary} from "./unary"
const argumentBuffer = arg => Buffer.from(JSON.stringify(arg), "utf8")
const hexBuffer = hex => Buffer.from(hex, "hex")
async function sendExecuteScriptAtBlockIDRequest(ix, opts) {
const unary = opts.unary || defaultUnary
const req = new ExecuteScriptAtBlockIDRequest()
req.setBlockId(hexBuffer(ix.block.id))
const code = Buffer.from(ix.message.cadence, "utf8")
ix.message.arguments.forEach(arg => req.addArguments(argumentBuffer(ix.arguments[arg].asArgument)))
req.setScript(code)
const res = await unary(opts.node, AccessAPI.ExecuteScriptAtBlockID, req)
return constructResponse(ix, res)
}
async function sendExecuteScriptAtBlockHeightRequest(ix, opts) {
const unary = opts.unary || defaultUnary
const req = new ExecuteScriptAtBlockHeightRequest()
req.setBlockHeight(Number(ix.block.height))
const code = Buffer.from(ix.message.cadence, "utf8")
ix.message.arguments.forEach(arg => req.addArguments(argumentBuffer(ix.arguments[arg].asArgument)))
req.setScript(code)
const res = await unary(opts.node, AccessAPI.ExecuteScriptAtBlockHeight, req)
return constructResponse(ix, res)
}
async function sendExecuteScriptAtLatestBlockRequest(ix, opts) {
const unary = opts.unary || defaultUnary
const req = new ExecuteScriptAtLatestBlockRequest()
const code = Buffer.from(ix.message.cadence, "utf8")
ix.message.arguments.forEach(arg => req.addArguments(argumentBuffer(ix.arguments[arg].asArgument)))
req.setScript(code)
const res = await unary(opts.node, AccessAPI.ExecuteScriptAtLatestBlock, req)
return constructResponse(ix, res)
}
function constructResponse(ix, res) {
let ret = response()
ret.tag = ix.tag
ret.encodedData = JSON.parse(Buffer.from(res.getValue_asU8()).toString("utf8"))
return ret
}
export async function sendExecuteScript(ix, opts = {}) {
invariant(opts.node, `SDK Send Execute Script Error: opts.node must be defined.`)
ix = await ix
if (ix.block.id) {
return await sendExecuteScriptAtBlockIDRequest(ix, opts)
} else if (ix.block.height) {
return await sendExecuteScriptAtBlockHeightRequest(ix, opts)
} else {
return await sendExecuteScriptAtLatestBlockRequest(ix, opts)
}
}