@stellar-expert/contract-wasm-interface-parser 1.0.7 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,118 @@
1
+ # @stellar-expert/contract-wasm-interface-parser
2
+
3
+ > Lightweight contract interface metadata parser for Soroban binary WASM
4
+
5
+ ## Installation
6
+
7
+ ```shell
8
+ npm i @stellar-expert/contract-wasm-interface-parser
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ Download WASM contract code and call `parseContractMetadata()` function to obtain a parsed contract interface.
14
+
15
+ ```js
16
+ parseContractMetadata(Buffer.from(/*binary wasm code*/))
17
+ ```
18
+
19
+ Example output:
20
+
21
+ ```json
22
+ {
23
+ "unions": [
24
+ {
25
+ "name": "Asset",
26
+ "cases": {
27
+ "Stellar": [
28
+ "address"
29
+ ],
30
+ "Other": [
31
+ "symbol"
32
+ ]
33
+ }
34
+ }
35
+ ],
36
+ "structs": [
37
+ {
38
+ "name": "TickerAsset",
39
+ "fields": [
40
+ {
41
+ "name": "asset",
42
+ "type": "Asset",
43
+ "doc": "Short ticker name of the asset"
44
+ },
45
+ {
46
+ "name": "source",
47
+ "type": "string",
48
+ "doc": "Data provider ID"
49
+ }
50
+ ]
51
+ }
52
+ ],
53
+ "errors": [
54
+ {
55
+ "name": "Error",
56
+ "cases": [
57
+ {
58
+ "name": "AlreadyInitialized",
59
+ "value": 0
60
+ },
61
+ {
62
+ "name": "Unauthorized",
63
+ "value": 1
64
+ }
65
+ ]
66
+ }
67
+ ],
68
+ "enums": [
69
+ {
70
+ "name": "SubscriptionStatus",
71
+ "cases": {
72
+ "Active": 0,
73
+ "Suspended": 1,
74
+ "Cancelled": 2
75
+ }
76
+ }
77
+ ],
78
+ "functions": [
79
+ {
80
+ "name": "config",
81
+ "inputs": [
82
+ {
83
+ "name": "config",
84
+ "type": "ConfigData"
85
+ "doc": "New configuration data"
86
+ }
87
+ ],
88
+ "outputs": [],
89
+ "doc": "Update contract confirguration"
90
+ },
91
+ {
92
+ "name": "set_fee",
93
+ "inputs": [
94
+ {
95
+ "name": "fee",
96
+ "type": "u64"
97
+ }
98
+ ],
99
+ "outputs": []
100
+ },
101
+ {
102
+ "name": "get_subscription",
103
+ "inputs": [
104
+ {
105
+ "name": "subscription_id",
106
+ "type": "u64"
107
+ }
108
+ ],
109
+ "outputs": [
110
+ "Subscription"
111
+ ]
112
+ }
113
+ ],
114
+ "interfaceVersion": "85899345920",
115
+ "rustVersion": "1.74.0",
116
+ "sdkVersion": "20.5.0#9e2c3022b4355b224a7a814e13ba51761eeb14bb"
117
+ }
118
+ ```
@@ -0,0 +1,20 @@
1
+ module.exports = {
2
+ presets: [
3
+ [
4
+ '@babel/preset-env',
5
+ {
6
+ corejs: '3.34',
7
+ useBuiltIns: 'entry',
8
+ //modules: false,
9
+ targets: {
10
+ browsers: [
11
+ '> 1%',
12
+ 'not dead',
13
+ 'not op_mini all'
14
+ ],
15
+ node: '18'
16
+ }
17
+ }
18
+ ]
19
+ ]
20
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stellar-expert/contract-wasm-interface-parser",
3
- "version": "1.0.7",
3
+ "version": "2.0.0",
4
4
  "description": "Contract interface metadata parser for binary WASM",
5
5
  "main": "index.js",
6
6
  "module": "./index.js",
@@ -11,6 +11,14 @@
11
11
  "author": "orbitlens <orbit@stellar.expert>",
12
12
  "license": "MIT",
13
13
  "peerDependencies": {
14
- "@stellar/stellar-base": "^10.0.1"
14
+ "@stellar/stellar-base": ">=12"
15
+ },
16
+ "devDependencies": {
17
+ "@babel/core": "^7.24.8",
18
+ "@babel/preset-env": "^7.24.8",
19
+ "babel-loader": "^9.1.3",
20
+ "jest": "^29.7.0",
21
+ "webpack": "^5.93.0",
22
+ "webpack-cli": "^5.1.4"
15
23
  }
16
24
  }
@@ -16,100 +16,153 @@ export function parseContractMeta(meta) {
16
16
  }
17
17
 
18
18
  export function parseSpec(entries) {
19
- const res = {}
19
+ return new SpecParser().parse(entries)
20
+ }
21
+
22
+
23
+ class SpecParser {
24
+ constructor() {
25
+ this.res = {}
26
+ }
20
27
 
21
- function addSpec(key, descriptor) {
22
- let spec = res[key]
28
+ /**
29
+ * @type {{}}
30
+ */
31
+ res
32
+
33
+ addSpec(key, descriptor, doc) {
34
+ let spec = this.res[key]
23
35
  if (spec === undefined) {
24
- spec = res[key] = []
36
+ spec = this.res[key] = []
25
37
  }
26
- spec.push(descriptor)
38
+ spec.push(this.withDocs(descriptor, doc))
27
39
  }
28
40
 
29
- for (const spec of entries) {
30
- const value = spec.value()
31
- switch (spec._arm) {
32
- case 'functionV0':
33
- addSpec('functions', {
34
- name: value.name().toString(),
35
- inputs: value.inputs().map(parseParameter),
36
- outputs: value.outputs().map(parseParameterType)
37
- })
38
- break
39
- case 'udtStructV0':
40
- addSpec('structs', {
41
- name: parseStructName(value),
42
- fields: value.fields().map(parseParameter)
43
- })
44
- break
45
- case 'udtUnionV0':
46
- addSpec('unions', {
47
- name: parseStructName(value),
48
- cases: value.cases().reduce((agg, c) => {
49
- const value = c.value()
50
- agg[value.name().toString()] = value.type ? value.type().map(parseParameterType) : []
51
- return agg
52
- }, {})
53
- })
54
- break
55
- case 'udtEnumV0':
56
- addSpec('enums', {
57
- name: parseStructName(value),
58
- cases: value.cases().reduce((agg, c) => {
59
- const value = c.value()
60
- agg[value.name().toString()] = value.value()
61
- return agg
62
- }, {})
63
- })
64
- break
65
- case 'udtErrorEnumV0':
66
- addSpec('errors', {
67
- name: parseStructName(value),
68
- cases: value.cases().map(c => ({
69
- name: c.name().toString(),
70
- value: c.value()
71
- }))
72
- })
73
- break
41
+ parse(entries) {
42
+ for (const spec of entries) {
43
+ const value = spec.value()
44
+ const {_attributes: attr} = value
45
+ switch (spec._arm) {
46
+ case 'functionV0':
47
+ this.addSpec('functions', this.parseFunction(attr), attr.doc)
48
+ break
49
+ case 'udtStructV0':
50
+ this.addSpec('structs', this.parseStruct(attr), attr.doc)
51
+ break
52
+ case 'udtUnionV0':
53
+ this.addSpec('unions', this.parseUnion(attr), attr.doc)
54
+ break
55
+ case 'udtEnumV0':
56
+ this.addSpec('enums', this.parseEnum(attr), attr.doc)
57
+ break
58
+ case 'udtErrorEnumV0':
59
+ this.addSpec('errors', this.parseError(attr), attr.doc)
60
+ break
61
+ default:
62
+ console.log('Unknown spec type: ' + spec._arm)
63
+ break
64
+ }
74
65
  }
66
+ return this.res
75
67
  }
76
- return res
77
- }
78
68
 
79
- function parseStructName(value) {
80
- let structName = value.name().toString()
81
- const lib = value.lib()
82
- if (lib.length) {
83
- structName += ':' + lib.toString()
69
+ parseFunction(attr) {
70
+ return {
71
+ name: attr.name.toString(),
72
+ inputs: attr.inputs.map(i => this.parseParameter(i)),
73
+ outputs: attr.outputs.map(o => this.parseParameterType(o))
74
+ }
84
75
  }
85
- return structName
86
- }
87
76
 
88
- function parseParameterType(type) {
89
- const typeName = type.switch().name
90
- switch (typeName) {
91
- case 'scSpecTypeOption':
92
- return `option<${parseParameterType(type.value().valueType())}>`
93
- case 'scSpecTypeBytesN':
94
- return `bytesn<${type.value().n()}>`
95
- case 'scSpecTypeVec':
96
- return `vec<${parseParameterType(type.value().elementType())}>`
97
- case 'scSpecTypeMap':
98
- return `map<${parseParameterType(type.value().keyType())},${parseParameterType(type.value().valueType())}>`
99
- case 'scSpecTypeResult':
100
- return `result<${parseParameterType(type.value().okType())},${parseParameterType(type.value().errorType())}>`
101
- case 'scSpecTypeTuple':
102
- return `tuple<${type.value().valueTypes().map(parseParameterType).join()}>`
103
- case 'scSpecTypeUdt':
104
- return type.value().name()
105
- default:
106
- return typeName.replace('scSpecType', '').toLowerCase()
77
+ parseStruct(attr) {
78
+ return {
79
+ name: this.parseStructName(attr),
80
+ fields: attr.fields.map(f => this.parseParameter(f))
81
+ }
82
+ }
83
+
84
+ parseUnion(attr) {
85
+ return {
86
+ name: this.parseStructName(attr),
87
+ cases: attr.cases.reduce((agg, c) => {
88
+ const value = c.value()
89
+ agg[value.name().toString()] = value.type ?
90
+ value.type().map(t => this.parseParameterType(t)) :
91
+ []
92
+ return agg
93
+ }, {})
94
+ }
95
+ }
96
+
97
+ parseEnum(attr) {
98
+ return {
99
+ name: this.parseStructName(attr),
100
+ cases: attr.cases.reduce((agg, c) => {
101
+ const value = c.value()
102
+ if (value.name) {
103
+ agg[value.name().toString()] = value.value()
104
+ } else {
105
+ agg[c._attributes.name] = value
106
+ }
107
+ return agg
108
+ }, {})
109
+ }
110
+ }
111
+
112
+ parseError(attr) {
113
+ return {
114
+ name: this.parseStructName(attr),
115
+ cases: attr.cases.map(c => ({
116
+ name: c.name().toString(),
117
+ value: c.value()
118
+ }))
119
+ }
107
120
  }
108
- }
109
121
 
110
- function parseParameter(param) {
111
- return {
112
- name: param.name().toString(),
113
- type: parseParameterType(param.type())
122
+ parseParameterType(type) {
123
+ const typeName = type.switch().name
124
+ switch (typeName) {
125
+ case 'scSpecTypeOption':
126
+ return `option<${this.parseParameterType(type.value().valueType())}>`
127
+ case 'scSpecTypeBytesN':
128
+ return `bytesn<${type.value().n()}>`
129
+ case 'scSpecTypeVec':
130
+ return `vec<${this.parseParameterType(type.value().elementType())}>`
131
+ case 'scSpecTypeMap':
132
+ return `map<${this.parseParameterType(type.value().keyType())},${this.parseParameterType(type.value().valueType())}>`
133
+ case 'scSpecTypeResult':
134
+ return `result<${this.parseParameterType(type.value().okType())},${this.parseParameterType(type.value().errorType())}>`
135
+ case 'scSpecTypeTuple':
136
+ return `tuple<${type.value().valueTypes().map(this.parseParameterType).join()}>`
137
+ case 'scSpecTypeUdt':
138
+ return type.value().name().toString()
139
+ default:
140
+ return typeName.replace('scSpecType', '').toLowerCase()
141
+ }
114
142
  }
115
- }
143
+
144
+ parseStructName(value) {
145
+ let structName = value.name.toString()
146
+ if (value.lib.length) {
147
+ structName += ':' + value.lib.toString()
148
+ }
149
+ return structName
150
+ }
151
+
152
+ parseParameter(param) {
153
+ const {_attributes: attr} = param
154
+ const res = {
155
+ name: attr.name.toString(),
156
+ type: this.parseParameterType(attr.type)
157
+ }
158
+ return this.withDocs(res, attr.doc)
159
+ }
160
+
161
+ withDocs(descriptor, doc) {
162
+ if (doc?.length) {
163
+ descriptor.doc = doc.toString()
164
+ }
165
+ return descriptor
166
+ }
167
+ }
168
+
@@ -0,0 +1,318 @@
1
+ {
2
+ "subscription": {
3
+ "wasm": "AGFzbQEAAAABpgEbYAN/f38Bf2ACf38Bf2ABfgF+YAJ+fgF+YAN+fn4BfmAAAX5gBH5+fn4BfmACf34AYAN/f38AYAJ/fwF+YAJ+fgF/YAN/f34AYAF/AGABfgBgAn9/AGABfwF+YAV+f39/fwBgBH9/f38BfmAAAX9gAn5/AGAAAGADfn5+AGAEfn5+fgBgA35/fwF/YAZ/f39/f38Bf2AFf39/f38Bf2AFf35+fn4AApEBGAFpAV8AAgFpATAAAgFsATEAAwFsAV8ABAFiAWkAAwF2ATMAAgFiAW0ABAFhATAAAgF4ATcABQF4ATQABQF4ATEAAwFsATYAAgF2AV8ABQF2ATEAAwF2ATYAAwFiATgAAgF2AWcAAwFpATYAAwFiAWoAAwFkAV8ABAFtATkABAFtAWEABgFsATAAAwF4ATUAAgNYVwIHCAkKCAsLDAwNDgMPDw4PBxAOBwEOCQMREgwFDQUNBxMUDRQFFRUWCQMJFQUIAgIDBwICAwQCAgUFDgUFARQXGBkAAAwAAQEAAQABAQEODgEUDBoAAAQFAXABDg4FAwEAEQYZA38BQYCAwAALfwBB6IvAAAt/AEHwi8AACwe9AREGbWVtb3J5AgAGY29uZmlnAEcHc2V0X2ZlZQBIB3RyaWdnZXIASQ91cGRhdGVfY29udHJhY3QASwZjaGFyZ2UATBNjcmVhdGVfc3Vic2NyaXB0aW9uAE0HZGVwb3NpdABOBmNhbmNlbABPEGdldF9zdWJzY3JpcHRpb24AUAVhZG1pbgBRB3ZlcnNpb24AUgNmZWUAVAV0b2tlbgBVAV8AagpfX2RhdGFfZW5kAwELX19oZWFwX2Jhc2UDAgkTAQBBAQsNVmVkIWYgYl1eX2BraQrbbVclAAJAIABC//////////8AVg0AIABCCIZCBoQPCyAAEICAgIAAC10CAX8BfgJAAkAgAadB/wFxIgJBwABGDQACQCACQQZGDQBCASEDQoOQgICAASEBDAILIAFCCIghAUIAIQMMAQtCACEDIAEQgYCAgAAhAQsgACABNwMIIAAgAzcDAAt9AgF/An4jgICAgABBEGsiAySAgICAAAJAAkACQCABIAIQm4CAgAAiBEICEJyAgIAADQBCACEEDAELIAMgBEICEIKAgIAAEJmAgIAAIAMpAwCnDQEgAykDCCEFQgEhBAsgACAFNwMIIAAgBDcDACADQRBqJICAgIAADwsAAAsaACAArUIghkIEhCABrUIghkIEhBCEgICAAAsPACAAIAEQloCAgABCAVELUAECfgJAAkAgASACEJuAgIAAIgNCAhCcgICAAA0AQgAhBAwBC0IBIQQgA0ICEIKAgIAAIgNC/wGDQs0AUQ0AAAALIAAgAzcDCCAAIAQ3AwALFwAgACABEJuAgIAAIAJCAhCDgICAABoLHQAgACABEJuAgIAAIAIQmICAgABCAhCDgICAABoLAgALAgALGQACQCAApw0AQdiDwIAAQSsQo4CAgAAACwsJABDXgICAAAALkgEBAn8jgICAgABBIGsiAiSAgICAACACIAE3AwggAiAANwMAQQAhAwN+AkAgA0EQRw0AQQAhAwJAA0AgA0EQRg0BIAJBEGogA2ogAiADaikDADcDACADQQhqIQMMAAsLIAJBEGoQpYCAgAAhASACQSBqJICAgIAAIAEPCyACQRBqIANqQgI3AwAgA0EIaiEDDAALCwwAIABBAhDDgICAAAtDAgF/AX4jgICAgABBEGsiASSAgICAACABIAAQp4CAgAACQCABKQMAp0UNAAAACyABKQMIIQIgAUEQaiSAgICAACACC40CAgF/BH4jgICAgABB8ABrIgIkgICAgAAgAkEYaiABEK6AgIAAAkACQCACKAIYDQAgAikDICEDIAJBCGogAUEYahCugICAACACKQMIpw0AIAIpAxAhBCABKQNAEJiAgIAAIQUgATUCVCEGIAIgASkDSBCYgICAADcDSCACIAU3AzggAiAENwMwIAIgAzcDKCACIAEpAzg3A2ggAiABKQMwNwNQIAIgBkIghkIEhDcDQCACIAE1AlBCIIZCBIQ3A2AgAiABMQBYQiCGQgSENwNYQZCCwIAAQQkgAkEoakEJELGAgIAAIQNCACEEDAELQgEhBAsgACADNwMIIAAgBDcDACACQfAAaiSAgICAAAtuAgF/An4jgICAgABBIGsiASSAgICAACAAKQMAEJiAgIAAIQIgASAAQQhqEKeAgIAAAkAgASkDAKdFDQAAAAsgASkDCCEDIAEgAjcDECABIAM3AxggAUEQahClgICAACECIAFBIGokgICAgAAgAgubBAICfwJ+I4CAgIAAQfAAayICJICAgIAAQQAhAwJAA0AgA0EQRg0BIAJB0ABqIANqQgI3AwAgA0EIaiEDDAALCwJAAkACQCABQv8Bg0LMAFINACABQbyBwIAAQQIgAkHQAGpBAhCqgICAACACKQNQIgFC/wGDQssAUg0BIAEQhYCAgAAhBCACQQA2AmggAiABNwNgIAIgBEIgiD4CbCACQcAAaiACQeAAahCrgICAACACKQNAIgFCAlENASABQv////8Pg0IAUg0BIAJBMGogAikDSBCsgICAACACKQMwpw0BAkACQAJAIAIpAzhBoIHAgACtQiCGQgSEQoSAgIAgEIaAgIAAQiCIpw4CAAEECyACKAJoIAIoAmwQrYCAgABBAUsNAyACIAJB4ABqEKuAgIAAIAIpAwAiAUICUQ0DIAFC/////w+DQgBSDQNCACEBIAIpAwgiBEL/AYNCzQBRDQEMAwsgAigCaCACKAJsEK2AgIAAQQFLDQIgAkEgaiACQeAAahCrgICAACACKQMgIgFCAlENAiABQv////8Pg0IAUg0CIAJBEGogAikDKBCsgICAACACKQMQpw0CIAIpAxghBEIBIQELAkAgAikDWCIFQv8Bg0LJAFINACAAIAU3AxAgACAENwMIIAAgATcDAAwDCyAAQgI3AwAMAgsgAEICNwMADAELIABCAjcDAAsgAkHwAGokgICAgAALMgACQCACIARGDQAAAAsgACABrUIghkIEhCADrUIghkIEhCACrUIghkIEhBCVgICAABoLbgIBfwJ+AkACQCABKAIIIgIgASgCDEkNAEICIQMMAQsgASkDACACrUIghkIEhBCNgICAACEEAkAgAkEBaiICRQ0AIAEgAjYCCEIAIQMMAQtB8IfAgABBHBCjgICAAAALIAAgBDcDCCAAIAM3AwALJAEBfyAAIAE3AwggACABp0H/AXEiAkEORyACQcoAR3GtNwMACyEAAkAgASAASQ0AIAEgAGsPC0HgiMCAAEEhEKOAgIAAAAuOAQIBfwF+I4CAgIAAQRBrIgIkgICAgAACQAJAIAEpAwBCAFINAEGRgcCAAEEHEK+AgIAAIQMMAQtBmIHAgABBBRCvgICAACEDCyACIAMgASkDCBCwgICAADcDACACIAEpAxA3AwggAEG8gcCAAEECIAJBAhCxgICAADcDCCAAQgA3AwAgAkEQaiSAgICAAAvGAQIBfgR/AkAgAUEJSw0AQgAhAiABIQMgACEEAkADQCADRQ0BQQEhBQJAIAQtAAAiBkHfAEYNAAJAIAZBUGpB/wFxQQpJDQACQCAGQb9/akH/AXFBGkkNACAGQZ9/akH/AXFBGUsNBSAGQUVqIQUMAgsgBkFLaiEFDAELIAZBUmohBQsgAkIGhiAFrUL/AYOEIQIgA0F/aiEDIARBAWohBAwACwsgAkIIhkIOhA8LIACtQiCGQgSEIAGtQiCGQgSEEJKAgIAACzwBAX8jgICAgABBEGsiAiSAgICAACACIAE3AwggAiAANwMAIAJBAhDDgICAACEBIAJBEGokgICAgAAgAQsvAAJAIAEgA0YNAAAACyAArUIghkIEhCACrUIghkIEhCABrUIghkIEhBCUgICAAAsYAEG8gMCAAEEFEJuAgIAAQgIQnICAgAALSgIBfwF+I4CAgIAAQRBrIgEkgICAgAAgAUG8gMCAAEEFEJ2AgIAAIAEpAwAhAiAAIAEpAwg3AwggACACNwMAIAFBEGokgICAgAALRwICfwF+I4CAgIAAQRBrIgAkgICAgAAgAEHBgMCAAEEIEJqAgIAAIAAoAgAhASAAKQMIIQIgAEEQaiSAgICAACACQgAgARsLEgBBwYDAgABBCCAAEJ+AgIAAC0YCAX8BfiOAgICAAEEQayIAJICAgIAAIABByYDAgABBBRCdgICAACAAKQMIIQEgACkDABCigICAACAAQRBqJICAgIAAIAELEgBBzoDAgABBFCAAEJ+AgIAAC7kEAgJ/B34jgICAgABBoAFrIgIkgICAgAACQAJAAkAgARCYgICAACIBQgEQnICAgAANACAAQgI3AwAMAQsgAUIBEIKAgIAAIQFBACEDAkADQCADQcgARg0BIAJBIGogA2pCAjcDACADQQhqIQMMAAsLIAFC/wGDQswAUg0BIAFBkILAgABBCSACQSBqQQkQqoCAgAAgAkH4AGogAikDIBCpgICAACACKQN4IgFCAlENASACQegAakEIaiACQYgBaiIDKQMANwMAIAIgAikDgAE3A2ggAkH4AGogAikDKBCpgICAACACKQN4IgRCAlENASACQZABakEIaiADKQMANwMAIAIgAikDgAE3A5ABIAJBEGogAikDMBCZgICAACACKAIQDQEgAikDOCIFQv8Bg0IEUg0BIAIpAxghBiACIAIpA0AQmYCAgAAgAigCAA0BIAIpA0giB0L/AYNCzQBSDQEgAikDUCIIQv8Bg0IEUg0BIAhCIIinIgNBA08NASACKQNYIghC/wGDQgRSDQEgAikDYCIJQv8Bg0LIAFINASACKQMIIQogACACKQNoNwMIIAAgAikDkAE3AyAgAEEQaiACQegAakEIaikDADcDACAAQShqIAJBkAFqQQhqKQMANwMAIAAgAzoAWCAAIAVCIIinNgJUIAAgCEIgiKc2AlAgACAKNwNIIAAgBjcDQCAAIAk3AzggACAHNwMwIAAgBDcDGCAAIAE3AwALIAJBoAFqJICAgIAADwsAAAsbACAAEJiAgIAAIAEQpoCAgABCARCDgICAABoLXgIBfwJ+I4CAgIAAQRBrIgAkgICAgAAgABCzgICAAAJAIAApAwAiAVANACAAKQMIIQIgARCigICAACACEIeAgIAAGiAAQRBqJICAgIAADwtCg4CAgBAQu4CAgAAAAAsLACAAEJeAgIAAGgsbAAJAELKAgIAADQBCg4CAgDAQu4CAgAAAAAsLCAAQtoCAgAALMgAgABCIgICAACABEL+AgIAAAkAgAkIAUQ0AEL2AgIAAEIiAgIAAIAJCABDAgICAAAsLxQEDAX8CfgF/I4CAgIAAQTBrIgMkgICAgAAQvYCAgAAhBEGBicCAAEEIEMGAgIAAIQUgAyACQgAQwoCAgAA3AxAgAyABNwMIIAMgADcDAEEAIQYDQAJAIAZBGEcNAEEAIQYCQANAIAZBGEYNASADQRhqIAZqIAMgBmopAwA3AwAgBkEIaiEGDAALCyAEIAUgA0EYakEDEMOAgIAAEMSAgIAAIANBMGokgICAgAAPCyADQRhqIAZqQgI3AwAgBkEIaiEGDAALC7YBAwF/AX4BfyOAgICAAEEgayIEJICAgIAAQYmJwIAAQQQQwYCAgAAhBSAEIAIgAxDCgICAADcDCCAEIAE3AwBBACEGA0ACQCAGQRBHDQBBACEGAkADQCAGQRBGDQEgBEEQaiAGaiAEIAZqKQMANwMAIAZBCGohBgwACwsgACAFIARBEGpBAhDDgICAABDEgICAACAEQSBqJICAgIAADwsgBEEQaiAGakICNwMAIAZBCGohBgwACwsMACAAIAEQr4CAgAALRQACQCAAQoCAgICAgIDAAHxC//////////8AVg0AIAAgAIUgAEI/hyABhYRCAFINACAAQgiGQguEDwsgASAAEJGAgIAACxoAIACtQiCGQgSEIAGtQiCGQgSEEJCAgIAAC1ABAX8jgICAgABBEGsiAySAgICAAAJAIAAgASACEJOAgIAAQv8Bg0ICUQ0AQYyIwIAAIANBD2pBuIjAgAAQxoCAgAAACyADQRBqJICAgIAAC64BAwF/AX4BfyOAgICAAEEgayIAJICAgIAAAkACQBCJgICAACIBp0H/AXEiAkHAAEYNAAJAIAJBBkcNACABQgiIIQEMAgtBjIjAgAAgAEEYakHIiMCAABDGgICAAAALIAEQgYCAgAAhAQsgAEEIaiABQgBC6AdCABDsgICAAAJAIAApAxBCAFINACAAKQMIIQEgAEEgaiSAgICAACABDwtB8IDAgABBIRCjgICAAAALCQAQ14CAgAAAC4ECAgJ/An4jgICAgABBMGsiASSAgICAAEEAIQICQANAIAJBGEYNASABQRhqIAJqQgI3AwAgAkEIaiECDAALCwJAAkAgAEL/AYNCzABSDQAgAEHcgsCAAEEDIAFBGGpBAxCqgICAACABKQMYIgBC/wGDQs0AUg0AIAFBCGogASkDIBCZgICAACABKQMIpw0AIAEpAygiA0L/AYNCzQBSDQAgASkDECEEIAAQh4CAgAAaELKAgIAARQ0BQgMQu4CAgAALAAALQbyAwIAAQQUgABCegICAACAEELWAgIAAQcmAwIAAQQUgAxCegICAAEIAELeAgIAAIAFBMGokgICAgABCAgtPAQF/I4CAgIAAQRBrIgEkgICAgAAgASAAEJmAgIAAAkAgASkDAKdFDQAAAAsgASkDCCEAELqAgIAAIAAQtYCAgAAgAUEQaiSAgICAAEICC6gBAgF/AX4jgICAgABBMGsiAiSAgICAACACQRBqIAAQmYCAgAACQCACKQMQpw0AIAIpAxghACACIAEQyoCAgAAgAikDAKcNACACKQMIIQEQuoCAgABCjryN0AdCju6qluu95wEQpICAgAAhAyAAEJiAgIAAIQAgAiABNwMoIAIgADcDICADIAJBIGoQpYCAgAAQioCAgAAaIAJBMGokgICAgABCAg8LAAALPwEBfkIBIQICQCABQv8Bg0LIAFINACABEI+AgIAAQoCAgIBwg0KAgICAgARSrSECCyAAIAE3AwggACACNwMAC1ABAX8jgICAgABBEGsiASSAgICAACABIAAQyoCAgAACQCABKQMAp0UNAAAACyABKQMIIQAQuoCAgAAgABCLgICAABogAUEQaiSAgICAAEICC7YFBAF/A34CfwV+I4CAgIAAQeABayIBJICAgIAAAkACQAJAAkACQAJAIABC/wGDQssAUg0AELqAgIAAEMWAgIAAIQIQtICAgAAhAxCMgICAACEEIAAQhYCAgABCIIinIQVBACEGQgAhBwJAA0AgBq0iCEIghkIEhCEJIAYgBSAGIAVLG60gCH0hCANAIAhQDQIgAUEQaiAAIAkQjYCAgAAQmYCAgAAgBkEBaiIGRQ0EAkAgASkDEKdFDQBBjIjAgAAgAUGAAWpBgIDAgAAQxoCAgAAACyABQSBqIAEpAxgiChC4gICAACABKQMgQgJRDQEgAUGAAWogAUEgakHgABDugICAABogAiABKQPIASILVA0FAkAgAiALfSILQoC4mSlaDQAgCUKAgICAEHwhCSAIQn98IQgMAQsLIAEgC0KAuJkpgEIAIANCABDsgICAACABKQMIUEUNBSABKQMAIQggASACNwPIASABIAEpA8ABIgkgCSAIIAkgCFQbIgh9Igk3A8ABAkAgCSADWg0AIAFBAToA2AEgBCAKEJiAgIAAEI6AgIAAIQQLIAogAUGAAWoQuYCAgAACQCAHIAh8IgggB1QNACAIIQcMAQsLQaCAwIAAQRwQo4CAgAAACyAHUEUNBAwFCwAAC0GggMCAAEEcEKOAgIAAAAtBsIPAgABBIRCjgICAAAALQfCAwIAAQSEQo4CAgAAAC0KOvI3QB0KO0qr27eyiARCkgICAACEIIAIQmICAgAAhCSABIAA3A4gBIAEgCTcDgAEgCCABQYABahClgICAABCKgICAABoCQCAEEIWAgIAAQoCAgIAQVA0AQo68jdAHQo7S6vSsreP1OBCkgICAACAEEIqAgIAAGgsQvYCAgAAQiICAgAAgB0IAEMCAgIAACyABQeABaiSAgICAAEICC/0IBAJ/B34EfwJ+I4CAgIAAQYADayICJICAgIAAQQAhAwJAA0AgA0EwRg0BIAJBmAJqIANqQgI3AwAgA0EIaiEDDAALCwJAIABC/wGDQswAUg0AIABB9ILAgABBBiACQZgCakEGEKqAgIAAIAJBIGogAikDmAIQqYCAgAAgAikDICIEQgJRDQAgAkGoAWpBCGogAkEwaiIDKQMANwMAIAIgAikDKDcDqAEgAkEgaiACKQOgAhCpgICAACACKQMgIgVCAlENACACQbgBakEIaiADKQMANwMAIAIgAikDKDcDuAEgAikDqAIiBkL/AYNCBFINACACKQOwAiIAQv8Bg0LNAFINACACKQO4AiIHQv8Bg0IEUg0AIAIpA8ACIghC/wGDQsgAUg0AIAJBmAFqQQhqIAJBqAFqQQhqKQMANwMAIAJBiAFqQQhqIAJBuAFqQQhqKQMANwMAIAIgAikDqAE3A5gBIAIgAikDuAE3A4gBIAJBEGogARCZgICAACACKAIQDQAgAikDGCEJELyAgIAAIAAQh4CAgAAaAkACQAJAAkAgCRC0gICAACIKVA0AIAZCIIinIgNBBUkNAQJAIAdCIIinIgsNAEKDgICA4AAQu4CAgAAMBQsgCBCPgICAAEIgiKdBgBBLDQIgACAJIAoQvoCAgAAgAkHOgMCAAEEUEJqAgIAAIAIpAwhCACACKAIAG0IBfCIBUA0DEMWAgIAAIQYgAkG4AWpBEGoiDCACQZgBakEIaikDADcDACACQbgBakEgaiINIAIpA4gBNwMAIAJBuAFqQShqIg4gAkGIAWpBCGopAwA3AwAgAiAENwO4ASACIAA3A+gBIAIgBTcD0AEgAiADNgKMAiACIAs2AogCIAJBADoAkAIgAiAJIAp9Igk3A/gBIAIgCDcD8AEgAiAGNwOAAiACIAIpA5gBNwPAASABIAJBuAFqELmAgIAAIAEQt4CAgAAgDCkDACEKIA0pAwAhByAOKQMAIQ8gAikDwAEhECACQdACaiAANwMAIAJB9AJqIAM2AgAgAkHwAmogCzYCACACQcgCaiAPNwMAIAJBmAJqQShqIAc3AwAgAkGYAmpBIGogBTcDACACQbACaiAKNwMAIAJBmAJqQRBqIBA3AwAgAkH4AmpBADoAACACQeACaiAJNwMAIAJB2AJqIAg3AwAgAkHoAmogBjcDACACIAE3A5gCIAIgBDcDoAJCjryN0AdCjtLq3Km9owEQpICAgAAgAkGYAmoQqICAgAAQioCAgAAaIAJBADoAgAEgAiADNgJ8IAIgCzYCeCACIAY3A3AgAiAJNwNoIAIgCDcDYCACIAA3A1ggAiAPNwNQIAIgBzcDSCACIAU3A0AgAiAKNwM4IAIgEDcDMCACIAQ3AyggAiABNwMgIAJBIGoQqICAgAAhACACQYADaiSAgICAACAADwtCg4CAgMAAELuAgIAADAMLQoOAgIDQABC7gICAAAwCC0KDgICA8AAQu4CAgAAMAQtBoIDAgABBHBCjgICAAAALAAALuQMCAX8CfiOAgICAAEHgAWsiAySAgICAAAJAIABC/wGDQs0AUg0AIANBEGogARCZgICAACADKAIQDQAgAykDGCEEIAMgAhCZgICAACADKAIADQAgAykDCCEBELyAgIAAIAAQh4CAgAAaAkAgAUIAUg0AQoOAgIDAABC7gICAAAwBCyADQYABaiAEELiAgIAAAkAgAykDgAFCAlINAEKDgICAIBC7gICAAAwBCyADQSBqIANBgAFqQeAAEO6AgIAAGhC0gICAACEFQgAhAgJAAkACQAJAAkAgAy0AeEF/ag4CAAIBCyAFIAFWDQIgA0EAOgB4IAUhAgsgACABIAIQvoCAgAAgAykDYCIAIAEgAn18IgIgAFQNAiADIAI3A2AgBCADQSBqELmAgIAAQo68jdAHQo7yrpzd1qYBEKSAgIAAIQAgBBCYgICAACEEIAMgARCYgICAADcDiAEgAyAENwOAASAAIANBgAFqEKWAgIAAEIqAgIAAGiADQeABaiSAgICAAEICDwtCg4CAgIABELuAgIAADAILQoOAgIDAABC7gICAAAwBC0GggMCAAEEcEKOAgIAAAAsAAAuAAgIBfwF+I4CAgIAAQdABayIBJICAgIAAIAEgABCZgICAAAJAAkAgASgCAA0AIAEpAwghABC8gICAACABQfAAaiAAELiAgIAAAkAgASkDcEICUg0AQoOAgIAgELuAgIAADAELIAFBEGogAUHwAGpB4AAQ7oCAgAAaIAEpA0AiAhCHgICAABogAS0AaEUNAUKDgICAgAEQu4CAgAALAAALEIiAgIAAIAIgASkDUBC/gICAACABQgA3A1AgAUECOgBoIAAgAUEQahC5gICAAEKOvI3QB0KO0uq4rMXOzSgQpICAgAAgABCYgICAABCKgICAABogAUHQAWokgICAgABCAguRAQEBfyOAgICAAEHQAWsiASSAgICAACABIAAQmYCAgAACQAJAIAEpAwCnDQAgASkDCCEAELyAgIAAIAFB8ABqIAAQuICAgAAgASkD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CwtBASEJIAchDCACIQAgByACRg0CCwJAAkAgBS0AAEUNACAEQaCEwIAAQQQgAygCDBGAgICAAAANAQsgASAHaiELIAAgB2shCkEAIQ0CQCAAIAdGDQAgCiALakF/ai0AAEEKRiENCyAFIA06AAAgDCEHIAQgCyAKIAMoAgwRgICAgAAARQ0BCwtBASEGCyAGC1gBAn8gACgCBCECIAAoAgAhAwJAIAAoAggiAC0AAEUNACADQaCEwIAAQQQgAigCDBGAgICAAABFDQBBAQ8LIAAgAUEKRjoAACADIAEgAigCEBGBgICAAAALEgAgAEGIhMCAACABENyAgIAACw4AIAAgASACENyAgIAAC9oCAQV/I4CAgIAAQRBrIgIkgICAgABBASEDAkAgASgCFCIEQYSGwIAAQQ0gAUEYaigCACIFKAIMIgYRgICAgAAADQACQCABLQAcQQRxDQAgBEGkhMCAAEEDIAYRgICAgAAADQEgBEH3hcCAAEEEIAYRgICAgAAADQEgBEGDhMCAAEECIAYRgICAgAAADQEgACAEIAUQ44CAgAANASAEQa2EwIAAQQIgBhGAgICAAAAhAwwBCyAEQaeEwIAAQQMgBhGAgICAAAANACACIAU2AgQgAiAENgIAQQEhAyACQQE6AA8gAiACQQ9qNgIIIAJB94XAgABBBBDegICAAA0AIAJBg4TAgABBAhDegICAAA0AIAAgAkGIhMCAABDjgICAAA0AQQEhAyACQaqEwIAAQQIQ3oCAgAANACAEQayEwIAAQQEgBhGAgICAAAAhAwsgAkEQaiSAgICAACADCzAAIAEgAC0AAEECdCIAQciGwIAAaigCACAAQbSGwIAAaigCACACKAIMEYCAgIAAAAsiACAAKAIAIgCtQgAgAKx9IABBf0oiABsgACABENiAgIAACxQAIAEgACgCACAAKAIEENuAgIAAC7EGAwF/AX4CfyOAgICAAEHgAGsiAiSAgICAACACIAApAwAiA6ciAEEIdiIENgIgIAIgA0IgiKciBTYCJAJAAkACQAJAIABB/xNLDQAgAEGAAkkNASACQRBqIAQQ54CAgAAgAigCFCEAIAIoAhAhBAJAIAVBCk8NACACIAA2AiwgAiAENgIoIAJBCGogBRDogICAACACQdAAakEMakGCgICAADYCACACQThqQQxqQgI3AgAg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",
4
+ "interface": {
5
+ "unions": [
6
+ {
7
+ "name": "Asset",
8
+ "cases": {
9
+ "Stellar": [
10
+ "address"
11
+ ],
12
+ "Other": [
13
+ "symbol"
14
+ ]
15
+ }
16
+ }
17
+ ],
18
+ "structs": [
19
+ {
20
+ "name": "TickerAsset",
21
+ "fields": [
22
+ {
23
+ "name": "asset",
24
+ "type": "Asset"
25
+ },
26
+ {
27
+ "name": "source",
28
+ "type": "string"
29
+ }
30
+ ]
31
+ },
32
+ {
33
+ "name": "Subscription",
34
+ "fields": [
35
+ {
36
+ "name": "asset1",
37
+ "type": "TickerAsset"
38
+ },
39
+ {
40
+ "name": "asset2",
41
+ "type": "TickerAsset"
42
+ },
43
+ {
44
+ "name": "balance",
45
+ "type": "u64"
46
+ },
47
+ {
48
+ "name": "heartbeat",
49
+ "type": "u32"
50
+ },
51
+ {
52
+ "name": "last_charge",
53
+ "type": "u64"
54
+ },
55
+ {
56
+ "name": "owner",
57
+ "type": "address"
58
+ },
59
+ {
60
+ "name": "status",
61
+ "type": "SubscriptionStatus"
62
+ },
63
+ {
64
+ "name": "threshold",
65
+ "type": "u32"
66
+ },
67
+ {
68
+ "name": "webhook",
69
+ "type": "bytes"
70
+ }
71
+ ]
72
+ },
73
+ {
74
+ "name": "ConfigData",
75
+ "fields": [
76
+ {
77
+ "name": "admin",
78
+ "type": "address"
79
+ },
80
+ {
81
+ "name": "fee",
82
+ "type": "u64"
83
+ },
84
+ {
85
+ "name": "token",
86
+ "type": "address"
87
+ }
88
+ ]
89
+ },
90
+ {
91
+ "name": "CreateSubscription",
92
+ "fields": [
93
+ {
94
+ "name": "asset1",
95
+ "type": "TickerAsset"
96
+ },
97
+ {
98
+ "name": "asset2",
99
+ "type": "TickerAsset"
100
+ },
101
+ {
102
+ "name": "heartbeat",
103
+ "type": "u32"
104
+ },
105
+ {
106
+ "name": "owner",
107
+ "type": "address"
108
+ },
109
+ {
110
+ "name": "threshold",
111
+ "type": "u32"
112
+ },
113
+ {
114
+ "name": "webhook",
115
+ "type": "bytes"
116
+ }
117
+ ]
118
+ }
119
+ ],
120
+ "errors": [
121
+ {
122
+ "name": "Error",
123
+ "cases": [
124
+ {
125
+ "name": "AlreadyInitialized",
126
+ "value": 0
127
+ },
128
+ {
129
+ "name": "Unauthorized",
130
+ "value": 1
131
+ },
132
+ {
133
+ "name": "SubscriptionNotFound",
134
+ "value": 2
135
+ },
136
+ {
137
+ "name": "NotInitialized",
138
+ "value": 3
139
+ },
140
+ {
141
+ "name": "InvalidAmount",
142
+ "value": 4
143
+ },
144
+ {
145
+ "name": "InvalidHeartbeat",
146
+ "value": 5
147
+ },
148
+ {
149
+ "name": "InvalidThreshold",
150
+ "value": 6
151
+ },
152
+ {
153
+ "name": "WebhookTooLong",
154
+ "value": 7
155
+ },
156
+ {
157
+ "name": "InvalidSubscriptionStatusError",
158
+ "value": 8
159
+ }
160
+ ]
161
+ }
162
+ ],
163
+ "enums": [
164
+ {
165
+ "name": "SubscriptionStatus",
166
+ "cases": {
167
+ "Active": 0,
168
+ "Suspended": 1,
169
+ "Cancelled": 2
170
+ }
171
+ }
172
+ ],
173
+ "functions": [
174
+ {
175
+ "name": "config",
176
+ "inputs": [
177
+ {
178
+ "name": "config",
179
+ "type": "ConfigData"
180
+ }
181
+ ],
182
+ "outputs": []
183
+ },
184
+ {
185
+ "name": "set_fee",
186
+ "inputs": [
187
+ {
188
+ "name": "fee",
189
+ "type": "u64"
190
+ }
191
+ ],
192
+ "outputs": []
193
+ },
194
+ {
195
+ "name": "trigger",
196
+ "inputs": [
197
+ {
198
+ "name": "timestamp",
199
+ "type": "u64"
200
+ },
201
+ {
202
+ "name": "trigger_hash",
203
+ "type": "bytesn<32>"
204
+ }
205
+ ],
206
+ "outputs": []
207
+ },
208
+ {
209
+ "name": "update_contract",
210
+ "inputs": [
211
+ {
212
+ "name": "wasm_hash",
213
+ "type": "bytesn<32>"
214
+ }
215
+ ],
216
+ "outputs": []
217
+ },
218
+ {
219
+ "name": "charge",
220
+ "inputs": [
221
+ {
222
+ "name": "subscription_ids",
223
+ "type": "vec<u64>"
224
+ }
225
+ ],
226
+ "outputs": []
227
+ },
228
+ {
229
+ "name": "create_subscription",
230
+ "inputs": [
231
+ {
232
+ "name": "new_subscription",
233
+ "type": "CreateSubscription"
234
+ },
235
+ {
236
+ "name": "amount",
237
+ "type": "u64"
238
+ }
239
+ ],
240
+ "outputs": [
241
+ "tuple<u64,Subscription>"
242
+ ]
243
+ },
244
+ {
245
+ "name": "deposit",
246
+ "inputs": [
247
+ {
248
+ "name": "from",
249
+ "type": "address"
250
+ },
251
+ {
252
+ "name": "subscription_id",
253
+ "type": "u64"
254
+ },
255
+ {
256
+ "name": "amount",
257
+ "type": "u64"
258
+ }
259
+ ],
260
+ "outputs": []
261
+ },
262
+ {
263
+ "name": "cancel",
264
+ "inputs": [
265
+ {
266
+ "name": "subscription_id",
267
+ "type": "u64"
268
+ }
269
+ ],
270
+ "outputs": []
271
+ },
272
+ {
273
+ "name": "get_subscription",
274
+ "inputs": [
275
+ {
276
+ "name": "subscription_id",
277
+ "type": "u64"
278
+ }
279
+ ],
280
+ "outputs": [
281
+ "Subscription"
282
+ ]
283
+ },
284
+ {
285
+ "name": "admin",
286
+ "inputs": [],
287
+ "outputs": [
288
+ "option<address>"
289
+ ]
290
+ },
291
+ {
292
+ "name": "version",
293
+ "inputs": [],
294
+ "outputs": [
295
+ "u32"
296
+ ]
297
+ },
298
+ {
299
+ "name": "fee",
300
+ "inputs": [],
301
+ "outputs": [
302
+ "u64"
303
+ ]
304
+ },
305
+ {
306
+ "name": "token",
307
+ "inputs": [],
308
+ "outputs": [
309
+ "address"
310
+ ]
311
+ }
312
+ ],
313
+ "interfaceVersion": "85899345920",
314
+ "rustVersion": "1.74.0",
315
+ "sdkVersion": "20.5.0#9e2c3022b4355b224a7a814e13ba51761eeb14bb"
316
+ }
317
+ }
318
+ }
@@ -0,0 +1,10 @@
1
+ import examples from './example-contracts.json'
2
+ import {parseContractMetadata} from '../index'
3
+
4
+ describe('Parser', () => {
5
+ test('parse subscription example meta', () => {
6
+ const {subscription} = examples
7
+ const parsed = parseContractMetadata(Buffer.from(subscription.wasm, 'base64'))
8
+ expect(parsed).toEqual(subscription.interface)
9
+ })
10
+ })