Skip to content

Commit

Permalink
feat-issues-242: borsh support
Browse files Browse the repository at this point in the history
  • Loading branch information
SpringChiu authored and fospring committed Aug 2, 2023
1 parent 01cab6d commit ea2632f
Show file tree
Hide file tree
Showing 11 changed files with 858 additions and 665 deletions.
61 changes: 61 additions & 0 deletions examples/__tests__/test-status-message-borsh.ava.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { Worker } from "near-workspaces";
import test from "ava";

test.before(async (t) => {
// Init the worker and start a Sandbox server
const worker = await Worker.init();

// Prepare sandbox for tests, create accounts, deploy contracts, etx.
const root = worker.rootAccount;

// Deploy the contract.
const statusMessage = await root.devDeploy("./build/status-message-borsh.wasm");

// Create test users
const ali = await root.createSubAccount("ali");
const bob = await root.createSubAccount("bob");
const carl = await root.createSubAccount("carl");

// Save state for test runs
t.context.worker = worker;
t.context.accounts = { root, statusMessage, ali, bob, carl };
});

test.after.always(async (t) => {
await t.context.worker.tearDown().catch((error) => {
console.log("Failed to tear down the worker:", error);
});
});

test("Root gets null status", async (t) => {
const { statusMessage, root } = t.context.accounts;
const result = await statusMessage.view("get_status", {
account_id: root.accountId,
});
t.is(result, null);
});

test("Ali sets then gets status", async (t) => {
const { ali, statusMessage } = t.context.accounts;
await ali.call(statusMessage, "set_status", { message: "hello" });

t.is(
await statusMessage.view("get_status", { account_id: ali.accountId }),
"hello"
);
});

test("Bob and Carl have different statuses", async (t) => {
const { statusMessage, bob, carl } = t.context.accounts;
await bob.call(statusMessage, "set_status", { message: "hello" });
await carl.call(statusMessage, "set_status", { message: "world" });

const bobStatus = await statusMessage.view("get_status", {
account_id: bob.accountId,
});
const carlStatus = await statusMessage.view("get_status", {
account_id: carl.accountId,
});
t.is(bobStatus, "hello");
t.is(carlStatus, "world");
});
7 changes: 5 additions & 2 deletions examples/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"scripts": {
"build": "run-s build:*",
"build:status-message": "near-sdk-js build src/status-message.js build/status-message.wasm",
"build:status-message-borsh": "near-sdk-js build src/status-message-borsh.js build/status-message-borsh.wasm",
"build:clean-state": "near-sdk-js build src/clean-state.js build/clean-state.wasm",
"build:counter": "near-sdk-js build src/counter.js build/counter.wasm",
"build:counter-lowlevel": "near-sdk-js build src/counter-lowlevel.js build/counter-lowlevel.wasm",
Expand Down Expand Up @@ -45,15 +46,17 @@
"test:parking-lot": "ava __tests__/test-parking-lot.ava.js",
"test:programmatic-update": "ava __tests__/test-programmatic-update.ava.js",
"test:state-migration": "ava __tests__/test-state-migration.ava.js",
"test:nested-collections": "ava __tests__/test-nested-collections.ava.js"
"test:nested-collections": "ava __tests__/test-nested-collections.ava.js",
"test:status-message-borsh": "ava __tests__/test-status-message-borsh.ava.js"
},
"author": "Near Inc <hello@nearprotocol.com>",
"license": "Apache-2.0",
"dependencies": {
"lodash-es": "^4.17.21",
"near-contract-standards": "workspace:*",
"near-sdk-js": "workspace:*",
"typescript": "^4.7.4"
"typescript": "^4.7.4",
"borsh": "https://github.com/gagdiez/borsh-js#fb89acf7800a717f1048f104acded64693bba2ca"
},
"devDependencies": {
"@types/lodash-es": "^4.17.6",
Expand Down
40 changes: 40 additions & 0 deletions examples/src/status-message-borsh.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import {NearBindgen, call, view, near, borshSerialize, borshDeserialize} from "near-sdk-js";

const schema = {
struct: { records: {map: { key: 'string', value: 'string' }} }
};

function borshSerializeStatusMessage(statusMessage) {
return borshSerialize(schema, statusMessage);
}

function borshDeserializeStatusMessage(value) {
return borshDeserialize(schema, value)
}

@NearBindgen({
serializer(value) {
return borshSerializeStatusMessage(value);
},
deserializer(value) {
return borshDeserializeStatusMessage(value);
}
})
export class StatusMessage {
constructor() {
this.records = new Map()
}

@call({})
set_status({ message }) {
let account_id = near.signerAccountId()
env.log(`${account_id} set_status with message ${message}`)
this.records.set(account_id, message)
}

@view({})
get_status({ account_id }) {
env.log(`get_status for account_id ${account_id}`)
return this.records.get(account_id) || null
}
}
4 changes: 4 additions & 0 deletions packages/near-sdk-js/lib/borsh.d.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions packages/near-sdk-js/lib/borsh.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/near-sdk-js/lib/index.d.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/near-sdk-js/lib/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion packages/near-sdk-js/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@
"rollup-plugin-sourcemaps": "^0.6.3",
"signale": "^1.4.0",
"ts-morph": "^16.0.0",
"typescript": "~4.7.2"
"typescript": "~4.7.2",
"borsh": "https://github.com/gagdiez/borsh-js#fb89acf7800a717f1048f104acded64693bba2ca"
},
"files": [
"builder",
Expand Down
9 changes: 9 additions & 0 deletions packages/near-sdk-js/src/borsh.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import * as borsh from 'borsh';
import {Schema} from "borsh";
import {DecodeTypes} from "borsh/lib/types/types";
export function borshSerialize(schema: Schema, value: unknown, checkSchema?: boolean): Uint8Array {
return borsh.serialize(schema, value, checkSchema);
}
export function borshDeserialize(schema: Schema, buffer: Uint8Array, checkSchema?: boolean): DecodeTypes {
return borsh.deserialize(schema, buffer, checkSchema);
}
1 change: 1 addition & 0 deletions packages/near-sdk-js/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ export * as near from "./api";
export * from "./near-bindgen";
export * from "./promise";
export * from "./utils";
export * from "./borsh";
Loading

0 comments on commit ea2632f

Please sign in to comment.