@bananapus/nana-sdk-core 2.13.0 → 2.14.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/review/transactionReview.d.ts +22 -4
- package/dist/cjs/review/transactionReview.d.ts.map +1 -1
- package/dist/cjs/review/transactionReview.js +42 -12
- package/dist/cjs/review/transactionReview.js.map +1 -1
- package/dist/esm/review/transactionReview.d.ts +22 -4
- package/dist/esm/review/transactionReview.d.ts.map +1 -1
- package/dist/esm/review/transactionReview.js +40 -13
- package/dist/esm/review/transactionReview.js.map +1 -1
- package/package.json +1 -1
|
@@ -12,6 +12,10 @@ export type TransactionReviewCall = {
|
|
|
12
12
|
to: Address;
|
|
13
13
|
data: Hex;
|
|
14
14
|
value?: bigint;
|
|
15
|
+
/** The gas limit the wallet or forwarder signs, when it is fixed before review. */
|
|
16
|
+
gas?: bigint;
|
|
17
|
+
/** A Safe proposal's signed `safeTxGas`. At 0 the Safe transaction reverts if this call fails. */
|
|
18
|
+
safeTxGas?: bigint;
|
|
15
19
|
from?: Address;
|
|
16
20
|
abi?: Abi;
|
|
17
21
|
functionName?: string;
|
|
@@ -40,6 +44,8 @@ export type ContractTransactionReviewCall = {
|
|
|
40
44
|
functionName: string;
|
|
41
45
|
args?: readonly unknown[];
|
|
42
46
|
value?: bigint;
|
|
47
|
+
gas?: bigint;
|
|
48
|
+
safeTxGas?: bigint;
|
|
43
49
|
account?: Address;
|
|
44
50
|
};
|
|
45
51
|
export type TransactionReviewOptions = Omit<TransactionReviewRequest, "calls"> & {
|
|
@@ -47,15 +53,27 @@ export type TransactionReviewOptions = Omit<TransactionReviewRequest, "calls"> &
|
|
|
47
53
|
contractName?: string;
|
|
48
54
|
};
|
|
49
55
|
type TransactionReviewHandler = (request: TransactionReviewRequest) => Promise<boolean>;
|
|
56
|
+
/** The person closed a review or a funding-chain choice. Nothing was sent; apps need not show an error. */
|
|
57
|
+
export declare class TransactionReviewCancelledError extends Error {
|
|
58
|
+
constructor(message?: string);
|
|
59
|
+
}
|
|
50
60
|
export type FundingChainOption = {
|
|
51
61
|
chainId: number;
|
|
52
|
-
/** The chain
|
|
62
|
+
/** The chain and its quoted cost, from {@link fundingChainLabel}. */
|
|
53
63
|
label: string;
|
|
54
64
|
};
|
|
55
|
-
type FundingChainSelectionHandler = (options: readonly FundingChainOption[]
|
|
65
|
+
type FundingChainSelectionHandler = (options: readonly FundingChainOption[],
|
|
66
|
+
/** The option to preselect, or null when the person must pick one of several. */
|
|
67
|
+
initialChainId: number | null) => Promise<number | null>;
|
|
68
|
+
/** "Base (~0.000123 ETH)": a chain and the relay fee quoted on it. */
|
|
69
|
+
export declare function fundingChainLabel(chainName: string, amountWei: bigint): string;
|
|
56
70
|
export declare function registerFundingChainSelectionHandler(handler: FundingChainSelectionHandler): () => void;
|
|
57
|
-
/**
|
|
58
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Asks where to pay a relay fee. The connected chain is preselected when it is
|
|
73
|
+
* quoted, and so is a lone quote; otherwise the person picks. The exact payment
|
|
74
|
+
* still gets its own review.
|
|
75
|
+
*/
|
|
76
|
+
export declare function requireFundingChainSelection(options: readonly FundingChainOption[], preferredChainId?: number): Promise<number>;
|
|
59
77
|
/**
|
|
60
78
|
* The provider registers the only UI capable of approving a transaction.
|
|
61
79
|
* Keeping the entry point in a small client module lets non-React wallet
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionReview.d.ts","sourceRoot":"","sources":["../../../src/review/transactionReview.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"transactionReview.d.ts","sourceRoot":"","sources":["../../../src/review/transactionReview.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
"use client";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.TransactionReviewCancelledError = void 0;
|
|
5
|
+
exports.fundingChainLabel = fundingChainLabel;
|
|
4
6
|
exports.registerFundingChainSelectionHandler = registerFundingChainSelectionHandler;
|
|
5
7
|
exports.requireFundingChainSelection = requireFundingChainSelection;
|
|
6
8
|
exports.registerTransactionReviewHandler = registerTransactionReviewHandler;
|
|
@@ -12,6 +14,22 @@ exports.buildTransactionDebugPrompt = buildTransactionDebugPrompt;
|
|
|
12
14
|
exports.buildTransactionReviewPrompt = buildTransactionReviewPrompt;
|
|
13
15
|
const viem_1 = require("viem");
|
|
14
16
|
const transactionReviewHandlers = [];
|
|
17
|
+
/** The person closed a review or a funding-chain choice. Nothing was sent; apps need not show an error. */
|
|
18
|
+
class TransactionReviewCancelledError extends Error {
|
|
19
|
+
constructor(message = "Review closed. Nothing was sent.") {
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = "TransactionReviewCancelledError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.TransactionReviewCancelledError = TransactionReviewCancelledError;
|
|
25
|
+
/** "Base (~0.000123 ETH)": a chain and the relay fee quoted on it. */
|
|
26
|
+
function fundingChainLabel(chainName, amountWei) {
|
|
27
|
+
const exact = (0, viem_1.formatEther)(amountWei);
|
|
28
|
+
const shown = new Intl.NumberFormat("en-US", {
|
|
29
|
+
maximumSignificantDigits: 3,
|
|
30
|
+
}).format(Number(exact));
|
|
31
|
+
return `${chainName} (${shown === exact ? "" : "~"}${shown} ETH)`;
|
|
32
|
+
}
|
|
15
33
|
const fundingChainSelectionHandlers = [];
|
|
16
34
|
function registerFundingChainSelectionHandler(handler) {
|
|
17
35
|
fundingChainSelectionHandlers.push(handler);
|
|
@@ -21,8 +39,12 @@ function registerFundingChainSelectionHandler(handler) {
|
|
|
21
39
|
fundingChainSelectionHandlers.splice(index, 1);
|
|
22
40
|
};
|
|
23
41
|
}
|
|
24
|
-
/**
|
|
25
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Asks where to pay a relay fee. The connected chain is preselected when it is
|
|
44
|
+
* quoted, and so is a lone quote; otherwise the person picks. The exact payment
|
|
45
|
+
* still gets its own review.
|
|
46
|
+
*/
|
|
47
|
+
async function requireFundingChainSelection(options, preferredChainId) {
|
|
26
48
|
const snapshot = options.map((option) => ({ ...option }));
|
|
27
49
|
const chainIds = new Set(snapshot.map((option) => option.chainId));
|
|
28
50
|
if (!snapshot.length ||
|
|
@@ -36,9 +58,14 @@ async function requireFundingChainSelection(options) {
|
|
|
36
58
|
if (!handler) {
|
|
37
59
|
throw new Error("Funding chain selection is unavailable. Reload the page before continuing.");
|
|
38
60
|
}
|
|
39
|
-
const
|
|
61
|
+
const initialChainId = preferredChainId !== undefined && chainIds.has(preferredChainId)
|
|
62
|
+
? preferredChainId
|
|
63
|
+
: snapshot.length === 1
|
|
64
|
+
? snapshot[0].chainId
|
|
65
|
+
: null;
|
|
66
|
+
const selected = await handler(snapshot, initialChainId);
|
|
40
67
|
if (selected === null) {
|
|
41
|
-
throw new
|
|
68
|
+
throw new TransactionReviewCancelledError("Funding chain selection cancelled. Nothing was sent.");
|
|
42
69
|
}
|
|
43
70
|
if (!chainIds.has(selected)) {
|
|
44
71
|
throw new Error("The selected funding chain is not available in this quote.");
|
|
@@ -80,6 +107,8 @@ function contractCallForReview(call, options = {}) {
|
|
|
80
107
|
to: call.address,
|
|
81
108
|
data,
|
|
82
109
|
value: call.value,
|
|
110
|
+
gas: call.gas,
|
|
111
|
+
safeTxGas: call.safeTxGas,
|
|
83
112
|
from: call.account,
|
|
84
113
|
abi: call.abi,
|
|
85
114
|
functionName: call.functionName,
|
|
@@ -101,18 +130,14 @@ function requestContractTransactionReview(call, options = {}) {
|
|
|
101
130
|
if (current.chainId !== reviewed.chainId ||
|
|
102
131
|
current.to.toLowerCase() !== reviewed.to.toLowerCase() ||
|
|
103
132
|
(current.value ?? 0n) !== (reviewed.value ?? 0n) ||
|
|
133
|
+
current.gas !== reviewed.gas ||
|
|
134
|
+
current.safeTxGas !== reviewed.safeTxGas ||
|
|
104
135
|
current.data !== reviewed.data) {
|
|
105
136
|
throw new Error("Transaction data changed after review. Nothing was sent; review it again.");
|
|
106
137
|
}
|
|
107
138
|
return true;
|
|
108
139
|
});
|
|
109
140
|
}
|
|
110
|
-
class TransactionReviewCancelledError extends Error {
|
|
111
|
-
constructor() {
|
|
112
|
-
super("Review closed. Nothing was sent.");
|
|
113
|
-
this.name = "TransactionReviewCancelledError";
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
141
|
async function requireTransactionReview(request) {
|
|
117
142
|
if (!(await requestTransactionReview(request))) {
|
|
118
143
|
throw new TransactionReviewCancelledError();
|
|
@@ -129,6 +154,10 @@ function transactionReviewJson(request) {
|
|
|
129
154
|
from: call.from,
|
|
130
155
|
to: call.to,
|
|
131
156
|
value: `0x${(call.value ?? 0n).toString(16)}`,
|
|
157
|
+
...(call.gas === undefined ? {} : { gas: `0x${call.gas.toString(16)}` }),
|
|
158
|
+
...(call.safeTxGas === undefined
|
|
159
|
+
? {}
|
|
160
|
+
: { safeTxGas: `0x${call.safeTxGas.toString(16)}` }),
|
|
132
161
|
data: call.data,
|
|
133
162
|
}));
|
|
134
163
|
const calls = transactions.length === 1 ? transactions[0] : { transactions };
|
|
@@ -161,7 +190,7 @@ function buildTransactionDebugPrompt(calls, { chainName: displayChainName, explo
|
|
|
161
190
|
}
|
|
162
191
|
function buildTransactionReviewPrompt(request, { explorerOrigin }) {
|
|
163
192
|
const lines = [
|
|
164
|
-
"I'm about to authorize a blockchain
|
|
193
|
+
"I'm about to authorize a blockchain action in a Juicebox V6 app (the nana V6 / revnet V6 protocol release, not an older Juicebox version). Act as a careful security reviewer. Independently verify the payload against the deployed contracts and V6 source, confirm it matches my intent, and give a go/no-go. Assume the UI could be spoofed; trust the onchain call and verified V6 source over the page.",
|
|
165
194
|
"",
|
|
166
195
|
"Exact app-controlled transaction payload:",
|
|
167
196
|
"```json",
|
|
@@ -190,10 +219,11 @@ function buildTransactionReviewPrompt(request, { explorerOrigin }) {
|
|
|
190
219
|
lines.push("");
|
|
191
220
|
lines.push("Check specifically:");
|
|
192
221
|
lines.push("1. Decode the calldata selector and every argument. Explain in plain English what state, permissions, ownership, tokens, or funds can change.");
|
|
193
|
-
lines.push("2. Verify the chain ID, `to` address, native `value`, and
|
|
222
|
+
lines.push("2. Verify the chain ID, `to` address, native `value`, calldata, and any `gas` or `safeTxGas` exactly. Flag any unexpected non-zero value or unknown target.");
|
|
194
223
|
lines.push("3. Identify every beneficiary, recipient, spender, operator, owner, hook, terminal, and permission-bearing address in the decoded arguments.");
|
|
195
224
|
lines.push("4. Warn about unlimited approvals, arbitrary-call capability, delegatecalls, ownership transfers, permission grants, upgradeability, or drain paths.");
|
|
196
225
|
lines.push("5. For multiple chains, confirm the intended change is consistent and that no extra chain or call was added.");
|
|
226
|
+
lines.push("6. For a Relayr or Safe authorization, separate what I sign now from the later onchain execution. A Safe `safeTxGas` of 0 makes the Safe transaction revert if the call fails; a nonzero value lets it execute and record the failure.");
|
|
197
227
|
lines.push("");
|
|
198
228
|
lines.push("Before your verdict, quiz me with 2–4 short plain-English questions about what I expect to happen (what changes, who receives or controls what, how much value moves, and on which chain). Wait for my answers, compare them with the decoded payload, and flag every mismatch.");
|
|
199
229
|
lines.push("");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionReview.js","sourceRoot":"","sources":["../../../src/review/transactionReview.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC
|
|
1
|
+
{"version":3,"file":"transactionReview.js","sourceRoot":"","sources":["../../../src/review/transactionReview.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,10 @@ export type TransactionReviewCall = {
|
|
|
12
12
|
to: Address;
|
|
13
13
|
data: Hex;
|
|
14
14
|
value?: bigint;
|
|
15
|
+
/** The gas limit the wallet or forwarder signs, when it is fixed before review. */
|
|
16
|
+
gas?: bigint;
|
|
17
|
+
/** A Safe proposal's signed `safeTxGas`. At 0 the Safe transaction reverts if this call fails. */
|
|
18
|
+
safeTxGas?: bigint;
|
|
15
19
|
from?: Address;
|
|
16
20
|
abi?: Abi;
|
|
17
21
|
functionName?: string;
|
|
@@ -40,6 +44,8 @@ export type ContractTransactionReviewCall = {
|
|
|
40
44
|
functionName: string;
|
|
41
45
|
args?: readonly unknown[];
|
|
42
46
|
value?: bigint;
|
|
47
|
+
gas?: bigint;
|
|
48
|
+
safeTxGas?: bigint;
|
|
43
49
|
account?: Address;
|
|
44
50
|
};
|
|
45
51
|
export type TransactionReviewOptions = Omit<TransactionReviewRequest, "calls"> & {
|
|
@@ -47,15 +53,27 @@ export type TransactionReviewOptions = Omit<TransactionReviewRequest, "calls"> &
|
|
|
47
53
|
contractName?: string;
|
|
48
54
|
};
|
|
49
55
|
type TransactionReviewHandler = (request: TransactionReviewRequest) => Promise<boolean>;
|
|
56
|
+
/** The person closed a review or a funding-chain choice. Nothing was sent; apps need not show an error. */
|
|
57
|
+
export declare class TransactionReviewCancelledError extends Error {
|
|
58
|
+
constructor(message?: string);
|
|
59
|
+
}
|
|
50
60
|
export type FundingChainOption = {
|
|
51
61
|
chainId: number;
|
|
52
|
-
/** The chain
|
|
62
|
+
/** The chain and its quoted cost, from {@link fundingChainLabel}. */
|
|
53
63
|
label: string;
|
|
54
64
|
};
|
|
55
|
-
type FundingChainSelectionHandler = (options: readonly FundingChainOption[]
|
|
65
|
+
type FundingChainSelectionHandler = (options: readonly FundingChainOption[],
|
|
66
|
+
/** The option to preselect, or null when the person must pick one of several. */
|
|
67
|
+
initialChainId: number | null) => Promise<number | null>;
|
|
68
|
+
/** "Base (~0.000123 ETH)": a chain and the relay fee quoted on it. */
|
|
69
|
+
export declare function fundingChainLabel(chainName: string, amountWei: bigint): string;
|
|
56
70
|
export declare function registerFundingChainSelectionHandler(handler: FundingChainSelectionHandler): () => void;
|
|
57
|
-
/**
|
|
58
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Asks where to pay a relay fee. The connected chain is preselected when it is
|
|
73
|
+
* quoted, and so is a lone quote; otherwise the person picks. The exact payment
|
|
74
|
+
* still gets its own review.
|
|
75
|
+
*/
|
|
76
|
+
export declare function requireFundingChainSelection(options: readonly FundingChainOption[], preferredChainId?: number): Promise<number>;
|
|
59
77
|
/**
|
|
60
78
|
* The provider registers the only UI capable of approving a transaction.
|
|
61
79
|
* Keeping the entry point in a small client module lets non-React wallet
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionReview.d.ts","sourceRoot":"","sources":["../../../src/review/transactionReview.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"transactionReview.d.ts","sourceRoot":"","sources":["../../../src/review/transactionReview.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { encodeFunctionData } from "viem";
|
|
2
|
+
import { encodeFunctionData, formatEther, } from "viem";
|
|
3
3
|
const transactionReviewHandlers = [];
|
|
4
|
+
/** The person closed a review or a funding-chain choice. Nothing was sent; apps need not show an error. */
|
|
5
|
+
export class TransactionReviewCancelledError extends Error {
|
|
6
|
+
constructor(message = "Review closed. Nothing was sent.") {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "TransactionReviewCancelledError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** "Base (~0.000123 ETH)": a chain and the relay fee quoted on it. */
|
|
12
|
+
export function fundingChainLabel(chainName, amountWei) {
|
|
13
|
+
const exact = formatEther(amountWei);
|
|
14
|
+
const shown = new Intl.NumberFormat("en-US", {
|
|
15
|
+
maximumSignificantDigits: 3,
|
|
16
|
+
}).format(Number(exact));
|
|
17
|
+
return `${chainName} (${shown === exact ? "" : "~"}${shown} ETH)`;
|
|
18
|
+
}
|
|
4
19
|
const fundingChainSelectionHandlers = [];
|
|
5
20
|
export function registerFundingChainSelectionHandler(handler) {
|
|
6
21
|
fundingChainSelectionHandlers.push(handler);
|
|
@@ -10,8 +25,12 @@ export function registerFundingChainSelectionHandler(handler) {
|
|
|
10
25
|
fundingChainSelectionHandlers.splice(index, 1);
|
|
11
26
|
};
|
|
12
27
|
}
|
|
13
|
-
/**
|
|
14
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Asks where to pay a relay fee. The connected chain is preselected when it is
|
|
30
|
+
* quoted, and so is a lone quote; otherwise the person picks. The exact payment
|
|
31
|
+
* still gets its own review.
|
|
32
|
+
*/
|
|
33
|
+
export async function requireFundingChainSelection(options, preferredChainId) {
|
|
15
34
|
const snapshot = options.map((option) => ({ ...option }));
|
|
16
35
|
const chainIds = new Set(snapshot.map((option) => option.chainId));
|
|
17
36
|
if (!snapshot.length ||
|
|
@@ -25,9 +44,14 @@ export async function requireFundingChainSelection(options) {
|
|
|
25
44
|
if (!handler) {
|
|
26
45
|
throw new Error("Funding chain selection is unavailable. Reload the page before continuing.");
|
|
27
46
|
}
|
|
28
|
-
const
|
|
47
|
+
const initialChainId = preferredChainId !== undefined && chainIds.has(preferredChainId)
|
|
48
|
+
? preferredChainId
|
|
49
|
+
: snapshot.length === 1
|
|
50
|
+
? snapshot[0].chainId
|
|
51
|
+
: null;
|
|
52
|
+
const selected = await handler(snapshot, initialChainId);
|
|
29
53
|
if (selected === null) {
|
|
30
|
-
throw new
|
|
54
|
+
throw new TransactionReviewCancelledError("Funding chain selection cancelled. Nothing was sent.");
|
|
31
55
|
}
|
|
32
56
|
if (!chainIds.has(selected)) {
|
|
33
57
|
throw new Error("The selected funding chain is not available in this quote.");
|
|
@@ -69,6 +93,8 @@ function contractCallForReview(call, options = {}) {
|
|
|
69
93
|
to: call.address,
|
|
70
94
|
data,
|
|
71
95
|
value: call.value,
|
|
96
|
+
gas: call.gas,
|
|
97
|
+
safeTxGas: call.safeTxGas,
|
|
72
98
|
from: call.account,
|
|
73
99
|
abi: call.abi,
|
|
74
100
|
functionName: call.functionName,
|
|
@@ -90,18 +116,14 @@ export function requestContractTransactionReview(call, options = {}) {
|
|
|
90
116
|
if (current.chainId !== reviewed.chainId ||
|
|
91
117
|
current.to.toLowerCase() !== reviewed.to.toLowerCase() ||
|
|
92
118
|
(current.value ?? 0n) !== (reviewed.value ?? 0n) ||
|
|
119
|
+
current.gas !== reviewed.gas ||
|
|
120
|
+
current.safeTxGas !== reviewed.safeTxGas ||
|
|
93
121
|
current.data !== reviewed.data) {
|
|
94
122
|
throw new Error("Transaction data changed after review. Nothing was sent; review it again.");
|
|
95
123
|
}
|
|
96
124
|
return true;
|
|
97
125
|
});
|
|
98
126
|
}
|
|
99
|
-
class TransactionReviewCancelledError extends Error {
|
|
100
|
-
constructor() {
|
|
101
|
-
super("Review closed. Nothing was sent.");
|
|
102
|
-
this.name = "TransactionReviewCancelledError";
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
127
|
export async function requireTransactionReview(request) {
|
|
106
128
|
if (!(await requestTransactionReview(request))) {
|
|
107
129
|
throw new TransactionReviewCancelledError();
|
|
@@ -118,6 +140,10 @@ export function transactionReviewJson(request) {
|
|
|
118
140
|
from: call.from,
|
|
119
141
|
to: call.to,
|
|
120
142
|
value: `0x${(call.value ?? 0n).toString(16)}`,
|
|
143
|
+
...(call.gas === undefined ? {} : { gas: `0x${call.gas.toString(16)}` }),
|
|
144
|
+
...(call.safeTxGas === undefined
|
|
145
|
+
? {}
|
|
146
|
+
: { safeTxGas: `0x${call.safeTxGas.toString(16)}` }),
|
|
121
147
|
data: call.data,
|
|
122
148
|
}));
|
|
123
149
|
const calls = transactions.length === 1 ? transactions[0] : { transactions };
|
|
@@ -150,7 +176,7 @@ export function buildTransactionDebugPrompt(calls, { chainName: displayChainName
|
|
|
150
176
|
}
|
|
151
177
|
export function buildTransactionReviewPrompt(request, { explorerOrigin }) {
|
|
152
178
|
const lines = [
|
|
153
|
-
"I'm about to authorize a blockchain
|
|
179
|
+
"I'm about to authorize a blockchain action in a Juicebox V6 app (the nana V6 / revnet V6 protocol release, not an older Juicebox version). Act as a careful security reviewer. Independently verify the payload against the deployed contracts and V6 source, confirm it matches my intent, and give a go/no-go. Assume the UI could be spoofed; trust the onchain call and verified V6 source over the page.",
|
|
154
180
|
"",
|
|
155
181
|
"Exact app-controlled transaction payload:",
|
|
156
182
|
"```json",
|
|
@@ -179,10 +205,11 @@ export function buildTransactionReviewPrompt(request, { explorerOrigin }) {
|
|
|
179
205
|
lines.push("");
|
|
180
206
|
lines.push("Check specifically:");
|
|
181
207
|
lines.push("1. Decode the calldata selector and every argument. Explain in plain English what state, permissions, ownership, tokens, or funds can change.");
|
|
182
|
-
lines.push("2. Verify the chain ID, `to` address, native `value`, and
|
|
208
|
+
lines.push("2. Verify the chain ID, `to` address, native `value`, calldata, and any `gas` or `safeTxGas` exactly. Flag any unexpected non-zero value or unknown target.");
|
|
183
209
|
lines.push("3. Identify every beneficiary, recipient, spender, operator, owner, hook, terminal, and permission-bearing address in the decoded arguments.");
|
|
184
210
|
lines.push("4. Warn about unlimited approvals, arbitrary-call capability, delegatecalls, ownership transfers, permission grants, upgradeability, or drain paths.");
|
|
185
211
|
lines.push("5. For multiple chains, confirm the intended change is consistent and that no extra chain or call was added.");
|
|
212
|
+
lines.push("6. For a Relayr or Safe authorization, separate what I sign now from the later onchain execution. A Safe `safeTxGas` of 0 makes the Safe transaction revert if the call fails; a nonzero value lets it execute and record the failure.");
|
|
186
213
|
lines.push("");
|
|
187
214
|
lines.push("Before your verdict, quiz me with 2–4 short plain-English questions about what I expect to happen (what changes, who receives or controls what, how much value moves, and on which chain). Wait for my answers, compare them with the decoded payload, and flag every mismatch.");
|
|
188
215
|
lines.push("");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionReview.js","sourceRoot":"","sources":["../../../src/review/transactionReview.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,
|
|
1
|
+
{"version":3,"file":"transactionReview.js","sourceRoot":"","sources":["../../../src/review/transactionReview.ts"],"names":[],"mappings":"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"}
|