@typemove/sui 1.1.0 → 1.2.0-rc.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"sui-chain-adapter.d.ts","sourceRoot":"","sources":["../../src/sui-chain-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EAGZ,cAAc,EACf,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,aAAa,EAAa,MAAM,uBAAuB,CAAA;AAEnG,qBAAa,eAAgB,SAAQ,YAAY,CAE/C,uBAAuB,EACvB,QAAQ,GAAG,aAAa,CACzB;IAGO,WAAW,CACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAEb,OAAO,CAAC,uBAAuB,CAAC;IAK7B,YAAY,CAChB,OAAO,EAAE,MAAM,GAEd,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAQrC,2BAA2B,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;IAQvE,iBAAiB,CAAC,OAAO,EAAE,uBAAuB,EAAE,GAAG,kBAAkB,EAAE;IAI3E,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC;IAgBlF,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa,GAAG,MAAM;IAI/C,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa;CA2BtC"}
1
+ {"version":3,"file":"sui-chain-adapter.d.ts","sourceRoot":"","sources":["../../src/sui-chain-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EAGZ,cAAc,EACf,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,aAAa,EAAa,MAAM,uBAAuB,CAAA;AAEnG,qBAAa,eAAgB,SAAQ,YAAY,CAE/C,uBAAuB,EACvB,QAAQ,GAAG,aAAa,CACzB;IAGO,WAAW,CACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAEb,OAAO,CAAC,uBAAuB,CAAC;IAK7B,YAAY,CAChB,OAAO,EAAE,MAAM,GAEd,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAQrC,2BAA2B,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;IAQvE,iBAAiB,CAAC,OAAO,EAAE,uBAAuB,EAAE,GAAG,kBAAkB,EAAE;IAI3E,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC;IAgBlF,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa,GAAG,MAAM;IAI/C,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa;CA8BtC"}
@@ -1,5 +1,5 @@
1
1
  import { toInternalModule } from './to-internal.js';
2
- import { ChainAdapter, moduleQname, SPLITTER, } from '@typemove/move';
2
+ import { ChainAdapter, moduleQname, SPLITTER } from '@typemove/move';
3
3
  import { SuiClient } from '@mysten/sui.js/client';
4
4
  export class SuiChainAdapter extends ChainAdapter {
5
5
  // static INSTANCE = new SuiChainAdapter()
@@ -14,7 +14,7 @@ export class SuiChainAdapter extends ChainAdapter {
14
14
  ) {
15
15
  const client = getRpcClient(this.endpoint);
16
16
  const modules = await client.getNormalizedMoveModulesByPackage({
17
- package: account,
17
+ package: account
18
18
  });
19
19
  return Object.values(modules);
20
20
  }
@@ -48,6 +48,9 @@ export class SuiChainAdapter extends ChainAdapter {
48
48
  // if (val.parsedJson) {
49
49
  // return val.parsedJson as any
50
50
  // }
51
+ if (val === undefined) {
52
+ throw Error('val is undefined');
53
+ }
51
54
  if ('parsedJson' in val) {
52
55
  return val.parsedJson;
53
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sui-chain-adapter.js","sourceRoot":"","sources":["../../src/sui-chain-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sui-chain-adapter.js","sourceRoot":"","sources":["../../src/sui-chain-adapter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typemove/sui",
3
- "version": "1.1.0",
3
+ "version": "1.2.0-rc.2",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -34,7 +34,7 @@
34
34
  "@mysten/sui.js": "^0.41.2",
35
35
  "chalk": "^5.3.0",
36
36
  "radash": "^11.0.0",
37
- "@typemove/move": "1.1.0"
37
+ "@typemove/move": "1.2.0-rc.2"
38
38
  },
39
39
  "url": "https://github.com/sentioxyz/typemove",
40
40
  "scripts": {
package/src/move-coder.ts CHANGED
@@ -6,24 +6,28 @@ import {
6
6
  parseMoveType,
7
7
  SPLITTER,
8
8
  TypeDescriptor,
9
- InternalMoveModule,
9
+ InternalMoveModule
10
10
  } from '@typemove/move'
11
11
  import {
12
12
  MoveCallSuiTransaction,
13
13
  SuiCallArg,
14
14
  SuiEvent,
15
15
  SuiMoveNormalizedModule,
16
- SuiMoveObject,
16
+ SuiMoveObject
17
17
  } from '@mysten/sui.js/client'
18
18
  import { toInternalModule } from './to-internal.js'
19
19
  import { SuiChainAdapter } from './sui-chain-adapter.js'
20
20
  import { dynamic_field } from './builtin/0x2.js'
21
+ import { BCS, getSuiMoveConfig, StructTypeDefinition, Encoding } from '@mysten/bcs'
22
+ import { normalizeSuiObjectId, normalizeSuiAddress } from '@mysten/sui.js/utils'
21
23
 
22
24
  export class MoveCoder extends AbstractMoveCoder<
23
25
  // SuiNetwork,
24
26
  SuiMoveNormalizedModule,
25
27
  SuiEvent | SuiMoveObject
26
28
  > {
29
+ bcs = new BCS(getSuiMoveConfig())
30
+
27
31
  constructor(network: string) {
28
32
  super(new SuiChainAdapter(network))
29
33
  }
@@ -38,20 +42,67 @@ export class MoveCoder extends AbstractMoveCoder<
38
42
  return m
39
43
  }
40
44
 
41
- protected decode(data: any, type: TypeDescriptor): any {
45
+ protected async decode(data: any, type: TypeDescriptor): Promise<any> {
42
46
  switch (type.qname) {
43
47
  case '0x1::ascii::Char':
48
+ if (data !== undefined && typeof data !== 'string') {
49
+ // bcs
50
+ const byte = (await super.decode(data, type)).byte as number
51
+ return String.fromCharCode(byte)
52
+ }
44
53
  case '0x1::ascii::String':
54
+ if (data !== undefined && typeof data !== 'string') {
55
+ // bcs verified
56
+ const bytes = (await super.decode(data, type)).bytes as number[]
57
+ return new TextDecoder().decode(new Uint8Array(bytes))
58
+ }
45
59
  case '0x2::object::ID':
60
+ if (data !== undefined && typeof data !== 'string') {
61
+ // bcs verified
62
+ const bytes = (await super.decode(data, type)).bytes as string
63
+ return normalizeSuiObjectId(bytes)
64
+ }
65
+ case '0x2::url::Url':
66
+ if (data !== undefined && typeof data !== 'string') {
67
+ // bcs
68
+ return (await super.decode(data, type)).url
69
+ }
46
70
  case '0x2::coin::Coin':
71
+ if (data !== undefined && typeof data !== 'string') {
72
+ // bcs
73
+ const bytes = (await super.decode(data, type)).id.id.bytes as number[]
74
+ return new TextDecoder().decode(new Uint8Array(bytes))
75
+ }
47
76
  return data
48
77
  case '0x2::balance::Balance':
78
+ if (data.value) {
79
+ // bcs verfied
80
+ const balance = await super.decode(data, type)
81
+ return balance.value
82
+ }
49
83
  return BigInt(data)
50
84
  case '0x1::option::Option':
51
85
  if (data === null) {
52
86
  return data
53
87
  }
88
+ if (data.vec) {
89
+ // bcs verifed
90
+ let vec = await super.decode(data, type)
91
+ vec = vec.vec
92
+ if (vec.length === 0) {
93
+ return null
94
+ }
95
+ return vec[0]
96
+ }
54
97
  return this.decode(data, type.typeArgs[0])
98
+ case 'Address':
99
+ const str = data as string
100
+ return normalizeSuiAddress(str)
101
+ case '0x1::string::String':
102
+ if (typeof data !== 'string') {
103
+ // bcs
104
+ return new TextDecoder().decode(new Uint8Array(data.bytes))
105
+ }
55
106
  default:
56
107
  return super.decode(data, type)
57
108
  }
@@ -115,9 +166,46 @@ export class MoveCoder extends AbstractMoveCoder<
115
166
  const argumentsTyped = await this.decodeArray(args, params, false)
116
167
  return {
117
168
  ...payload,
118
- arguments_decoded: argumentsTyped,
169
+ arguments_decoded: argumentsTyped
119
170
  } as TypedFunctionPayload<any>
120
171
  }
172
+
173
+ private async _registerBCSType(qname: string): Promise<void> {
174
+ if (this.bcs.hasType(qname)) {
175
+ return
176
+ }
177
+ const moveStruct = await this.getMoveStruct(qname)
178
+ const structDef: StructTypeDefinition = {}
179
+
180
+ for (const field of moveStruct.fields) {
181
+ structDef[field.name] = field.type.getNormalizedSignature()
182
+ }
183
+ let typeName = qname
184
+ const generics = moveStruct.typeParams.map((p, idx) => 'T' + idx).join(', ')
185
+ if (generics) {
186
+ typeName = typeName + '<' + generics + '>'
187
+ }
188
+
189
+ this.bcs.registerStructType(typeName, structDef)
190
+
191
+ for (const field of moveStruct.fields) {
192
+ await this.registerBCSTypes(field.type)
193
+ }
194
+ }
195
+
196
+ async registerBCSTypes(type: TypeDescriptor): Promise<void> {
197
+ // TODO maybe can we get rid of this
198
+ await this._registerBCSType('0x1::string::String')
199
+
200
+ for (const typeArg of type.dependedTypes()) {
201
+ await this._registerBCSType(typeArg)
202
+ }
203
+ }
204
+
205
+ async decodeBCS(type: TypeDescriptor, data: Uint8Array | string, encoding?: Encoding): Promise<any> {
206
+ await this.registerBCSTypes(type)
207
+ return this.bcs.de(type.getNormalizedSignature(), data, encoding)
208
+ }
121
209
  }
122
210
 
123
211
  const DEFAULT_ENDPOINT = 'https://fullnode.mainnet.sui.io/'
@@ -5,7 +5,7 @@ import {
5
5
  ChainAdapter,
6
6
  moduleQname,
7
7
  SPLITTER,
8
- TypeDescriptor,
8
+ TypeDescriptor
9
9
  } from '@typemove/move'
10
10
 
11
11
  import { SuiMoveNormalizedModule, SuiEvent, SuiMoveObject, SuiClient } from '@mysten/sui.js/client'
@@ -32,7 +32,7 @@ export class SuiChainAdapter extends ChainAdapter<
32
32
  ): Promise<SuiMoveNormalizedModule[]> {
33
33
  const client = getRpcClient(this.endpoint)
34
34
  const modules = await client.getNormalizedMoveModulesByPackage({
35
- package: account,
35
+ package: account
36
36
  })
37
37
  return Object.values(modules)
38
38
  }
@@ -73,6 +73,9 @@ export class SuiChainAdapter extends ChainAdapter<
73
73
  // if (val.parsedJson) {
74
74
  // return val.parsedJson as any
75
75
  // }
76
+ if (val === undefined) {
77
+ throw Error('val is undefined')
78
+ }
76
79
  if ('parsedJson' in val) {
77
80
  return val.parsedJson as any
78
81
  }