@bananapus/nana-sdk-core 2.17.0 → 2.19.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/dist/cjs/constants.d.ts +1 -13
- package/dist/cjs/constants.d.ts.map +1 -1
- package/dist/cjs/constants.js +4 -22
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/generated/abi/jbBuybackHookAbi.d.ts +1187 -0
- package/dist/cjs/generated/abi/jbBuybackHookAbi.d.ts.map +1 -0
- package/dist/cjs/generated/abi/jbBuybackHookAbi.js +841 -0
- package/dist/cjs/generated/abi/jbBuybackHookAbi.js.map +1 -0
- package/dist/cjs/generated/abi/jbBuybackHookRegistryAbi.d.ts +791 -0
- package/dist/cjs/generated/abi/jbBuybackHookRegistryAbi.d.ts.map +1 -0
- package/dist/cjs/generated/abi/jbBuybackHookRegistryAbi.js +632 -0
- package/dist/cjs/generated/abi/jbBuybackHookRegistryAbi.js.map +1 -0
- package/dist/cjs/generated/abi/jbControllerAbi.d.ts +2569 -0
- package/dist/cjs/generated/abi/jbControllerAbi.d.ts.map +1 -0
- package/dist/cjs/generated/abi/jbControllerAbi.js +1906 -0
- package/dist/cjs/generated/abi/jbControllerAbi.js.map +1 -0
- package/dist/cjs/generated/abi/jbDirectoryAbi.d.ts +410 -0
- package/dist/cjs/generated/abi/jbDirectoryAbi.d.ts.map +1 -0
- package/dist/cjs/generated/abi/jbDirectoryAbi.js +365 -0
- package/dist/cjs/generated/abi/jbDirectoryAbi.js.map +1 -0
- package/dist/cjs/generated/abi/jbMultiTerminalAbi.d.ts +1863 -0
- package/dist/cjs/generated/abi/jbMultiTerminalAbi.d.ts.map +1 -0
- package/dist/cjs/generated/abi/jbMultiTerminalAbi.js +1459 -0
- package/dist/cjs/generated/abi/jbMultiTerminalAbi.js.map +1 -0
- package/dist/cjs/generated/abi/jbPermissionsAbi.d.ts +240 -0
- package/dist/cjs/generated/abi/jbPermissionsAbi.d.ts.map +1 -0
- package/dist/cjs/generated/abi/jbPermissionsAbi.js +164 -0
- package/dist/cjs/generated/abi/jbPermissionsAbi.js.map +1 -0
- package/dist/cjs/generated/abi/jbProjectsAbi.d.ts +626 -0
- package/dist/cjs/generated/abi/jbProjectsAbi.d.ts.map +1 -0
- package/dist/cjs/generated/abi/jbProjectsAbi.js +470 -0
- package/dist/cjs/generated/abi/jbProjectsAbi.js.map +1 -0
- package/dist/cjs/generated/abi/jbRouterTerminalGatewayAbi.d.ts +1503 -0
- package/dist/cjs/generated/abi/jbRouterTerminalGatewayAbi.d.ts.map +1 -0
- package/dist/cjs/generated/abi/jbRouterTerminalGatewayAbi.js +1037 -0
- package/dist/cjs/generated/abi/jbRouterTerminalGatewayAbi.js.map +1 -0
- package/dist/cjs/generated/abi/jbRouterTerminalRegistryAbi.d.ts +1119 -0
- package/dist/cjs/generated/abi/jbRouterTerminalRegistryAbi.d.ts.map +1 -0
- package/dist/cjs/generated/abi/jbRouterTerminalRegistryAbi.js +925 -0
- package/dist/cjs/generated/abi/jbRouterTerminalRegistryAbi.js.map +1 -0
- package/dist/cjs/generated/abi/jbSplitsAbi.d.ts +244 -0
- package/dist/cjs/generated/abi/jbSplitsAbi.d.ts.map +1 -0
- package/dist/cjs/generated/abi/jbSplitsAbi.js +198 -0
- package/dist/cjs/generated/abi/jbSplitsAbi.js.map +1 -0
- package/dist/cjs/generated/abi/jbTokensAbi.d.ts +602 -0
- package/dist/cjs/generated/abi/jbTokensAbi.d.ts.map +1 -0
- package/dist/cjs/generated/abi/jbTokensAbi.js +501 -0
- package/dist/cjs/generated/abi/jbTokensAbi.js.map +1 -0
- package/dist/cjs/generated/juicebox.d.ts +25405 -36537
- package/dist/cjs/generated/juicebox.d.ts.map +1 -1
- package/dist/cjs/generated/juicebox.js +14362 -22761
- package/dist/cjs/generated/juicebox.js.map +1 -1
- package/dist/cjs/pureConstants.d.ts +15 -0
- package/dist/cjs/pureConstants.d.ts.map +1 -0
- package/dist/cjs/pureConstants.js +28 -0
- package/dist/cjs/pureConstants.js.map +1 -0
- package/dist/cjs/review/decode.d.ts.map +1 -1
- package/dist/cjs/review/decode.js +35 -51
- package/dist/cjs/review/decode.js.map +1 -1
- package/dist/cjs/review/relayr.d.ts.map +1 -1
- package/dist/cjs/review/relayr.js +11 -31
- package/dist/cjs/review/relayr.js.map +1 -1
- package/dist/cjs/safe.d.ts +376 -8
- package/dist/cjs/safe.d.ts.map +1 -1
- package/dist/cjs/safe.js +1088 -29
- package/dist/cjs/safe.js.map +1 -1
- package/dist/cjs/safeService.d.ts +361 -1
- package/dist/cjs/safeService.d.ts.map +1 -1
- package/dist/cjs/safeService.js +844 -6
- package/dist/cjs/safeService.js.map +1 -1
- package/dist/cjs/untrusted.d.ts +8 -0
- package/dist/cjs/untrusted.d.ts.map +1 -0
- package/dist/cjs/untrusted.js +33 -0
- package/dist/cjs/untrusted.js.map +1 -0
- package/dist/cjs/v6/deploymentAbi.d.ts +4 -0
- package/dist/cjs/v6/deploymentAbi.d.ts.map +1 -0
- package/dist/cjs/v6/deploymentAbi.js +15 -0
- package/dist/cjs/v6/deploymentAbi.js.map +1 -0
- package/dist/cjs/v6/deploymentDiagnostics.d.ts +45 -0
- package/dist/cjs/v6/deploymentDiagnostics.d.ts.map +1 -0
- package/dist/cjs/v6/deploymentDiagnostics.js +525 -0
- package/dist/cjs/v6/deploymentDiagnostics.js.map +1 -0
- package/dist/cjs/v6/distributions.d.ts +90 -0
- package/dist/cjs/v6/distributions.d.ts.map +1 -0
- package/dist/cjs/v6/distributions.js +287 -0
- package/dist/cjs/v6/distributions.js.map +1 -0
- package/dist/cjs/v6/index.d.ts +4 -0
- package/dist/cjs/v6/index.d.ts.map +1 -1
- package/dist/cjs/v6/index.js +4 -0
- package/dist/cjs/v6/index.js.map +1 -1
- package/dist/cjs/v6/nft.d.ts +15 -0
- package/dist/cjs/v6/nft.d.ts.map +1 -1
- package/dist/cjs/v6/nft.js +49 -29
- package/dist/cjs/v6/nft.js.map +1 -1
- package/dist/cjs/v6/omnichain.d.ts +3 -2
- package/dist/cjs/v6/omnichain.d.ts.map +1 -1
- package/dist/cjs/v6/omnichain.js +9 -4
- package/dist/cjs/v6/omnichain.js.map +1 -1
- package/dist/cjs/v6/permissionIds.d.ts +62 -0
- package/dist/cjs/v6/permissionIds.d.ts.map +1 -0
- package/dist/cjs/v6/permissionIds.js +70 -0
- package/dist/cjs/v6/permissionIds.js.map +1 -0
- package/dist/cjs/v6/permissions.d.ts +3 -62
- package/dist/cjs/v6/permissions.d.ts.map +1 -1
- package/dist/cjs/v6/permissions.js +6 -67
- package/dist/cjs/v6/permissions.js.map +1 -1
- package/dist/cjs/v6/revnet721.d.ts +42 -0
- package/dist/cjs/v6/revnet721.d.ts.map +1 -0
- package/dist/cjs/v6/revnet721.js +74 -0
- package/dist/cjs/v6/revnet721.js.map +1 -0
- package/dist/cjs/v6/revnets.d.ts +11 -3
- package/dist/cjs/v6/revnets.d.ts.map +1 -1
- package/dist/cjs/v6/revnets.js +36 -7
- package/dist/cjs/v6/revnets.js.map +1 -1
- package/dist/cjs/v6/splits.d.ts +1 -1
- package/dist/cjs/v6/splits.d.ts.map +1 -1
- package/dist/cjs/v6/splits.js +3 -3
- package/dist/cjs/v6/splits.js.map +1 -1
- package/dist/cjs/v6/sticky.d.ts +2 -2
- package/dist/cjs/v6/sticky.d.ts.map +1 -1
- package/dist/cjs/v6/types.d.ts +1 -1
- package/dist/cjs/v6/types.d.ts.map +1 -1
- package/dist/esm/constants.d.ts +1 -13
- package/dist/esm/constants.d.ts.map +1 -1
- package/dist/esm/constants.js +1 -21
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/generated/abi/jbBuybackHookAbi.d.ts +1187 -0
- package/dist/esm/generated/abi/jbBuybackHookAbi.d.ts.map +1 -0
- package/dist/esm/generated/abi/jbBuybackHookAbi.js +838 -0
- package/dist/esm/generated/abi/jbBuybackHookAbi.js.map +1 -0
- package/dist/esm/generated/abi/jbBuybackHookRegistryAbi.d.ts +791 -0
- package/dist/esm/generated/abi/jbBuybackHookRegistryAbi.d.ts.map +1 -0
- package/dist/esm/generated/abi/jbBuybackHookRegistryAbi.js +629 -0
- package/dist/esm/generated/abi/jbBuybackHookRegistryAbi.js.map +1 -0
- package/dist/esm/generated/abi/jbControllerAbi.d.ts +2569 -0
- package/dist/esm/generated/abi/jbControllerAbi.d.ts.map +1 -0
- package/dist/esm/generated/abi/jbControllerAbi.js +1903 -0
- package/dist/esm/generated/abi/jbControllerAbi.js.map +1 -0
- package/dist/esm/generated/abi/jbDirectoryAbi.d.ts +410 -0
- package/dist/esm/generated/abi/jbDirectoryAbi.d.ts.map +1 -0
- package/dist/esm/generated/abi/jbDirectoryAbi.js +362 -0
- package/dist/esm/generated/abi/jbDirectoryAbi.js.map +1 -0
- package/dist/esm/generated/abi/jbMultiTerminalAbi.d.ts +1863 -0
- package/dist/esm/generated/abi/jbMultiTerminalAbi.d.ts.map +1 -0
- package/dist/esm/generated/abi/jbMultiTerminalAbi.js +1456 -0
- package/dist/esm/generated/abi/jbMultiTerminalAbi.js.map +1 -0
- package/dist/esm/generated/abi/jbPermissionsAbi.d.ts +240 -0
- package/dist/esm/generated/abi/jbPermissionsAbi.d.ts.map +1 -0
- package/dist/esm/generated/abi/jbPermissionsAbi.js +161 -0
- package/dist/esm/generated/abi/jbPermissionsAbi.js.map +1 -0
- package/dist/esm/generated/abi/jbProjectsAbi.d.ts +626 -0
- package/dist/esm/generated/abi/jbProjectsAbi.d.ts.map +1 -0
- package/dist/esm/generated/abi/jbProjectsAbi.js +467 -0
- package/dist/esm/generated/abi/jbProjectsAbi.js.map +1 -0
- package/dist/esm/generated/abi/jbRouterTerminalGatewayAbi.d.ts +1503 -0
- package/dist/esm/generated/abi/jbRouterTerminalGatewayAbi.d.ts.map +1 -0
- package/dist/esm/generated/abi/jbRouterTerminalGatewayAbi.js +1034 -0
- package/dist/esm/generated/abi/jbRouterTerminalGatewayAbi.js.map +1 -0
- package/dist/esm/generated/abi/jbRouterTerminalRegistryAbi.d.ts +1119 -0
- package/dist/esm/generated/abi/jbRouterTerminalRegistryAbi.d.ts.map +1 -0
- package/dist/esm/generated/abi/jbRouterTerminalRegistryAbi.js +922 -0
- package/dist/esm/generated/abi/jbRouterTerminalRegistryAbi.js.map +1 -0
- package/dist/esm/generated/abi/jbSplitsAbi.d.ts +244 -0
- package/dist/esm/generated/abi/jbSplitsAbi.d.ts.map +1 -0
- package/dist/esm/generated/abi/jbSplitsAbi.js +195 -0
- package/dist/esm/generated/abi/jbSplitsAbi.js.map +1 -0
- package/dist/esm/generated/abi/jbTokensAbi.d.ts +602 -0
- package/dist/esm/generated/abi/jbTokensAbi.d.ts.map +1 -0
- package/dist/esm/generated/abi/jbTokensAbi.js +498 -0
- package/dist/esm/generated/abi/jbTokensAbi.js.map +1 -0
- package/dist/esm/generated/juicebox.d.ts +25405 -36537
- package/dist/esm/generated/juicebox.d.ts.map +1 -1
- package/dist/esm/generated/juicebox.js +14634 -23044
- package/dist/esm/generated/juicebox.js.map +1 -1
- package/dist/esm/pureConstants.d.ts +15 -0
- package/dist/esm/pureConstants.d.ts.map +1 -0
- package/dist/esm/pureConstants.js +25 -0
- package/dist/esm/pureConstants.js.map +1 -0
- package/dist/esm/review/decode.d.ts.map +1 -1
- package/dist/esm/review/decode.js +21 -37
- package/dist/esm/review/decode.js.map +1 -1
- package/dist/esm/review/relayr.d.ts.map +1 -1
- package/dist/esm/review/relayr.js +5 -25
- package/dist/esm/review/relayr.js.map +1 -1
- package/dist/esm/safe.d.ts +376 -8
- package/dist/esm/safe.d.ts.map +1 -1
- package/dist/esm/safe.js +1070 -29
- package/dist/esm/safe.js.map +1 -1
- package/dist/esm/safeService.d.ts +361 -1
- package/dist/esm/safeService.d.ts.map +1 -1
- package/dist/esm/safeService.js +818 -5
- package/dist/esm/safeService.js.map +1 -1
- package/dist/esm/untrusted.d.ts +8 -0
- package/dist/esm/untrusted.d.ts.map +1 -0
- package/dist/esm/untrusted.js +28 -0
- package/dist/esm/untrusted.js.map +1 -0
- package/dist/esm/v6/deploymentAbi.d.ts +4 -0
- package/dist/esm/v6/deploymentAbi.d.ts.map +1 -0
- package/dist/esm/v6/deploymentAbi.js +12 -0
- package/dist/esm/v6/deploymentAbi.js.map +1 -0
- package/dist/esm/v6/deploymentDiagnostics.d.ts +45 -0
- package/dist/esm/v6/deploymentDiagnostics.d.ts.map +1 -0
- package/dist/esm/v6/deploymentDiagnostics.js +521 -0
- package/dist/esm/v6/deploymentDiagnostics.js.map +1 -0
- package/dist/esm/v6/distributions.d.ts +90 -0
- package/dist/esm/v6/distributions.d.ts.map +1 -0
- package/dist/esm/v6/distributions.js +283 -0
- package/dist/esm/v6/distributions.js.map +1 -0
- package/dist/esm/v6/index.d.ts +4 -0
- package/dist/esm/v6/index.d.ts.map +1 -1
- package/dist/esm/v6/index.js +4 -0
- package/dist/esm/v6/index.js.map +1 -1
- package/dist/esm/v6/nft.d.ts +15 -0
- package/dist/esm/v6/nft.d.ts.map +1 -1
- package/dist/esm/v6/nft.js +48 -29
- package/dist/esm/v6/nft.js.map +1 -1
- package/dist/esm/v6/omnichain.d.ts +3 -2
- package/dist/esm/v6/omnichain.d.ts.map +1 -1
- package/dist/esm/v6/omnichain.js +9 -4
- package/dist/esm/v6/omnichain.js.map +1 -1
- package/dist/esm/v6/permissionIds.d.ts +62 -0
- package/dist/esm/v6/permissionIds.d.ts.map +1 -0
- package/dist/esm/v6/permissionIds.js +66 -0
- package/dist/esm/v6/permissionIds.js.map +1 -0
- package/dist/esm/v6/permissions.d.ts +3 -62
- package/dist/esm/v6/permissions.d.ts.map +1 -1
- package/dist/esm/v6/permissions.js +2 -64
- package/dist/esm/v6/permissions.js.map +1 -1
- package/dist/esm/v6/revnet721.d.ts +42 -0
- package/dist/esm/v6/revnet721.d.ts.map +1 -0
- package/dist/esm/v6/revnet721.js +70 -0
- package/dist/esm/v6/revnet721.js.map +1 -0
- package/dist/esm/v6/revnets.d.ts +11 -3
- package/dist/esm/v6/revnets.d.ts.map +1 -1
- package/dist/esm/v6/revnets.js +36 -7
- package/dist/esm/v6/revnets.js.map +1 -1
- package/dist/esm/v6/splits.d.ts +1 -1
- package/dist/esm/v6/splits.d.ts.map +1 -1
- package/dist/esm/v6/splits.js +1 -1
- package/dist/esm/v6/splits.js.map +1 -1
- package/dist/esm/v6/sticky.d.ts +2 -2
- package/dist/esm/v6/sticky.d.ts.map +1 -1
- package/dist/esm/v6/types.d.ts +1 -1
- package/dist/esm/v6/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.describeProjectDataStatus = describeProjectDataStatus;
|
|
4
|
+
exports.getProjectDeploymentDiagnostics = getProjectDeploymentDiagnostics;
|
|
5
|
+
const viem_1 = require("viem");
|
|
6
|
+
const juicebox_js_1 = require("../generated/juicebox.js");
|
|
7
|
+
const jbDirectoryAbi_js_1 = require("../generated/abi/jbDirectoryAbi.js");
|
|
8
|
+
const jbProjectsAbi_js_1 = require("../generated/abi/jbProjectsAbi.js");
|
|
9
|
+
const errors_js_1 = require("../utils/errors.js");
|
|
10
|
+
const nft_js_1 = require("./nft.js");
|
|
11
|
+
const permissions_js_1 = require("./permissions.js");
|
|
12
|
+
const rulesets_js_1 = require("./rulesets.js");
|
|
13
|
+
const types_js_1 = require("./types.js");
|
|
14
|
+
function describeProjectDataStatus(status) {
|
|
15
|
+
switch (status) {
|
|
16
|
+
case "available":
|
|
17
|
+
return "Indexed project details are available.";
|
|
18
|
+
case "missing":
|
|
19
|
+
return "The indexer returned no project record. This does not establish why it is missing.";
|
|
20
|
+
case "incomplete":
|
|
21
|
+
return "Some indexed project details are missing. This does not establish indexing progress.";
|
|
22
|
+
case "unavailable":
|
|
23
|
+
return "The indexer request did not complete. Indexing progress is unknown.";
|
|
24
|
+
case "not-checked":
|
|
25
|
+
return "The indexer was not checked.";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const sameAddress = (left, right) => left.toLowerCase() === right.toLowerCase();
|
|
29
|
+
/** Inspect current v6 wiring without a wallet, tier enumeration or indexer.
|
|
30
|
+
* Reads are pinned to one block. Caller-supplied indexer evidence belongs in a
|
|
31
|
+
* separate report section: a failed indexer request proves nothing about wiring.
|
|
32
|
+
* Custom hooks/controllers are unsupported where capabilities cannot be verified,
|
|
33
|
+
* never invalid merely for differing from canonical deployments. Pricing units
|
|
34
|
+
* and operator powers are informational unless explicit expectations are supplied.
|
|
35
|
+
*/
|
|
36
|
+
async function getProjectDeploymentDiagnostics(client, args) {
|
|
37
|
+
const requestedOperator = args.operator && (0, viem_1.isAddress)(args.operator) ? args.operator : undefined;
|
|
38
|
+
const report = {
|
|
39
|
+
version: 6,
|
|
40
|
+
chainId: args.chainId,
|
|
41
|
+
projectId: args.projectId.toString(),
|
|
42
|
+
checkedAt: new Date().toISOString(),
|
|
43
|
+
checkedBlock: null,
|
|
44
|
+
kind: "unknown",
|
|
45
|
+
checks: [],
|
|
46
|
+
...(requestedOperator ? { operator: requestedOperator } : {}),
|
|
47
|
+
};
|
|
48
|
+
const add = (check) => {
|
|
49
|
+
if (check.status === "mismatch" && !check.action)
|
|
50
|
+
check.action =
|
|
51
|
+
"Compare these values with the original deployment call before choosing a correction; immutable settings may require a new deployment.";
|
|
52
|
+
report.checks.push(check);
|
|
53
|
+
};
|
|
54
|
+
const unavailable = (id, category, label, error) => add({
|
|
55
|
+
id,
|
|
56
|
+
category,
|
|
57
|
+
label,
|
|
58
|
+
status: (0, errors_js_1.isMissingContractFunctionError)(error)
|
|
59
|
+
? "unsupported"
|
|
60
|
+
: "unavailable",
|
|
61
|
+
message: (0, errors_js_1.isMissingContractFunctionError)(error)
|
|
62
|
+
? "The contract read reverted or returned no data, so this check could not be verified."
|
|
63
|
+
: "The chain read did not complete. No mismatch was established.",
|
|
64
|
+
action: "Retry the check or inspect this contract with your deployment configuration.",
|
|
65
|
+
});
|
|
66
|
+
if (args.projectId <= 0n) {
|
|
67
|
+
add({
|
|
68
|
+
id: "project",
|
|
69
|
+
category: "project",
|
|
70
|
+
status: "unsupported",
|
|
71
|
+
label: "Project",
|
|
72
|
+
message: "A positive project ID is required.",
|
|
73
|
+
});
|
|
74
|
+
return report;
|
|
75
|
+
}
|
|
76
|
+
let blockNumber;
|
|
77
|
+
try {
|
|
78
|
+
const chainId = await client.getChainId();
|
|
79
|
+
if (chainId !== args.chainId) {
|
|
80
|
+
add({
|
|
81
|
+
id: "network",
|
|
82
|
+
category: "project",
|
|
83
|
+
status: "unavailable",
|
|
84
|
+
label: "Network",
|
|
85
|
+
message: "The connected network does not match this project.",
|
|
86
|
+
actual: String(chainId),
|
|
87
|
+
expected: String(args.chainId),
|
|
88
|
+
action: "Choose the project's network and retry.",
|
|
89
|
+
});
|
|
90
|
+
return report;
|
|
91
|
+
}
|
|
92
|
+
blockNumber = await client.getBlockNumber();
|
|
93
|
+
report.checkedBlock = blockNumber.toString();
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
unavailable("network", "project", "Network");
|
|
97
|
+
return report;
|
|
98
|
+
}
|
|
99
|
+
let directory, projects, controller, revOwner, revDeployer, omni;
|
|
100
|
+
try {
|
|
101
|
+
directory = (0, types_js_1.v6Address)("JBDirectory", args.chainId);
|
|
102
|
+
projects = (0, types_js_1.v6Address)("JBProjects", args.chainId);
|
|
103
|
+
controller = (0, types_js_1.v6Address)("JBController", args.chainId);
|
|
104
|
+
revOwner = (0, types_js_1.v6Address)("REVOwner", args.chainId);
|
|
105
|
+
revDeployer = (0, types_js_1.v6Address)("REVDeployer", args.chainId);
|
|
106
|
+
omni = (0, types_js_1.v6Address)("JBOmnichainDeployer", args.chainId);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
add({
|
|
110
|
+
id: "network",
|
|
111
|
+
category: "project",
|
|
112
|
+
status: "unsupported",
|
|
113
|
+
label: "Network",
|
|
114
|
+
message: "This SDK has no supported v6 deployment on this network.",
|
|
115
|
+
});
|
|
116
|
+
return report;
|
|
117
|
+
}
|
|
118
|
+
// Every nested shared resolver uses this same block; no mutable latest reads.
|
|
119
|
+
const snapshot = {
|
|
120
|
+
...client,
|
|
121
|
+
readContract: (parameters) => client.readContract({ ...parameters, blockNumber }),
|
|
122
|
+
};
|
|
123
|
+
const read = snapshot.readContract;
|
|
124
|
+
const [ownerRead, controllerRead] = await Promise.allSettled([
|
|
125
|
+
read({
|
|
126
|
+
address: projects,
|
|
127
|
+
abi: jbProjectsAbi_js_1.jbProjectsAbi,
|
|
128
|
+
functionName: "ownerOf",
|
|
129
|
+
args: [args.projectId],
|
|
130
|
+
}),
|
|
131
|
+
read({
|
|
132
|
+
address: directory,
|
|
133
|
+
abi: jbDirectoryAbi_js_1.jbDirectoryAbi,
|
|
134
|
+
functionName: "controllerOf",
|
|
135
|
+
args: [args.projectId],
|
|
136
|
+
}),
|
|
137
|
+
]);
|
|
138
|
+
if (ownerRead.status === "rejected") {
|
|
139
|
+
unavailable("project.owner", "project", "Project owner", ownerRead.reason);
|
|
140
|
+
return report;
|
|
141
|
+
}
|
|
142
|
+
const owner = ownerRead.value;
|
|
143
|
+
const isRevnet = sameAddress(owner, revOwner);
|
|
144
|
+
report.kind = isRevnet ? "revnet" : "juicebox";
|
|
145
|
+
add({
|
|
146
|
+
id: "project.owner",
|
|
147
|
+
category: "project",
|
|
148
|
+
status: "passed",
|
|
149
|
+
label: "Project exists",
|
|
150
|
+
message: "The v6 project registry returned its current owner.",
|
|
151
|
+
actual: owner,
|
|
152
|
+
});
|
|
153
|
+
if (controllerRead.status === "rejected") {
|
|
154
|
+
unavailable("project.controller", "project", "Controller", controllerRead.reason);
|
|
155
|
+
return report;
|
|
156
|
+
}
|
|
157
|
+
if (!sameAddress(controllerRead.value, controller)) {
|
|
158
|
+
report.kind = "custom";
|
|
159
|
+
add({
|
|
160
|
+
id: "project.controller",
|
|
161
|
+
category: "project",
|
|
162
|
+
status: "unsupported",
|
|
163
|
+
label: "Controller",
|
|
164
|
+
message: "This controller requires deployment-specific checks.",
|
|
165
|
+
actual: controllerRead.value,
|
|
166
|
+
expected: controller,
|
|
167
|
+
action: "Compare with the controller chosen in the deployment script.",
|
|
168
|
+
});
|
|
169
|
+
return report;
|
|
170
|
+
}
|
|
171
|
+
add({
|
|
172
|
+
id: "project.controller",
|
|
173
|
+
category: "project",
|
|
174
|
+
status: "passed",
|
|
175
|
+
label: "Controller",
|
|
176
|
+
message: "The project uses the supported v6 controller.",
|
|
177
|
+
actual: controller,
|
|
178
|
+
});
|
|
179
|
+
let canonicalRevnet = false;
|
|
180
|
+
if (isRevnet) {
|
|
181
|
+
try {
|
|
182
|
+
const hash = await read({
|
|
183
|
+
address: revDeployer,
|
|
184
|
+
abi: juicebox_js_1.revDeployerAbi,
|
|
185
|
+
functionName: "hashedEncodedConfigurationOf",
|
|
186
|
+
args: [args.projectId],
|
|
187
|
+
});
|
|
188
|
+
canonicalRevnet = hash !== viem_1.zeroHash;
|
|
189
|
+
add({
|
|
190
|
+
id: "project.provenance",
|
|
191
|
+
category: "project",
|
|
192
|
+
status: canonicalRevnet ? "passed" : "unsupported",
|
|
193
|
+
label: "Revnet configuration",
|
|
194
|
+
message: canonicalRevnet
|
|
195
|
+
? "The canonical deployer has a configuration for this revnet."
|
|
196
|
+
: "No canonical configuration is registered. Ownership alone does not establish canonical deployment.",
|
|
197
|
+
actual: hash,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
unavailable("project.provenance", "project", "Revnet configuration", error);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
let current;
|
|
205
|
+
try {
|
|
206
|
+
current = await (0, rulesets_js_1.getCurrentRuleset)(snapshot, args);
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
unavailable("project.ruleset", "project", "Current ruleset", error);
|
|
210
|
+
if (!isRevnet)
|
|
211
|
+
return report;
|
|
212
|
+
}
|
|
213
|
+
if (current?.ruleset.id === 0) {
|
|
214
|
+
add({
|
|
215
|
+
id: "project.ruleset",
|
|
216
|
+
category: "project",
|
|
217
|
+
status: "info",
|
|
218
|
+
label: "Current ruleset",
|
|
219
|
+
message: "No active ruleset is available yet. Hook routing cannot be checked.",
|
|
220
|
+
});
|
|
221
|
+
if (!isRevnet)
|
|
222
|
+
return report;
|
|
223
|
+
current = undefined;
|
|
224
|
+
}
|
|
225
|
+
const metadata = current?.metadata;
|
|
226
|
+
if (metadata) {
|
|
227
|
+
const expectedHook = canonicalRevnet ? revOwner : undefined;
|
|
228
|
+
add({
|
|
229
|
+
id: "hook.routing",
|
|
230
|
+
category: "hook",
|
|
231
|
+
status: expectedHook && !sameAddress(metadata.dataHook, expectedHook)
|
|
232
|
+
? "mismatch"
|
|
233
|
+
: "info",
|
|
234
|
+
label: "Payment hook routing",
|
|
235
|
+
message: "The current ruleset selects this data hook.",
|
|
236
|
+
actual: metadata.dataHook,
|
|
237
|
+
...(expectedHook ? { expected: expectedHook } : {}),
|
|
238
|
+
});
|
|
239
|
+
const canonicalComposite = canonicalRevnet;
|
|
240
|
+
add({
|
|
241
|
+
id: "hook.flags",
|
|
242
|
+
category: "hook",
|
|
243
|
+
status: canonicalComposite &&
|
|
244
|
+
(!metadata.useDataHookForPay || !metadata.useDataHookForCashOut)
|
|
245
|
+
? "mismatch"
|
|
246
|
+
: "info",
|
|
247
|
+
label: "Hook enablement",
|
|
248
|
+
message: canonicalComposite
|
|
249
|
+
? "Canonical composite hooks enable both payment and cash-out routing."
|
|
250
|
+
: "Hook enablement can be an intentional ruleset choice.",
|
|
251
|
+
actual: `payments=${metadata.useDataHookForPay}; cashOuts=${metadata.useDataHookForCashOut}`,
|
|
252
|
+
...(canonicalComposite
|
|
253
|
+
? { expected: "payments=true; cashOuts=true" }
|
|
254
|
+
: {}),
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
let resolved;
|
|
258
|
+
try {
|
|
259
|
+
resolved = await (0, nft_js_1.resolveProject721Hook)(snapshot, {
|
|
260
|
+
...args,
|
|
261
|
+
isRevnet,
|
|
262
|
+
ruleset: current,
|
|
263
|
+
includeInactiveHook: true,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
unavailable("hook.shop", "hook", "Shop hook", error);
|
|
268
|
+
return report;
|
|
269
|
+
}
|
|
270
|
+
if (!resolved) {
|
|
271
|
+
const custom = metadata &&
|
|
272
|
+
metadata.dataHook !== viem_1.zeroAddress &&
|
|
273
|
+
!sameAddress(metadata.dataHook, omni) &&
|
|
274
|
+
!isRevnet;
|
|
275
|
+
if (custom)
|
|
276
|
+
report.kind = "custom";
|
|
277
|
+
add({
|
|
278
|
+
id: "hook.shop",
|
|
279
|
+
category: "hook",
|
|
280
|
+
status: canonicalRevnet ? "mismatch" : custom ? "unsupported" : "info",
|
|
281
|
+
label: "Shop hook",
|
|
282
|
+
message: canonicalRevnet
|
|
283
|
+
? "The canonical revnet has no registered shop hook."
|
|
284
|
+
: custom
|
|
285
|
+
? "The selected custom data hook does not expose a supported 721 shop."
|
|
286
|
+
: "No 721 shop is configured. This is valid for a Juicebox project.",
|
|
287
|
+
...(canonicalRevnet
|
|
288
|
+
? { actual: viem_1.zeroAddress, expected: "A registered 721 hook" }
|
|
289
|
+
: {}),
|
|
290
|
+
});
|
|
291
|
+
return report;
|
|
292
|
+
}
|
|
293
|
+
const hook = resolved.hook;
|
|
294
|
+
add({
|
|
295
|
+
id: "hook.shop",
|
|
296
|
+
category: "hook",
|
|
297
|
+
status: "passed",
|
|
298
|
+
label: "Shop hook",
|
|
299
|
+
message: "The project resolves to a hook reporting a 721 store address.",
|
|
300
|
+
actual: hook,
|
|
301
|
+
});
|
|
302
|
+
const bind = async (id, label, readValue, expected) => {
|
|
303
|
+
try {
|
|
304
|
+
const actual = String(await readValue());
|
|
305
|
+
add({
|
|
306
|
+
id,
|
|
307
|
+
category: "hook",
|
|
308
|
+
label,
|
|
309
|
+
status: expected
|
|
310
|
+
? actual.toLowerCase() === expected.toLowerCase()
|
|
311
|
+
? "passed"
|
|
312
|
+
: "mismatch"
|
|
313
|
+
: "info",
|
|
314
|
+
message: expected
|
|
315
|
+
? "Compared the hook's binding with this project."
|
|
316
|
+
: "The hook reported this value; custom ownership can be intentional.",
|
|
317
|
+
actual,
|
|
318
|
+
...(expected ? { expected } : {}),
|
|
319
|
+
});
|
|
320
|
+
return actual;
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
unavailable(id, "hook", label, error);
|
|
324
|
+
return undefined;
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
const [hookProject, , hookOwner, permissionRegistry] = await Promise.all([
|
|
328
|
+
bind("hook.projectId", "Hook project", () => read({
|
|
329
|
+
address: hook,
|
|
330
|
+
abi: juicebox_js_1.jb721TiersHookAbi,
|
|
331
|
+
functionName: "projectId",
|
|
332
|
+
}), args.projectId.toString()),
|
|
333
|
+
bind("hook.directory", "Hook directory", () => read({
|
|
334
|
+
address: hook,
|
|
335
|
+
abi: juicebox_js_1.jb721TiersHookAbi,
|
|
336
|
+
functionName: "DIRECTORY",
|
|
337
|
+
}), directory),
|
|
338
|
+
bind("hook.owner", "Shop authority", () => read({ address: hook, abi: juicebox_js_1.jb721TiersHookAbi, functionName: "owner" }), canonicalRevnet ? revOwner : undefined),
|
|
339
|
+
bind("hook.permissions", "Permission registry", () => read({
|
|
340
|
+
address: hook,
|
|
341
|
+
abi: juicebox_js_1.jb721TiersHookAbi,
|
|
342
|
+
functionName: "PERMISSIONS",
|
|
343
|
+
})),
|
|
344
|
+
]);
|
|
345
|
+
await Promise.all([
|
|
346
|
+
(async () => {
|
|
347
|
+
if (sameAddress(resolved.store, viem_1.zeroAddress)) {
|
|
348
|
+
add({
|
|
349
|
+
id: "hook.store",
|
|
350
|
+
category: "hook",
|
|
351
|
+
status: "mismatch",
|
|
352
|
+
label: "Shop store",
|
|
353
|
+
message: "The hook reports no store address.",
|
|
354
|
+
actual: viem_1.zeroAddress,
|
|
355
|
+
expected: "A deployed 721 store",
|
|
356
|
+
action: "Compare the hook initialization with the deployment script before using its shop.",
|
|
357
|
+
});
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
try {
|
|
361
|
+
const maxTierId = await read({
|
|
362
|
+
address: resolved.store,
|
|
363
|
+
abi: juicebox_js_1.jb721TiersHookStoreAbi,
|
|
364
|
+
functionName: "maxTierIdOf",
|
|
365
|
+
args: [hook],
|
|
366
|
+
});
|
|
367
|
+
add({
|
|
368
|
+
id: "hook.store",
|
|
369
|
+
category: "hook",
|
|
370
|
+
status: "passed",
|
|
371
|
+
label: "Shop store",
|
|
372
|
+
message: `The reported store is readable; highest tier ID is ${maxTierId}.`,
|
|
373
|
+
actual: resolved.store,
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
unavailable("hook.store", "hook", "Shop store", error);
|
|
378
|
+
}
|
|
379
|
+
})(),
|
|
380
|
+
(async () => {
|
|
381
|
+
try {
|
|
382
|
+
const factory = await read({
|
|
383
|
+
address: (0, types_js_1.v6Address)("JBAddressRegistry", args.chainId),
|
|
384
|
+
abi: juicebox_js_1.jbAddressRegistryAbi,
|
|
385
|
+
functionName: "deployerOf",
|
|
386
|
+
args: [hook],
|
|
387
|
+
});
|
|
388
|
+
const expected = (0, types_js_1.v6Address)("JB721TiersHookDeployer", args.chainId);
|
|
389
|
+
add({
|
|
390
|
+
id: "hook.provenance",
|
|
391
|
+
category: "hook",
|
|
392
|
+
status: sameAddress(factory, expected) ? "passed" : "unsupported",
|
|
393
|
+
label: "Shop factory",
|
|
394
|
+
message: sameAddress(factory, expected)
|
|
395
|
+
? "The registry records the canonical 721 factory."
|
|
396
|
+
: "The registry does not establish canonical factory provenance. Custom hooks need separate review.",
|
|
397
|
+
actual: factory,
|
|
398
|
+
expected,
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
unavailable("hook.provenance", "hook", "Shop factory", error);
|
|
403
|
+
}
|
|
404
|
+
})(),
|
|
405
|
+
(async () => {
|
|
406
|
+
try {
|
|
407
|
+
const [currency, decimals] = await read({
|
|
408
|
+
address: hook,
|
|
409
|
+
abi: juicebox_js_1.jb721TiersHookAbi,
|
|
410
|
+
functionName: "pricingContext",
|
|
411
|
+
});
|
|
412
|
+
const expected = args.expectedPricing;
|
|
413
|
+
add({
|
|
414
|
+
id: "shop.pricing",
|
|
415
|
+
category: "pricing",
|
|
416
|
+
status: expected
|
|
417
|
+
? currency === BigInt(expected.currency) &&
|
|
418
|
+
decimals === BigInt(expected.decimals)
|
|
419
|
+
? "passed"
|
|
420
|
+
: "mismatch"
|
|
421
|
+
: "info",
|
|
422
|
+
label: "Shop pricing",
|
|
423
|
+
message: "Prices use these units. Precision alone cannot establish whether an item was priced as intended.",
|
|
424
|
+
actual: `currency=${currency}; decimals=${decimals}`,
|
|
425
|
+
...(expected
|
|
426
|
+
? {
|
|
427
|
+
expected: `currency=${expected.currency}; decimals=${expected.decimals}`,
|
|
428
|
+
}
|
|
429
|
+
: {}),
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
catch (error) {
|
|
433
|
+
unavailable("shop.pricing", "pricing", "Shop pricing", error);
|
|
434
|
+
}
|
|
435
|
+
})(),
|
|
436
|
+
(async () => {
|
|
437
|
+
if (args.operator && !requestedOperator) {
|
|
438
|
+
add({
|
|
439
|
+
id: "shop.permissions",
|
|
440
|
+
category: "permissions",
|
|
441
|
+
status: "unsupported",
|
|
442
|
+
label: "Shop permissions",
|
|
443
|
+
message: "The supplied operator is not a valid address.",
|
|
444
|
+
action: "Supply the operator address from your deployment configuration.",
|
|
445
|
+
});
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
if (!requestedOperator) {
|
|
449
|
+
add({
|
|
450
|
+
id: "shop.permissions",
|
|
451
|
+
category: "permissions",
|
|
452
|
+
status: "info",
|
|
453
|
+
label: "Shop permissions",
|
|
454
|
+
message: "Operator permissions can be intentionally restricted. Supply an operator address to read its current powers.",
|
|
455
|
+
...(hookOwner ? { actual: `Shop authority: ${hookOwner}` } : {}),
|
|
456
|
+
});
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
if (!hookOwner || !hookProject || !permissionRegistry) {
|
|
460
|
+
const dependencies = [
|
|
461
|
+
"hook.owner",
|
|
462
|
+
"hook.projectId",
|
|
463
|
+
"hook.permissions",
|
|
464
|
+
].map((id) => report.checks.find((item) => item.id === id));
|
|
465
|
+
add({
|
|
466
|
+
id: "shop.permissions",
|
|
467
|
+
category: "permissions",
|
|
468
|
+
status: dependencies.some((item) => item?.status === "unavailable")
|
|
469
|
+
? "unavailable"
|
|
470
|
+
: "unsupported",
|
|
471
|
+
label: "Shop permissions",
|
|
472
|
+
message: "A required hook authority or binding read could not be verified. Operator powers remain unknown.",
|
|
473
|
+
action: "Retry the missing hook reads before checking operator powers.",
|
|
474
|
+
});
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
const operator = requestedOperator;
|
|
478
|
+
if (sameAddress(operator, viem_1.zeroAddress) ||
|
|
479
|
+
hookProject !== args.projectId.toString() ||
|
|
480
|
+
!permissionRegistry ||
|
|
481
|
+
!sameAddress(permissionRegistry, (0, types_js_1.v6Address)("JBPermissions", args.chainId))) {
|
|
482
|
+
add({
|
|
483
|
+
id: "shop.permissions",
|
|
484
|
+
category: "permissions",
|
|
485
|
+
status: "unsupported",
|
|
486
|
+
label: "Shop permissions",
|
|
487
|
+
message: "Operator powers cannot be established for an unverified project binding, custom permission registry or zero operator.",
|
|
488
|
+
action: "Verify the hook's project and permission registry, then supply a nonzero operator address.",
|
|
489
|
+
});
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
const permissions = [
|
|
493
|
+
["Adjust tiers", permissions_js_1.JBPermissionIdsV6.ADJUST_721_TIERS],
|
|
494
|
+
["Update metadata", permissions_js_1.JBPermissionIdsV6.SET_721_METADATA],
|
|
495
|
+
["Mint items", permissions_js_1.JBPermissionIdsV6.MINT_721],
|
|
496
|
+
["Increase discounts", permissions_js_1.JBPermissionIdsV6.SET_721_DISCOUNT_PERCENT],
|
|
497
|
+
];
|
|
498
|
+
await Promise.all(permissions.map(async ([label, id]) => {
|
|
499
|
+
try {
|
|
500
|
+
const allowed = sameAddress(operator, hookOwner) ||
|
|
501
|
+
(await (0, permissions_js_1.hasPermissions)(snapshot, {
|
|
502
|
+
...args,
|
|
503
|
+
operator,
|
|
504
|
+
account: hookOwner,
|
|
505
|
+
permissionIds: [id],
|
|
506
|
+
}));
|
|
507
|
+
add({
|
|
508
|
+
id: `shop.permission.${id}`,
|
|
509
|
+
category: "permissions",
|
|
510
|
+
status: "info",
|
|
511
|
+
label,
|
|
512
|
+
message: "This is the supplied operator's current capability, including owner, root and wildcard authority.",
|
|
513
|
+
actual: allowed ? "Allowed" : "Not allowed",
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
catch (error) {
|
|
517
|
+
unavailable(`shop.permission.${id}`, "permissions", label, error);
|
|
518
|
+
}
|
|
519
|
+
}));
|
|
520
|
+
})(),
|
|
521
|
+
]);
|
|
522
|
+
report.checks.sort((left, right) => left.id.localeCompare(right.id));
|
|
523
|
+
return report;
|
|
524
|
+
}
|
|
525
|
+
//# sourceMappingURL=deploymentDiagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploymentDiagnostics.js","sourceRoot":"","sources":["../../../src/v6/deploymentDiagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { type Address } from "viem";
|
|
2
|
+
/** A reviewed split, as the ruleset held it when the distribution was reviewed. */
|
|
3
|
+
export type ExpectedDistributionSplit = {
|
|
4
|
+
percent: number | bigint | string;
|
|
5
|
+
projectId: number | bigint | string;
|
|
6
|
+
beneficiary: Address;
|
|
7
|
+
preferAddToBalance: boolean;
|
|
8
|
+
lockedUntil: number | bigint | string;
|
|
9
|
+
hook: Address;
|
|
10
|
+
/**
|
|
11
|
+
* Payouts only: true when the terminal pays this split without its fee, so
|
|
12
|
+
* its net must equal its gross. Leave it unset when unknown.
|
|
13
|
+
*/
|
|
14
|
+
feeless?: boolean;
|
|
15
|
+
};
|
|
16
|
+
/** What a reviewed `sendPayoutsOf` must have done. Numbers may be any uint256 form. */
|
|
17
|
+
export type ExpectedPayoutReceipt = {
|
|
18
|
+
terminal: Address;
|
|
19
|
+
projectId: number | bigint | string;
|
|
20
|
+
rulesetId: number | bigint | string;
|
|
21
|
+
cycleNumber: number | bigint | string;
|
|
22
|
+
token: Address;
|
|
23
|
+
/** The project owner, who receives what the splits leave. */
|
|
24
|
+
owner: Address;
|
|
25
|
+
/** The account that sent the distribution. */
|
|
26
|
+
caller: Address;
|
|
27
|
+
/** The amount `sendPayoutsOf` was called with, in its currency. */
|
|
28
|
+
amount: number | bigint | string;
|
|
29
|
+
/** The least `amountPaidOut` the review allowed, in the token. */
|
|
30
|
+
minimum: number | bigint | string;
|
|
31
|
+
splits: readonly ExpectedDistributionSplit[];
|
|
32
|
+
};
|
|
33
|
+
/** What a reviewed `sendReservedTokensToSplitsOf` must have done. */
|
|
34
|
+
export type ExpectedReservedReceipt = {
|
|
35
|
+
controller: Address;
|
|
36
|
+
/** JBTokens, which logs the controller's burns. */
|
|
37
|
+
tokens: Address;
|
|
38
|
+
projectId: number | bigint | string;
|
|
39
|
+
rulesetId: number | bigint | string;
|
|
40
|
+
cycleNumber: number | bigint | string;
|
|
41
|
+
/** The project owner, who receives what the splits leave. */
|
|
42
|
+
owner: Address;
|
|
43
|
+
caller: Address;
|
|
44
|
+
/** The pending reserved tokens the review saw. */
|
|
45
|
+
tokenCount: number | bigint | string;
|
|
46
|
+
splits: readonly ExpectedDistributionSplit[];
|
|
47
|
+
};
|
|
48
|
+
type Receipt = {
|
|
49
|
+
status?: unknown;
|
|
50
|
+
logs: readonly unknown[];
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Prove that a `sendPayoutsOf` receipt paid every reviewed split in full.
|
|
54
|
+
*
|
|
55
|
+
* The terminal must log, for the project, no `PayoutReverted` or
|
|
56
|
+
* `PayoutTransferReverted`; exactly one `SendPayouts` from the reviewed
|
|
57
|
+
* caller, in the reviewed ruleset and cycle, to the reviewed owner, for the
|
|
58
|
+
* reviewed amount, paying out at least the reviewed minimum with a fee within
|
|
59
|
+
* 2.5%; and one `SendPayoutToSplit` per reviewed split, in order, naming that
|
|
60
|
+
* exact split. Each split's gross is the terminal's successive remainder
|
|
61
|
+
* (`remaining × percent / remaining percent`). Its net must be the gross, or
|
|
62
|
+
* the gross less its 2.5% fee, and the gross alone for a split marked
|
|
63
|
+
* feeless: anything else is a hook that took only part of its share. The
|
|
64
|
+
* owner's net leftover follows the same rule.
|
|
65
|
+
*
|
|
66
|
+
* Throws, naming the first event that differs. A refusal means the receipt
|
|
67
|
+
* cannot show the payouts completed: keep the transaction, and do not send
|
|
68
|
+
* the same payouts again.
|
|
69
|
+
*/
|
|
70
|
+
export declare function verifyPayoutReceipt(receipt: Receipt, expected: ExpectedPayoutReceipt): void;
|
|
71
|
+
/**
|
|
72
|
+
* Prove that a `sendReservedTokensToSplitsOf` receipt sent every reviewed
|
|
73
|
+
* split its reserved tokens.
|
|
74
|
+
*
|
|
75
|
+
* The controller must log, for the project, no `ReservedDistributionReverted`
|
|
76
|
+
* or `SplitHookReverted`; exactly one `SendReservedTokensToSplits` from the
|
|
77
|
+
* reviewed caller, in the reviewed ruleset and cycle, to the reviewed owner,
|
|
78
|
+
* for the reviewed token count, leaving what the splits do not take; and one
|
|
79
|
+
* `SendReservedTokensToSplit` per reviewed split, in order, naming that exact
|
|
80
|
+
* split with `tokenCount × percent / 100%`. JBTokens must log burns from the
|
|
81
|
+
* controller of exactly the shares sent to 0x…dEaD: any other burn is tokens a
|
|
82
|
+
* hook did not take.
|
|
83
|
+
*
|
|
84
|
+
* Throws, naming the first event that differs. A refusal means the receipt
|
|
85
|
+
* cannot show the distribution completed: keep the transaction, and do not
|
|
86
|
+
* distribute the same reserved tokens again.
|
|
87
|
+
*/
|
|
88
|
+
export declare function verifyReservedDistributionReceipt(receipt: Receipt, expected: ExpectedReservedReceipt): void;
|
|
89
|
+
export {};
|
|
90
|
+
//# sourceMappingURL=distributions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distributions.d.ts","sourceRoot":"","sources":["../../../src/v6/distributions.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,OAAO,EACb,MAAM,MAAM,CAAC;AAad,mFAAmF;AACnF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACtC,IAAI,EAAE,OAAO,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,uFAAuF;AACvF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,6DAA6D;IAC7D,KAAK,EAAE,OAAO,CAAC;IACf,8CAA8C;IAC9C,MAAM,EAAE,OAAO,CAAC;IAChB,mEAAmE;IACnE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,kEAAkE;IAClE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,MAAM,EAAE,SAAS,yBAAyB,EAAE,CAAC;CAC9C,CAAC;AAEF,qEAAqE;AACrE,MAAM,MAAM,uBAAuB,GAAG;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACtC,6DAA6D;IAC7D,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,kDAAkD;IAClD,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACrC,MAAM,EAAE,SAAS,yBAAyB,EAAE,CAAC;CAC9C,CAAC;AAEF,KAAK,OAAO,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE,CAAC;AAyI9D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,qBAAqB,GAC9B,IAAI,CA0HN;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,uBAAuB,GAChC,IAAI,CAyHN"}
|