@haneullabs/wallet-sdk 0.1.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 +69 -0
- package/README.md +1 -0
- package/dist/cjs/auto-approvals/analyzer.d.ts +71 -0
- package/dist/cjs/auto-approvals/analyzer.js +70 -0
- package/dist/cjs/auto-approvals/analyzer.js.map +7 -0
- package/dist/cjs/auto-approvals/index.d.ts +6 -0
- package/dist/cjs/auto-approvals/index.js +33 -0
- package/dist/cjs/auto-approvals/index.js.map +7 -0
- package/dist/cjs/auto-approvals/intent.d.ts +5 -0
- package/dist/cjs/auto-approvals/intent.js +65 -0
- package/dist/cjs/auto-approvals/intent.js.map +7 -0
- package/dist/cjs/auto-approvals/manager.d.ts +31 -0
- package/dist/cjs/auto-approvals/manager.js +328 -0
- package/dist/cjs/auto-approvals/manager.js.map +7 -0
- package/dist/cjs/auto-approvals/schemas/index.d.ts +4 -0
- package/dist/cjs/auto-approvals/schemas/index.js +28 -0
- package/dist/cjs/auto-approvals/schemas/index.js.map +7 -0
- package/dist/cjs/auto-approvals/schemas/policy.d.ts +145 -0
- package/dist/cjs/auto-approvals/schemas/policy.js +79 -0
- package/dist/cjs/auto-approvals/schemas/policy.js.map +7 -0
- package/dist/cjs/auto-approvals/schemas/state.d.ts +115 -0
- package/dist/cjs/auto-approvals/schemas/state.js +49 -0
- package/dist/cjs/auto-approvals/schemas/state.js.map +7 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.js +20 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/package.json +5 -0
- package/dist/cjs/transaction-analyzer/analyzer.d.ts +34 -0
- package/dist/cjs/transaction-analyzer/analyzer.js +94 -0
- package/dist/cjs/transaction-analyzer/analyzer.js.map +7 -0
- package/dist/cjs/transaction-analyzer/index.d.ts +9 -0
- package/dist/cjs/transaction-analyzer/index.js +28 -0
- package/dist/cjs/transaction-analyzer/index.js.map +7 -0
- package/dist/cjs/transaction-analyzer/rules/accessLevel.d.ts +29 -0
- package/dist/cjs/transaction-analyzer/rules/accessLevel.js +106 -0
- package/dist/cjs/transaction-analyzer/rules/accessLevel.js.map +7 -0
- package/dist/cjs/transaction-analyzer/rules/coin-flows.d.ts +313 -0
- package/dist/cjs/transaction-analyzer/rules/coin-flows.js +179 -0
- package/dist/cjs/transaction-analyzer/rules/coin-flows.js.map +7 -0
- package/dist/cjs/transaction-analyzer/rules/coin-value.d.ts +42 -0
- package/dist/cjs/transaction-analyzer/rules/coin-value.js +60 -0
- package/dist/cjs/transaction-analyzer/rules/coin-value.js.map +7 -0
- package/dist/cjs/transaction-analyzer/rules/coins.d.ts +337 -0
- package/dist/cjs/transaction-analyzer/rules/coins.js +78 -0
- package/dist/cjs/transaction-analyzer/rules/coins.js.map +7 -0
- package/dist/cjs/transaction-analyzer/rules/commands.d.ts +366 -0
- package/dist/cjs/transaction-analyzer/rules/commands.js +148 -0
- package/dist/cjs/transaction-analyzer/rules/commands.js.map +7 -0
- package/dist/cjs/transaction-analyzer/rules/core.d.ts +314 -0
- package/dist/cjs/transaction-analyzer/rules/core.js +73 -0
- package/dist/cjs/transaction-analyzer/rules/core.js.map +7 -0
- package/dist/cjs/transaction-analyzer/rules/functions.d.ts +292 -0
- package/dist/cjs/transaction-analyzer/rules/functions.js +58 -0
- package/dist/cjs/transaction-analyzer/rules/functions.js.map +7 -0
- package/dist/cjs/transaction-analyzer/rules/index.d.ts +2244 -0
- package/dist/cjs/transaction-analyzer/rules/index.js +52 -0
- package/dist/cjs/transaction-analyzer/rules/index.js.map +7 -0
- package/dist/cjs/transaction-analyzer/rules/inputs.d.ts +313 -0
- package/dist/cjs/transaction-analyzer/rules/inputs.js +49 -0
- package/dist/cjs/transaction-analyzer/rules/inputs.js.map +7 -0
- package/dist/cjs/transaction-analyzer/rules/objects.d.ts +359 -0
- package/dist/cjs/transaction-analyzer/rules/objects.js +124 -0
- package/dist/cjs/transaction-analyzer/rules/objects.js.map +7 -0
- package/dist/cjs/util.d.ts +5 -0
- package/dist/cjs/util.js +17 -0
- package/dist/cjs/util.js.map +7 -0
- package/dist/esm/auto-approvals/analyzer.d.ts +71 -0
- package/dist/esm/auto-approvals/analyzer.js +50 -0
- package/dist/esm/auto-approvals/analyzer.js.map +7 -0
- package/dist/esm/auto-approvals/index.d.ts +6 -0
- package/dist/esm/auto-approvals/index.js +12 -0
- package/dist/esm/auto-approvals/index.js.map +7 -0
- package/dist/esm/auto-approvals/intent.d.ts +5 -0
- package/dist/esm/auto-approvals/intent.js +45 -0
- package/dist/esm/auto-approvals/intent.js.map +7 -0
- package/dist/esm/auto-approvals/manager.d.ts +31 -0
- package/dist/esm/auto-approvals/manager.js +308 -0
- package/dist/esm/auto-approvals/manager.js.map +7 -0
- package/dist/esm/auto-approvals/schemas/index.d.ts +4 -0
- package/dist/esm/auto-approvals/schemas/index.js +8 -0
- package/dist/esm/auto-approvals/schemas/index.js.map +7 -0
- package/dist/esm/auto-approvals/schemas/policy.d.ts +145 -0
- package/dist/esm/auto-approvals/schemas/policy.js +49 -0
- package/dist/esm/auto-approvals/schemas/policy.js.map +7 -0
- package/dist/esm/auto-approvals/schemas/state.d.ts +115 -0
- package/dist/esm/auto-approvals/schemas/state.js +19 -0
- package/dist/esm/auto-approvals/schemas/state.js.map +7 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +7 -0
- package/dist/esm/package.json +5 -0
- package/dist/esm/transaction-analyzer/analyzer.d.ts +34 -0
- package/dist/esm/transaction-analyzer/analyzer.js +74 -0
- package/dist/esm/transaction-analyzer/analyzer.js.map +7 -0
- package/dist/esm/transaction-analyzer/index.d.ts +9 -0
- package/dist/esm/transaction-analyzer/index.js +8 -0
- package/dist/esm/transaction-analyzer/index.js.map +7 -0
- package/dist/esm/transaction-analyzer/rules/accessLevel.d.ts +29 -0
- package/dist/esm/transaction-analyzer/rules/accessLevel.js +86 -0
- package/dist/esm/transaction-analyzer/rules/accessLevel.js.map +7 -0
- package/dist/esm/transaction-analyzer/rules/coin-flows.d.ts +313 -0
- package/dist/esm/transaction-analyzer/rules/coin-flows.js +159 -0
- package/dist/esm/transaction-analyzer/rules/coin-flows.js.map +7 -0
- package/dist/esm/transaction-analyzer/rules/coin-value.d.ts +42 -0
- package/dist/esm/transaction-analyzer/rules/coin-value.js +40 -0
- package/dist/esm/transaction-analyzer/rules/coin-value.js.map +7 -0
- package/dist/esm/transaction-analyzer/rules/coins.d.ts +337 -0
- package/dist/esm/transaction-analyzer/rules/coins.js +58 -0
- package/dist/esm/transaction-analyzer/rules/coins.js.map +7 -0
- package/dist/esm/transaction-analyzer/rules/commands.d.ts +366 -0
- package/dist/esm/transaction-analyzer/rules/commands.js +128 -0
- package/dist/esm/transaction-analyzer/rules/commands.js.map +7 -0
- package/dist/esm/transaction-analyzer/rules/core.d.ts +314 -0
- package/dist/esm/transaction-analyzer/rules/core.js +53 -0
- package/dist/esm/transaction-analyzer/rules/core.js.map +7 -0
- package/dist/esm/transaction-analyzer/rules/functions.d.ts +292 -0
- package/dist/esm/transaction-analyzer/rules/functions.js +38 -0
- package/dist/esm/transaction-analyzer/rules/functions.js.map +7 -0
- package/dist/esm/transaction-analyzer/rules/index.d.ts +2244 -0
- package/dist/esm/transaction-analyzer/rules/index.js +32 -0
- package/dist/esm/transaction-analyzer/rules/index.js.map +7 -0
- package/dist/esm/transaction-analyzer/rules/inputs.d.ts +313 -0
- package/dist/esm/transaction-analyzer/rules/inputs.js +29 -0
- package/dist/esm/transaction-analyzer/rules/inputs.js.map +7 -0
- package/dist/esm/transaction-analyzer/rules/objects.d.ts +359 -0
- package/dist/esm/transaction-analyzer/rules/objects.js +104 -0
- package/dist/esm/transaction-analyzer/rules/objects.js.map +7 -0
- package/dist/esm/util.d.ts +5 -0
- package/dist/esm/util.js +1 -0
- package/dist/esm/util.js.map +7 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
const AccessLevelSchema = v.union([v.literal("read"), v.literal("mutate"), v.literal("transfer")]);
|
|
3
|
+
const BasePermissionSchema = v.object({
|
|
4
|
+
description: v.string()
|
|
5
|
+
});
|
|
6
|
+
const ObjectTypePermissionSchema = v.object({
|
|
7
|
+
...BasePermissionSchema.entries,
|
|
8
|
+
$kind: v.literal("ObjectType"),
|
|
9
|
+
objectType: v.string(),
|
|
10
|
+
accessLevel: AccessLevelSchema
|
|
11
|
+
});
|
|
12
|
+
const CoinBalancePermissionSchema = v.object({
|
|
13
|
+
...BasePermissionSchema.entries,
|
|
14
|
+
$kind: v.literal("CoinBalance"),
|
|
15
|
+
coinType: v.string()
|
|
16
|
+
});
|
|
17
|
+
const AnyBalancesPermissionSchema = v.object({
|
|
18
|
+
...BasePermissionSchema.entries,
|
|
19
|
+
$kind: v.literal("AnyBalance")
|
|
20
|
+
});
|
|
21
|
+
const AutoApprovalOperationSchema = v.object({
|
|
22
|
+
id: v.string(),
|
|
23
|
+
description: v.string(),
|
|
24
|
+
permissions: v.object({
|
|
25
|
+
ownedObjects: v.optional(v.array(ObjectTypePermissionSchema)),
|
|
26
|
+
balances: v.optional(v.array(CoinBalancePermissionSchema)),
|
|
27
|
+
anyBalance: v.optional(AnyBalancesPermissionSchema)
|
|
28
|
+
})
|
|
29
|
+
});
|
|
30
|
+
const AutoApprovalSettingsSchema = v.looseObject({
|
|
31
|
+
approvedOperations: v.array(v.string()),
|
|
32
|
+
expiration: v.number(),
|
|
33
|
+
// TODO: figure out a better name
|
|
34
|
+
remainingTransactions: v.nullable(v.number()),
|
|
35
|
+
sharedBudget: v.nullable(v.number()),
|
|
36
|
+
// TODO: normalize coin types
|
|
37
|
+
coinBudgets: v.record(v.string(), v.string())
|
|
38
|
+
});
|
|
39
|
+
const AutoApprovalPolicySchema = v.object({
|
|
40
|
+
schemaVersion: v.literal("1.0.0"),
|
|
41
|
+
operations: v.array(AutoApprovalOperationSchema),
|
|
42
|
+
// TODO: do we want to split suggested settings into a different type (not everything makes sense as a suggestion)
|
|
43
|
+
suggestedSettings: v.optional(v.partial(AutoApprovalSettingsSchema))
|
|
44
|
+
});
|
|
45
|
+
export {
|
|
46
|
+
AutoApprovalPolicySchema,
|
|
47
|
+
AutoApprovalSettingsSchema
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/auto-approvals/schemas/policy.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport * as v from 'valibot';\n\nconst AccessLevelSchema = v.union([v.literal('read'), v.literal('mutate'), v.literal('transfer')]);\n\nconst BasePermissionSchema = v.object({\n\tdescription: v.string(),\n});\n\nconst ObjectTypePermissionSchema = v.object({\n\t...BasePermissionSchema.entries,\n\t$kind: v.literal('ObjectType'),\n\tobjectType: v.string(),\n\taccessLevel: AccessLevelSchema,\n});\n\nconst CoinBalancePermissionSchema = v.object({\n\t...BasePermissionSchema.entries,\n\t$kind: v.literal('CoinBalance'),\n\tcoinType: v.string(),\n});\n\nconst AnyBalancesPermissionSchema = v.object({\n\t...BasePermissionSchema.entries,\n\t$kind: v.literal('AnyBalance'),\n});\n\nexport type PolicyPermission = v.InferOutput<\n\t| typeof CoinBalancePermissionSchema\n\t| typeof AnyBalancesPermissionSchema\n\t| typeof ObjectTypePermissionSchema\n>;\n\nconst AutoApprovalOperationSchema = v.object({\n\tid: v.string(),\n\tdescription: v.string(),\n\tpermissions: v.object({\n\t\townedObjects: v.optional(v.array(ObjectTypePermissionSchema)),\n\t\tbalances: v.optional(v.array(CoinBalancePermissionSchema)),\n\t\tanyBalance: v.optional(AnyBalancesPermissionSchema),\n\t}),\n});\n\n// TODO: do we want to support custom settings\nexport const AutoApprovalSettingsSchema = v.looseObject({\n\tapprovedOperations: v.array(v.string()),\n\texpiration: v.number(),\n\t// TODO: figure out a better name\n\tremainingTransactions: v.nullable(v.number()),\n\tsharedBudget: v.nullable(v.number()),\n\t// TODO: normalize coin types\n\tcoinBudgets: v.record(v.string(), v.string()),\n});\n\nexport const AutoApprovalPolicySchema = v.object({\n\tschemaVersion: v.literal('1.0.0'),\n\toperations: v.array(AutoApprovalOperationSchema),\n\t// TODO: do we want to split suggested settings into a different type (not everything makes sense as a suggestion)\n\tsuggestedSettings: v.optional(v.partial(AutoApprovalSettingsSchema)),\n});\n\nexport type AutoApprovalSettings = v.InferOutput<typeof AutoApprovalSettingsSchema>;\nexport type AutoApprovalPolicy = v.InferOutput<typeof AutoApprovalPolicySchema>;\nexport type AutoApprovalOperation = v.InferOutput<typeof AutoApprovalOperationSchema>;\n"],
|
|
5
|
+
"mappings": "AAGA,YAAY,OAAO;AAEnB,MAAM,oBAAoB,EAAE,MAAM,CAAC,EAAE,QAAQ,MAAM,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,UAAU,CAAC,CAAC;AAEjG,MAAM,uBAAuB,EAAE,OAAO;AAAA,EACrC,aAAa,EAAE,OAAO;AACvB,CAAC;AAED,MAAM,6BAA6B,EAAE,OAAO;AAAA,EAC3C,GAAG,qBAAqB;AAAA,EACxB,OAAO,EAAE,QAAQ,YAAY;AAAA,EAC7B,YAAY,EAAE,OAAO;AAAA,EACrB,aAAa;AACd,CAAC;AAED,MAAM,8BAA8B,EAAE,OAAO;AAAA,EAC5C,GAAG,qBAAqB;AAAA,EACxB,OAAO,EAAE,QAAQ,aAAa;AAAA,EAC9B,UAAU,EAAE,OAAO;AACpB,CAAC;AAED,MAAM,8BAA8B,EAAE,OAAO;AAAA,EAC5C,GAAG,qBAAqB;AAAA,EACxB,OAAO,EAAE,QAAQ,YAAY;AAC9B,CAAC;AAQD,MAAM,8BAA8B,EAAE,OAAO;AAAA,EAC5C,IAAI,EAAE,OAAO;AAAA,EACb,aAAa,EAAE,OAAO;AAAA,EACtB,aAAa,EAAE,OAAO;AAAA,IACrB,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAAA,IAC5D,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAAA,IACzD,YAAY,EAAE,SAAS,2BAA2B;AAAA,EACnD,CAAC;AACF,CAAC;AAGM,MAAM,6BAA6B,EAAE,YAAY;AAAA,EACvD,oBAAoB,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EACtC,YAAY,EAAE,OAAO;AAAA;AAAA,EAErB,uBAAuB,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAC5C,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA;AAAA,EAEnC,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAC7C,CAAC;AAEM,MAAM,2BAA2B,EAAE,OAAO;AAAA,EAChD,eAAe,EAAE,QAAQ,OAAO;AAAA,EAChC,YAAY,EAAE,MAAM,2BAA2B;AAAA;AAAA,EAE/C,mBAAmB,EAAE,SAAS,EAAE,QAAQ,0BAA0B,CAAC;AACpE,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
export declare const CreatedObjectSchema: v.ObjectSchema<{
|
|
3
|
+
readonly objectId: v.StringSchema<undefined>;
|
|
4
|
+
readonly version: v.StringSchema<undefined>;
|
|
5
|
+
readonly digest: v.StringSchema<undefined>;
|
|
6
|
+
readonly objectType: v.StringSchema<undefined>;
|
|
7
|
+
}, undefined>;
|
|
8
|
+
export declare const AutoApprovalStateSchema: v.ObjectSchema<{
|
|
9
|
+
readonly schemaVersion: v.LiteralSchema<"1.0.0", undefined>;
|
|
10
|
+
readonly policy: v.ObjectSchema<{
|
|
11
|
+
readonly schemaVersion: v.LiteralSchema<"1.0.0", undefined>;
|
|
12
|
+
readonly operations: v.ArraySchema<v.ObjectSchema<{
|
|
13
|
+
readonly id: v.StringSchema<undefined>;
|
|
14
|
+
readonly description: v.StringSchema<undefined>;
|
|
15
|
+
readonly permissions: v.ObjectSchema<{
|
|
16
|
+
readonly ownedObjects: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
|
|
17
|
+
readonly $kind: v.LiteralSchema<"ObjectType", undefined>;
|
|
18
|
+
readonly objectType: v.StringSchema<undefined>;
|
|
19
|
+
readonly accessLevel: v.UnionSchema<[v.LiteralSchema<"read", undefined>, v.LiteralSchema<"mutate", undefined>, v.LiteralSchema<"transfer", undefined>], undefined>;
|
|
20
|
+
readonly description: v.StringSchema<undefined>;
|
|
21
|
+
}, undefined>, undefined>, undefined>;
|
|
22
|
+
readonly balances: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
|
|
23
|
+
readonly $kind: v.LiteralSchema<"CoinBalance", undefined>;
|
|
24
|
+
readonly coinType: v.StringSchema<undefined>;
|
|
25
|
+
readonly description: v.StringSchema<undefined>;
|
|
26
|
+
}, undefined>, undefined>, undefined>;
|
|
27
|
+
readonly anyBalance: v.OptionalSchema<v.ObjectSchema<{
|
|
28
|
+
readonly $kind: v.LiteralSchema<"AnyBalance", undefined>;
|
|
29
|
+
readonly description: v.StringSchema<undefined>;
|
|
30
|
+
}, undefined>, undefined>;
|
|
31
|
+
}, undefined>;
|
|
32
|
+
}, undefined>, undefined>;
|
|
33
|
+
readonly suggestedSettings: v.OptionalSchema<Omit<v.LooseObjectSchema<{
|
|
34
|
+
readonly approvedOperations: v.ArraySchema<v.StringSchema<undefined>, undefined>;
|
|
35
|
+
readonly expiration: v.NumberSchema<undefined>;
|
|
36
|
+
readonly remainingTransactions: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
|
|
37
|
+
readonly sharedBudget: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
|
|
38
|
+
readonly coinBudgets: v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>;
|
|
39
|
+
}, undefined>, "entries" | "~types" | "~run" | "~standard"> & {
|
|
40
|
+
readonly entries: {
|
|
41
|
+
readonly approvedOperations: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, undefined>;
|
|
42
|
+
readonly expiration: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
43
|
+
readonly remainingTransactions: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
|
|
44
|
+
readonly sharedBudget: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
|
|
45
|
+
readonly coinBudgets: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
|
|
46
|
+
};
|
|
47
|
+
readonly "~standard": v.StandardProps<{
|
|
48
|
+
approvedOperations?: string[] | undefined;
|
|
49
|
+
expiration?: number | undefined;
|
|
50
|
+
remainingTransactions?: number | null | undefined;
|
|
51
|
+
sharedBudget?: number | null | undefined;
|
|
52
|
+
coinBudgets?: {
|
|
53
|
+
[x: string]: string;
|
|
54
|
+
} | undefined;
|
|
55
|
+
} & {
|
|
56
|
+
[key: string]: unknown;
|
|
57
|
+
}, {
|
|
58
|
+
approvedOperations?: string[] | undefined;
|
|
59
|
+
expiration?: number | undefined;
|
|
60
|
+
remainingTransactions?: number | null | undefined;
|
|
61
|
+
sharedBudget?: number | null | undefined;
|
|
62
|
+
coinBudgets?: {
|
|
63
|
+
[x: string]: string;
|
|
64
|
+
} | undefined;
|
|
65
|
+
} & {
|
|
66
|
+
[key: string]: unknown;
|
|
67
|
+
}>;
|
|
68
|
+
readonly "~run": (dataset: v.UnknownDataset, config: v.Config<v.BaseIssue<unknown>>) => v.OutputDataset<{
|
|
69
|
+
approvedOperations?: string[] | undefined;
|
|
70
|
+
expiration?: number | undefined;
|
|
71
|
+
remainingTransactions?: number | null | undefined;
|
|
72
|
+
sharedBudget?: number | null | undefined;
|
|
73
|
+
coinBudgets?: {
|
|
74
|
+
[x: string]: string;
|
|
75
|
+
} | undefined;
|
|
76
|
+
} & {
|
|
77
|
+
[key: string]: unknown;
|
|
78
|
+
}, v.StringIssue | v.ArrayIssue | v.NumberIssue | v.RecordIssue | v.LooseObjectIssue>;
|
|
79
|
+
readonly "~types"?: {
|
|
80
|
+
readonly input: {
|
|
81
|
+
approvedOperations?: string[] | undefined;
|
|
82
|
+
expiration?: number | undefined;
|
|
83
|
+
remainingTransactions?: number | null | undefined;
|
|
84
|
+
sharedBudget?: number | null | undefined;
|
|
85
|
+
coinBudgets?: {
|
|
86
|
+
[x: string]: string;
|
|
87
|
+
} | undefined;
|
|
88
|
+
} & {
|
|
89
|
+
[key: string]: unknown;
|
|
90
|
+
};
|
|
91
|
+
readonly output: {
|
|
92
|
+
approvedOperations?: string[] | undefined;
|
|
93
|
+
expiration?: number | undefined;
|
|
94
|
+
remainingTransactions?: number | null | undefined;
|
|
95
|
+
sharedBudget?: number | null | undefined;
|
|
96
|
+
coinBudgets?: {
|
|
97
|
+
[x: string]: string;
|
|
98
|
+
} | undefined;
|
|
99
|
+
} & {
|
|
100
|
+
[key: string]: unknown;
|
|
101
|
+
};
|
|
102
|
+
readonly issue: v.StringIssue | v.ArrayIssue | v.NumberIssue | v.RecordIssue | v.LooseObjectIssue;
|
|
103
|
+
} | undefined;
|
|
104
|
+
}, undefined>;
|
|
105
|
+
}, undefined>;
|
|
106
|
+
readonly settings: v.NullableSchema<v.LooseObjectSchema<{
|
|
107
|
+
readonly approvedOperations: v.ArraySchema<v.StringSchema<undefined>, undefined>;
|
|
108
|
+
readonly expiration: v.NumberSchema<undefined>;
|
|
109
|
+
readonly remainingTransactions: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
|
|
110
|
+
readonly sharedBudget: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
|
|
111
|
+
readonly coinBudgets: v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>;
|
|
112
|
+
}, undefined>, undefined>;
|
|
113
|
+
readonly pendingDigests: v.ArraySchema<v.StringSchema<undefined>, undefined>;
|
|
114
|
+
}, undefined>;
|
|
115
|
+
export type AutoApprovalState = v.InferOutput<typeof AutoApprovalStateSchema>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import { AutoApprovalPolicySchema, AutoApprovalSettingsSchema } from "./policy.js";
|
|
3
|
+
const CreatedObjectSchema = v.object({
|
|
4
|
+
objectId: v.string(),
|
|
5
|
+
version: v.string(),
|
|
6
|
+
digest: v.string(),
|
|
7
|
+
objectType: v.string()
|
|
8
|
+
});
|
|
9
|
+
const AutoApprovalStateSchema = v.object({
|
|
10
|
+
schemaVersion: v.literal("1.0.0"),
|
|
11
|
+
policy: AutoApprovalPolicySchema,
|
|
12
|
+
settings: v.nullable(AutoApprovalSettingsSchema),
|
|
13
|
+
pendingDigests: v.array(v.string())
|
|
14
|
+
});
|
|
15
|
+
export {
|
|
16
|
+
AutoApprovalStateSchema,
|
|
17
|
+
CreatedObjectSchema
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/auto-approvals/schemas/state.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport * as v from 'valibot';\nimport { AutoApprovalPolicySchema, AutoApprovalSettingsSchema } from './policy.js';\n\nexport const CreatedObjectSchema = v.object({\n\tobjectId: v.string(),\n\tversion: v.string(),\n\tdigest: v.string(),\n\tobjectType: v.string(),\n});\n\nexport const AutoApprovalStateSchema = v.object({\n\tschemaVersion: v.literal('1.0.0'),\n\tpolicy: AutoApprovalPolicySchema,\n\tsettings: v.nullable(AutoApprovalSettingsSchema),\n\tpendingDigests: v.array(v.string()),\n});\n\nexport type AutoApprovalState = v.InferOutput<typeof AutoApprovalStateSchema>;\n"],
|
|
5
|
+
"mappings": "AAGA,YAAY,OAAO;AACnB,SAAS,0BAA0B,kCAAkC;AAE9D,MAAM,sBAAsB,EAAE,OAAO;AAAA,EAC3C,UAAU,EAAE,OAAO;AAAA,EACnB,SAAS,EAAE,OAAO;AAAA,EAClB,QAAQ,EAAE,OAAO;AAAA,EACjB,YAAY,EAAE,OAAO;AACtB,CAAC;AAEM,MAAM,0BAA0B,EAAE,OAAO;AAAA,EAC/C,eAAe,EAAE,QAAQ,OAAO;AAAA,EAChC,QAAQ;AAAA,EACR,UAAU,EAAE,SAAS,0BAA0B;AAAA,EAC/C,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC;AACnC,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport * from './transaction-analyzer/index.js';\nexport * from './auto-approvals/index.js';\n"],
|
|
5
|
+
"mappings": "AAGA,cAAc;AACd,cAAc;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Transaction } from '@haneullabs/haneul/transactions';
|
|
2
|
+
import type { Defined, Simplify, UnionToIntersection } from '../util.js';
|
|
3
|
+
export declare function createAnalyzer<T extends Defined, Deps extends Record<string, Analyzer<Defined, any, any>> = {}, Options = object>({ cacheKey, dependencies, analyze, }: {
|
|
4
|
+
cacheKey?: unknown;
|
|
5
|
+
dependencies?: Deps;
|
|
6
|
+
analyze: (options: Options, transaction: Transaction) => (analysis: {
|
|
7
|
+
[k in keyof Deps]: Deps[k] extends Analyzer<infer R, any, any> ? R : never;
|
|
8
|
+
}) => Promise<AnalyzerResult<T>> | AnalyzerResult<T>;
|
|
9
|
+
}): Analyzer<T, Simplify<UnionToIntersection<Options | { [k in keyof Deps]: Deps[k] extends Analyzer<any, infer O, any> ? O : never; }[keyof Deps]>>, { [k in keyof Deps]: Deps[k] extends Analyzer<infer R, any, any> ? R : never; }>;
|
|
10
|
+
type OptionsFromAnalyzers<T extends Record<string, Analyzer<Defined, any, any>>> = Simplify<{
|
|
11
|
+
[K in keyof T]: T[K] extends Analyzer<Defined, infer O, any> ? O : never;
|
|
12
|
+
}[keyof T] & {
|
|
13
|
+
transaction: string | Uint8Array;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function analyze<T extends Record<string, Analyzer<Defined, any, any>>>(analyzers: T, { transaction, ...options }: OptionsFromAnalyzers<T>): Promise<{ [k in keyof T]: T[k] extends Analyzer<infer R extends Defined, any, any> ? AnalyzerResult<R> : never; }>;
|
|
16
|
+
export type Analyzer<T extends Defined, Options = object, Analysis extends Record<string, Defined> = {}> = {
|
|
17
|
+
cacheKey?: unknown;
|
|
18
|
+
dependencies: {
|
|
19
|
+
[k in keyof Analysis]: Analyzer<Analysis[k], Options>;
|
|
20
|
+
};
|
|
21
|
+
analyze: (options: Options, transaction: Transaction) => (analysis: Analysis) => AnalyzerResult<T> | Promise<AnalyzerResult<T>>;
|
|
22
|
+
};
|
|
23
|
+
export type AnalyzerResult<T extends Defined = Defined> = {
|
|
24
|
+
result: T;
|
|
25
|
+
issues?: never;
|
|
26
|
+
} | {
|
|
27
|
+
issues: TransactionAnalysisIssue[];
|
|
28
|
+
result?: never;
|
|
29
|
+
};
|
|
30
|
+
export interface TransactionAnalysisIssue {
|
|
31
|
+
message: string;
|
|
32
|
+
error?: Error;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Transaction } from "@haneullabs/haneul/transactions";
|
|
2
|
+
function createAnalyzer({
|
|
3
|
+
cacheKey,
|
|
4
|
+
dependencies,
|
|
5
|
+
analyze: analyze2
|
|
6
|
+
}) {
|
|
7
|
+
return {
|
|
8
|
+
cacheKey,
|
|
9
|
+
dependencies,
|
|
10
|
+
analyze: analyze2
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
async function analyze(analyzers, { transaction, ...options }) {
|
|
14
|
+
const tx = Transaction.from(transaction);
|
|
15
|
+
const analyzerMap = /* @__PURE__ */ new Map();
|
|
16
|
+
function initializeAnalyzer(analyzer) {
|
|
17
|
+
const cacheKey = analyzer.cacheKey ?? analyzer;
|
|
18
|
+
if (!analyzerMap.has(cacheKey)) {
|
|
19
|
+
const deps = analyzer.dependencies || {};
|
|
20
|
+
analyzerMap.set(cacheKey, analyzer.analyze(options, tx));
|
|
21
|
+
Object.values(deps).forEach((dep) => initializeAnalyzer(dep));
|
|
22
|
+
}
|
|
23
|
+
return analyzerMap.get(cacheKey);
|
|
24
|
+
}
|
|
25
|
+
Object.values(analyzers).forEach((analyzer) => initializeAnalyzer(analyzer));
|
|
26
|
+
const analysisMap = /* @__PURE__ */ new Map();
|
|
27
|
+
async function runAnalyzer(analyzer) {
|
|
28
|
+
const deps = Object.fromEntries(
|
|
29
|
+
await Promise.all(
|
|
30
|
+
Object.entries(analyzer.dependencies || {}).map(
|
|
31
|
+
async ([key, dep]) => [key, await getAnalysis(dep)]
|
|
32
|
+
)
|
|
33
|
+
)
|
|
34
|
+
);
|
|
35
|
+
const issues = /* @__PURE__ */ new Set();
|
|
36
|
+
for (const dep of Object.values(deps)) {
|
|
37
|
+
if (dep.issues) {
|
|
38
|
+
dep.issues.forEach((issue) => issues.add(issue));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (issues.size) {
|
|
42
|
+
return { issues: [...issues] };
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const result = await analyzerMap.get(analyzer.cacheKey ?? analyzer)(
|
|
46
|
+
Object.fromEntries(Object.entries(deps).map(([key, dep]) => [key, dep.result]))
|
|
47
|
+
);
|
|
48
|
+
return result;
|
|
49
|
+
} catch (error) {
|
|
50
|
+
return {
|
|
51
|
+
issues: [
|
|
52
|
+
{ message: `Unexpected error while analyzing transaction: ${error.message}` }
|
|
53
|
+
]
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function getAnalysis(analyzer) {
|
|
58
|
+
const cacheKey = analyzer.cacheKey ?? analyzer;
|
|
59
|
+
if (!analysisMap.has(cacheKey)) {
|
|
60
|
+
analysisMap.set(cacheKey, runAnalyzer(analyzer));
|
|
61
|
+
}
|
|
62
|
+
return analysisMap.get(cacheKey);
|
|
63
|
+
}
|
|
64
|
+
return Object.fromEntries(
|
|
65
|
+
await Promise.all(
|
|
66
|
+
Object.entries(analyzers).map(async ([key, analyzer]) => [key, await getAnalysis(analyzer)])
|
|
67
|
+
)
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
export {
|
|
71
|
+
analyze,
|
|
72
|
+
createAnalyzer
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/transaction-analyzer/analyzer.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n/* eslint-disable @typescript-eslint/ban-types */\n\nimport { Transaction } from '@haneullabs/haneul/transactions';\nimport type { Defined, Simplify, UnionToIntersection } from '../util.js';\n\nexport function createAnalyzer<\n\tT extends Defined,\n\tDeps extends Record<string, Analyzer<Defined, any, any>> = {},\n\tOptions = object,\n>({\n\tcacheKey,\n\tdependencies,\n\tanalyze,\n}: {\n\tcacheKey?: unknown;\n\tdependencies?: Deps;\n\tanalyze: (\n\t\toptions: Options,\n\t\ttransaction: Transaction,\n\t) => (analysis: {\n\t\t[k in keyof Deps]: Deps[k] extends Analyzer<infer R, any, any> ? R : never;\n\t}) => Promise<AnalyzerResult<T>> | AnalyzerResult<T>;\n}) {\n\treturn {\n\t\tcacheKey,\n\t\tdependencies,\n\t\tanalyze: analyze,\n\t} as Analyzer<\n\t\tT,\n\t\tSimplify<\n\t\t\tUnionToIntersection<\n\t\t\t\t| Options\n\t\t\t\t| {\n\t\t\t\t\t\t[k in keyof Deps]: Deps[k] extends Analyzer<any, infer O, any> ? O : never;\n\t\t\t\t }[keyof Deps]\n\t\t\t>\n\t\t>,\n\t\t{\n\t\t\t[k in keyof Deps]: Deps[k] extends Analyzer<infer R, any, any> ? R : never;\n\t\t}\n\t>;\n}\n\ntype OptionsFromAnalyzers<T extends Record<string, Analyzer<Defined, any, any>>> = Simplify<\n\t{\n\t\t[K in keyof T]: T[K] extends Analyzer<Defined, infer O, any> ? O : never;\n\t}[keyof T] & {\n\t\ttransaction: string | Uint8Array;\n\t}\n>;\n\nexport async function analyze<T extends Record<string, Analyzer<Defined, any, any>>>(\n\tanalyzers: T,\n\t{ transaction, ...options }: OptionsFromAnalyzers<T>,\n) {\n\tconst tx = Transaction.from(transaction);\n\tconst analyzerMap = new Map<\n\t\tunknown,\n\t\t(analysis: object) => AnalyzerResult | Promise<AnalyzerResult>\n\t>();\n\n\tfunction initializeAnalyzer(analyzer: Analyzer<Defined>) {\n\t\tconst cacheKey = analyzer.cacheKey ?? analyzer;\n\n\t\tif (!analyzerMap.has(cacheKey)) {\n\t\t\tconst deps: Record<string, Analyzer<Defined>> = analyzer.dependencies || {};\n\t\t\tanalyzerMap.set(cacheKey, analyzer.analyze(options, tx));\n\n\t\t\tObject.values(deps).forEach((dep) => initializeAnalyzer(dep));\n\t\t}\n\n\t\treturn analyzerMap.get(cacheKey)!;\n\t}\n\n\tObject.values(analyzers).forEach((analyzer) => initializeAnalyzer(analyzer));\n\n\tconst analysisMap = new Map<unknown, Promise<AnalyzerResult>>();\n\n\tasync function runAnalyzer(analyzer: Analyzer<Defined>): Promise<AnalyzerResult> {\n\t\tconst deps: Record<string, AnalyzerResult> = Object.fromEntries(\n\t\t\tawait Promise.all(\n\t\t\t\tObject.entries((analyzer.dependencies || {}) as Record<string, Analyzer<Defined>>).map(\n\t\t\t\t\tasync ([key, dep]) => [key, await getAnalysis(dep)],\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\n\t\tconst issues = new Set<TransactionAnalysisIssue>();\n\n\t\tfor (const dep of Object.values(deps)) {\n\t\t\tif (dep.issues) {\n\t\t\t\tdep.issues.forEach((issue) => issues.add(issue));\n\t\t\t}\n\t\t}\n\n\t\tif (issues.size) {\n\t\t\treturn { issues: [...issues] };\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await analyzerMap.get(analyzer.cacheKey ?? analyzer)!(\n\t\t\t\tObject.fromEntries(Object.entries(deps).map(([key, dep]) => [key, dep.result])),\n\t\t\t);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tissues: [\n\t\t\t\t\t{ message: `Unexpected error while analyzing transaction: ${(error as Error).message}` },\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t}\n\n\tfunction getAnalysis(analyzer: Analyzer<Defined>): Promise<AnalyzerResult> {\n\t\tconst cacheKey = analyzer.cacheKey ?? analyzer;\n\n\t\tif (!analysisMap.has(cacheKey)) {\n\t\t\tanalysisMap.set(cacheKey, runAnalyzer(analyzer));\n\t\t}\n\n\t\treturn analysisMap.get(cacheKey)!;\n\t}\n\n\treturn Object.fromEntries(\n\t\tawait Promise.all(\n\t\t\tObject.entries(analyzers).map(async ([key, analyzer]) => [key, await getAnalysis(analyzer)]),\n\t\t),\n\t) as {\n\t\t[k in keyof T]: T[k] extends Analyzer<infer R, any, any> ? AnalyzerResult<R> : never;\n\t};\n}\n\nexport type Analyzer<\n\tT extends Defined,\n\tOptions = object,\n\tAnalysis extends Record<string, Defined> = {},\n> = {\n\tcacheKey?: unknown;\n\tdependencies: {\n\t\t[k in keyof Analysis]: Analyzer<Analysis[k], Options>;\n\t};\n\tanalyze: (\n\t\toptions: Options,\n\t\ttransaction: Transaction,\n\t) => (analysis: Analysis) => AnalyzerResult<T> | Promise<AnalyzerResult<T>>;\n};\n\nexport type AnalyzerResult<T extends Defined = Defined> =\n\t| {\n\t\t\tresult: T;\n\t\t\tissues?: never;\n\t }\n\t| {\n\t\t\tissues: TransactionAnalysisIssue[];\n\t\t\tresult?: never;\n\t };\n\nexport interface TransactionAnalysisIssue {\n\tmessage: string;\n\terror?: Error;\n}\n"],
|
|
5
|
+
"mappings": "AAIA,SAAS,mBAAmB;AAGrB,SAAS,eAId;AAAA,EACD;AAAA,EACA;AAAA,EACA,SAAAA;AACD,GASG;AACF,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,SAASA;AAAA,EACV;AAcD;AAUA,eAAsB,QACrB,WACA,EAAE,aAAa,GAAG,QAAQ,GACzB;AACD,QAAM,KAAK,YAAY,KAAK,WAAW;AACvC,QAAM,cAAc,oBAAI,IAGtB;AAEF,WAAS,mBAAmB,UAA6B;AACxD,UAAM,WAAW,SAAS,YAAY;AAEtC,QAAI,CAAC,YAAY,IAAI,QAAQ,GAAG;AAC/B,YAAM,OAA0C,SAAS,gBAAgB,CAAC;AAC1E,kBAAY,IAAI,UAAU,SAAS,QAAQ,SAAS,EAAE,CAAC;AAEvD,aAAO,OAAO,IAAI,EAAE,QAAQ,CAAC,QAAQ,mBAAmB,GAAG,CAAC;AAAA,IAC7D;AAEA,WAAO,YAAY,IAAI,QAAQ;AAAA,EAChC;AAEA,SAAO,OAAO,SAAS,EAAE,QAAQ,CAAC,aAAa,mBAAmB,QAAQ,CAAC;AAE3E,QAAM,cAAc,oBAAI,IAAsC;AAE9D,iBAAe,YAAY,UAAsD;AAChF,UAAM,OAAuC,OAAO;AAAA,MACnD,MAAM,QAAQ;AAAA,QACb,OAAO,QAAS,SAAS,gBAAgB,CAAC,CAAuC,EAAE;AAAA,UAClF,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,MAAM,YAAY,GAAG,CAAC;AAAA,QACnD;AAAA,MACD;AAAA,IACD;AAEA,UAAM,SAAS,oBAAI,IAA8B;AAEjD,eAAW,OAAO,OAAO,OAAO,IAAI,GAAG;AACtC,UAAI,IAAI,QAAQ;AACf,YAAI,OAAO,QAAQ,CAAC,UAAU,OAAO,IAAI,KAAK,CAAC;AAAA,MAChD;AAAA,IACD;AAEA,QAAI,OAAO,MAAM;AAChB,aAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,EAAE;AAAA,IAC9B;AAEA,QAAI;AACH,YAAM,SAAS,MAAM,YAAY,IAAI,SAAS,YAAY,QAAQ;AAAA,QACjE,OAAO,YAAY,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;AAAA,MAC/E;AAEA,aAAO;AAAA,IACR,SAAS,OAAO;AACf,aAAO;AAAA,QACN,QAAQ;AAAA,UACP,EAAE,SAAS,iDAAkD,MAAgB,OAAO,GAAG;AAAA,QACxF;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,WAAS,YAAY,UAAsD;AAC1E,UAAM,WAAW,SAAS,YAAY;AAEtC,QAAI,CAAC,YAAY,IAAI,QAAQ,GAAG;AAC/B,kBAAY,IAAI,UAAU,YAAY,QAAQ,CAAC;AAAA,IAChD;AAEA,WAAO,YAAY,IAAI,QAAQ;AAAA,EAChC;AAEA,SAAO,OAAO;AAAA,IACb,MAAM,QAAQ;AAAA,MACb,OAAO,QAAQ,SAAS,EAAE,IAAI,OAAO,CAAC,KAAK,QAAQ,MAAM,CAAC,KAAK,MAAM,YAAY,QAAQ,CAAC,CAAC;AAAA,IAC5F;AAAA,EACD;AAGD;",
|
|
6
|
+
"names": ["analyze"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { analyze, createAnalyzer } from './analyzer.js';
|
|
2
|
+
export type { AnalyzerResult, TransactionAnalysisIssue } from './analyzer.js';
|
|
3
|
+
export type { AnalyzedCoin } from './rules/coins.js';
|
|
4
|
+
export type { AnalyzedCommandArgument, AnalyzedCommand } from './rules/commands.js';
|
|
5
|
+
export type { AnalyzedObject } from './rules/objects.js';
|
|
6
|
+
export type { CoinFlow } from './rules/coin-flows.js';
|
|
7
|
+
export type { CoinValueAnalyzerOptions, CoinValueAnalysis } from './rules/coin-value.js';
|
|
8
|
+
export type { AnalyzedCommandInput } from './rules/inputs.js';
|
|
9
|
+
export { analyzers } from './rules/index.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/transaction-analyzer/index.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport { analyze, createAnalyzer } from './analyzer.js';\nexport type { AnalyzerResult, TransactionAnalysisIssue } from './analyzer.js';\n\nexport type { AnalyzedCoin } from './rules/coins.js';\nexport type { AnalyzedCommandArgument, AnalyzedCommand } from './rules/commands.js';\nexport type { AnalyzedObject } from './rules/objects.js';\nexport type { CoinFlow } from './rules/coin-flows.js';\nexport type { CoinValueAnalyzerOptions, CoinValueAnalysis } from './rules/coin-value.js';\nexport type { AnalyzedCommandInput } from './rules/inputs.js';\n\nexport { analyzers } from './rules/index.js';\n"],
|
|
5
|
+
"mappings": "AAGA,SAAS,SAAS,sBAAsB;AAUxC,SAAS,iBAAiB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare const accessLevel: import("../analyzer.js").Analyzer<Record<string, "read" | "mutate" | "transfer">, {
|
|
2
|
+
client: import("@haneullabs/haneul/dist/cjs/experimental/client.js").Experimental_BaseClient & {
|
|
3
|
+
core: import("@haneullabs/haneul/dist/cjs/experimental/core.js").Experimental_CoreClient;
|
|
4
|
+
};
|
|
5
|
+
}, {
|
|
6
|
+
commands: import("./commands.js").AnalyzedCommand[];
|
|
7
|
+
objects: {
|
|
8
|
+
ownerAddress: string | null;
|
|
9
|
+
id: string;
|
|
10
|
+
version: string;
|
|
11
|
+
digest: string;
|
|
12
|
+
owner: import("@haneullabs/haneul/dist/cjs/experimental/types.js").Experimental_HaneulClientTypes.ObjectOwner;
|
|
13
|
+
type: string;
|
|
14
|
+
content: PromiseLike<Uint8Array>;
|
|
15
|
+
previousTransaction: string | null;
|
|
16
|
+
}[];
|
|
17
|
+
gasCoins: {
|
|
18
|
+
coinType: string;
|
|
19
|
+
balance: bigint;
|
|
20
|
+
ownerAddress: string | null;
|
|
21
|
+
id: string;
|
|
22
|
+
version: string;
|
|
23
|
+
digest: string;
|
|
24
|
+
owner: import("@haneullabs/haneul/dist/cjs/experimental/types.js").Experimental_HaneulClientTypes.ObjectOwner;
|
|
25
|
+
type: string;
|
|
26
|
+
content: PromiseLike<Uint8Array>;
|
|
27
|
+
previousTransaction: string | null;
|
|
28
|
+
}[];
|
|
29
|
+
}>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { createAnalyzer } from "../analyzer.js";
|
|
2
|
+
import { gasCoins } from "./coins.js";
|
|
3
|
+
import { commands } from "./commands.js";
|
|
4
|
+
import { objects } from "./objects.js";
|
|
5
|
+
const accessLevel = createAnalyzer({
|
|
6
|
+
dependencies: { commands, objects, gasCoins },
|
|
7
|
+
analyze: () => async ({ commands: commands2, objects: objects2, gasCoins: gasCoins2 }) => {
|
|
8
|
+
const issues = [];
|
|
9
|
+
const gasCoinIds = new Set(gasCoins2.map((g) => g.id));
|
|
10
|
+
const accessLevels = Object.fromEntries(
|
|
11
|
+
objects2.map((obj) => [obj.id, "read"])
|
|
12
|
+
);
|
|
13
|
+
for (const id of gasCoinIds) {
|
|
14
|
+
accessLevels[id] = "mutate";
|
|
15
|
+
}
|
|
16
|
+
for (const command of commands2) {
|
|
17
|
+
switch (command.$kind) {
|
|
18
|
+
case "TransferObjects":
|
|
19
|
+
for (const obj of command.objects) {
|
|
20
|
+
updateFromArgument(obj);
|
|
21
|
+
}
|
|
22
|
+
break;
|
|
23
|
+
case "MoveCall":
|
|
24
|
+
for (const arg of command.arguments) {
|
|
25
|
+
updateFromArgument(arg);
|
|
26
|
+
}
|
|
27
|
+
break;
|
|
28
|
+
case "SplitCoins":
|
|
29
|
+
updateFromArgument(command.coin);
|
|
30
|
+
break;
|
|
31
|
+
case "MergeCoins":
|
|
32
|
+
updateFromArgument(command.destination);
|
|
33
|
+
for (const src of command.sources) {
|
|
34
|
+
updateFromArgument(src);
|
|
35
|
+
}
|
|
36
|
+
break;
|
|
37
|
+
case "MakeMoveVec":
|
|
38
|
+
for (const el of command.elements) {
|
|
39
|
+
updateFromArgument(el);
|
|
40
|
+
}
|
|
41
|
+
break;
|
|
42
|
+
case "Upgrade":
|
|
43
|
+
updateFromArgument(command.ticket);
|
|
44
|
+
break;
|
|
45
|
+
case "Publish":
|
|
46
|
+
break;
|
|
47
|
+
default:
|
|
48
|
+
issues.push({ message: `Unknown command type: ${JSON.stringify(command)}` });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (issues.length) {
|
|
52
|
+
return { issues };
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
result: accessLevels
|
|
56
|
+
};
|
|
57
|
+
function updateFromArgument(arg) {
|
|
58
|
+
switch (arg.$kind) {
|
|
59
|
+
case "GasCoin":
|
|
60
|
+
for (const id of gasCoinIds) {
|
|
61
|
+
updateAccessLevel(id, arg.accessLevel);
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
case "Object":
|
|
65
|
+
updateAccessLevel(arg.object.id, arg.accessLevel);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function updateAccessLevel(id, level) {
|
|
70
|
+
const current = accessLevels[id];
|
|
71
|
+
if (current === "transfer") {
|
|
72
|
+
return;
|
|
73
|
+
} else if (current === "mutate") {
|
|
74
|
+
if (level === "transfer") {
|
|
75
|
+
accessLevels[id] = "transfer";
|
|
76
|
+
}
|
|
77
|
+
} else {
|
|
78
|
+
accessLevels[id] = level;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
export {
|
|
84
|
+
accessLevel
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=accessLevel.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/transaction-analyzer/rules/accessLevel.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { TransactionAnalysisIssue } from '../analyzer.js';\nimport { createAnalyzer } from '../analyzer.js';\nimport { gasCoins } from './coins.js';\nimport type { AnalyzedCommandArgument } from './commands.js';\nimport { commands } from './commands.js';\nimport { objects } from './objects.js';\n\nexport const accessLevel = createAnalyzer({\n\tdependencies: { commands, objects, gasCoins },\n\tanalyze:\n\t\t() =>\n\t\tasync ({ commands, objects, gasCoins }) => {\n\t\t\tconst issues: TransactionAnalysisIssue[] = [];\n\n\t\t\tconst gasCoinIds = new Set(gasCoins.map((g) => g.id));\n\n\t\t\tconst accessLevels: Record<string, 'read' | 'mutate' | 'transfer'> = Object.fromEntries(\n\t\t\t\tobjects.map((obj) => [obj.id, 'read' as const]),\n\t\t\t);\n\n\t\t\tfor (const id of gasCoinIds) {\n\t\t\t\taccessLevels[id] = 'mutate';\n\t\t\t}\n\n\t\t\tfor (const command of commands) {\n\t\t\t\tswitch (command.$kind) {\n\t\t\t\t\tcase 'TransferObjects':\n\t\t\t\t\t\tfor (const obj of command.objects) {\n\t\t\t\t\t\t\tupdateFromArgument(obj);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'MoveCall':\n\t\t\t\t\t\tfor (const arg of command.arguments) {\n\t\t\t\t\t\t\tupdateFromArgument(arg);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'SplitCoins':\n\t\t\t\t\t\tupdateFromArgument(command.coin);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'MergeCoins':\n\t\t\t\t\t\tupdateFromArgument(command.destination);\n\t\t\t\t\t\tfor (const src of command.sources) {\n\t\t\t\t\t\t\tupdateFromArgument(src);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'MakeMoveVec':\n\t\t\t\t\t\tfor (const el of command.elements) {\n\t\t\t\t\t\t\tupdateFromArgument(el);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Upgrade':\n\t\t\t\t\t\tupdateFromArgument(command.ticket);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Publish':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tissues.push({ message: `Unknown command type: ${JSON.stringify(command)}` });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (issues.length) {\n\t\t\t\treturn { issues };\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tresult: accessLevels,\n\t\t\t};\n\n\t\t\tfunction updateFromArgument(arg: AnalyzedCommandArgument) {\n\t\t\t\tswitch (arg.$kind) {\n\t\t\t\t\tcase 'GasCoin':\n\t\t\t\t\t\tfor (const id of gasCoinIds) {\n\t\t\t\t\t\t\tupdateAccessLevel(id, arg.accessLevel);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Object':\n\t\t\t\t\t\tupdateAccessLevel(arg.object.id, arg.accessLevel);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction updateAccessLevel(id: string, level: 'read' | 'mutate' | 'transfer') {\n\t\t\t\tconst current = accessLevels[id];\n\t\t\t\tif (current === 'transfer') {\n\t\t\t\t\treturn;\n\t\t\t\t} else if (current === 'mutate') {\n\t\t\t\t\tif (level === 'transfer') {\n\t\t\t\t\t\taccessLevels[id] = 'transfer';\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\taccessLevels[id] = level;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n});\n"],
|
|
5
|
+
"mappings": "AAIA,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB;AAEzB,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAEjB,MAAM,cAAc,eAAe;AAAA,EACzC,cAAc,EAAE,UAAU,SAAS,SAAS;AAAA,EAC5C,SACC,MACA,OAAO,EAAE,UAAAA,WAAU,SAAAC,UAAS,UAAAC,UAAS,MAAM;AAC1C,UAAM,SAAqC,CAAC;AAE5C,UAAM,aAAa,IAAI,IAAIA,UAAS,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAEpD,UAAM,eAA+D,OAAO;AAAA,MAC3ED,SAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,MAAe,CAAC;AAAA,IAC/C;AAEA,eAAW,MAAM,YAAY;AAC5B,mBAAa,EAAE,IAAI;AAAA,IACpB;AAEA,eAAW,WAAWD,WAAU;AAC/B,cAAQ,QAAQ,OAAO;AAAA,QACtB,KAAK;AACJ,qBAAW,OAAO,QAAQ,SAAS;AAClC,+BAAmB,GAAG;AAAA,UACvB;AACA;AAAA,QACD,KAAK;AACJ,qBAAW,OAAO,QAAQ,WAAW;AACpC,+BAAmB,GAAG;AAAA,UACvB;AACA;AAAA,QACD,KAAK;AACJ,6BAAmB,QAAQ,IAAI;AAC/B;AAAA,QACD,KAAK;AACJ,6BAAmB,QAAQ,WAAW;AACtC,qBAAW,OAAO,QAAQ,SAAS;AAClC,+BAAmB,GAAG;AAAA,UACvB;AACA;AAAA,QACD,KAAK;AACJ,qBAAW,MAAM,QAAQ,UAAU;AAClC,+BAAmB,EAAE;AAAA,UACtB;AACA;AAAA,QACD,KAAK;AACJ,6BAAmB,QAAQ,MAAM;AACjC;AAAA,QACD,KAAK;AACJ;AAAA,QACD;AACC,iBAAO,KAAK,EAAE,SAAS,yBAAyB,KAAK,UAAU,OAAO,CAAC,GAAG,CAAC;AAAA,MAC7E;AAAA,IACD;AAEA,QAAI,OAAO,QAAQ;AAClB,aAAO,EAAE,OAAO;AAAA,IACjB;AAEA,WAAO;AAAA,MACN,QAAQ;AAAA,IACT;AAEA,aAAS,mBAAmB,KAA8B;AACzD,cAAQ,IAAI,OAAO;AAAA,QAClB,KAAK;AACJ,qBAAW,MAAM,YAAY;AAC5B,8BAAkB,IAAI,IAAI,WAAW;AAAA,UACtC;AACA;AAAA,QACD,KAAK;AACJ,4BAAkB,IAAI,OAAO,IAAI,IAAI,WAAW;AAChD;AAAA,MACF;AAAA,IACD;AAEA,aAAS,kBAAkB,IAAY,OAAuC;AAC7E,YAAM,UAAU,aAAa,EAAE;AAC/B,UAAI,YAAY,YAAY;AAC3B;AAAA,MACD,WAAW,YAAY,UAAU;AAChC,YAAI,UAAU,YAAY;AACzB,uBAAa,EAAE,IAAI;AAAA,QACpB;AAAA,MACD,OAAO;AACN,qBAAa,EAAE,IAAI;AAAA,MACpB;AAAA,IACD;AAAA,EACD;AACF,CAAC;",
|
|
6
|
+
"names": ["commands", "objects", "gasCoins"]
|
|
7
|
+
}
|