@ckb-ccc/ssri 0.1.0 → 0.2.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/CHANGELOG.md +24 -0
- package/dist/executor.d.ts +9 -3
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +26 -8
- package/dist/trait.d.ts +4 -2
- package/dist/trait.d.ts.map +1 -1
- package/dist/trait.js +23 -2
- package/dist.commonjs/executor.d.ts +9 -3
- package/dist.commonjs/executor.d.ts.map +1 -1
- package/dist.commonjs/executor.js +30 -10
- package/dist.commonjs/trait.d.ts +4 -2
- package/dist.commonjs/trait.d.ts.map +1 -1
- package/dist.commonjs/trait.js +23 -2
- package/package.json +2 -2
- package/src/executor.ts +28 -9
- package/src/trait.ts +37 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# @ckb-ccc/ssri
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`e4ea183`](https://github.com/ckb-devrel/ccc/commit/e4ea18359675877511550ac0b28f207550f907e4) Thanks [@Hanssen0](https://github.com/Hanssen0)! - feat(ssri): Trait.tryRun to handle expected error
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- [`52ef11b`](https://github.com/ckb-devrel/ccc/commit/52ef11baa7bde8a73467683f5c44a863190aa1f1) Thanks [@Hanssen0](https://github.com/Hanssen0)! - fix(ssri): Trait.version() should throw if byteLength mismatch
|
|
12
|
+
|
|
13
|
+
- Updated dependencies [[`3fdb2c4`](https://github.com/ckb-devrel/ccc/commit/3fdb2c477d0b2766b231e436b8f396f047b02634), [`f429087`](https://github.com/ckb-devrel/ccc/commit/f4290874dfab3fe58844e5169673c5d47bda64e3)]:
|
|
14
|
+
- @ckb-ccc/core@1.4.0
|
|
15
|
+
|
|
16
|
+
## 0.1.1
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- [#134](https://github.com/ckb-devrel/ccc/pull/134) [`ecb9059`](https://github.com/ckb-devrel/ccc/commit/ecb9059e54f8a2afacda45e58a961532bf1107a1) Thanks [@Hanssen0](https://github.com/Hanssen0)! - fix(ssri): ssri.Trait class should not be abstract
|
|
21
|
+
|
|
22
|
+
- [`092c0a9`](https://github.com/ckb-devrel/ccc/commit/092c0a9e30ece8a8767fa59d23707833dce015eb) Thanks [@Hanssen0](https://github.com/Hanssen0)! - refactor(ssri): error types
|
|
23
|
+
|
|
24
|
+
- Updated dependencies [[`a48cccf`](https://github.com/ckb-devrel/ccc/commit/a48cccfae3ce6b3456a5eb863f207e7e5a6e568f)]:
|
|
25
|
+
- @ckb-ccc/core@1.3.1
|
|
26
|
+
|
|
3
27
|
## 0.1.0
|
|
4
28
|
|
|
5
29
|
### Minor Changes
|
package/dist/executor.d.ts
CHANGED
|
@@ -14,6 +14,15 @@ export type ContextScript = {
|
|
|
14
14
|
cell?: undefined | null;
|
|
15
15
|
tx?: undefined | null;
|
|
16
16
|
};
|
|
17
|
+
export declare class ExecutorErrorUnknown extends Error {
|
|
18
|
+
constructor(msg?: string);
|
|
19
|
+
}
|
|
20
|
+
export declare class ExecutorErrorExecutionFailed extends Error {
|
|
21
|
+
constructor(msg?: string);
|
|
22
|
+
}
|
|
23
|
+
export declare class ExecutorErrorDecode extends Error {
|
|
24
|
+
constructor(msg?: string);
|
|
25
|
+
}
|
|
17
26
|
export type ContextCode = undefined | {
|
|
18
27
|
script?: undefined | null;
|
|
19
28
|
cell?: undefined | null;
|
|
@@ -26,9 +35,6 @@ export declare class ExecutorResponse<T> {
|
|
|
26
35
|
static new<T>(res: T, cellDeps?: ccc.OutPointLike[] | null): ExecutorResponse<T>;
|
|
27
36
|
map<U>(fn: (res: T) => U): ExecutorResponse<U>;
|
|
28
37
|
}
|
|
29
|
-
export declare class ExecutorErrorExecutionFailed extends Error {
|
|
30
|
-
constructor(msg?: string);
|
|
31
|
-
}
|
|
32
38
|
/**
|
|
33
39
|
* Represents an SSRI executor.
|
|
34
40
|
*/
|
package/dist/executor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAIpC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC;IAC7C,EAAE,EAAE,GAAG,CAAC,eAAe,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrC,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB,SAAS,GACT;IACE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC;AAEN,qBAAa,gBAAgB,CAAC,CAAC;aAEX,GAAG,EAAE,CAAC;aACN,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE;gBADxB,GAAG,EAAE,CAAC,EACN,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE;IAG1C,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,IAAI;IAI1D,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAIpC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC;IAC7C,EAAE,EAAE,GAAG,CAAC,eAAe,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrC,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,GAAG,CAAC,EAAE,MAAM;CAGzB;AAED,qBAAa,4BAA6B,SAAQ,KAAK;gBACzC,GAAG,CAAC,EAAE,MAAM;CAGzB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,GAAG,CAAC,EAAE,MAAM;CAGzB;AAED,MAAM,MAAM,WAAW,GACnB,SAAS,GACT;IACE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC;AAEN,qBAAa,gBAAgB,CAAC,CAAC;aAEX,GAAG,EAAE,CAAC;aACN,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE;gBADxB,GAAG,EAAE,CAAC,EACN,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE;IAG1C,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,IAAI;IAI1D,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC;CAO/C;AAED;;GAEG;AACH,8BAAsB,QAAQ;IAC5B,QAAQ,CAAC,SAAS,CAChB,YAAY,EAAE,GAAG,CAAC,YAAY,EAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,EACnB,OAAO,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,WAAW,GAAG,kBAAkB,GACvE,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAE/B,YAAY,CAChB,YAAY,EAAE,GAAG,CAAC,YAAY,EAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,EACnB,OAAO,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,WAAW,GAAG,kBAAkB,GACvE,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;CAUlD;AAED,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,SAAgB,SAAS,EAAE,GAAG,CAAC,gBAAgB,CAAC;IAEhD;;;OAGG;gBAED,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,GAAG,CAAC,sBAAsB,GAAG;QAAE,SAAS,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAA;KAAE;IA8B5E,IAAI,GAAG,WAEN;IAYK,SAAS,CACb,YAAY,EAAE,GAAG,CAAC,YAAY,EAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,EACnB,OAAO,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,WAAW,GAAG,kBAAkB,GACvE,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAiDtC"}
|
package/dist/executor.js
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import { ccc } from "@ckb-ccc/core";
|
|
2
2
|
import { cccA } from "@ckb-ccc/core/advanced";
|
|
3
3
|
import { getMethodPath } from "./utils.js";
|
|
4
|
+
export class ExecutorErrorUnknown extends Error {
|
|
5
|
+
constructor(msg) {
|
|
6
|
+
super(msg);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class ExecutorErrorExecutionFailed extends Error {
|
|
10
|
+
constructor(msg) {
|
|
11
|
+
super(msg);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class ExecutorErrorDecode extends Error {
|
|
15
|
+
constructor(msg) {
|
|
16
|
+
super(msg);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
4
19
|
export class ExecutorResponse {
|
|
5
20
|
constructor(res, cellDeps) {
|
|
6
21
|
this.res = res;
|
|
@@ -10,12 +25,12 @@ export class ExecutorResponse {
|
|
|
10
25
|
return new ExecutorResponse(res, cellDeps?.map(ccc.OutPoint.from) ?? []);
|
|
11
26
|
}
|
|
12
27
|
map(fn) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
28
|
+
try {
|
|
29
|
+
return new ExecutorResponse(fn(this.res), this.cellDeps);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
throw new ExecutorErrorDecode(JSON.stringify(err));
|
|
33
|
+
}
|
|
19
34
|
}
|
|
20
35
|
}
|
|
21
36
|
/**
|
|
@@ -48,7 +63,7 @@ export class ExecutorJsonRpc extends Executor {
|
|
|
48
63
|
errAny === null ||
|
|
49
64
|
!("code" in errAny) ||
|
|
50
65
|
typeof errAny.code !== "number") {
|
|
51
|
-
throw errAny;
|
|
66
|
+
throw new ExecutorErrorUnknown(JSON.stringify(errAny));
|
|
52
67
|
}
|
|
53
68
|
if (errAny.code === 1003 || errAny.code === 1004) {
|
|
54
69
|
if ("message" in errAny && typeof errAny.message === "string") {
|
|
@@ -56,7 +71,10 @@ export class ExecutorJsonRpc extends Executor {
|
|
|
56
71
|
}
|
|
57
72
|
throw new ExecutorErrorExecutionFailed();
|
|
58
73
|
}
|
|
59
|
-
|
|
74
|
+
if ("message" in errAny && typeof errAny.message === "string") {
|
|
75
|
+
throw new ExecutorErrorUnknown(errAny.message);
|
|
76
|
+
}
|
|
77
|
+
throw new ExecutorErrorUnknown();
|
|
60
78
|
});
|
|
61
79
|
}
|
|
62
80
|
get url() {
|
package/dist/trait.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ccc } from "@ckb-ccc/core";
|
|
2
2
|
import { Executor, ExecutorResponse } from "./executor.js";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Class representing an SSRI trait. Should be used as the base of all SSRI traits.
|
|
5
5
|
*/
|
|
6
|
-
export declare
|
|
6
|
+
export declare class Trait {
|
|
7
7
|
readonly code: ccc.OutPoint;
|
|
8
8
|
readonly executor?: Executor;
|
|
9
9
|
/**
|
|
@@ -12,6 +12,8 @@ export declare abstract class Trait {
|
|
|
12
12
|
* @param executor - The SSRI executor instance.
|
|
13
13
|
*/
|
|
14
14
|
constructor(code: ccc.OutPointLike, executor?: Executor | null);
|
|
15
|
+
static tryRun<T>(call: Promise<ExecutorResponse<T>>): Promise<ExecutorResponse<T | undefined>>;
|
|
16
|
+
tryRun<T>(call: Promise<ExecutorResponse<T>>): Promise<ExecutorResponse<T | undefined>>;
|
|
15
17
|
assertExecutor(): Executor;
|
|
16
18
|
/**
|
|
17
19
|
* Retrieves a list of methods.
|
package/dist/trait.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trait.d.ts","sourceRoot":"","sources":["../src/trait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"trait.d.ts","sourceRoot":"","sources":["../src/trait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EACL,QAAQ,EAGR,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAGvB;;GAEG;AACH,qBAAa,KAAK;IAChB,SAAgB,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC;IACnC,SAAgB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpC;;;;OAIG;gBACS,IAAI,EAAE,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI;WAKjD,MAAM,CAAC,CAAC,EACnB,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAcrC,MAAM,CAAC,CAAC,EACZ,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAI3C,cAAc;IAQd;;;;;OAKG;IACG,UAAU,CACd,MAAM,GAAE,GAAG,CAAC,OAAW,EACvB,KAAK,GAAE,GAAG,CAAC,OAAW,GACrB,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAUvC;;;;OAIG;IACG,UAAU,CACd,WAAW,EAAE,MAAM,EAAE,EACrB,gBAAgB,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,GAC/B,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;IAcvC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAcpD"}
|
package/dist/trait.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ccc } from "@ckb-ccc/core";
|
|
2
|
+
import { ExecutorErrorDecode, ExecutorErrorExecutionFailed, ExecutorResponse, } from "./executor.js";
|
|
2
3
|
import { getMethodPath } from "./utils.js";
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
+
* Class representing an SSRI trait. Should be used as the base of all SSRI traits.
|
|
5
6
|
*/
|
|
6
7
|
export class Trait {
|
|
7
8
|
/**
|
|
@@ -13,6 +14,21 @@ export class Trait {
|
|
|
13
14
|
this.code = ccc.OutPoint.from(code);
|
|
14
15
|
this.executor = executor ?? undefined;
|
|
15
16
|
}
|
|
17
|
+
static async tryRun(call) {
|
|
18
|
+
try {
|
|
19
|
+
return await call;
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
if (e instanceof ExecutorErrorExecutionFailed ||
|
|
23
|
+
e instanceof ExecutorErrorDecode) {
|
|
24
|
+
return ExecutorResponse.new(undefined);
|
|
25
|
+
}
|
|
26
|
+
throw e;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async tryRun(call) {
|
|
30
|
+
return Trait.tryRun(call);
|
|
31
|
+
}
|
|
16
32
|
assertExecutor() {
|
|
17
33
|
if (!this.executor) {
|
|
18
34
|
throw new Error("SSRI executor is not set");
|
|
@@ -47,6 +63,11 @@ export class Trait {
|
|
|
47
63
|
*/
|
|
48
64
|
async version() {
|
|
49
65
|
const res = await this.assertExecutor().runScript(this.code, "SSRI.version", []);
|
|
50
|
-
return res.map((res) =>
|
|
66
|
+
return res.map((res) => {
|
|
67
|
+
if (res.length !== 4) {
|
|
68
|
+
throw new Error("Invalid U8");
|
|
69
|
+
}
|
|
70
|
+
return ccc.numFrom(res);
|
|
71
|
+
});
|
|
51
72
|
}
|
|
52
73
|
}
|
|
@@ -14,6 +14,15 @@ export type ContextScript = {
|
|
|
14
14
|
cell?: undefined | null;
|
|
15
15
|
tx?: undefined | null;
|
|
16
16
|
};
|
|
17
|
+
export declare class ExecutorErrorUnknown extends Error {
|
|
18
|
+
constructor(msg?: string);
|
|
19
|
+
}
|
|
20
|
+
export declare class ExecutorErrorExecutionFailed extends Error {
|
|
21
|
+
constructor(msg?: string);
|
|
22
|
+
}
|
|
23
|
+
export declare class ExecutorErrorDecode extends Error {
|
|
24
|
+
constructor(msg?: string);
|
|
25
|
+
}
|
|
17
26
|
export type ContextCode = undefined | {
|
|
18
27
|
script?: undefined | null;
|
|
19
28
|
cell?: undefined | null;
|
|
@@ -26,9 +35,6 @@ export declare class ExecutorResponse<T> {
|
|
|
26
35
|
static new<T>(res: T, cellDeps?: ccc.OutPointLike[] | null): ExecutorResponse<T>;
|
|
27
36
|
map<U>(fn: (res: T) => U): ExecutorResponse<U>;
|
|
28
37
|
}
|
|
29
|
-
export declare class ExecutorErrorExecutionFailed extends Error {
|
|
30
|
-
constructor(msg?: string);
|
|
31
|
-
}
|
|
32
38
|
/**
|
|
33
39
|
* Represents an SSRI executor.
|
|
34
40
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAIpC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC;IAC7C,EAAE,EAAE,GAAG,CAAC,eAAe,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrC,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB,SAAS,GACT;IACE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC;AAEN,qBAAa,gBAAgB,CAAC,CAAC;aAEX,GAAG,EAAE,CAAC;aACN,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE;gBADxB,GAAG,EAAE,CAAC,EACN,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE;IAG1C,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,IAAI;IAI1D,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ExecutorJsonRpc = exports.Executor = exports.ExecutorErrorExecutionFailed = exports.
|
|
3
|
+
exports.ExecutorJsonRpc = exports.Executor = exports.ExecutorResponse = exports.ExecutorErrorDecode = exports.ExecutorErrorExecutionFailed = exports.ExecutorErrorUnknown = void 0;
|
|
4
4
|
const core_1 = require("@ckb-ccc/core");
|
|
5
5
|
const advanced_1 = require("@ckb-ccc/core/advanced");
|
|
6
6
|
const utils_js_1 = require("./utils.js");
|
|
7
|
+
class ExecutorErrorUnknown extends Error {
|
|
8
|
+
constructor(msg) {
|
|
9
|
+
super(msg);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.ExecutorErrorUnknown = ExecutorErrorUnknown;
|
|
13
|
+
class ExecutorErrorExecutionFailed extends Error {
|
|
14
|
+
constructor(msg) {
|
|
15
|
+
super(msg);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.ExecutorErrorExecutionFailed = ExecutorErrorExecutionFailed;
|
|
19
|
+
class ExecutorErrorDecode extends Error {
|
|
20
|
+
constructor(msg) {
|
|
21
|
+
super(msg);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.ExecutorErrorDecode = ExecutorErrorDecode;
|
|
7
25
|
class ExecutorResponse {
|
|
8
26
|
constructor(res, cellDeps) {
|
|
9
27
|
this.res = res;
|
|
@@ -13,16 +31,15 @@ class ExecutorResponse {
|
|
|
13
31
|
return new ExecutorResponse(res, cellDeps?.map(core_1.ccc.OutPoint.from) ?? []);
|
|
14
32
|
}
|
|
15
33
|
map(fn) {
|
|
16
|
-
|
|
34
|
+
try {
|
|
35
|
+
return new ExecutorResponse(fn(this.res), this.cellDeps);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
throw new ExecutorErrorDecode(JSON.stringify(err));
|
|
39
|
+
}
|
|
17
40
|
}
|
|
18
41
|
}
|
|
19
42
|
exports.ExecutorResponse = ExecutorResponse;
|
|
20
|
-
class ExecutorErrorExecutionFailed extends Error {
|
|
21
|
-
constructor(msg) {
|
|
22
|
-
super(msg);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
exports.ExecutorErrorExecutionFailed = ExecutorErrorExecutionFailed;
|
|
26
43
|
/**
|
|
27
44
|
* Represents an SSRI executor.
|
|
28
45
|
*/
|
|
@@ -54,7 +71,7 @@ class ExecutorJsonRpc extends Executor {
|
|
|
54
71
|
errAny === null ||
|
|
55
72
|
!("code" in errAny) ||
|
|
56
73
|
typeof errAny.code !== "number") {
|
|
57
|
-
throw errAny;
|
|
74
|
+
throw new ExecutorErrorUnknown(JSON.stringify(errAny));
|
|
58
75
|
}
|
|
59
76
|
if (errAny.code === 1003 || errAny.code === 1004) {
|
|
60
77
|
if ("message" in errAny && typeof errAny.message === "string") {
|
|
@@ -62,7 +79,10 @@ class ExecutorJsonRpc extends Executor {
|
|
|
62
79
|
}
|
|
63
80
|
throw new ExecutorErrorExecutionFailed();
|
|
64
81
|
}
|
|
65
|
-
|
|
82
|
+
if ("message" in errAny && typeof errAny.message === "string") {
|
|
83
|
+
throw new ExecutorErrorUnknown(errAny.message);
|
|
84
|
+
}
|
|
85
|
+
throw new ExecutorErrorUnknown();
|
|
66
86
|
});
|
|
67
87
|
}
|
|
68
88
|
get url() {
|
package/dist.commonjs/trait.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ccc } from "@ckb-ccc/core";
|
|
2
2
|
import { Executor, ExecutorResponse } from "./executor.js";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Class representing an SSRI trait. Should be used as the base of all SSRI traits.
|
|
5
5
|
*/
|
|
6
|
-
export declare
|
|
6
|
+
export declare class Trait {
|
|
7
7
|
readonly code: ccc.OutPoint;
|
|
8
8
|
readonly executor?: Executor;
|
|
9
9
|
/**
|
|
@@ -12,6 +12,8 @@ export declare abstract class Trait {
|
|
|
12
12
|
* @param executor - The SSRI executor instance.
|
|
13
13
|
*/
|
|
14
14
|
constructor(code: ccc.OutPointLike, executor?: Executor | null);
|
|
15
|
+
static tryRun<T>(call: Promise<ExecutorResponse<T>>): Promise<ExecutorResponse<T | undefined>>;
|
|
16
|
+
tryRun<T>(call: Promise<ExecutorResponse<T>>): Promise<ExecutorResponse<T | undefined>>;
|
|
15
17
|
assertExecutor(): Executor;
|
|
16
18
|
/**
|
|
17
19
|
* Retrieves a list of methods.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trait.d.ts","sourceRoot":"","sources":["../src/trait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"trait.d.ts","sourceRoot":"","sources":["../src/trait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EACL,QAAQ,EAGR,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAGvB;;GAEG;AACH,qBAAa,KAAK;IAChB,SAAgB,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC;IACnC,SAAgB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpC;;;;OAIG;gBACS,IAAI,EAAE,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI;WAKjD,MAAM,CAAC,CAAC,EACnB,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAcrC,MAAM,CAAC,CAAC,EACZ,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAI3C,cAAc;IAQd;;;;;OAKG;IACG,UAAU,CACd,MAAM,GAAE,GAAG,CAAC,OAAW,EACvB,KAAK,GAAE,GAAG,CAAC,OAAW,GACrB,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAUvC;;;;OAIG;IACG,UAAU,CACd,WAAW,EAAE,MAAM,EAAE,EACrB,gBAAgB,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,GAC/B,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;IAcvC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAcpD"}
|
package/dist.commonjs/trait.js
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Trait = void 0;
|
|
4
4
|
const core_1 = require("@ckb-ccc/core");
|
|
5
|
+
const executor_js_1 = require("./executor.js");
|
|
5
6
|
const utils_js_1 = require("./utils.js");
|
|
6
7
|
/**
|
|
7
|
-
*
|
|
8
|
+
* Class representing an SSRI trait. Should be used as the base of all SSRI traits.
|
|
8
9
|
*/
|
|
9
10
|
class Trait {
|
|
10
11
|
/**
|
|
@@ -16,6 +17,21 @@ class Trait {
|
|
|
16
17
|
this.code = core_1.ccc.OutPoint.from(code);
|
|
17
18
|
this.executor = executor ?? undefined;
|
|
18
19
|
}
|
|
20
|
+
static async tryRun(call) {
|
|
21
|
+
try {
|
|
22
|
+
return await call;
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
if (e instanceof executor_js_1.ExecutorErrorExecutionFailed ||
|
|
26
|
+
e instanceof executor_js_1.ExecutorErrorDecode) {
|
|
27
|
+
return executor_js_1.ExecutorResponse.new(undefined);
|
|
28
|
+
}
|
|
29
|
+
throw e;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async tryRun(call) {
|
|
33
|
+
return Trait.tryRun(call);
|
|
34
|
+
}
|
|
19
35
|
assertExecutor() {
|
|
20
36
|
if (!this.executor) {
|
|
21
37
|
throw new Error("SSRI executor is not set");
|
|
@@ -50,7 +66,12 @@ class Trait {
|
|
|
50
66
|
*/
|
|
51
67
|
async version() {
|
|
52
68
|
const res = await this.assertExecutor().runScript(this.code, "SSRI.version", []);
|
|
53
|
-
return res.map((res) =>
|
|
69
|
+
return res.map((res) => {
|
|
70
|
+
if (res.length !== 4) {
|
|
71
|
+
throw new Error("Invalid U8");
|
|
72
|
+
}
|
|
73
|
+
return core_1.ccc.numFrom(res);
|
|
74
|
+
});
|
|
54
75
|
}
|
|
55
76
|
}
|
|
56
77
|
exports.Trait = Trait;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ckb-ccc/ssri",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "SSRI",
|
|
5
5
|
"author": "Alive24 <xct24@live.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"access": "public"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@ckb-ccc/core": "1.
|
|
45
|
+
"@ckb-ccc/core": "1.4.0"
|
|
46
46
|
},
|
|
47
47
|
"scripts": {
|
|
48
48
|
"test": "jest",
|
package/src/executor.ts
CHANGED
|
@@ -20,6 +20,24 @@ export type ContextScript = {
|
|
|
20
20
|
tx?: undefined | null;
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
+
export class ExecutorErrorUnknown extends Error {
|
|
24
|
+
constructor(msg?: string) {
|
|
25
|
+
super(msg);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export class ExecutorErrorExecutionFailed extends Error {
|
|
30
|
+
constructor(msg?: string) {
|
|
31
|
+
super(msg);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class ExecutorErrorDecode extends Error {
|
|
36
|
+
constructor(msg?: string) {
|
|
37
|
+
super(msg);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
23
41
|
export type ContextCode =
|
|
24
42
|
| undefined
|
|
25
43
|
| {
|
|
@@ -39,13 +57,11 @@ export class ExecutorResponse<T> {
|
|
|
39
57
|
}
|
|
40
58
|
|
|
41
59
|
map<U>(fn: (res: T) => U): ExecutorResponse<U> {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
constructor(msg?: string) {
|
|
48
|
-
super(msg);
|
|
60
|
+
try {
|
|
61
|
+
return new ExecutorResponse(fn(this.res), this.cellDeps);
|
|
62
|
+
} catch (err) {
|
|
63
|
+
throw new ExecutorErrorDecode(JSON.stringify(err));
|
|
64
|
+
}
|
|
49
65
|
}
|
|
50
66
|
}
|
|
51
67
|
|
|
@@ -99,7 +115,7 @@ export class ExecutorJsonRpc extends Executor {
|
|
|
99
115
|
!("code" in errAny) ||
|
|
100
116
|
typeof errAny.code !== "number"
|
|
101
117
|
) {
|
|
102
|
-
throw errAny;
|
|
118
|
+
throw new ExecutorErrorUnknown(JSON.stringify(errAny));
|
|
103
119
|
}
|
|
104
120
|
|
|
105
121
|
if (errAny.code === 1003 || errAny.code === 1004) {
|
|
@@ -109,7 +125,10 @@ export class ExecutorJsonRpc extends Executor {
|
|
|
109
125
|
throw new ExecutorErrorExecutionFailed();
|
|
110
126
|
}
|
|
111
127
|
|
|
112
|
-
|
|
128
|
+
if ("message" in errAny && typeof errAny.message === "string") {
|
|
129
|
+
throw new ExecutorErrorUnknown(errAny.message);
|
|
130
|
+
}
|
|
131
|
+
throw new ExecutorErrorUnknown();
|
|
113
132
|
});
|
|
114
133
|
}
|
|
115
134
|
|
package/src/trait.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { ccc } from "@ckb-ccc/core";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
Executor,
|
|
4
|
+
ExecutorErrorDecode,
|
|
5
|
+
ExecutorErrorExecutionFailed,
|
|
6
|
+
ExecutorResponse,
|
|
7
|
+
} from "./executor.js";
|
|
3
8
|
import { getMethodPath } from "./utils.js";
|
|
4
9
|
|
|
5
10
|
/**
|
|
6
|
-
*
|
|
11
|
+
* Class representing an SSRI trait. Should be used as the base of all SSRI traits.
|
|
7
12
|
*/
|
|
8
|
-
export
|
|
13
|
+
export class Trait {
|
|
9
14
|
public readonly code: ccc.OutPoint;
|
|
10
15
|
public readonly executor?: Executor;
|
|
11
16
|
|
|
@@ -19,6 +24,28 @@ export abstract class Trait {
|
|
|
19
24
|
this.executor = executor ?? undefined;
|
|
20
25
|
}
|
|
21
26
|
|
|
27
|
+
static async tryRun<T>(
|
|
28
|
+
call: Promise<ExecutorResponse<T>>,
|
|
29
|
+
): Promise<ExecutorResponse<T | undefined>> {
|
|
30
|
+
try {
|
|
31
|
+
return await call;
|
|
32
|
+
} catch (e) {
|
|
33
|
+
if (
|
|
34
|
+
e instanceof ExecutorErrorExecutionFailed ||
|
|
35
|
+
e instanceof ExecutorErrorDecode
|
|
36
|
+
) {
|
|
37
|
+
return ExecutorResponse.new(undefined);
|
|
38
|
+
}
|
|
39
|
+
throw e;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async tryRun<T>(
|
|
44
|
+
call: Promise<ExecutorResponse<T>>,
|
|
45
|
+
): Promise<ExecutorResponse<T | undefined>> {
|
|
46
|
+
return Trait.tryRun(call);
|
|
47
|
+
}
|
|
48
|
+
|
|
22
49
|
assertExecutor() {
|
|
23
50
|
if (!this.executor) {
|
|
24
51
|
throw new Error("SSRI executor is not set");
|
|
@@ -78,6 +105,12 @@ export abstract class Trait {
|
|
|
78
105
|
"SSRI.version",
|
|
79
106
|
[],
|
|
80
107
|
);
|
|
81
|
-
|
|
108
|
+
|
|
109
|
+
return res.map((res) => {
|
|
110
|
+
if (res.length !== 4) {
|
|
111
|
+
throw new Error("Invalid U8");
|
|
112
|
+
}
|
|
113
|
+
return ccc.numFrom(res);
|
|
114
|
+
});
|
|
82
115
|
}
|
|
83
116
|
}
|