Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@initia/builder.js",
"version": "0.2.8",
"version": "0.2.9",
"description": "The JavaScript Move Builder for Initia",
"license": "MIT",
"author": "Initia Foundation",
Expand Down
42 changes: 33 additions & 9 deletions src/builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ import {
compilerPayloadBcsType,
testOptBcsType,
TestOptions,
DecodedModuleBytes,
DecodedScriptBytes,
ModuleInfo,
} from './types'

type ModuleName = string
Expand Down Expand Up @@ -283,9 +286,9 @@ export class MoveBuilder {
* @param moduleBytes - Move module bytes.
* @returns If success, return buffer, else throw an error.
*/
public static async decode_module_bytes(
public static async decodeModuleBytes(
moduleBytes: Buffer
): Promise<FFIResult> {
): Promise<DecodedModuleBytes> {
const errMsg = createRawErrMsg()

const moduleBytesView = ref.alloc(ByteSliceViewType)
Expand All @@ -297,21 +300,25 @@ export class MoveBuilder {
)
rawModuleBytesView.len = moduleBytes.length

return handleResponse(
const response = await handleResponse(
libmovevm.decode_module_bytes.async,
errMsg,
rawModuleBytesView
)
if (response === null) {
throw new Error('Failed to decode module bytes')
}
return JSON.parse(response.toString()) as DecodedModuleBytes
}

/**
* Decode script bytes to move function.
* @param scriptBytes - Move script bytes.
* @returns If success, return buffer, else throw an error.
*/
public static async decode_script_bytes(
public static async decodeScriptBytes(
scriptBytes: Buffer
): Promise<FFIResult> {
): Promise<DecodedScriptBytes> {
const errMsg = createRawErrMsg()

const scriptBytesView = ref.alloc(ByteSliceViewType)
Expand All @@ -323,21 +330,25 @@ export class MoveBuilder {
)
rawScriptBytesView.len = scriptBytes.length

return handleResponse(
const response = await handleResponse(
libmovevm.decode_script_bytes.async,
errMsg,
rawScriptBytesView
)
if (response === null) {
throw new Error('Failed to decode module bytes')
}
return JSON.parse(response.toString()) as DecodedScriptBytes
}

/**
* Read module info from bytes.
* @param compiledBinary - Move compiled bytes.
* @returns If success, return buffer, else throw an error.
*/
public static async read_module_info(
public static async readModuleInfo(
compiledBinary: Buffer
): Promise<FFIResult> {
): Promise<ModuleInfo> {
const errMsg = createRawErrMsg()

const compiledView = ref.alloc(ByteSliceViewType)
Expand All @@ -349,10 +360,23 @@ export class MoveBuilder {
)
rawCompiledView.len = compiledBinary.length

return handleResponse(
const response = await handleResponse(
libmovevm.read_module_info.async,
errMsg,
rawCompiledView
)
if (response === null) {
throw new Error('Failed to decode module bytes')
}

const res = JSON.parse(response.toString()) as {
address: number[]
name: string
}
return {
address:
'0x' + Buffer.from(res.address).toString('hex').replace(/^0+/, ''),
name: res.name,
}
}
}
9 changes: 8 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,9 @@
export { FFIResult, BuildOptions, TestOptions } from './types'
export {
FFIResult,
BuildOptions,
TestOptions,
ModuleInfo,
DecodedModuleBytes,
DecodedScriptBytes,
} from './types'
export * from './builder'
1 change: 1 addition & 0 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import ref from '@eleccookie/ref-napi'
export * from './options'
export * from './bcs'
export * from './ffi'
export * from './type'

const StructType = struct(ref)

Expand Down
39 changes: 39 additions & 0 deletions src/types/type.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
export interface DecodedModuleBytes {
address: string
name: string
friends: string[]
exposed_functions: {
name: string
visibility: string
is_entry: boolean
is_view: boolean
generic_type_params: string[]
params: string[]
return: string[]
}[]
structs: {
name: string
is_native: boolean
abilities: string[]
generic_type_params: string[]
fields: {
name: string
type: string
}[]
}[]
}

export interface DecodedScriptBytes {
name: string
visibility: string
is_entry: boolean
is_view: boolean
generic_type_params: string[]
params: string[]
return: string[]
}

export interface ModuleInfo {
address: string
name: string
}
166 changes: 91 additions & 75 deletions test/build.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,7 @@ describe('build move package', () => {
bytecodeVersion: 7,
compilerVersion: '2',
languageVersion: '1',
additionalNamedAddresses: [
['test', '0x4'],
['test2', '0x4c4e8f7def3c24453ae7eee7d9aee9b7556a26a0'],
],
additionalNamedAddresses: [['test', '0x4']],
})
const dummyModulePath = path.join(
contractDir,
Expand All @@ -36,77 +33,100 @@ describe('build move package', () => {

it('decodes module bytes correctly', async () => {
const dummy = await builder.get('dummy')
expect(await MoveBuilder.decode_module_bytes(dummy)).toEqual(
JSON.stringify({
address: '0x4',
name: 'dummy',
friends: [],
exposed_functions: [
{
name: 'return_0',
visibility: 'public',
is_entry: false,
is_view: false,
generic_type_params: [],
params: [],
return: ['u32'],
},
{
name: 'return_10',
visibility: 'public',
is_entry: false,
is_view: false,
generic_type_params: [],
params: [],
return: ['u32'],
},
],
structs: [],
})
)
expect(await MoveBuilder.decodeModuleBytes(dummy)).toEqual({
address: '0x4',
name: 'dummy',
friends: ['0x4::hihi'],
exposed_functions: [
{
name: 'return_0',
visibility: 'public',
is_entry: false,
is_view: false,
generic_type_params: [],
params: [],
return: ['u32'],
},
{
name: 'return_10',
visibility: 'public',
is_entry: false,
is_view: false,
generic_type_params: [],
params: [],
return: ['u32'],
},
{
name: 'return_10_by_friend',
visibility: 'friend',
is_entry: false,
is_view: false,
generic_type_params: [],
params: [],
return: ['u32'],
},
],
structs: [],
})
const hihi = await builder.get('hihi')

expect(await MoveBuilder.decode_module_bytes(hihi)).toEqual(
JSON.stringify({
address: '0x4c4e8f7def3c24453ae7eee7d9aee9b7556a26a0',
name: 'hihi',
friends: [],
exposed_functions: [
{
name: 'return_0',
visibility: 'public',
is_entry: false,
is_view: false,
generic_type_params: [],
params: [],
return: ['u32'],
},
{
name: 'return_10',
visibility: 'public',
is_entry: false,
is_view: false,
generic_type_params: [],
params: [],
return: ['u32'],
},
],
structs: [],
})
)
expect(await MoveBuilder.decodeModuleBytes(hihi)).toEqual({
address: '0x4',
name: 'hihi',
friends: [],
exposed_functions: [
{
name: 'return_0',
visibility: 'public',
is_entry: false,
is_view: false,
generic_type_params: [],
params: [],
return: ['u32'],
},
{
name: 'return_10',
visibility: 'public',
is_entry: false,
is_view: false,
generic_type_params: [],
params: [],
return: ['u32'],
},
{
name: 'call_friend',
visibility: 'public',
is_entry: false,
is_view: false,
generic_type_params: [],
params: [],
return: ['u32'],
},
],
structs: [
{
name: 'HiHi',
is_native: false,
abilities: ['store'],
generic_type_params: [],
fields: [{ name: 'count', type: 'u64' }],
},
],
})
})

it('reads module info correctly', async () => {
const modules = await builder.getAll()
const dummy = modules['dummy']
const hihi = modules['hihi']

expect(await MoveBuilder.read_module_info(dummy)).toEqual(
'{"address":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4],"name":"dummy"}'
)
expect(await MoveBuilder.read_module_info(hihi)).toEqual(
'{"address":[0,0,0,0,0,0,0,0,0,0,0,0,76,78,143,125,239,60,36,69,58,231,238,231,217,174,233,183,85,106,38,160],"name":"hihi"}'
)
expect(await MoveBuilder.readModuleInfo(dummy)).toEqual({
address: '0x4',
name: 'dummy',
})
expect(await MoveBuilder.readModuleInfo(hihi)).toEqual({
address: '0x4',
name: 'hihi',
})
})

it('reads source maps correctly', async () => {
Expand All @@ -123,16 +143,12 @@ describe('build move package', () => {

it('reads module info correctly', async () => {
const binary = await builder.get('dummy')
const moduleInfo = await MoveBuilder.read_module_info(binary)
const expectedModuleInfo = JSON.stringify({
address: [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 4,
],
const moduleInfo = await MoveBuilder.readModuleInfo(binary)

expect(moduleInfo).toEqual({
address: '0x4',
name: 'dummy',
})

expect(moduleInfo).toEqual(expectedModuleInfo)
})

it('cleans the package correctly', async () => {
Expand Down
3 changes: 1 addition & 2 deletions test/contract/dummy/Move.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,4 @@ version = "1.0.0"
[addresses]
std = "0x1"
initia_std = "0x1"
test="_"
test2 = "_"
test="_"
6 changes: 6 additions & 0 deletions test/contract/dummy/sources/dummy.move
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
module test::dummy {
friend test::hihi;

public fun return_0(): u32 {
0
}
Expand All @@ -7,6 +9,10 @@ module test::dummy {
10
}

public(friend) fun return_10_by_friend(): u32 {
10
}

#[test]
fun test_return_0() {
assert!(return_0() == 0,1);
Expand Down
Loading