@haneullabs/wallet-sdk 0.1.0 → 0.1.1
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 +47 -18
- package/dist/auto-approvals/analyzer.d.mts +83 -0
- package/dist/auto-approvals/analyzer.d.mts.map +1 -0
- package/dist/auto-approvals/analyzer.mjs +43 -0
- package/dist/auto-approvals/analyzer.mjs.map +1 -0
- package/dist/auto-approvals/index.d.mts +6 -0
- package/dist/auto-approvals/intent.d.mts +9 -0
- package/dist/auto-approvals/intent.d.mts.map +1 -0
- package/dist/auto-approvals/intent.mjs +40 -0
- package/dist/auto-approvals/intent.mjs.map +1 -0
- package/dist/auto-approvals/manager.d.mts +38 -0
- package/dist/auto-approvals/manager.d.mts.map +1 -0
- package/dist/auto-approvals/manager.mjs +192 -0
- package/dist/auto-approvals/manager.mjs.map +1 -0
- package/dist/auto-approvals/schemas/index.d.mts +2 -0
- package/dist/auto-approvals/schemas/policy.d.mts +149 -0
- package/dist/auto-approvals/schemas/policy.d.mts.map +1 -0
- package/dist/auto-approvals/schemas/policy.mjs +49 -0
- package/dist/auto-approvals/schemas/policy.mjs.map +1 -0
- package/dist/auto-approvals/schemas/state.d.mts +115 -0
- package/dist/auto-approvals/schemas/state.d.mts.map +1 -0
- package/dist/auto-approvals/schemas/state.mjs +20 -0
- package/dist/auto-approvals/schemas/state.mjs.map +1 -0
- package/dist/index.d.mts +16 -0
- package/dist/index.mjs +9 -0
- package/dist/transaction-analyzer/analyzer.d.mts +39 -0
- package/dist/transaction-analyzer/analyzer.d.mts.map +1 -0
- package/dist/transaction-analyzer/analyzer.mjs +46 -0
- package/dist/transaction-analyzer/analyzer.mjs.map +1 -0
- package/dist/transaction-analyzer/index.d.mts +8 -0
- package/dist/transaction-analyzer/rules/accessLevel.mjs +65 -0
- package/dist/transaction-analyzer/rules/accessLevel.mjs.map +1 -0
- package/dist/transaction-analyzer/rules/coin-flows.d.mts +12 -0
- package/dist/transaction-analyzer/rules/coin-flows.d.mts.map +1 -0
- package/dist/transaction-analyzer/rules/coin-flows.mjs +122 -0
- package/dist/transaction-analyzer/rules/coin-flows.mjs.map +1 -0
- package/dist/transaction-analyzer/rules/coin-value.d.mts +25 -0
- package/dist/transaction-analyzer/rules/coin-value.d.mts.map +1 -0
- package/dist/transaction-analyzer/rules/coin-value.mjs +36 -0
- package/dist/transaction-analyzer/rules/coin-value.mjs.map +1 -0
- package/dist/transaction-analyzer/rules/coins.d.mts +12 -0
- package/dist/transaction-analyzer/rules/coins.d.mts.map +1 -0
- package/dist/transaction-analyzer/rules/coins.mjs +48 -0
- package/dist/transaction-analyzer/rules/coins.mjs.map +1 -0
- package/dist/transaction-analyzer/rules/commands.d.mts +79 -0
- package/dist/transaction-analyzer/rules/commands.d.mts.map +1 -0
- package/dist/transaction-analyzer/rules/commands.mjs +141 -0
- package/dist/transaction-analyzer/rules/commands.mjs.map +1 -0
- package/dist/transaction-analyzer/rules/core.mjs +48 -0
- package/dist/transaction-analyzer/rules/core.mjs.map +1 -0
- package/dist/transaction-analyzer/rules/functions.mjs +31 -0
- package/dist/transaction-analyzer/rules/functions.mjs.map +1 -0
- package/dist/transaction-analyzer/rules/index.d.mts +2125 -0
- package/dist/transaction-analyzer/rules/index.d.mts.map +1 -0
- package/dist/transaction-analyzer/rules/index.mjs +34 -0
- package/dist/transaction-analyzer/rules/index.mjs.map +1 -0
- package/dist/transaction-analyzer/rules/inputs.d.mts +20 -0
- package/dist/transaction-analyzer/rules/inputs.d.mts.map +1 -0
- package/dist/transaction-analyzer/rules/inputs.mjs +38 -0
- package/dist/transaction-analyzer/rules/inputs.mjs.map +1 -0
- package/dist/transaction-analyzer/rules/objects.d.mts +12 -0
- package/dist/transaction-analyzer/rules/objects.d.mts.map +1 -0
- package/dist/transaction-analyzer/rules/objects.mjs +92 -0
- package/dist/transaction-analyzer/rules/objects.mjs.map +1 -0
- package/dist/util.d.mts +7 -0
- package/dist/util.d.mts.map +1 -0
- package/package.json +27 -25
- package/dist/cjs/auto-approvals/analyzer.d.ts +0 -71
- package/dist/cjs/auto-approvals/analyzer.js +0 -70
- package/dist/cjs/auto-approvals/analyzer.js.map +0 -7
- package/dist/cjs/auto-approvals/index.d.ts +0 -6
- package/dist/cjs/auto-approvals/index.js +0 -33
- package/dist/cjs/auto-approvals/index.js.map +0 -7
- package/dist/cjs/auto-approvals/intent.d.ts +0 -5
- package/dist/cjs/auto-approvals/intent.js +0 -65
- package/dist/cjs/auto-approvals/intent.js.map +0 -7
- package/dist/cjs/auto-approvals/manager.d.ts +0 -31
- package/dist/cjs/auto-approvals/manager.js +0 -328
- package/dist/cjs/auto-approvals/manager.js.map +0 -7
- package/dist/cjs/auto-approvals/schemas/index.d.ts +0 -4
- package/dist/cjs/auto-approvals/schemas/index.js +0 -28
- package/dist/cjs/auto-approvals/schemas/index.js.map +0 -7
- package/dist/cjs/auto-approvals/schemas/policy.d.ts +0 -145
- package/dist/cjs/auto-approvals/schemas/policy.js +0 -79
- package/dist/cjs/auto-approvals/schemas/policy.js.map +0 -7
- package/dist/cjs/auto-approvals/schemas/state.d.ts +0 -115
- package/dist/cjs/auto-approvals/schemas/state.js +0 -49
- package/dist/cjs/auto-approvals/schemas/state.js.map +0 -7
- package/dist/cjs/index.d.ts +0 -2
- package/dist/cjs/index.js +0 -20
- package/dist/cjs/index.js.map +0 -7
- package/dist/cjs/package.json +0 -5
- package/dist/cjs/transaction-analyzer/analyzer.d.ts +0 -34
- package/dist/cjs/transaction-analyzer/analyzer.js +0 -94
- package/dist/cjs/transaction-analyzer/analyzer.js.map +0 -7
- package/dist/cjs/transaction-analyzer/index.d.ts +0 -9
- package/dist/cjs/transaction-analyzer/index.js +0 -28
- package/dist/cjs/transaction-analyzer/index.js.map +0 -7
- package/dist/cjs/transaction-analyzer/rules/accessLevel.d.ts +0 -29
- package/dist/cjs/transaction-analyzer/rules/accessLevel.js +0 -106
- package/dist/cjs/transaction-analyzer/rules/accessLevel.js.map +0 -7
- package/dist/cjs/transaction-analyzer/rules/coin-flows.d.ts +0 -313
- package/dist/cjs/transaction-analyzer/rules/coin-flows.js +0 -179
- package/dist/cjs/transaction-analyzer/rules/coin-flows.js.map +0 -7
- package/dist/cjs/transaction-analyzer/rules/coin-value.d.ts +0 -42
- package/dist/cjs/transaction-analyzer/rules/coin-value.js +0 -60
- package/dist/cjs/transaction-analyzer/rules/coin-value.js.map +0 -7
- package/dist/cjs/transaction-analyzer/rules/coins.d.ts +0 -337
- package/dist/cjs/transaction-analyzer/rules/coins.js +0 -78
- package/dist/cjs/transaction-analyzer/rules/coins.js.map +0 -7
- package/dist/cjs/transaction-analyzer/rules/commands.d.ts +0 -366
- package/dist/cjs/transaction-analyzer/rules/commands.js +0 -148
- package/dist/cjs/transaction-analyzer/rules/commands.js.map +0 -7
- package/dist/cjs/transaction-analyzer/rules/core.d.ts +0 -314
- package/dist/cjs/transaction-analyzer/rules/core.js +0 -73
- package/dist/cjs/transaction-analyzer/rules/core.js.map +0 -7
- package/dist/cjs/transaction-analyzer/rules/functions.d.ts +0 -292
- package/dist/cjs/transaction-analyzer/rules/functions.js +0 -58
- package/dist/cjs/transaction-analyzer/rules/functions.js.map +0 -7
- package/dist/cjs/transaction-analyzer/rules/index.d.ts +0 -2244
- package/dist/cjs/transaction-analyzer/rules/index.js +0 -52
- package/dist/cjs/transaction-analyzer/rules/index.js.map +0 -7
- package/dist/cjs/transaction-analyzer/rules/inputs.d.ts +0 -313
- package/dist/cjs/transaction-analyzer/rules/inputs.js +0 -49
- package/dist/cjs/transaction-analyzer/rules/inputs.js.map +0 -7
- package/dist/cjs/transaction-analyzer/rules/objects.d.ts +0 -359
- package/dist/cjs/transaction-analyzer/rules/objects.js +0 -124
- package/dist/cjs/transaction-analyzer/rules/objects.js.map +0 -7
- package/dist/cjs/util.d.ts +0 -5
- package/dist/cjs/util.js +0 -17
- package/dist/cjs/util.js.map +0 -7
- package/dist/esm/auto-approvals/analyzer.d.ts +0 -71
- package/dist/esm/auto-approvals/analyzer.js +0 -50
- package/dist/esm/auto-approvals/analyzer.js.map +0 -7
- package/dist/esm/auto-approvals/index.d.ts +0 -6
- package/dist/esm/auto-approvals/index.js +0 -12
- package/dist/esm/auto-approvals/index.js.map +0 -7
- package/dist/esm/auto-approvals/intent.d.ts +0 -5
- package/dist/esm/auto-approvals/intent.js +0 -45
- package/dist/esm/auto-approvals/intent.js.map +0 -7
- package/dist/esm/auto-approvals/manager.d.ts +0 -31
- package/dist/esm/auto-approvals/manager.js +0 -308
- package/dist/esm/auto-approvals/manager.js.map +0 -7
- package/dist/esm/auto-approvals/schemas/index.d.ts +0 -4
- package/dist/esm/auto-approvals/schemas/index.js +0 -8
- package/dist/esm/auto-approvals/schemas/index.js.map +0 -7
- package/dist/esm/auto-approvals/schemas/policy.d.ts +0 -145
- package/dist/esm/auto-approvals/schemas/policy.js +0 -49
- package/dist/esm/auto-approvals/schemas/policy.js.map +0 -7
- package/dist/esm/auto-approvals/schemas/state.d.ts +0 -115
- package/dist/esm/auto-approvals/schemas/state.js +0 -19
- package/dist/esm/auto-approvals/schemas/state.js.map +0 -7
- package/dist/esm/index.d.ts +0 -2
- package/dist/esm/index.js +0 -3
- package/dist/esm/index.js.map +0 -7
- package/dist/esm/package.json +0 -5
- package/dist/esm/transaction-analyzer/analyzer.d.ts +0 -34
- package/dist/esm/transaction-analyzer/analyzer.js +0 -74
- package/dist/esm/transaction-analyzer/analyzer.js.map +0 -7
- package/dist/esm/transaction-analyzer/index.d.ts +0 -9
- package/dist/esm/transaction-analyzer/index.js +0 -8
- package/dist/esm/transaction-analyzer/index.js.map +0 -7
- package/dist/esm/transaction-analyzer/rules/accessLevel.d.ts +0 -29
- package/dist/esm/transaction-analyzer/rules/accessLevel.js +0 -86
- package/dist/esm/transaction-analyzer/rules/accessLevel.js.map +0 -7
- package/dist/esm/transaction-analyzer/rules/coin-flows.d.ts +0 -313
- package/dist/esm/transaction-analyzer/rules/coin-flows.js +0 -159
- package/dist/esm/transaction-analyzer/rules/coin-flows.js.map +0 -7
- package/dist/esm/transaction-analyzer/rules/coin-value.d.ts +0 -42
- package/dist/esm/transaction-analyzer/rules/coin-value.js +0 -40
- package/dist/esm/transaction-analyzer/rules/coin-value.js.map +0 -7
- package/dist/esm/transaction-analyzer/rules/coins.d.ts +0 -337
- package/dist/esm/transaction-analyzer/rules/coins.js +0 -58
- package/dist/esm/transaction-analyzer/rules/coins.js.map +0 -7
- package/dist/esm/transaction-analyzer/rules/commands.d.ts +0 -366
- package/dist/esm/transaction-analyzer/rules/commands.js +0 -128
- package/dist/esm/transaction-analyzer/rules/commands.js.map +0 -7
- package/dist/esm/transaction-analyzer/rules/core.d.ts +0 -314
- package/dist/esm/transaction-analyzer/rules/core.js +0 -53
- package/dist/esm/transaction-analyzer/rules/core.js.map +0 -7
- package/dist/esm/transaction-analyzer/rules/functions.d.ts +0 -292
- package/dist/esm/transaction-analyzer/rules/functions.js +0 -38
- package/dist/esm/transaction-analyzer/rules/functions.js.map +0 -7
- package/dist/esm/transaction-analyzer/rules/index.d.ts +0 -2244
- package/dist/esm/transaction-analyzer/rules/index.js +0 -32
- package/dist/esm/transaction-analyzer/rules/index.js.map +0 -7
- package/dist/esm/transaction-analyzer/rules/inputs.d.ts +0 -313
- package/dist/esm/transaction-analyzer/rules/inputs.js +0 -29
- package/dist/esm/transaction-analyzer/rules/inputs.js.map +0 -7
- package/dist/esm/transaction-analyzer/rules/objects.d.ts +0 -359
- package/dist/esm/transaction-analyzer/rules/objects.js +0 -104
- package/dist/esm/transaction-analyzer/rules/objects.js.map +0 -7
- package/dist/esm/util.d.ts +0 -5
- package/dist/esm/util.js +0 -1
- package/dist/esm/util.js.map +0 -7
- package/dist/tsconfig.esm.tsbuildinfo +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,41 @@
|
|
|
1
|
-
# @
|
|
1
|
+
# @mysten/wallet-sdk
|
|
2
|
+
|
|
3
|
+
## 0.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 99d1e00: Add default export condition
|
|
8
|
+
- Updated dependencies [99d1e00]
|
|
9
|
+
- @mysten/wallet-standard@0.20.1
|
|
10
|
+
- @mysten/bcs@2.0.2
|
|
11
|
+
|
|
12
|
+
## 0.1.0
|
|
13
|
+
|
|
14
|
+
### Minor Changes
|
|
15
|
+
|
|
16
|
+
- e00788c: Update to @mysten/sui@2.0
|
|
17
|
+
- e00788c: Update to use SuiJsonRpcClient instead of SuiClient
|
|
18
|
+
|
|
19
|
+
Updated all type signatures, internal usages, examples, and documentation to use
|
|
20
|
+
`SuiJsonRpcClient` from `@mysten/sui/jsonRpc` instead of the deprecated `SuiClient` from
|
|
21
|
+
`@mysten/sui/client`.
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- Updated dependencies [e00788c]
|
|
26
|
+
- Updated dependencies [e00788c]
|
|
27
|
+
- Updated dependencies [e00788c]
|
|
28
|
+
- Updated dependencies [e00788c]
|
|
29
|
+
- @mysten/wallet-standard@0.20.0
|
|
30
|
+
- @mysten/bcs@2.0.0
|
|
2
31
|
|
|
3
32
|
## 0.0.8
|
|
4
33
|
|
|
5
34
|
### Patch Changes
|
|
6
35
|
|
|
7
36
|
- Updated dependencies [29e8b92]
|
|
8
|
-
- @
|
|
9
|
-
- @
|
|
37
|
+
- @mysten/sui@1.45.2
|
|
38
|
+
- @mysten/wallet-standard@0.19.9
|
|
10
39
|
|
|
11
40
|
## 0.0.7
|
|
12
41
|
|
|
@@ -14,8 +43,8 @@
|
|
|
14
43
|
|
|
15
44
|
- e3811f1: update valibot
|
|
16
45
|
- Updated dependencies [e3811f1]
|
|
17
|
-
- @
|
|
18
|
-
- @
|
|
46
|
+
- @mysten/sui@1.45.1
|
|
47
|
+
- @mysten/wallet-standard@0.19.8
|
|
19
48
|
|
|
20
49
|
## 0.0.6
|
|
21
50
|
|
|
@@ -28,34 +57,34 @@
|
|
|
28
57
|
### Patch Changes
|
|
29
58
|
|
|
30
59
|
- Updated dependencies [88bdbac]
|
|
31
|
-
- @
|
|
32
|
-
- @
|
|
60
|
+
- @mysten/sui@1.45.0
|
|
61
|
+
- @mysten/wallet-standard@0.19.7
|
|
33
62
|
|
|
34
63
|
## 0.0.4
|
|
35
64
|
|
|
36
65
|
### Patch Changes
|
|
37
66
|
|
|
38
67
|
- Updated dependencies [44d9b4f]
|
|
39
|
-
- @
|
|
40
|
-
- @
|
|
68
|
+
- @mysten/sui@1.44.0
|
|
69
|
+
- @mysten/wallet-standard@0.19.6
|
|
41
70
|
|
|
42
71
|
## 0.0.3
|
|
43
72
|
|
|
44
73
|
### Patch Changes
|
|
45
74
|
|
|
46
75
|
- Updated dependencies [89fa2dc]
|
|
47
|
-
- @
|
|
48
|
-
- @
|
|
49
|
-
- @
|
|
76
|
+
- @mysten/bcs@1.9.2
|
|
77
|
+
- @mysten/sui@1.43.2
|
|
78
|
+
- @mysten/wallet-standard@0.19.5
|
|
50
79
|
|
|
51
80
|
## 0.0.2
|
|
52
81
|
|
|
53
82
|
### Patch Changes
|
|
54
83
|
|
|
55
84
|
- Updated dependencies [a37829f]
|
|
56
|
-
- @
|
|
57
|
-
- @
|
|
58
|
-
- @
|
|
85
|
+
- @mysten/bcs@1.9.1
|
|
86
|
+
- @mysten/sui@1.43.1
|
|
87
|
+
- @mysten/wallet-standard@0.19.4
|
|
59
88
|
|
|
60
89
|
## 0.0.1
|
|
61
90
|
|
|
@@ -64,6 +93,6 @@
|
|
|
64
93
|
- Updated dependencies [f3b19a7]
|
|
65
94
|
- Updated dependencies [f3b19a7]
|
|
66
95
|
- Updated dependencies [bf9f85c]
|
|
67
|
-
- @
|
|
68
|
-
- @
|
|
69
|
-
- @
|
|
96
|
+
- @mysten/sui@1.43.0
|
|
97
|
+
- @mysten/bcs@1.9.0
|
|
98
|
+
- @mysten/wallet-standard@0.19.3
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Analyzer, AnalyzerResult } from "../transaction-analyzer/analyzer.mjs";
|
|
2
|
+
import { CoinFlow } from "../transaction-analyzer/rules/coin-flows.mjs";
|
|
3
|
+
import "../transaction-analyzer/index.mjs";
|
|
4
|
+
import * as _haneullabs_haneul_client0 from "@haneullabs/haneul/client";
|
|
5
|
+
|
|
6
|
+
//#region src/auto-approvals/analyzer.d.ts
|
|
7
|
+
declare const autoApprovalAnalyzer: Analyzer<{
|
|
8
|
+
operationType: string | null;
|
|
9
|
+
bytes: Uint8Array<ArrayBufferLike>;
|
|
10
|
+
coinFlows: {
|
|
11
|
+
outflows: CoinFlow[];
|
|
12
|
+
};
|
|
13
|
+
accessLevel: Record<string, "read" | "mutate" | "transfer">;
|
|
14
|
+
ownedObjects: {
|
|
15
|
+
ownerAddress: string | null;
|
|
16
|
+
objectId: string;
|
|
17
|
+
version: string;
|
|
18
|
+
digest: string;
|
|
19
|
+
owner: _haneullabs_haneul_client0.HaneulClientTypes.ObjectOwner;
|
|
20
|
+
type: string;
|
|
21
|
+
content: Uint8Array<ArrayBuffer>;
|
|
22
|
+
previousTransaction: undefined;
|
|
23
|
+
objectBcs: undefined;
|
|
24
|
+
json: undefined;
|
|
25
|
+
}[];
|
|
26
|
+
digest: string;
|
|
27
|
+
coinValues: {
|
|
28
|
+
total: number;
|
|
29
|
+
coinTypesWithoutPrice: string[];
|
|
30
|
+
coinTypes: {
|
|
31
|
+
coinType: string;
|
|
32
|
+
decimals: number;
|
|
33
|
+
price: number;
|
|
34
|
+
amount: bigint;
|
|
35
|
+
convertedAmount: number;
|
|
36
|
+
}[];
|
|
37
|
+
};
|
|
38
|
+
}, {
|
|
39
|
+
client: _haneullabs_haneul_client0.BaseClient & {
|
|
40
|
+
core: _haneullabs_haneul_client0.CoreClient;
|
|
41
|
+
};
|
|
42
|
+
getCoinPrices: (coinTypes: string[]) => Promise<{
|
|
43
|
+
coinType: string;
|
|
44
|
+
decimals: number;
|
|
45
|
+
price: number | null;
|
|
46
|
+
}[]>;
|
|
47
|
+
}, {
|
|
48
|
+
operationType: string | null;
|
|
49
|
+
bytes: Uint8Array<ArrayBufferLike>;
|
|
50
|
+
coinFlows: {
|
|
51
|
+
outflows: CoinFlow[];
|
|
52
|
+
};
|
|
53
|
+
coinValues: {
|
|
54
|
+
total: number;
|
|
55
|
+
coinTypesWithoutPrice: string[];
|
|
56
|
+
coinTypes: {
|
|
57
|
+
coinType: string;
|
|
58
|
+
decimals: number;
|
|
59
|
+
price: number;
|
|
60
|
+
amount: bigint;
|
|
61
|
+
convertedAmount: number;
|
|
62
|
+
}[];
|
|
63
|
+
};
|
|
64
|
+
accessLevel: Record<string, "read" | "mutate" | "transfer">;
|
|
65
|
+
ownedObjects: {
|
|
66
|
+
ownerAddress: string | null;
|
|
67
|
+
objectId: string;
|
|
68
|
+
version: string;
|
|
69
|
+
digest: string;
|
|
70
|
+
owner: _haneullabs_haneul_client0.HaneulClientTypes.ObjectOwner;
|
|
71
|
+
type: string;
|
|
72
|
+
content: Uint8Array<ArrayBuffer>;
|
|
73
|
+
previousTransaction: undefined;
|
|
74
|
+
objectBcs: undefined;
|
|
75
|
+
json: undefined;
|
|
76
|
+
}[];
|
|
77
|
+
digest: string;
|
|
78
|
+
}>;
|
|
79
|
+
type AutoApprovalAnalysis = typeof autoApprovalAnalyzer extends Analyzer<infer R, any, any> ? R : never;
|
|
80
|
+
type AutoApprovalResult = AnalyzerResult<AutoApprovalAnalysis>;
|
|
81
|
+
//#endregion
|
|
82
|
+
export { AutoApprovalAnalysis, AutoApprovalResult, autoApprovalAnalyzer };
|
|
83
|
+
//# sourceMappingURL=analyzer.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.mts","names":[],"sources":["../../src/auto-approvals/analyzer.ts"],"sourcesContent":[],"mappings":";;;;;;cA6Ba,sBAAoB;;;;;EAApB,CAAA;;;;;;;;;;;;;;;;;;IAAoB,SAAA,EAAA;MAAA,QAAA,EAAA,MAAA;MA2BrB,QAAA,EAAA,MAAoB;MAEpB,KAAA,EAAA,MAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAFlB,oBAAA,UACJ,6BAA6B;KACzB,kBAAA,GAAqB,eAAe"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createAnalyzer } from "../transaction-analyzer/analyzer.mjs";
|
|
2
|
+
import { analyzers } from "../transaction-analyzer/rules/index.mjs";
|
|
3
|
+
import { OPERATION_INTENT, extractOperationType } from "./intent.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/auto-approvals/analyzer.ts
|
|
6
|
+
const operationType = createAnalyzer({
|
|
7
|
+
dependencies: { bytes: analyzers.bytes },
|
|
8
|
+
analyze: (_options, tx) => {
|
|
9
|
+
let operationType$1 = null;
|
|
10
|
+
tx.addIntentResolver(OPERATION_INTENT, extractOperationType((type) => {
|
|
11
|
+
operationType$1 = type;
|
|
12
|
+
}));
|
|
13
|
+
return async () => {
|
|
14
|
+
return { result: operationType$1 };
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
const autoApprovalAnalyzer = createAnalyzer({
|
|
19
|
+
dependencies: {
|
|
20
|
+
operationType,
|
|
21
|
+
bytes: analyzers.bytes,
|
|
22
|
+
coinFlows: analyzers.coinFlows,
|
|
23
|
+
coinValues: analyzers.coinValues,
|
|
24
|
+
accessLevel: analyzers.accessLevel,
|
|
25
|
+
ownedObjects: analyzers.ownedObjects,
|
|
26
|
+
digest: analyzers.digest
|
|
27
|
+
},
|
|
28
|
+
analyze: () => async ({ bytes, coinFlows, accessLevel, ownedObjects, digest, operationType: operationType$1, coinValues }) => {
|
|
29
|
+
return { result: {
|
|
30
|
+
operationType: operationType$1,
|
|
31
|
+
bytes,
|
|
32
|
+
coinFlows,
|
|
33
|
+
accessLevel,
|
|
34
|
+
ownedObjects,
|
|
35
|
+
digest,
|
|
36
|
+
coinValues
|
|
37
|
+
} };
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
export { autoApprovalAnalyzer };
|
|
43
|
+
//# sourceMappingURL=analyzer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.mjs","names":["operationType"],"sources":["../../src/auto-approvals/analyzer.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Analyzer, AnalyzerResult } from '../transaction-analyzer/analyzer.js';\nimport { createAnalyzer } from '../transaction-analyzer/index.js';\nimport { analyzers } from '../transaction-analyzer/index.js';\nimport { extractOperationType, OPERATION_INTENT } from './intent.js';\n\nconst operationType = createAnalyzer({\n\tdependencies: {\n\t\tbytes: analyzers.bytes,\n\t},\n\tanalyze: (_options, tx) => {\n\t\tlet operationType: string | null = null;\n\t\ttx.addIntentResolver(\n\t\t\tOPERATION_INTENT,\n\t\t\textractOperationType((type) => {\n\t\t\t\toperationType = type;\n\t\t\t}),\n\t\t);\n\n\t\treturn async () => {\n\t\t\treturn {\n\t\t\t\tresult: operationType,\n\t\t\t};\n\t\t};\n\t},\n});\n\nexport const autoApprovalAnalyzer = createAnalyzer({\n\tdependencies: {\n\t\toperationType,\n\t\tbytes: analyzers.bytes,\n\t\tcoinFlows: analyzers.coinFlows,\n\t\tcoinValues: analyzers.coinValues,\n\t\taccessLevel: analyzers.accessLevel,\n\t\townedObjects: analyzers.ownedObjects,\n\t\tdigest: analyzers.digest,\n\t},\n\tanalyze:\n\t\t() =>\n\t\tasync ({ bytes, coinFlows, accessLevel, ownedObjects, digest, operationType, coinValues }) => {\n\t\t\treturn {\n\t\t\t\tresult: {\n\t\t\t\t\toperationType,\n\t\t\t\t\tbytes,\n\t\t\t\t\tcoinFlows,\n\t\t\t\t\taccessLevel,\n\t\t\t\t\townedObjects,\n\t\t\t\t\tdigest,\n\t\t\t\t\tcoinValues,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n});\n\nexport type AutoApprovalAnalysis =\n\ttypeof autoApprovalAnalyzer extends Analyzer<infer R, any, any> ? R : never;\nexport type AutoApprovalResult = AnalyzerResult<AutoApprovalAnalysis>;\n"],"mappings":";;;;;AAQA,MAAM,gBAAgB,eAAe;CACpC,cAAc,EACb,OAAO,UAAU,OACjB;CACD,UAAU,UAAU,OAAO;EAC1B,IAAIA,kBAA+B;AACnC,KAAG,kBACF,kBACA,sBAAsB,SAAS;AAC9B,qBAAgB;IACf,CACF;AAED,SAAO,YAAY;AAClB,UAAO,EACN,QAAQA,iBACR;;;CAGH,CAAC;AAEF,MAAa,uBAAuB,eAAe;CAClD,cAAc;EACb;EACA,OAAO,UAAU;EACjB,WAAW,UAAU;EACrB,YAAY,UAAU;EACtB,aAAa,UAAU;EACvB,cAAc,UAAU;EACxB,QAAQ,UAAU;EAClB;CACD,eAEC,OAAO,EAAE,OAAO,WAAW,aAAa,cAAc,QAAQ,gCAAe,iBAAiB;AAC7F,SAAO,EACN,QAAQ;GACP;GACA;GACA;GACA;GACA;GACA;GACA;GACA,EACD;;CAEH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { OPERATION_INTENT, extractOperationType, operationType } from "./intent.mjs";
|
|
2
|
+
import { AutoApprovalAnalysis, AutoApprovalResult, autoApprovalAnalyzer } from "./analyzer.mjs";
|
|
3
|
+
import { AutoApprovalState, AutoApprovalStateSchema } from "./schemas/state.mjs";
|
|
4
|
+
import { AutoApprovalOperation, AutoApprovalPolicy, AutoApprovalPolicySchema, AutoApprovalSettings, AutoApprovalSettingsSchema, PolicyPermission } from "./schemas/policy.mjs";
|
|
5
|
+
import { AutoApprovalCheck, AutoApprovalIssue, AutoApprovalManager } from "./manager.mjs";
|
|
6
|
+
import "./schemas/index.mjs";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Transaction, TransactionDataBuilder, TransactionResult } from "@haneullabs/haneul/transactions";
|
|
2
|
+
|
|
3
|
+
//#region src/auto-approvals/intent.d.ts
|
|
4
|
+
declare const OPERATION_INTENT = "@haneullabs/wallet-kit/AutoApprovalOperation";
|
|
5
|
+
declare function operationType(operationType: string): (tx: Transaction) => TransactionResult;
|
|
6
|
+
declare function extractOperationType(cb: (operationType: string) => void): (transactionData: TransactionDataBuilder, _options: unknown, next: () => Promise<void>) => Promise<void>;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { OPERATION_INTENT, extractOperationType, operationType };
|
|
9
|
+
//# sourceMappingURL=intent.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent.d.mts","names":[],"sources":["../../src/auto-approvals/intent.ts"],"sourcesContent":[],"mappings":";;;cAOa,gBAAA;AAAA,iBAEG,aAAA,CAFa,aAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,EAGhB,WAHgB,EAAA,GAGF,iBAHE;AAEb,iBAmBA,oBAAA,CAlBW,EAAA,EAAA,CAAA,aAAiB,EAAA,MAAA,EAAA,GAAA,IAAA,CAAA,EAAA,CAAA,eAAA,EAoBzB,sBApByB,EAAA,QAAA,EAAA,OAAA,EAAA,IAAA,EAAA,GAAA,GAsB9B,OAtB8B,CAAA,IAAA,CAAA,EAAA,GAsBjB,OAtBiB,CAAA,IAAA,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { TransactionCommands } from "@haneullabs/haneul/transactions";
|
|
2
|
+
|
|
3
|
+
//#region src/auto-approvals/intent.ts
|
|
4
|
+
const OPERATION_INTENT = "@haneullabs/wallet-kit/AutoApprovalOperation";
|
|
5
|
+
function operationType(operationType$1) {
|
|
6
|
+
return (tx) => {
|
|
7
|
+
tx.addIntentResolver(OPERATION_INTENT, (transactionData, _options, next) => {
|
|
8
|
+
replaceOperationTypeIntent(transactionData);
|
|
9
|
+
return next();
|
|
10
|
+
});
|
|
11
|
+
return tx.add(TransactionCommands.Intent({
|
|
12
|
+
name: OPERATION_INTENT,
|
|
13
|
+
inputs: {},
|
|
14
|
+
data: { operationType: operationType$1 }
|
|
15
|
+
}));
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function extractOperationType(cb) {
|
|
19
|
+
return (transactionData, _options, next) => {
|
|
20
|
+
replaceOperationTypeIntent(transactionData, cb);
|
|
21
|
+
return next();
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function replaceOperationTypeIntent(transactionData, cb) {
|
|
25
|
+
let intentFound = false;
|
|
26
|
+
for (let index = 0; index < transactionData.commands.length; index++) {
|
|
27
|
+
const command = transactionData.commands[index];
|
|
28
|
+
if (command.$kind === "$Intent" && command.$Intent.name === OPERATION_INTENT) {
|
|
29
|
+
if (intentFound) throw new Error("Multiple operation type intents found in transaction");
|
|
30
|
+
intentFound = true;
|
|
31
|
+
const operationType$1 = command.$Intent.data.operationType;
|
|
32
|
+
transactionData.replaceCommand(index, []);
|
|
33
|
+
cb?.(operationType$1);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
export { OPERATION_INTENT, extractOperationType, operationType };
|
|
40
|
+
//# sourceMappingURL=intent.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent.mjs","names":["operationType"],"sources":["../../src/auto-approvals/intent.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Transaction, TransactionResult } from '@haneullabs/haneul/transactions';\nimport type { TransactionDataBuilder } from '@haneullabs/haneul/transactions';\nimport { TransactionCommands } from '@haneullabs/haneul/transactions';\n\nexport const OPERATION_INTENT = '@haneullabs/wallet-kit/AutoApprovalOperation';\n\nexport function operationType(operationType: string) {\n\treturn (tx: Transaction): TransactionResult => {\n\t\ttx.addIntentResolver(OPERATION_INTENT, (transactionData, _options, next) => {\n\t\t\treplaceOperationTypeIntent(transactionData);\n\t\t\treturn next();\n\t\t});\n\n\t\tconst result = tx.add(\n\t\t\tTransactionCommands.Intent({\n\t\t\t\tname: OPERATION_INTENT,\n\t\t\t\tinputs: {},\n\t\t\t\tdata: { operationType },\n\t\t\t}),\n\t\t);\n\n\t\treturn result;\n\t};\n}\n\nexport function extractOperationType(cb: (operationType: string) => void) {\n\treturn (\n\t\ttransactionData: TransactionDataBuilder,\n\t\t_options: unknown,\n\t\tnext: () => Promise<void>,\n\t) => {\n\t\treplaceOperationTypeIntent(transactionData, cb);\n\t\treturn next();\n\t};\n}\n\nfunction replaceOperationTypeIntent(\n\ttransactionData: TransactionDataBuilder,\n\tcb?: (operationType: string) => void,\n) {\n\tlet intentFound = false;\n\tfor (let index = 0; index < transactionData.commands.length; index++) {\n\t\tconst command = transactionData.commands[index];\n\t\tif (command.$kind === '$Intent' && command.$Intent.name === OPERATION_INTENT) {\n\t\t\tif (intentFound) {\n\t\t\t\tthrow new Error('Multiple operation type intents found in transaction');\n\t\t\t}\n\t\t\tintentFound = true;\n\t\t\tconst operationType = command.$Intent.data.operationType as string;\n\t\t\ttransactionData.replaceCommand(index, []);\n\t\t\tcb?.(operationType);\n\t\t}\n\t}\n}\n"],"mappings":";;;AAOA,MAAa,mBAAmB;AAEhC,SAAgB,cAAc,iBAAuB;AACpD,SAAQ,OAAuC;AAC9C,KAAG,kBAAkB,mBAAmB,iBAAiB,UAAU,SAAS;AAC3E,8BAA2B,gBAAgB;AAC3C,UAAO,MAAM;IACZ;AAUF,SARe,GAAG,IACjB,oBAAoB,OAAO;GAC1B,MAAM;GACN,QAAQ,EAAE;GACV,MAAM,EAAE,gCAAe;GACvB,CAAC,CACF;;;AAMH,SAAgB,qBAAqB,IAAqC;AACzE,SACC,iBACA,UACA,SACI;AACJ,6BAA2B,iBAAiB,GAAG;AAC/C,SAAO,MAAM;;;AAIf,SAAS,2BACR,iBACA,IACC;CACD,IAAI,cAAc;AAClB,MAAK,IAAI,QAAQ,GAAG,QAAQ,gBAAgB,SAAS,QAAQ,SAAS;EACrE,MAAM,UAAU,gBAAgB,SAAS;AACzC,MAAI,QAAQ,UAAU,aAAa,QAAQ,QAAQ,SAAS,kBAAkB;AAC7E,OAAI,YACH,OAAM,IAAI,MAAM,uDAAuD;AAExE,iBAAc;GACd,MAAMA,kBAAgB,QAAQ,QAAQ,KAAK;AAC3C,mBAAgB,eAAe,OAAO,EAAE,CAAC;AACzC,QAAKA,gBAAc"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { AutoApprovalResult } from "./analyzer.mjs";
|
|
2
|
+
import { AutoApprovalState } from "./schemas/state.mjs";
|
|
3
|
+
import { AutoApprovalSettings } from "./schemas/policy.mjs";
|
|
4
|
+
import { HaneulClientTypes } from "@haneullabs/haneul/client";
|
|
5
|
+
|
|
6
|
+
//#region src/auto-approvals/manager.d.ts
|
|
7
|
+
interface AutoApprovalManagerOptions {
|
|
8
|
+
policy: string;
|
|
9
|
+
state: string | null;
|
|
10
|
+
}
|
|
11
|
+
interface AutoApprovalIssue {
|
|
12
|
+
message: string;
|
|
13
|
+
}
|
|
14
|
+
interface AutoApprovalCheck {
|
|
15
|
+
matchesPolicy: boolean;
|
|
16
|
+
canAutoApprove: boolean;
|
|
17
|
+
policyIssues: AutoApprovalIssue[];
|
|
18
|
+
settingsIssues: AutoApprovalIssue[];
|
|
19
|
+
analysisIssues: AutoApprovalIssue[];
|
|
20
|
+
}
|
|
21
|
+
declare class AutoApprovalManager {
|
|
22
|
+
#private;
|
|
23
|
+
constructor(options: AutoApprovalManagerOptions);
|
|
24
|
+
checkTransaction(analysis: AutoApprovalResult): AutoApprovalCheck;
|
|
25
|
+
commitTransaction(analysis: AutoApprovalResult): void;
|
|
26
|
+
revertTransaction(analysis: AutoApprovalResult): void;
|
|
27
|
+
applyTransactionEffects(analysis: AutoApprovalResult, result: HaneulClientTypes.Transaction<{
|
|
28
|
+
balanceChanges: true;
|
|
29
|
+
}>): void;
|
|
30
|
+
reset(): void;
|
|
31
|
+
export(): string;
|
|
32
|
+
getState(): AutoApprovalState;
|
|
33
|
+
getSettings(): AutoApprovalSettings | null;
|
|
34
|
+
updateSettings(settings: AutoApprovalSettings): void;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { AutoApprovalCheck, AutoApprovalIssue, AutoApprovalManager };
|
|
38
|
+
//# sourceMappingURL=manager.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.mts","names":[],"sources":["../../src/auto-approvals/manager.ts"],"sourcesContent":[],"mappings":";;;;;;UAYiB,0BAAA;;EAAA,KAAA,EAAA,MAAA,GAAA,IAAA;AAKjB;AAIiB,UAJA,iBAAA,CAIiB;EAGnB,OAAA,EAAA,MAAA;;AAEE,UALA,iBAAA,CAKA;EAAiB,aAAA,EAAA,OAAA;EAGrB,cAAA,EAAA,OAAmB;EAGV,YAAA,EARP,iBAQO,EAAA;EA0BM,cAAA,EAjCX,iBAiCW,EAAA;EAAqB,cAAA,EAhChC,iBAgCgC,EAAA;;AAuNpB,cApPhB,mBAAA,CAoPgB;EAsDjB,CAAA,OAAA;EACF,WAAA,CAAA,OAAkB,EAxSN,0BAwSM;EAwDf,gBAAA,CAAA,QAAA,EAtUe,kBAsUf,CAAA,EAtUoC,iBAsUpC;EAIG,iBAAA,CAAA,QAAA,EA5Ja,kBA4Jb,CAAA,EAAA,IAAA;EAIU,iBAAA,CAAA,QAAA,EAvHG,kBAuHH,CAAA,EAAA,IAAA;EAAoB,uBAAA,CAAA,QAAA,EAjElC,kBAiEkC,EAAA,MAAA,EAhEpC,iBAAA,CAAkB,WAgEkB,CAAA;;;;;cARjC;iBAIG;2BAIU"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { AutoApprovalPolicySchema, AutoApprovalSettingsSchema } from "./schemas/policy.mjs";
|
|
2
|
+
import { AutoApprovalStateSchema } from "./schemas/state.mjs";
|
|
3
|
+
import { parseStructTag } from "@haneullabs/haneul/utils";
|
|
4
|
+
import { parse, safeParse } from "valibot";
|
|
5
|
+
|
|
6
|
+
//#region src/auto-approvals/manager.ts
|
|
7
|
+
var AutoApprovalManager = class {
|
|
8
|
+
#state;
|
|
9
|
+
constructor(options) {
|
|
10
|
+
let state = null;
|
|
11
|
+
if (options.state) {
|
|
12
|
+
const parseResult = safeParse(AutoApprovalStateSchema, JSON.parse(options.state));
|
|
13
|
+
if (parseResult.success) {
|
|
14
|
+
const providedPolicy = parse(AutoApprovalPolicySchema, JSON.parse(options.policy));
|
|
15
|
+
const currentPolicy = parseResult.output.policy;
|
|
16
|
+
if (JSON.stringify(currentPolicy) === JSON.stringify(providedPolicy)) state = parseResult.output;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
this.#state = state ?? parse(AutoApprovalStateSchema, {
|
|
20
|
+
schemaVersion: "1.0.0",
|
|
21
|
+
policy: parse(AutoApprovalPolicySchema, JSON.parse(options.policy)),
|
|
22
|
+
settings: null,
|
|
23
|
+
pendingDigests: []
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
checkTransaction(analysis) {
|
|
27
|
+
const results = {
|
|
28
|
+
matchesPolicy: false,
|
|
29
|
+
canAutoApprove: false,
|
|
30
|
+
analysisIssues: [...analysis.issues ?? []],
|
|
31
|
+
policyIssues: [],
|
|
32
|
+
settingsIssues: []
|
|
33
|
+
};
|
|
34
|
+
if (results.analysisIssues.length > 0) return results;
|
|
35
|
+
const policyIssues = this.#matchesPolicy(analysis);
|
|
36
|
+
if (policyIssues.length > 0) {
|
|
37
|
+
results.policyIssues = policyIssues;
|
|
38
|
+
return results;
|
|
39
|
+
} else results.matchesPolicy = true;
|
|
40
|
+
const settingsIssues = this.#canAutoApprove(analysis);
|
|
41
|
+
if (settingsIssues.length > 0) {
|
|
42
|
+
results.settingsIssues = settingsIssues;
|
|
43
|
+
return results;
|
|
44
|
+
} else results.canAutoApprove = true;
|
|
45
|
+
return results;
|
|
46
|
+
}
|
|
47
|
+
#matchesPolicy(analysis) {
|
|
48
|
+
const issues = [];
|
|
49
|
+
if (analysis.issues) {
|
|
50
|
+
issues.push({ message: "Transaction analysis failed" });
|
|
51
|
+
return issues;
|
|
52
|
+
}
|
|
53
|
+
if (!analysis.result.operationType) {
|
|
54
|
+
issues.push({ message: "Operation type not found in Transaction" });
|
|
55
|
+
return issues;
|
|
56
|
+
}
|
|
57
|
+
const operation = this.#state.policy.operations.find((op) => op.id === analysis.result.operationType);
|
|
58
|
+
if (!operation) {
|
|
59
|
+
issues.push({ message: "Operation not found in policy" });
|
|
60
|
+
return issues;
|
|
61
|
+
}
|
|
62
|
+
if (!operation.permissions.anyBalance) {
|
|
63
|
+
for (const flow of analysis.result.coinFlows.outflows) if (!operation.permissions.balances?.find((b) => b.coinType === flow.coinType)) issues.push({ message: `Operation does not have permission to use coin type ${flow.coinType}` });
|
|
64
|
+
}
|
|
65
|
+
for (const obj of analysis.result.ownedObjects) {
|
|
66
|
+
if (isCoinType(obj.type)) continue;
|
|
67
|
+
const accessLevel = analysis.result.accessLevel[obj.objectId];
|
|
68
|
+
if (!accessLevel) issues.push({ message: `Access level could not be determined for object ${obj.objectId}` });
|
|
69
|
+
const ownedObjectsPermission = operation.permissions.ownedObjects?.find((p) => p.objectType === obj.type);
|
|
70
|
+
if (!ownedObjectsPermission) issues.push({ message: `No permission found for object ${obj.objectId}` });
|
|
71
|
+
else if (!compareAccessLevel(ownedObjectsPermission.accessLevel, accessLevel)) issues.push({ message: `Insufficient access level for object ${obj.objectId}: required ${ownedObjectsPermission.accessLevel}, got ${accessLevel}` });
|
|
72
|
+
}
|
|
73
|
+
return issues;
|
|
74
|
+
function compareAccessLevel(required, actual) {
|
|
75
|
+
if (required === "read") return true;
|
|
76
|
+
if (required === "mutate") return actual === "mutate" || actual === "transfer";
|
|
77
|
+
return actual === "transfer";
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
#canAutoApprove(analysis) {
|
|
81
|
+
const issues = [];
|
|
82
|
+
if (!this.#state.settings) {
|
|
83
|
+
issues.push({ message: "No auto-approval settings configured" });
|
|
84
|
+
return issues;
|
|
85
|
+
}
|
|
86
|
+
if (analysis.issues) {
|
|
87
|
+
issues.push({ message: "Transaction analysis failed" });
|
|
88
|
+
return issues;
|
|
89
|
+
}
|
|
90
|
+
if (/* @__PURE__ */ new Date() > new Date(this.#state.settings.expiration)) issues.push({ message: "Auto-approval settings have expired" });
|
|
91
|
+
if (this.#state.settings.remainingTransactions !== null && this.#state.settings.remainingTransactions <= 0) issues.push({ message: "No remaining auto-approved transactions" });
|
|
92
|
+
if (!analysis.result.operationType || !this.#state.settings.approvedOperations.includes(analysis.result.operationType)) issues.push({ message: "Operation type not approved for auto-approval" });
|
|
93
|
+
for (const outflow of analysis.result.coinFlows.outflows) {
|
|
94
|
+
if (outflow.amount <= 0n) continue;
|
|
95
|
+
if (this.#state.settings.coinBudgets[outflow.coinType] !== void 0) {
|
|
96
|
+
const coinBudget = this.#state.settings.coinBudgets[outflow.coinType];
|
|
97
|
+
if (coinBudget) {
|
|
98
|
+
if (BigInt(coinBudget) < outflow.amount) issues.push({ message: `Insufficient budget for coin type ${outflow.coinType}` });
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
const coinAmount = analysis.result.coinValues.coinTypes.find((ct) => ct.coinType === outflow.coinType);
|
|
102
|
+
if (!coinAmount) issues.push({ message: `No budget configured for coin type ${outflow.coinType}` });
|
|
103
|
+
else if ((this.#state.settings.sharedBudget ?? 0) < coinAmount.convertedAmount) issues.push({ message: `Insufficient budget for coin type ${outflow.coinType}` });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return issues;
|
|
107
|
+
}
|
|
108
|
+
commitTransaction(analysis) {
|
|
109
|
+
if (!this.#state.settings) throw new Error("No auto-approval settings configured");
|
|
110
|
+
if (!analysis.result) throw new Error("Transaction analysis failed");
|
|
111
|
+
if (this.#state.settings.remainingTransactions !== null && this.#state.settings) this.#state.settings.remainingTransactions = Math.max(0, this.#state.settings.remainingTransactions - 1);
|
|
112
|
+
for (const outflow of analysis.result.coinFlows.outflows) if (this.#state.settings.coinBudgets[outflow.coinType] !== void 0) {
|
|
113
|
+
const newBalance = BigInt(this.#state.settings?.coinBudgets[outflow.coinType] ?? "0") - outflow.amount;
|
|
114
|
+
this.#state.settings.coinBudgets[outflow.coinType] = newBalance.toString();
|
|
115
|
+
} else {
|
|
116
|
+
if (this.#state.settings.sharedBudget === null) throw new Error("No budget available for coin type " + outflow.coinType);
|
|
117
|
+
const coinValue = analysis.result.coinValues.coinTypes.find((ct) => ct.coinType === outflow.coinType);
|
|
118
|
+
if (!coinValue) throw new Error("No value available for coin type " + outflow.coinType);
|
|
119
|
+
this.#state.settings.sharedBudget -= coinValue.convertedAmount;
|
|
120
|
+
}
|
|
121
|
+
this.#state.pendingDigests.push(analysis.result.digest);
|
|
122
|
+
}
|
|
123
|
+
revertTransaction(analysis) {
|
|
124
|
+
if (analysis.result?.digest) this.#removePendingDigest(analysis.result?.digest);
|
|
125
|
+
if (this.#state.settings?.remainingTransactions !== null && this.#state.settings) this.#state.settings.remainingTransactions += 1;
|
|
126
|
+
this.#revertCoinFlows(analysis);
|
|
127
|
+
}
|
|
128
|
+
#revertCoinFlows(analysis) {
|
|
129
|
+
if (!this.#state.settings) throw new Error("No auto-approval settings configured");
|
|
130
|
+
if (!analysis.result) throw new Error("Transaction analysis failed");
|
|
131
|
+
for (const outflow of analysis.result.coinFlows.outflows) if (this.#state.settings?.coinBudgets[outflow.coinType] !== void 0) {
|
|
132
|
+
const newBalance = BigInt(this.#state.settings?.coinBudgets[outflow.coinType] ?? "0") + outflow.amount;
|
|
133
|
+
this.#state.settings.coinBudgets[outflow.coinType] = newBalance.toString();
|
|
134
|
+
} else {
|
|
135
|
+
if (this.#state.settings.sharedBudget === null) throw new Error("No budget available for coin type " + outflow.coinType);
|
|
136
|
+
const coinValue = analysis.result.coinValues.coinTypes.find((ct) => ct.coinType === outflow.coinType);
|
|
137
|
+
if (!coinValue) throw new Error("No value available for coin type " + outflow.coinType);
|
|
138
|
+
this.#state.settings.sharedBudget += coinValue.convertedAmount;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
#removePendingDigest(digest) {
|
|
142
|
+
const pendingIndex = this.#state.pendingDigests.indexOf(digest);
|
|
143
|
+
if (pendingIndex >= 0) this.#state.pendingDigests.splice(pendingIndex, 1);
|
|
144
|
+
else throw new Error(`Transaction with digest ${digest} not found in pending digests`);
|
|
145
|
+
}
|
|
146
|
+
applyTransactionEffects(analysis, result) {
|
|
147
|
+
this.#removePendingDigest(result.digest);
|
|
148
|
+
if (!this.#state.settings) throw new Error("No auto-approval settings configured");
|
|
149
|
+
if (!analysis.result) throw new Error("Transaction analysis failed");
|
|
150
|
+
this.#revertCoinFlows(analysis);
|
|
151
|
+
for (const change of result.balanceChanges) if (this.#state.settings.coinBudgets[change.coinType] !== void 0) {
|
|
152
|
+
const newBalance = BigInt(this.#state.settings?.coinBudgets[change.coinType] ?? "0") + BigInt(change.amount);
|
|
153
|
+
if (this.#state.settings) this.#state.settings.coinBudgets[change.coinType] = newBalance.toString();
|
|
154
|
+
} else {
|
|
155
|
+
if (this.#state.settings.sharedBudget === null) throw new Error("No budget available for coin type " + change.coinType);
|
|
156
|
+
const coinValue = analysis.result.coinValues.coinTypes.find((ct) => ct.coinType === change.coinType);
|
|
157
|
+
if (!coinValue) throw new Error("No value available for coin type " + change.coinType);
|
|
158
|
+
const convertedChange = Number(change.amount) / 10 ** coinValue.decimals * coinValue.price;
|
|
159
|
+
this.#state.settings.sharedBudget += convertedChange;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
reset() {
|
|
163
|
+
this.#state = {
|
|
164
|
+
schemaVersion: "1.0.0",
|
|
165
|
+
policy: this.#state.policy,
|
|
166
|
+
settings: null,
|
|
167
|
+
pendingDigests: []
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
export() {
|
|
171
|
+
return JSON.stringify(parse(AutoApprovalStateSchema, this.#state));
|
|
172
|
+
}
|
|
173
|
+
getState() {
|
|
174
|
+
return parse(AutoApprovalStateSchema, this.#state);
|
|
175
|
+
}
|
|
176
|
+
getSettings() {
|
|
177
|
+
return this.#state.settings;
|
|
178
|
+
}
|
|
179
|
+
updateSettings(settings) {
|
|
180
|
+
const validatedSettings = parse(AutoApprovalSettingsSchema, settings);
|
|
181
|
+
this.#state.settings = validatedSettings;
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
const parsedCoinType = parseStructTag("0x2::coin::Coin");
|
|
185
|
+
function isCoinType(type) {
|
|
186
|
+
const parsedType = parseStructTag(type);
|
|
187
|
+
return parsedType.address === parsedCoinType.address && parsedType.module === parsedCoinType.module && parsedType.name === parsedCoinType.name && parsedType.typeParams.length === 1;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
//#endregion
|
|
191
|
+
export { AutoApprovalManager };
|
|
192
|
+
//# sourceMappingURL=manager.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.mjs","names":["#state","#matchesPolicy","#canAutoApprove","#removePendingDigest","#revertCoinFlows"],"sources":["../../src/auto-approvals/manager.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { HaneulClientTypes } from '@haneullabs/haneul/client';\nimport { parse, safeParse } from 'valibot';\nimport type { AutoApprovalState } from './schemas/state.js';\nimport { AutoApprovalStateSchema } from './schemas/state.js';\nimport type { AutoApprovalSettings } from './schemas/policy.js';\nimport { AutoApprovalPolicySchema, AutoApprovalSettingsSchema } from './schemas/policy.js';\nimport { parseStructTag } from '@haneullabs/haneul/utils';\nimport type { AutoApprovalResult } from './analyzer.js';\n\nexport interface AutoApprovalManagerOptions {\n\tpolicy: string;\n\tstate: string | null;\n}\n\nexport interface AutoApprovalIssue {\n\tmessage: string;\n}\n\nexport interface AutoApprovalCheck {\n\tmatchesPolicy: boolean;\n\tcanAutoApprove: boolean;\n\tpolicyIssues: AutoApprovalIssue[];\n\tsettingsIssues: AutoApprovalIssue[];\n\tanalysisIssues: AutoApprovalIssue[];\n}\n\nexport class AutoApprovalManager {\n\t#state: AutoApprovalState;\n\n\tconstructor(options: AutoApprovalManagerOptions) {\n\t\tlet state: AutoApprovalState | null = null;\n\n\t\tif (options.state) {\n\t\t\tconst parseResult = safeParse(AutoApprovalStateSchema, JSON.parse(options.state));\n\t\t\t// TODO: how do we want to handle failures\n\t\t\tif (parseResult.success) {\n\t\t\t\tconst providedPolicy = parse(AutoApprovalPolicySchema, JSON.parse(options.policy));\n\t\t\t\tconst currentPolicy = parseResult.output.policy;\n\n\t\t\t\tif (JSON.stringify(currentPolicy) === JSON.stringify(providedPolicy)) {\n\t\t\t\t\tstate = parseResult.output;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.#state =\n\t\t\tstate ??\n\t\t\tparse(AutoApprovalStateSchema, {\n\t\t\t\tschemaVersion: '1.0.0',\n\t\t\t\tpolicy: parse(AutoApprovalPolicySchema, JSON.parse(options.policy)),\n\t\t\t\tsettings: null,\n\t\t\t\tpendingDigests: [],\n\t\t\t} satisfies AutoApprovalState);\n\t}\n\n\tcheckTransaction(analysis: AutoApprovalResult): AutoApprovalCheck {\n\t\tconst results: AutoApprovalCheck = {\n\t\t\tmatchesPolicy: false,\n\t\t\tcanAutoApprove: false,\n\t\t\tanalysisIssues: [...(analysis.issues ?? [])],\n\t\t\tpolicyIssues: [],\n\t\t\tsettingsIssues: [],\n\t\t};\n\n\t\tif (results.analysisIssues.length > 0) {\n\t\t\treturn results;\n\t\t}\n\n\t\tconst policyIssues = this.#matchesPolicy(analysis);\n\n\t\tif (policyIssues.length > 0) {\n\t\t\tresults.policyIssues = policyIssues;\n\t\t\treturn results;\n\t\t} else {\n\t\t\tresults.matchesPolicy = true;\n\t\t}\n\n\t\tconst settingsIssues = this.#canAutoApprove(analysis);\n\n\t\tif (settingsIssues.length > 0) {\n\t\t\tresults.settingsIssues = settingsIssues;\n\t\t\treturn results;\n\t\t} else {\n\t\t\tresults.canAutoApprove = true;\n\t\t}\n\n\t\treturn results;\n\t}\n\n\t#matchesPolicy(analysis: AutoApprovalResult): AutoApprovalIssue[] {\n\t\tconst issues: AutoApprovalIssue[] = [];\n\n\t\tif (analysis.issues) {\n\t\t\tissues.push({ message: 'Transaction analysis failed' });\n\t\t\treturn issues;\n\t\t}\n\n\t\tif (!analysis.result.operationType) {\n\t\t\tissues.push({ message: 'Operation type not found in Transaction' });\n\n\t\t\treturn issues;\n\t\t}\n\n\t\tconst operation = this.#state.policy.operations.find(\n\t\t\t(op) => op.id === analysis.result.operationType,\n\t\t);\n\n\t\tif (!operation) {\n\t\t\tissues.push({ message: 'Operation not found in policy' });\n\t\t\treturn issues;\n\t\t}\n\n\t\tif (!operation.permissions.anyBalance) {\n\t\t\tfor (const flow of analysis.result.coinFlows.outflows) {\n\t\t\t\tif (!operation.permissions.balances?.find((b) => b.coinType === flow.coinType)) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tmessage: `Operation does not have permission to use coin type ${flow.coinType}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const obj of analysis.result.ownedObjects) {\n\t\t\tif (isCoinType(obj.type)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst accessLevel = analysis.result.accessLevel[obj.objectId];\n\n\t\t\tif (!accessLevel) {\n\t\t\t\tissues.push({ message: `Access level could not be determined for object ${obj.objectId}` });\n\t\t\t}\n\n\t\t\tconst ownedObjectsPermission = operation.permissions.ownedObjects?.find(\n\t\t\t\t(p) => p.objectType === obj.type,\n\t\t\t);\n\n\t\t\tif (!ownedObjectsPermission) {\n\t\t\t\tissues.push({ message: `No permission found for object ${obj.objectId}` });\n\t\t\t} else if (!compareAccessLevel(ownedObjectsPermission.accessLevel, accessLevel)) {\n\t\t\t\tissues.push({\n\t\t\t\t\tmessage: `Insufficient access level for object ${obj.objectId}: required ${ownedObjectsPermission.accessLevel}, got ${accessLevel}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn issues;\n\n\t\tfunction compareAccessLevel(\n\t\t\trequired: 'read' | 'mutate' | 'transfer',\n\t\t\tactual: 'read' | 'mutate' | 'transfer',\n\t\t): boolean {\n\t\t\tif (required === 'read') {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (required === 'mutate') {\n\t\t\t\treturn actual === 'mutate' || actual === 'transfer';\n\t\t\t}\n\t\t\treturn actual === 'transfer';\n\t\t}\n\t}\n\n\t#canAutoApprove(analysis: AutoApprovalResult): AutoApprovalIssue[] {\n\t\tconst issues: AutoApprovalIssue[] = [];\n\n\t\tif (!this.#state.settings) {\n\t\t\tissues.push({ message: 'No auto-approval settings configured' });\n\t\t\treturn issues;\n\t\t}\n\n\t\tif (analysis.issues) {\n\t\t\tissues.push({ message: 'Transaction analysis failed' });\n\t\t\treturn issues;\n\t\t}\n\n\t\tif (new Date() > new Date(this.#state.settings.expiration)) {\n\t\t\tissues.push({ message: 'Auto-approval settings have expired' });\n\t\t}\n\n\t\tif (\n\t\t\tthis.#state.settings.remainingTransactions !== null &&\n\t\t\tthis.#state.settings.remainingTransactions <= 0\n\t\t) {\n\t\t\tissues.push({ message: 'No remaining auto-approved transactions' });\n\t\t}\n\n\t\tif (\n\t\t\t!analysis.result.operationType ||\n\t\t\t!this.#state.settings.approvedOperations.includes(analysis.result.operationType)\n\t\t) {\n\t\t\tissues.push({ message: 'Operation type not approved for auto-approval' });\n\t\t}\n\n\t\tfor (const outflow of analysis.result.coinFlows.outflows) {\n\t\t\tif (outflow.amount <= 0n) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (this.#state.settings.coinBudgets[outflow.coinType] !== undefined) {\n\t\t\t\tconst coinBudget = this.#state.settings.coinBudgets[outflow.coinType];\n\n\t\t\t\tif (coinBudget) {\n\t\t\t\t\tif (BigInt(coinBudget) < outflow.amount) {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tmessage: `Insufficient budget for coin type ${outflow.coinType}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst coinAmount = analysis.result.coinValues.coinTypes.find(\n\t\t\t\t\t(ct) => ct.coinType === outflow.coinType,\n\t\t\t\t);\n\n\t\t\t\tif (!coinAmount) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tmessage: `No budget configured for coin type ${outflow.coinType}`,\n\t\t\t\t\t});\n\t\t\t\t} else if ((this.#state.settings.sharedBudget ?? 0) < coinAmount.convertedAmount) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tmessage: `Insufficient budget for coin type ${outflow.coinType}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn issues;\n\t}\n\n\t// TODO: we should ensure that only 1 tx is pending at a time, and pending txs can't increase budgets\n\tcommitTransaction(analysis: AutoApprovalResult): void {\n\t\tif (!this.#state.settings) {\n\t\t\tthrow new Error('No auto-approval settings configured');\n\t\t}\n\n\t\tif (!analysis.result) {\n\t\t\tthrow new Error('Transaction analysis failed');\n\t\t}\n\n\t\tif (this.#state.settings.remainingTransactions !== null && this.#state.settings) {\n\t\t\tthis.#state.settings.remainingTransactions = Math.max(\n\t\t\t\t0,\n\t\t\t\tthis.#state.settings.remainingTransactions - 1,\n\t\t\t);\n\t\t}\n\n\t\tfor (const outflow of analysis.result.coinFlows.outflows) {\n\t\t\tif (this.#state.settings.coinBudgets[outflow.coinType] !== undefined) {\n\t\t\t\tconst currentBudget = BigInt(this.#state.settings?.coinBudgets[outflow.coinType] ?? '0');\n\t\t\t\tconst newBalance = currentBudget - outflow.amount;\n\t\t\t\tthis.#state.settings.coinBudgets[outflow.coinType] = newBalance.toString();\n\t\t\t} else {\n\t\t\t\tif (this.#state.settings.sharedBudget === null) {\n\t\t\t\t\tthrow new Error('No budget available for coin type ' + outflow.coinType);\n\t\t\t\t}\n\n\t\t\t\tconst coinValue = analysis.result.coinValues.coinTypes.find(\n\t\t\t\t\t(ct) => ct.coinType === outflow.coinType,\n\t\t\t\t);\n\n\t\t\t\tif (!coinValue) {\n\t\t\t\t\tthrow new Error('No value available for coin type ' + outflow.coinType);\n\t\t\t\t}\n\n\t\t\t\tthis.#state.settings.sharedBudget -= coinValue.convertedAmount;\n\t\t\t}\n\t\t}\n\n\t\tthis.#state.pendingDigests.push(analysis.result.digest);\n\t}\n\n\trevertTransaction(analysis: AutoApprovalResult): void {\n\t\tif (analysis.result?.digest) {\n\t\t\tthis.#removePendingDigest(analysis.result?.digest);\n\t\t}\n\n\t\tif (this.#state.settings?.remainingTransactions !== null && this.#state.settings) {\n\t\t\tthis.#state.settings.remainingTransactions += 1;\n\t\t}\n\n\t\tthis.#revertCoinFlows(analysis);\n\t}\n\n\t#revertCoinFlows(analysis: AutoApprovalResult): void {\n\t\tif (!this.#state.settings) {\n\t\t\tthrow new Error('No auto-approval settings configured');\n\t\t}\n\n\t\tif (!analysis.result) {\n\t\t\tthrow new Error('Transaction analysis failed');\n\t\t}\n\n\t\tfor (const outflow of analysis.result.coinFlows.outflows) {\n\t\t\tif (this.#state.settings?.coinBudgets[outflow.coinType] !== undefined) {\n\t\t\t\tconst currentBudget = BigInt(this.#state.settings?.coinBudgets[outflow.coinType] ?? '0');\n\t\t\t\tconst newBalance = currentBudget + outflow.amount;\n\t\t\t\tthis.#state.settings.coinBudgets[outflow.coinType] = newBalance.toString();\n\t\t\t} else {\n\t\t\t\tif (this.#state.settings.sharedBudget === null) {\n\t\t\t\t\tthrow new Error('No budget available for coin type ' + outflow.coinType);\n\t\t\t\t}\n\n\t\t\t\tconst coinValue = analysis.result.coinValues.coinTypes.find(\n\t\t\t\t\t(ct) => ct.coinType === outflow.coinType,\n\t\t\t\t);\n\n\t\t\t\tif (!coinValue) {\n\t\t\t\t\tthrow new Error('No value available for coin type ' + outflow.coinType);\n\t\t\t\t}\n\n\t\t\t\tthis.#state.settings.sharedBudget += coinValue.convertedAmount;\n\t\t\t}\n\t\t}\n\t}\n\n\t#removePendingDigest(digest: string): void {\n\t\tconst pendingIndex = this.#state.pendingDigests.indexOf(digest);\n\t\tif (pendingIndex >= 0) {\n\t\t\tthis.#state.pendingDigests.splice(pendingIndex, 1);\n\t\t} else {\n\t\t\tthrow new Error(`Transaction with digest ${digest} not found in pending digests`);\n\t\t}\n\t}\n\n\tapplyTransactionEffects(\n\t\tanalysis: AutoApprovalResult,\n\t\tresult: HaneulClientTypes.Transaction<{ balanceChanges: true }>,\n\t): void {\n\t\tthis.#removePendingDigest(result.digest);\n\n\t\tif (!this.#state.settings) {\n\t\t\tthrow new Error('No auto-approval settings configured');\n\t\t}\n\n\t\tif (!analysis.result) {\n\t\t\tthrow new Error('Transaction analysis failed');\n\t\t}\n\n\t\t// Revert coin flows and use real balance changes instead\n\t\tthis.#revertCoinFlows(analysis);\n\n\t\tfor (const change of result.balanceChanges) {\n\t\t\tif (this.#state.settings.coinBudgets[change.coinType] !== undefined) {\n\t\t\t\tconst currentBudget = BigInt(this.#state.settings?.coinBudgets[change.coinType] ?? '0');\n\t\t\t\tconst newBalance = currentBudget + BigInt(change.amount);\n\t\t\t\tif (this.#state.settings) {\n\t\t\t\t\tthis.#state.settings.coinBudgets[change.coinType] = newBalance.toString();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.#state.settings.sharedBudget === null) {\n\t\t\t\t\tthrow new Error('No budget available for coin type ' + change.coinType);\n\t\t\t\t}\n\n\t\t\t\tconst coinValue = analysis.result.coinValues.coinTypes.find(\n\t\t\t\t\t(ct) => ct.coinType === change.coinType,\n\t\t\t\t);\n\n\t\t\t\tif (!coinValue) {\n\t\t\t\t\tthrow new Error('No value available for coin type ' + change.coinType);\n\t\t\t\t}\n\n\t\t\t\tconst convertedChange =\n\t\t\t\t\t(Number(change.amount) / 10 ** coinValue.decimals) * coinValue.price;\n\n\t\t\t\tthis.#state.settings.sharedBudget += convertedChange;\n\t\t\t}\n\t\t}\n\t}\n\n\treset() {\n\t\tthis.#state = {\n\t\t\tschemaVersion: '1.0.0',\n\t\t\tpolicy: this.#state.policy,\n\t\t\tsettings: null,\n\t\t\tpendingDigests: [],\n\t\t};\n\t}\n\n\texport(): string {\n\t\treturn JSON.stringify(parse(AutoApprovalStateSchema, this.#state));\n\t}\n\n\tgetState(): AutoApprovalState {\n\t\treturn parse(AutoApprovalStateSchema, this.#state);\n\t}\n\n\tgetSettings(): AutoApprovalSettings | null {\n\t\treturn this.#state.settings;\n\t}\n\n\tupdateSettings(settings: AutoApprovalSettings): void {\n\t\tconst validatedSettings = parse(AutoApprovalSettingsSchema, settings);\n\t\tthis.#state.settings = validatedSettings;\n\t}\n}\n\nconst parsedCoinType = parseStructTag('0x2::coin::Coin');\n\nfunction isCoinType(type: string): boolean {\n\tconst parsedType = parseStructTag(type);\n\treturn (\n\t\tparsedType.address === parsedCoinType.address &&\n\t\tparsedType.module === parsedCoinType.module &&\n\t\tparsedType.name === parsedCoinType.name &&\n\t\tparsedType.typeParams.length === 1\n\t);\n}\n"],"mappings":"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"}
|