@dev.sail.money/sailor 0.0.2-19 → 0.0.2-20
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/package.json +1 -1
- package/packages/cli/dist/index.cjs +14 -14
- package/packages/cli/dist/server.cjs +139 -948
- package/packages/sdk/dist/intelligence.d.ts +1 -1
- package/packages/sdk/dist/intelligence.js +1 -1
- package/packages/ui/dist/assets/Arc-VDBY7LNS-BChRXCXW.js +1 -0
- package/packages/ui/dist/assets/Brave-BRAKJXDS-mq-Xo37j.js +1 -0
- package/packages/ui/dist/assets/Browser-76IHF3Y2-BMhRaC5Z.js +1 -0
- package/packages/ui/dist/assets/Chrome-65Q5P54Y-DR9MQEVr.js +1 -0
- package/packages/ui/dist/assets/Edge-XSPUTORV-DEoZslQE.js +1 -0
- package/packages/ui/dist/assets/Firefox-AAHGJQIP-Bp_Hm04m.js +1 -0
- package/packages/ui/dist/assets/Linux-OO4TNCLJ-B0aw93n9.js +1 -0
- package/packages/ui/dist/assets/Macos-MW4AE7LN-Vvm8Drw3.js +1 -0
- package/packages/ui/dist/assets/Opera-KQZLSACL-Cwv5MDFy.js +1 -0
- package/packages/ui/dist/assets/Safari-ZPL37GXR-C4Ggg6rz.js +1 -0
- package/packages/ui/dist/assets/Windows-PPTHQER6-BlyV2p7Y.js +1 -0
- package/packages/ui/dist/assets/add-BrylwREe.js +15 -0
- package/packages/ui/dist/assets/all-wallets-DGR35dSU.js +6 -0
- package/packages/ui/dist/assets/apechain-SX5YFU6N-q5qBv-mp.js +1 -0
- package/packages/ui/dist/assets/app-store-BpM1x6bI.js +17 -0
- package/packages/ui/dist/assets/apple-xvs7JX23.js +18 -0
- package/packages/ui/dist/assets/ar_AR-LIPSOZP5-BQrIDibT.js +1519 -0
- package/packages/ui/dist/assets/arbitrum-WURIBY6W-CqVkHBr5.js +1 -0
- package/packages/ui/dist/assets/arrow-bottom-CF6xPQbH.js +8 -0
- package/packages/ui/dist/assets/arrow-bottom-circle-r0A6jlRF.js +11 -0
- package/packages/ui/dist/assets/arrow-left-Ce6MJKC0.js +8 -0
- package/packages/ui/dist/assets/arrow-right-CiCNIsI0.js +8 -0
- package/packages/ui/dist/assets/arrow-top-TI5RQSIc.js +8 -0
- package/packages/ui/dist/assets/assets-Q6ZU7ZJ5-P8HioiAD.js +1 -0
- package/packages/ui/dist/assets/avalanche-KOMJD3XY-Dsn_JPR4.js +1 -0
- package/packages/ui/dist/assets/bank-CmrK2TRa.js +14 -0
- package/packages/ui/dist/assets/base-OAXLRA4F-CoYTVIiL.js +1 -0
- package/packages/ui/dist/assets/base-QS6CYWIN-CsjdbWCf.js +1 -0
- package/packages/ui/dist/assets/basic-BhoXad_6.js +2128 -0
- package/packages/ui/dist/assets/berachain-NJECWIVC-DumxnFvf.js +1 -0
- package/packages/ui/dist/assets/blast-V555OVXZ-BbhJh1tj.js +1 -0
- package/packages/ui/dist/assets/browser-BWCT-XSy.js +14 -0
- package/packages/ui/dist/assets/bsc-N647EYR2-B2nLKXWV.js +1 -0
- package/packages/ui/dist/assets/card-v1fl0QNj.js +14 -0
- package/packages/ui/dist/assets/ccip-BkGqsEgG.js +1 -0
- package/packages/ui/dist/assets/celo-GEP4TUHG-CenIBYLU.js +1 -0
- package/packages/ui/dist/assets/checkmark-CiQnNFee.js +11 -0
- package/packages/ui/dist/assets/checkmark-bold-B63f9SW6.js +8 -0
- package/packages/ui/dist/assets/chevron-bottom-DpBpDiYb.js +8 -0
- package/packages/ui/dist/assets/chevron-left-o_G-ctyg.js +8 -0
- package/packages/ui/dist/assets/chevron-right-I9LAJ9De.js +8 -0
- package/packages/ui/dist/assets/chevron-top-JRwGHMKH.js +8 -0
- package/packages/ui/dist/assets/chrome-store-Cw9skzSt.js +61 -0
- package/packages/ui/dist/assets/clock-BK_Lu0EB.js +8 -0
- package/packages/ui/dist/assets/close-DWFjOyu7.js +8 -0
- package/packages/ui/dist/assets/coinPlaceholder-gi3wDlPb.js +8 -0
- package/packages/ui/dist/assets/compass-Dlpsn_k-.js +8 -0
- package/packages/ui/dist/assets/connect-UA7M4XW6-IY3X6Bmr.js +1 -0
- package/packages/ui/dist/assets/copy-BzNKdXeG.js +15 -0
- package/packages/ui/dist/assets/core-BN9UnMip.js +907 -0
- package/packages/ui/dist/assets/create-FASO7PVG-D_rvSpre.js +1 -0
- package/packages/ui/dist/assets/cronos-HJPAQTAE-BEOvlOC4.js +1 -0
- package/packages/ui/dist/assets/cursor-BWdjWDLC.js +3 -0
- package/packages/ui/dist/assets/cursor-transparent-B3RZ6Udt.js +12 -0
- package/packages/ui/dist/assets/de_DE-YE3KOFHU-BRt5ztUe.js +1519 -0
- package/packages/ui/dist/assets/degen-FQQ4XGHB-CeHTs88l.js +1 -0
- package/packages/ui/dist/assets/desktop-rngwE1T9.js +9 -0
- package/packages/ui/dist/assets/disconnect-_DzDsvsZ.js +8 -0
- package/packages/ui/dist/assets/discord-B9qQB66m.js +17 -0
- package/packages/ui/dist/assets/es_419-7LMPU7G4-DH7rM0yQ.js +1519 -0
- package/packages/ui/dist/assets/ethereum-RGGVA4PY-SWGOlkuk.js +1 -0
- package/packages/ui/dist/assets/etherscan-D7hlQ8Z3.js +6 -0
- package/packages/ui/dist/assets/events-DrkgavVp.js +1 -0
- package/packages/ui/dist/assets/exclamation-triangle-iCvLVoM-.js +4 -0
- package/packages/ui/dist/assets/extension-CjGcOeuB.js +8 -0
- package/packages/ui/dist/assets/external-link-DTkyjOr4.js +8 -0
- package/packages/ui/dist/assets/facebook-DoO2uCiE.js +26 -0
- package/packages/ui/dist/assets/fallback-Y8-BiCNG.js +1 -0
- package/packages/ui/dist/assets/farcaster-Dyz6wiZi.js +12 -0
- package/packages/ui/dist/assets/filters-Bd5PxMiz.js +8 -0
- package/packages/ui/dist/assets/flow-5FQJFCTK-CUie2reO.js +1 -0
- package/packages/ui/dist/assets/fr_FR-VBJP3ZLL-B-_ocunw.js +1519 -0
- package/packages/ui/dist/assets/github-CmqSJCq6.js +18 -0
- package/packages/ui/dist/assets/gnosis-37ZC4RBL-B137OtHZ.js +1 -0
- package/packages/ui/dist/assets/google-i_MKKqQP.js +18 -0
- package/packages/ui/dist/assets/gravity-J5YQHTYH-Bj6B0uod.js +1 -0
- package/packages/ui/dist/assets/hardhat-TX56IT5N-CV1FY-wE.js +1 -0
- package/packages/ui/dist/assets/help-circle-_ER8-V35.js +12 -0
- package/packages/ui/dist/assets/hi_IN-WBVD5XYI-D73g2UFs.js +1519 -0
- package/packages/ui/dist/assets/hyperevm-VKPAA4SA-CHwraEsx.js +1 -0
- package/packages/ui/dist/assets/id-D2adRwvh.js +12 -0
- package/packages/ui/dist/assets/id_ID-SBYANJ7G-Cjpa4ay6.js +1519 -0
- package/packages/ui/dist/assets/image-q_rpi7cn.js +4 -0
- package/packages/ui/dist/assets/index-B6Wb3mjQ.js +1 -0
- package/packages/ui/dist/assets/index-BLD08Nrb.js +1 -0
- package/packages/ui/dist/assets/index-Bdl623mb.js +395 -0
- package/packages/ui/dist/assets/index-BwoSt5mL.js +1 -0
- package/packages/ui/dist/assets/index-CzevBC-K.js +16 -0
- package/packages/ui/dist/assets/index-DDKDa0s2.css +1 -0
- package/packages/ui/dist/assets/index-DJQDBPts.js +1775 -0
- package/packages/ui/dist/assets/index.es-D6UPoR2j.js +26 -0
- package/packages/ui/dist/assets/info-Ck7GYYmo.js +3 -0
- package/packages/ui/dist/assets/info-circle-DtA5FQXd.js +12 -0
- package/packages/ui/dist/assets/ink-FZMYZWHG-62p-5IK5.js +1 -0
- package/packages/ui/dist/assets/ja_JP-ZRMWJV3I-DXbifiMm.js +1519 -0
- package/packages/ui/dist/assets/kaia-65D2U3PU-JmuLQ4gC.js +1 -0
- package/packages/ui/dist/assets/ko_KR-FR54RFUG-upinSHjQ.js +1519 -0
- package/packages/ui/dist/assets/lightbulb-DR3jyzkK.js +3 -0
- package/packages/ui/dist/assets/linea-QRMVQ5DY-DuI3vv0d.js +1 -0
- package/packages/ui/dist/assets/login-UP3DZBGS-Db_wM5oQ.js +1 -0
- package/packages/ui/dist/assets/mail-BK_pW_tL.js +8 -0
- package/packages/ui/dist/assets/manta-SI27YFEJ-CpVOKa06.js +1 -0
- package/packages/ui/dist/assets/mantle-CKIUT334-DR2WgqzU.js +1 -0
- package/packages/ui/dist/assets/metaMaskWallet-EI6MED72-D5HFOsnz.js +1 -0
- package/packages/ui/dist/assets/metamask-sdk-IZbe4GJ_.js +542 -0
- package/packages/ui/dist/assets/mobile-CLG-4Yut.js +9 -0
- package/packages/ui/dist/assets/monad-4KWC6TSS-DVXSkpiz.js +1 -0
- package/packages/ui/dist/assets/more-BBqkkVbe.js +11 -0
- package/packages/ui/dist/assets/ms_MY-EZSGYYYQ-4cPLK-3L.js +1519 -0
- package/packages/ui/dist/assets/native-CJ5et6AR.js +1 -0
- package/packages/ui/dist/assets/network-placeholder-kf7EWfmj.js +14 -0
- package/packages/ui/dist/assets/nftPlaceholder-BEFwtFPl.js +8 -0
- package/packages/ui/dist/assets/off-DKjJt-l0.js +8 -0
- package/packages/ui/dist/assets/optimism-HAF2GUT7-ec6Nqxs9.js +1 -0
- package/packages/ui/dist/assets/parseSignature-KWl5TpQf.js +1 -0
- package/packages/ui/dist/assets/play-store-DBVkWbwG.js +32 -0
- package/packages/ui/dist/assets/plus-BQzagKUL.js +13 -0
- package/packages/ui/dist/assets/polygon-WW6ZI7PM-DXlmm4L1.js +1 -0
- package/packages/ui/dist/assets/pt_BR-JQFQ3P4L-DOHfdcA2.js +1519 -0
- package/packages/ui/dist/assets/qr-code-DVwEgFEM.js +6 -0
- package/packages/ui/dist/assets/rainbowWallet-O26YNBMX-DUhYus-9.js +1 -0
- package/packages/ui/dist/assets/recycle-horizontal-D2E6B1Kh.js +9 -0
- package/packages/ui/dist/assets/refresh-CUavEsqn.js +8 -0
- package/packages/ui/dist/assets/refresh-S4T5V5GX-CwqIaaxK.js +1 -0
- package/packages/ui/dist/assets/reown-logo-mAAAaf4E.js +12 -0
- package/packages/ui/dist/assets/ronin-EMCPYXZT-N-QBHZdV.js +1 -0
- package/packages/ui/dist/assets/ru_RU-Z42UEJBP-Cvb2oWxQ.js +1519 -0
- package/packages/ui/dist/assets/safeWallet-5MNKTR5Z-D-5imDLD.js +1 -0
- package/packages/ui/dist/assets/sanko-RHQYXGM5-OX010CbN.js +1 -0
- package/packages/ui/dist/assets/scan-4UYSQ56Q-CjMz6-XC.js +1 -0
- package/packages/ui/dist/assets/scroll-5OBGQVOV-DJFECiai.js +1 -0
- package/packages/ui/dist/assets/search-BAnb6iT_.js +8 -0
- package/packages/ui/dist/assets/secp256k1-CBUZgsE-.js +1 -0
- package/packages/ui/dist/assets/send-BYjfitxS.js +15 -0
- package/packages/ui/dist/assets/sign-A7IJEUT5-CGsRnPrd.js +1 -0
- package/packages/ui/dist/assets/superposition-HG6MMR2Y-bRkgatRO.js +1 -0
- package/packages/ui/dist/assets/swapHorizontal-C-4qjxwd.js +8 -0
- package/packages/ui/dist/assets/swapHorizontalBold-zA-cWlfT.js +8 -0
- package/packages/ui/dist/assets/swapHorizontalMedium-gIIVXh3I.js +16 -0
- package/packages/ui/dist/assets/swapHorizontalRoundedBold-CwtQpc9E.js +8 -0
- package/packages/ui/dist/assets/swapVertical-wrdYsAkk.js +8 -0
- package/packages/ui/dist/assets/telegram-3aqbBSMX.js +16 -0
- package/packages/ui/dist/assets/th_TH-4YB4VSB2-BUipNP-V.js +1519 -0
- package/packages/ui/dist/assets/three-dots-BNRpZX3L.js +5 -0
- package/packages/ui/dist/assets/tr_TR-5FKHPPIO-D5jTpIm9.js +1519 -0
- package/packages/ui/dist/assets/twitch-Bya9c1W1.js +18 -0
- package/packages/ui/dist/assets/twitterIcon-1thOj_Z5.js +6 -0
- package/packages/ui/dist/assets/uk_UA-ZD4IBC52-DgnQrpzl.js +1519 -0
- package/packages/ui/dist/assets/unichain-C5BWO2ZY-BfguYsnu.js +1 -0
- package/packages/ui/dist/assets/verify-D8ggGSfI.js +8 -0
- package/packages/ui/dist/assets/verify-filled-CeZM7920.js +8 -0
- package/packages/ui/dist/assets/vi_VN-5EVRZKLY-x078672g.js +1519 -0
- package/packages/ui/dist/assets/w3m-modal-CUwD6iiA.js +642 -0
- package/packages/ui/dist/assets/wallet-Baz0DeMJ.js +8 -0
- package/packages/ui/dist/assets/wallet-placeholder-3yAnyuC4.js +14 -0
- package/packages/ui/dist/assets/walletConnectWallet-YHWKVTDY-D3lyiczV.js +1 -0
- package/packages/ui/dist/assets/walletconnect-CfkgbqAq.js +30 -0
- package/packages/ui/dist/assets/warning-circle-BfOqu3HN.js +12 -0
- package/packages/ui/dist/assets/x-CxAcJv-O.js +12 -0
- package/packages/ui/dist/assets/xdc-KJ3TDBYO-DNV6zchh.js +1 -0
- package/packages/ui/dist/assets/zetachain-TLDS5IPW-Udhyw16T.js +1 -0
- package/packages/ui/dist/assets/zh_CN-4XK5YJPR-Bt6Yz5Ek.js +1519 -0
- package/packages/ui/dist/assets/zh_HK-N4YN2WSI-Cvzl1V16.js +1519 -0
- package/packages/ui/dist/assets/zh_TW-CNCRXH6Z-BNelatfN.js +1519 -0
- package/packages/ui/dist/assets/zksync-DH7HK5U4-Dt4usFw6.js +1 -0
- package/packages/ui/dist/assets/zora-FYL5H3IO-iB4wygST.js +1 -0
- package/packages/ui/dist/index.html +14 -0
|
@@ -5113,7 +5113,7 @@ var require_lib2 = __commonJS({
|
|
|
5113
5113
|
iconv.encodings = null;
|
|
5114
5114
|
iconv.defaultCharUnicode = "\uFFFD";
|
|
5115
5115
|
iconv.defaultCharSingleByte = "?";
|
|
5116
|
-
iconv.encode = function
|
|
5116
|
+
iconv.encode = function encode4(str, encoding, options) {
|
|
5117
5117
|
str = "" + (str || "");
|
|
5118
5118
|
var encoder7 = iconv.getEncoder(encoding, options);
|
|
5119
5119
|
var res = encoder7.write(str);
|
|
@@ -15943,7 +15943,7 @@ var require_get_intrinsic = __commonJS({
|
|
|
15943
15943
|
var abs = require_abs();
|
|
15944
15944
|
var floor = require_floor();
|
|
15945
15945
|
var max = require_max();
|
|
15946
|
-
var
|
|
15946
|
+
var min = require_min();
|
|
15947
15947
|
var pow = require_pow();
|
|
15948
15948
|
var round = require_round();
|
|
15949
15949
|
var sign3 = require_sign();
|
|
@@ -16057,7 +16057,7 @@ var require_get_intrinsic = __commonJS({
|
|
|
16057
16057
|
"%Math.abs%": abs,
|
|
16058
16058
|
"%Math.floor%": floor,
|
|
16059
16059
|
"%Math.max%": max,
|
|
16060
|
-
"%Math.min%":
|
|
16060
|
+
"%Math.min%": min,
|
|
16061
16061
|
"%Math.pow%": pow,
|
|
16062
16062
|
"%Math.round%": round,
|
|
16063
16063
|
"%Math.sign%": sign3,
|
|
@@ -16626,7 +16626,7 @@ var require_utils = __commonJS({
|
|
|
16626
16626
|
}
|
|
16627
16627
|
};
|
|
16628
16628
|
var limit = 1024;
|
|
16629
|
-
var
|
|
16629
|
+
var encode4 = function encode5(str, defaultEncoder, charset, kind, format) {
|
|
16630
16630
|
if (str.length === 0) {
|
|
16631
16631
|
return str;
|
|
16632
16632
|
}
|
|
@@ -16728,7 +16728,7 @@ var require_utils = __commonJS({
|
|
|
16728
16728
|
combine,
|
|
16729
16729
|
compact,
|
|
16730
16730
|
decode: decode2,
|
|
16731
|
-
encode:
|
|
16731
|
+
encode: encode4,
|
|
16732
16732
|
isBuffer,
|
|
16733
16733
|
isOverflow,
|
|
16734
16734
|
isRegExp,
|
|
@@ -22055,12 +22055,12 @@ var require_cookie = __commonJS({
|
|
|
22055
22055
|
} while (++index2 < max);
|
|
22056
22056
|
return max;
|
|
22057
22057
|
}
|
|
22058
|
-
function endIndex(str, index2,
|
|
22059
|
-
while (index2 >
|
|
22058
|
+
function endIndex(str, index2, min) {
|
|
22059
|
+
while (index2 > min) {
|
|
22060
22060
|
var code = str.charCodeAt(--index2);
|
|
22061
22061
|
if (code !== 32 && code !== 9) return index2 + 1;
|
|
22062
22062
|
}
|
|
22063
|
-
return
|
|
22063
|
+
return min;
|
|
22064
22064
|
}
|
|
22065
22065
|
function serialize(name, val, opt) {
|
|
22066
22066
|
var enc = opt && opt.encode || encodeURIComponent;
|
|
@@ -27538,7 +27538,7 @@ var init_base = __esm({
|
|
|
27538
27538
|
});
|
|
27539
27539
|
|
|
27540
27540
|
// ../../node_modules/.pnpm/viem@2.51.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.4.3/node_modules/viem/_esm/errors/abi.js
|
|
27541
|
-
var AbiEncodingArrayLengthMismatchError, AbiEncodingBytesSizeMismatchError, AbiEncodingLengthMismatchError, AbiFunctionNotFoundError, AbiItemAmbiguityError, BytesSizeMismatchError, InvalidAbiEncodingTypeError, InvalidArrayError, InvalidDefinitionTypeError
|
|
27541
|
+
var AbiEncodingArrayLengthMismatchError, AbiEncodingBytesSizeMismatchError, AbiEncodingLengthMismatchError, AbiFunctionNotFoundError, AbiItemAmbiguityError, BytesSizeMismatchError, InvalidAbiEncodingTypeError, InvalidArrayError, InvalidDefinitionTypeError;
|
|
27542
27542
|
var init_abi = __esm({
|
|
27543
27543
|
"../../node_modules/.pnpm/viem@2.51.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.4.3/node_modules/viem/_esm/errors/abi.js"() {
|
|
27544
27544
|
init_formatAbiItem2();
|
|
@@ -27622,13 +27622,6 @@ var init_abi = __esm({
|
|
|
27622
27622
|
].join("\n"), { name: "InvalidDefinitionTypeError" });
|
|
27623
27623
|
}
|
|
27624
27624
|
};
|
|
27625
|
-
UnsupportedPackedAbiType = class extends BaseError2 {
|
|
27626
|
-
constructor(type) {
|
|
27627
|
-
super(`Type "${type}" is not supported for packed encoding.`, {
|
|
27628
|
-
name: "UnsupportedPackedAbiType"
|
|
27629
|
-
});
|
|
27630
|
-
}
|
|
27631
|
-
};
|
|
27632
27625
|
}
|
|
27633
27626
|
});
|
|
27634
27627
|
|
|
@@ -27696,8 +27689,8 @@ var init_encoding = __esm({
|
|
|
27696
27689
|
"../../node_modules/.pnpm/viem@2.51.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.4.3/node_modules/viem/_esm/errors/encoding.js"() {
|
|
27697
27690
|
init_base();
|
|
27698
27691
|
IntegerOutOfRangeError = class extends BaseError2 {
|
|
27699
|
-
constructor({ max, min
|
|
27700
|
-
super(`Number "${value}" is not in safe ${size6 ? `${size6 * 8}-bit ${signed ? "signed" : "unsigned"} ` : ""}integer range ${max ? `(${
|
|
27692
|
+
constructor({ max, min, signed, size: size6, value }) {
|
|
27693
|
+
super(`Number "${value}" is not in safe ${size6 ? `${size6 * 8}-bit ${signed ? "signed" : "unsigned"} ` : ""}integer range ${max ? `(${min} to ${max})` : `(above ${min})`}`, { name: "IntegerOutOfRangeError" });
|
|
27701
27694
|
}
|
|
27702
27695
|
};
|
|
27703
27696
|
SizeOverflowError = class extends BaseError2 {
|
|
@@ -28008,9 +28001,9 @@ function aexists(instance, checkFinished = true) {
|
|
|
28008
28001
|
}
|
|
28009
28002
|
function aoutput(out, instance) {
|
|
28010
28003
|
abytes(out);
|
|
28011
|
-
const
|
|
28012
|
-
if (out.length <
|
|
28013
|
-
throw new Error("digestInto() expects output buffer of length at least " +
|
|
28004
|
+
const min = instance.outputLen;
|
|
28005
|
+
if (out.length < min) {
|
|
28006
|
+
throw new Error("digestInto() expects output buffer of length at least " + min);
|
|
28014
28007
|
}
|
|
28015
28008
|
}
|
|
28016
28009
|
function u32(arr) {
|
|
@@ -28646,10 +28639,9 @@ var init_slice = __esm({
|
|
|
28646
28639
|
});
|
|
28647
28640
|
|
|
28648
28641
|
// ../../node_modules/.pnpm/viem@2.51.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.4.3/node_modules/viem/_esm/utils/regex.js
|
|
28649
|
-
var
|
|
28642
|
+
var bytesRegex2, integerRegex2;
|
|
28650
28643
|
var init_regex2 = __esm({
|
|
28651
28644
|
"../../node_modules/.pnpm/viem@2.51.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.4.3/node_modules/viem/_esm/utils/regex.js"() {
|
|
28652
|
-
arrayRegex = /^(.*)\[([0-9]*)\]$/;
|
|
28653
28645
|
bytesRegex2 = /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/;
|
|
28654
28646
|
integerRegex2 = /^(u?int)(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/;
|
|
28655
28647
|
}
|
|
@@ -28807,11 +28799,11 @@ function encodeBool(value) {
|
|
|
28807
28799
|
function encodeNumber(value, { signed, size: size6 = 256 }) {
|
|
28808
28800
|
if (typeof size6 === "number") {
|
|
28809
28801
|
const max = 2n ** (BigInt(size6) - (signed ? 1n : 0n)) - 1n;
|
|
28810
|
-
const
|
|
28811
|
-
if (value > max || value <
|
|
28802
|
+
const min = signed ? -max - 1n : 0n;
|
|
28803
|
+
if (value > max || value < min)
|
|
28812
28804
|
throw new IntegerOutOfRangeError({
|
|
28813
28805
|
max: max.toString(),
|
|
28814
|
-
min:
|
|
28806
|
+
min: min.toString(),
|
|
28815
28807
|
signed,
|
|
28816
28808
|
size: size6 / 8,
|
|
28817
28809
|
value: value.toString()
|
|
@@ -29420,8 +29412,8 @@ function getEncodableList(list) {
|
|
|
29420
29412
|
else
|
|
29421
29413
|
cursor.pushUint32(bodyLength);
|
|
29422
29414
|
}
|
|
29423
|
-
for (const { encode:
|
|
29424
|
-
|
|
29415
|
+
for (const { encode: encode4 } of list) {
|
|
29416
|
+
encode4(cursor);
|
|
29425
29417
|
}
|
|
29426
29418
|
}
|
|
29427
29419
|
};
|
|
@@ -30642,12 +30634,12 @@ function utf8ToBytes2(str) {
|
|
|
30642
30634
|
throw new Error("string expected");
|
|
30643
30635
|
return new Uint8Array(new TextEncoder().encode(str));
|
|
30644
30636
|
}
|
|
30645
|
-
function inRange(n,
|
|
30646
|
-
return isPosBig(n) && isPosBig(
|
|
30637
|
+
function inRange(n, min, max) {
|
|
30638
|
+
return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;
|
|
30647
30639
|
}
|
|
30648
|
-
function aInRange(title, n,
|
|
30649
|
-
if (!inRange(n,
|
|
30650
|
-
throw new Error("expected valid " + title + ": " +
|
|
30640
|
+
function aInRange(title, n, min, max) {
|
|
30641
|
+
if (!inRange(n, min, max))
|
|
30642
|
+
throw new Error("expected valid " + title + ": " + min + " <= n < " + max + ", got " + n);
|
|
30651
30643
|
}
|
|
30652
30644
|
function bitLen(n) {
|
|
30653
30645
|
let len;
|
|
@@ -30772,80 +30764,6 @@ var init_chain = __esm({
|
|
|
30772
30764
|
}
|
|
30773
30765
|
});
|
|
30774
30766
|
|
|
30775
|
-
// ../../node_modules/.pnpm/viem@2.51.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.4.3/node_modules/viem/_esm/utils/abi/encodePacked.js
|
|
30776
|
-
function encodePacked(types, values) {
|
|
30777
|
-
if (types.length !== values.length)
|
|
30778
|
-
throw new AbiEncodingLengthMismatchError({
|
|
30779
|
-
expectedLength: types.length,
|
|
30780
|
-
givenLength: values.length
|
|
30781
|
-
});
|
|
30782
|
-
const data = [];
|
|
30783
|
-
for (let i = 0; i < types.length; i++) {
|
|
30784
|
-
const type = types[i];
|
|
30785
|
-
const value = values[i];
|
|
30786
|
-
data.push(encode(type, value));
|
|
30787
|
-
}
|
|
30788
|
-
return concatHex(data);
|
|
30789
|
-
}
|
|
30790
|
-
function encode(type, value, isArray = false) {
|
|
30791
|
-
if (type === "address") {
|
|
30792
|
-
const address = value;
|
|
30793
|
-
if (!isAddress(address))
|
|
30794
|
-
throw new InvalidAddressError({ address });
|
|
30795
|
-
return pad(address.toLowerCase(), {
|
|
30796
|
-
size: isArray ? 32 : null
|
|
30797
|
-
});
|
|
30798
|
-
}
|
|
30799
|
-
if (type === "string")
|
|
30800
|
-
return stringToHex(value);
|
|
30801
|
-
if (type === "bytes")
|
|
30802
|
-
return value;
|
|
30803
|
-
if (type === "bool")
|
|
30804
|
-
return pad(boolToHex(value), { size: isArray ? 32 : 1 });
|
|
30805
|
-
const intMatch = type.match(integerRegex2);
|
|
30806
|
-
if (intMatch) {
|
|
30807
|
-
const [_type, baseType, bits = "256"] = intMatch;
|
|
30808
|
-
const size6 = Number.parseInt(bits, 10) / 8;
|
|
30809
|
-
return numberToHex(value, {
|
|
30810
|
-
size: isArray ? 32 : size6,
|
|
30811
|
-
signed: baseType === "int"
|
|
30812
|
-
});
|
|
30813
|
-
}
|
|
30814
|
-
const bytesMatch = type.match(bytesRegex2);
|
|
30815
|
-
if (bytesMatch) {
|
|
30816
|
-
const [_type, size6] = bytesMatch;
|
|
30817
|
-
if (Number.parseInt(size6, 10) !== (value.length - 2) / 2)
|
|
30818
|
-
throw new BytesSizeMismatchError({
|
|
30819
|
-
expectedSize: Number.parseInt(size6, 10),
|
|
30820
|
-
givenSize: (value.length - 2) / 2
|
|
30821
|
-
});
|
|
30822
|
-
return pad(value, { dir: "right", size: isArray ? 32 : null });
|
|
30823
|
-
}
|
|
30824
|
-
const arrayMatch = type.match(arrayRegex);
|
|
30825
|
-
if (arrayMatch && Array.isArray(value)) {
|
|
30826
|
-
const [_type, childType] = arrayMatch;
|
|
30827
|
-
const data = [];
|
|
30828
|
-
for (let i = 0; i < value.length; i++) {
|
|
30829
|
-
data.push(encode(childType, value[i], true));
|
|
30830
|
-
}
|
|
30831
|
-
if (data.length === 0)
|
|
30832
|
-
return "0x";
|
|
30833
|
-
return concatHex(data);
|
|
30834
|
-
}
|
|
30835
|
-
throw new UnsupportedPackedAbiType(type);
|
|
30836
|
-
}
|
|
30837
|
-
var init_encodePacked = __esm({
|
|
30838
|
-
"../../node_modules/.pnpm/viem@2.51.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.4.3/node_modules/viem/_esm/utils/abi/encodePacked.js"() {
|
|
30839
|
-
init_abi();
|
|
30840
|
-
init_address();
|
|
30841
|
-
init_isAddress();
|
|
30842
|
-
init_concat();
|
|
30843
|
-
init_pad();
|
|
30844
|
-
init_toHex();
|
|
30845
|
-
init_regex2();
|
|
30846
|
-
}
|
|
30847
|
-
});
|
|
30848
|
-
|
|
30849
30767
|
// ../../node_modules/.pnpm/viem@2.51.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.4.3/node_modules/viem/_esm/utils/transaction/assertTransaction.js
|
|
30850
30768
|
function assertTransactionEIP7702(transaction) {
|
|
30851
30769
|
const { authorizationList } = transaction;
|
|
@@ -33621,8 +33539,6 @@ var init_esm = __esm({
|
|
|
33621
33539
|
init_exports();
|
|
33622
33540
|
init_address2();
|
|
33623
33541
|
init_encodeFunctionData();
|
|
33624
|
-
init_encodePacked();
|
|
33625
|
-
init_pad();
|
|
33626
33542
|
init_toBytes();
|
|
33627
33543
|
init_keccak256();
|
|
33628
33544
|
init_hashTypedData();
|
|
@@ -35082,8 +34998,8 @@ var init_encoding2 = __esm({
|
|
|
35082
34998
|
"../../node_modules/.pnpm/viem@2.51.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.25.76/node_modules/viem/_esm/errors/encoding.js"() {
|
|
35083
34999
|
init_base2();
|
|
35084
35000
|
IntegerOutOfRangeError2 = class extends BaseError4 {
|
|
35085
|
-
constructor({ max, min
|
|
35086
|
-
super(`Number "${value}" is not in safe ${size6 ? `${size6 * 8}-bit ${signed ? "signed" : "unsigned"} ` : ""}integer range ${max ? `(${
|
|
35001
|
+
constructor({ max, min, signed, size: size6, value }) {
|
|
35002
|
+
super(`Number "${value}" is not in safe ${size6 ? `${size6 * 8}-bit ${signed ? "signed" : "unsigned"} ` : ""}integer range ${max ? `(${min} to ${max})` : `(above ${min})`}`, { name: "IntegerOutOfRangeError" });
|
|
35087
35003
|
}
|
|
35088
35004
|
};
|
|
35089
35005
|
InvalidBytesBooleanError = class extends BaseError4 {
|
|
@@ -35812,11 +35728,11 @@ function encodeBool2(value) {
|
|
|
35812
35728
|
function encodeNumber2(value, { signed, size: size6 = 256 }) {
|
|
35813
35729
|
if (typeof size6 === "number") {
|
|
35814
35730
|
const max = 2n ** (BigInt(size6) - (signed ? 1n : 0n)) - 1n;
|
|
35815
|
-
const
|
|
35816
|
-
if (value > max || value <
|
|
35731
|
+
const min = signed ? -max - 1n : 0n;
|
|
35732
|
+
if (value > max || value < min)
|
|
35817
35733
|
throw new IntegerOutOfRangeError2({
|
|
35818
35734
|
max: max.toString(),
|
|
35819
|
-
min:
|
|
35735
|
+
min: min.toString(),
|
|
35820
35736
|
signed,
|
|
35821
35737
|
size: size6 / 8,
|
|
35822
35738
|
value: value.toString()
|
|
@@ -38916,8 +38832,8 @@ var init_Hex = __esm({
|
|
|
38916
38832
|
encoder6 = /* @__PURE__ */ new TextEncoder();
|
|
38917
38833
|
hexes5 = /* @__PURE__ */ Array.from({ length: 256 }, (_v, i) => i.toString(16).padStart(2, "0"));
|
|
38918
38834
|
IntegerOutOfRangeError3 = class extends BaseError5 {
|
|
38919
|
-
constructor({ max, min
|
|
38920
|
-
super(`Number \`${value}\` is not in safe${size6 ? ` ${size6 * 8}-bit` : ""}${signed ? " signed" : " unsigned"} integer range ${max ? `(\`${
|
|
38835
|
+
constructor({ max, min, signed, size: size6, value }) {
|
|
38836
|
+
super(`Number \`${value}\` is not in safe${size6 ? ` ${size6 * 8}-bit` : ""}${signed ? " signed" : " unsigned"} integer range ${max ? `(\`${min}\` to \`${max}\`)` : `(above \`${min}\`)`}`);
|
|
38921
38837
|
Object.defineProperty(this, "name", {
|
|
38922
38838
|
enumerable: true,
|
|
38923
38839
|
configurable: true,
|
|
@@ -40780,35 +40696,6 @@ var KERNEL_ERROR_SIGNATURES = [
|
|
|
40780
40696
|
];
|
|
40781
40697
|
var KERNEL_ERROR_ABI = parseAbi(KERNEL_ERROR_SIGNATURES);
|
|
40782
40698
|
|
|
40783
|
-
// ../sdk/dist/eip712.js
|
|
40784
|
-
var REGISTER_PERMISSIONS_BATCH_TYPES = {
|
|
40785
|
-
RegisterPermissions: [
|
|
40786
|
-
{ name: "account", type: "address" },
|
|
40787
|
-
{ name: "permissions", type: "address[]" },
|
|
40788
|
-
{ name: "nonce", type: "uint256" },
|
|
40789
|
-
{ name: "deadline", type: "uint256" }
|
|
40790
|
-
]
|
|
40791
|
-
};
|
|
40792
|
-
function buildRegisterPermissionsBatchTypedData(args) {
|
|
40793
|
-
const deadline = args.deadline ?? BigInt(Math.floor(Date.now() / 1e3) + 600);
|
|
40794
|
-
return {
|
|
40795
|
-
domain: {
|
|
40796
|
-
name: "SailKernel",
|
|
40797
|
-
version: "1",
|
|
40798
|
-
chainId: args.chainId,
|
|
40799
|
-
verifyingContract: args.kernel
|
|
40800
|
-
},
|
|
40801
|
-
types: REGISTER_PERMISSIONS_BATCH_TYPES,
|
|
40802
|
-
primaryType: "RegisterPermissions",
|
|
40803
|
-
message: {
|
|
40804
|
-
account: args.account,
|
|
40805
|
-
permissions: args.permissions,
|
|
40806
|
-
nonce: args.nonce.toString(),
|
|
40807
|
-
deadline: deadline.toString()
|
|
40808
|
-
}
|
|
40809
|
-
};
|
|
40810
|
-
}
|
|
40811
|
-
|
|
40812
40699
|
// ../sdk/dist/lifi.js
|
|
40813
40700
|
init_esm();
|
|
40814
40701
|
var ERC20_ABI = parseAbi([
|
|
@@ -40874,9 +40761,9 @@ function anumArr(label, input) {
|
|
|
40874
40761
|
function chain(...args) {
|
|
40875
40762
|
const id = (a) => a;
|
|
40876
40763
|
const wrap3 = (a, b) => (c) => a(b(c));
|
|
40877
|
-
const
|
|
40764
|
+
const encode4 = args.map((x) => x.encode).reduceRight(wrap3, id);
|
|
40878
40765
|
const decode2 = args.map((x) => x.decode).reduce(wrap3, id);
|
|
40879
|
-
return { encode:
|
|
40766
|
+
return { encode: encode4, decode: decode2 };
|
|
40880
40767
|
}
|
|
40881
40768
|
// @__NO_SIDE_EFFECTS__
|
|
40882
40769
|
function alphabet(letters) {
|
|
@@ -41643,83 +41530,8 @@ var LocalKeyring = class _LocalKeyring {
|
|
|
41643
41530
|
}
|
|
41644
41531
|
};
|
|
41645
41532
|
|
|
41646
|
-
// ../sdk/dist/abis/SailGovernance.js
|
|
41647
|
-
var SailGovernanceAbi = [
|
|
41648
|
-
{
|
|
41649
|
-
type: "function",
|
|
41650
|
-
name: "baseFee",
|
|
41651
|
-
stateMutability: "view",
|
|
41652
|
-
inputs: [],
|
|
41653
|
-
outputs: [{ type: "uint256" }]
|
|
41654
|
-
},
|
|
41655
|
-
{
|
|
41656
|
-
type: "function",
|
|
41657
|
-
name: "complexityRate",
|
|
41658
|
-
stateMutability: "view",
|
|
41659
|
-
inputs: [],
|
|
41660
|
-
outputs: [{ type: "uint256" }]
|
|
41661
|
-
},
|
|
41662
|
-
{
|
|
41663
|
-
type: "function",
|
|
41664
|
-
name: "MAX_PERMISSION_FEE_WEI",
|
|
41665
|
-
stateMutability: "view",
|
|
41666
|
-
inputs: [],
|
|
41667
|
-
outputs: [{ type: "uint256" }]
|
|
41668
|
-
},
|
|
41669
|
-
{
|
|
41670
|
-
type: "function",
|
|
41671
|
-
name: "permissionRegistrationFee",
|
|
41672
|
-
stateMutability: "view",
|
|
41673
|
-
inputs: [],
|
|
41674
|
-
outputs: [{ type: "uint256" }]
|
|
41675
|
-
},
|
|
41676
|
-
{
|
|
41677
|
-
type: "function",
|
|
41678
|
-
name: "maxPermissionsPerAccount",
|
|
41679
|
-
stateMutability: "view",
|
|
41680
|
-
inputs: [],
|
|
41681
|
-
outputs: [{ type: "uint256" }]
|
|
41682
|
-
},
|
|
41683
|
-
{
|
|
41684
|
-
type: "function",
|
|
41685
|
-
name: "isPaused",
|
|
41686
|
-
stateMutability: "view",
|
|
41687
|
-
inputs: [],
|
|
41688
|
-
outputs: [{ type: "bool" }]
|
|
41689
|
-
}
|
|
41690
|
-
];
|
|
41691
|
-
|
|
41692
41533
|
// ../sdk/dist/safe.js
|
|
41693
41534
|
init_esm();
|
|
41694
|
-
var setManagerAbi = [
|
|
41695
|
-
{
|
|
41696
|
-
type: "function",
|
|
41697
|
-
name: "setManager",
|
|
41698
|
-
stateMutability: "nonpayable",
|
|
41699
|
-
inputs: [{ name: "newManager", type: "address" }],
|
|
41700
|
-
outputs: []
|
|
41701
|
-
}
|
|
41702
|
-
];
|
|
41703
|
-
var gnosisSafeExecAbi = [
|
|
41704
|
-
{
|
|
41705
|
-
type: "function",
|
|
41706
|
-
name: "execTransaction",
|
|
41707
|
-
stateMutability: "payable",
|
|
41708
|
-
inputs: [
|
|
41709
|
-
{ name: "to", type: "address" },
|
|
41710
|
-
{ name: "value", type: "uint256" },
|
|
41711
|
-
{ name: "data", type: "bytes" },
|
|
41712
|
-
{ name: "operation", type: "uint8" },
|
|
41713
|
-
{ name: "safeTxGas", type: "uint256" },
|
|
41714
|
-
{ name: "baseGas", type: "uint256" },
|
|
41715
|
-
{ name: "gasPrice", type: "uint256" },
|
|
41716
|
-
{ name: "gasToken", type: "address" },
|
|
41717
|
-
{ name: "refundReceiver", type: "address" },
|
|
41718
|
-
{ name: "signatures", type: "bytes" }
|
|
41719
|
-
],
|
|
41720
|
-
outputs: [{ name: "success", type: "bool" }]
|
|
41721
|
-
}
|
|
41722
|
-
];
|
|
41723
41535
|
var gnosisSafeAbi = [
|
|
41724
41536
|
{
|
|
41725
41537
|
type: "function",
|
|
@@ -41778,81 +41590,6 @@ function buildSafeSetupInitializer(params) {
|
|
|
41778
41590
|
]
|
|
41779
41591
|
});
|
|
41780
41592
|
}
|
|
41781
|
-
function buildApprovedHashSignature(owner) {
|
|
41782
|
-
return encodePacked(["bytes32", "bytes32", "uint8"], [pad(owner, { size: 32 }), pad("0x", { size: 32 }), 1]);
|
|
41783
|
-
}
|
|
41784
|
-
function encodeSetManager(newManager) {
|
|
41785
|
-
return encodeFunctionData({
|
|
41786
|
-
abi: setManagerAbi,
|
|
41787
|
-
functionName: "setManager",
|
|
41788
|
-
args: [newManager]
|
|
41789
|
-
});
|
|
41790
|
-
}
|
|
41791
|
-
function buildSetManagerExecTransaction(params) {
|
|
41792
|
-
const innerData = encodeSetManager(params.newManager);
|
|
41793
|
-
const data = encodeFunctionData({
|
|
41794
|
-
abi: gnosisSafeExecAbi,
|
|
41795
|
-
functionName: "execTransaction",
|
|
41796
|
-
args: [
|
|
41797
|
-
params.kernel,
|
|
41798
|
-
// to
|
|
41799
|
-
0n,
|
|
41800
|
-
// value
|
|
41801
|
-
innerData,
|
|
41802
|
-
// data: setManager(newManager)
|
|
41803
|
-
0,
|
|
41804
|
-
// operation: Call
|
|
41805
|
-
0n,
|
|
41806
|
-
// safeTxGas
|
|
41807
|
-
0n,
|
|
41808
|
-
// baseGas
|
|
41809
|
-
0n,
|
|
41810
|
-
// gasPrice
|
|
41811
|
-
zeroAddress,
|
|
41812
|
-
// gasToken
|
|
41813
|
-
zeroAddress,
|
|
41814
|
-
// refundReceiver
|
|
41815
|
-
buildApprovedHashSignature(params.owner)
|
|
41816
|
-
]
|
|
41817
|
-
});
|
|
41818
|
-
return { to: params.safe, data };
|
|
41819
|
-
}
|
|
41820
|
-
|
|
41821
|
-
// ../sdk/dist/fees.js
|
|
41822
|
-
function min(a, b) {
|
|
41823
|
-
return a < b ? a : b;
|
|
41824
|
-
}
|
|
41825
|
-
async function estimatePermissionFee(publicClient, governance, permission) {
|
|
41826
|
-
try {
|
|
41827
|
-
const [baseFee, complexityRate, cap, code] = await Promise.all([
|
|
41828
|
-
publicClient.readContract({
|
|
41829
|
-
address: governance,
|
|
41830
|
-
abi: SailGovernanceAbi,
|
|
41831
|
-
functionName: "baseFee"
|
|
41832
|
-
}),
|
|
41833
|
-
publicClient.readContract({
|
|
41834
|
-
address: governance,
|
|
41835
|
-
abi: SailGovernanceAbi,
|
|
41836
|
-
functionName: "complexityRate"
|
|
41837
|
-
}),
|
|
41838
|
-
publicClient.readContract({
|
|
41839
|
-
address: governance,
|
|
41840
|
-
abi: SailGovernanceAbi,
|
|
41841
|
-
functionName: "MAX_PERMISSION_FEE_WEI"
|
|
41842
|
-
}),
|
|
41843
|
-
publicClient.getBytecode({ address: permission })
|
|
41844
|
-
]);
|
|
41845
|
-
const byteLength = code ? BigInt((code.length - 2) / 2) : 0n;
|
|
41846
|
-
const fee = min(baseFee, cap) + min(byteLength * complexityRate, cap);
|
|
41847
|
-
return min(fee, cap);
|
|
41848
|
-
} catch {
|
|
41849
|
-
return publicClient.readContract({
|
|
41850
|
-
address: governance,
|
|
41851
|
-
abi: SailGovernanceAbi,
|
|
41852
|
-
functionName: "permissionRegistrationFee"
|
|
41853
|
-
});
|
|
41854
|
-
}
|
|
41855
|
-
}
|
|
41856
41593
|
|
|
41857
41594
|
// ../../node_modules/.pnpm/viem@2.51.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.25.76/node_modules/viem/_esm/utils/getAction.js
|
|
41858
41595
|
function getAction(client, actionFn, name) {
|
|
@@ -42107,8 +41844,8 @@ function getEncodableList2(list) {
|
|
|
42107
41844
|
else
|
|
42108
41845
|
cursor.pushUint32(bodyLength);
|
|
42109
41846
|
}
|
|
42110
|
-
for (const { encode:
|
|
42111
|
-
|
|
41847
|
+
for (const { encode: encode4 } of list) {
|
|
41848
|
+
encode4(cursor);
|
|
42112
41849
|
}
|
|
42113
41850
|
}
|
|
42114
41851
|
};
|
|
@@ -46266,7 +46003,7 @@ init_Errors();
|
|
|
46266
46003
|
init_Hex();
|
|
46267
46004
|
|
|
46268
46005
|
// ../../node_modules/.pnpm/ox@0.14.25_typescript@5.9.3_zod@3.25.76/node_modules/ox/_esm/core/Solidity.js
|
|
46269
|
-
var
|
|
46006
|
+
var arrayRegex = /^(.*)\[([0-9]*)\]$/;
|
|
46270
46007
|
var bytesRegex5 = /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/;
|
|
46271
46008
|
var integerRegex5 = /^(u?int)(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/;
|
|
46272
46009
|
var maxInt83 = 2n ** (8n - 1n) - 1n;
|
|
@@ -46579,7 +46316,7 @@ function prepareParameter({ checksumAddress: checksumAddress3 = false, parameter
|
|
|
46579
46316
|
}
|
|
46580
46317
|
throw new InvalidTypeError(parameter.type);
|
|
46581
46318
|
}
|
|
46582
|
-
function
|
|
46319
|
+
function encode(preparedParameters) {
|
|
46583
46320
|
let staticSize = 0;
|
|
46584
46321
|
for (let i = 0; i < preparedParameters.length; i++) {
|
|
46585
46322
|
const { dynamic, encoded } = preparedParameters[i];
|
|
@@ -46635,7 +46372,7 @@ function encodeArray3(value, options) {
|
|
|
46635
46372
|
preparedParameters.push(preparedParam);
|
|
46636
46373
|
}
|
|
46637
46374
|
if (dynamic || dynamicChild) {
|
|
46638
|
-
const data =
|
|
46375
|
+
const data = encode(preparedParameters);
|
|
46639
46376
|
if (dynamic) {
|
|
46640
46377
|
const length2 = fromNumber(preparedParameters.length, { size: 32 });
|
|
46641
46378
|
return {
|
|
@@ -46678,11 +46415,11 @@ function encodeBoolean(value) {
|
|
|
46678
46415
|
function encodeNumber3(value, { signed, size: size6 }) {
|
|
46679
46416
|
if (typeof size6 === "number") {
|
|
46680
46417
|
const max = 2n ** (BigInt(size6) - (signed ? 1n : 0n)) - 1n;
|
|
46681
|
-
const
|
|
46682
|
-
if (value > max || value <
|
|
46418
|
+
const min = signed ? -max - 1n : 0n;
|
|
46419
|
+
if (value > max || value < min)
|
|
46683
46420
|
throw new IntegerOutOfRangeError3({
|
|
46684
46421
|
max: max.toString(),
|
|
46685
|
-
min:
|
|
46422
|
+
min: min.toString(),
|
|
46686
46423
|
signed,
|
|
46687
46424
|
size: size6 / 8,
|
|
46688
46425
|
value: value.toString()
|
|
@@ -46726,7 +46463,7 @@ function encodeTuple3(value, options) {
|
|
|
46726
46463
|
}
|
|
46727
46464
|
return {
|
|
46728
46465
|
dynamic,
|
|
46729
|
-
encoded: dynamic ?
|
|
46466
|
+
encoded: dynamic ? encode(preparedParameters) : concat3(...preparedParameters.map(({ encoded }) => encoded))
|
|
46730
46467
|
};
|
|
46731
46468
|
}
|
|
46732
46469
|
function getArrayComponents3(type) {
|
|
@@ -46988,7 +46725,7 @@ function decode(parameters, data, options = {}) {
|
|
|
46988
46725
|
}
|
|
46989
46726
|
return values;
|
|
46990
46727
|
}
|
|
46991
|
-
function
|
|
46728
|
+
function encode2(parameters, values, options) {
|
|
46992
46729
|
const { checksumAddress: checksumAddress3 = false } = options ?? {};
|
|
46993
46730
|
if (parameters.length !== values.length)
|
|
46994
46731
|
throw new LengthMismatchError({
|
|
@@ -47000,7 +46737,7 @@ function encode3(parameters, values, options) {
|
|
|
47000
46737
|
parameters,
|
|
47001
46738
|
values
|
|
47002
46739
|
});
|
|
47003
|
-
const data =
|
|
46740
|
+
const data = encode(preparedParameters);
|
|
47004
46741
|
if (data.length === 0)
|
|
47005
46742
|
return "0x";
|
|
47006
46743
|
return data;
|
|
@@ -47020,7 +46757,7 @@ function encodePacked2(types, values) {
|
|
|
47020
46757
|
return concat3(...data);
|
|
47021
46758
|
}
|
|
47022
46759
|
(function(encodePacked3) {
|
|
47023
|
-
function
|
|
46760
|
+
function encode4(type, value, isArray = false) {
|
|
47024
46761
|
if (type === "address") {
|
|
47025
46762
|
const address = value;
|
|
47026
46763
|
assert4(address);
|
|
@@ -47051,12 +46788,12 @@ function encodePacked2(types, values) {
|
|
|
47051
46788
|
});
|
|
47052
46789
|
return padRight(value, isArray ? 32 : 0);
|
|
47053
46790
|
}
|
|
47054
|
-
const arrayMatch = type.match(
|
|
46791
|
+
const arrayMatch = type.match(arrayRegex);
|
|
47055
46792
|
if (arrayMatch && Array.isArray(value)) {
|
|
47056
46793
|
const [_type, childType] = arrayMatch;
|
|
47057
46794
|
const data = [];
|
|
47058
46795
|
for (let i = 0; i < value.length; i++) {
|
|
47059
|
-
data.push(
|
|
46796
|
+
data.push(encode4(childType, value[i], true));
|
|
47060
46797
|
}
|
|
47061
46798
|
if (data.length === 0)
|
|
47062
46799
|
return "0x";
|
|
@@ -47064,7 +46801,7 @@ function encodePacked2(types, values) {
|
|
|
47064
46801
|
}
|
|
47065
46802
|
throw new InvalidTypeError(type);
|
|
47066
46803
|
}
|
|
47067
|
-
encodePacked3.encode =
|
|
46804
|
+
encodePacked3.encode = encode4;
|
|
47068
46805
|
})(encodePacked2 || (encodePacked2 = {}));
|
|
47069
46806
|
function from5(parameters) {
|
|
47070
46807
|
if (Array.isArray(parameters) && typeof parameters[0] === "string")
|
|
@@ -47209,8 +46946,8 @@ function getEncodableList3(list) {
|
|
|
47209
46946
|
else
|
|
47210
46947
|
cursor.pushUint32(bodyLength);
|
|
47211
46948
|
}
|
|
47212
|
-
for (const { encode:
|
|
47213
|
-
|
|
46949
|
+
for (const { encode: encode4 } of list) {
|
|
46950
|
+
encode4(cursor);
|
|
47214
46951
|
}
|
|
47215
46952
|
}
|
|
47216
46953
|
};
|
|
@@ -47544,7 +47281,7 @@ function wrap(value) {
|
|
|
47544
47281
|
payload: getSignPayload(value.authorization),
|
|
47545
47282
|
signature: from7(value.authorization)
|
|
47546
47283
|
});
|
|
47547
|
-
const suffix =
|
|
47284
|
+
const suffix = encode2(suffixParameters, [
|
|
47548
47285
|
{
|
|
47549
47286
|
...value.authorization,
|
|
47550
47287
|
delegation: value.authorization.address,
|
|
@@ -48200,7 +47937,7 @@ var NotFoundError = class extends BaseError5 {
|
|
|
48200
47937
|
|
|
48201
47938
|
// ../../node_modules/.pnpm/ox@0.14.25_typescript@5.9.3_zod@3.25.76/node_modules/ox/_esm/core/AbiConstructor.js
|
|
48202
47939
|
init_Hex();
|
|
48203
|
-
function
|
|
47940
|
+
function encode3(...parameters) {
|
|
48204
47941
|
const [abiConstructor, options] = (() => {
|
|
48205
47942
|
if (Array.isArray(parameters[0])) {
|
|
48206
47943
|
const [abi2, options2] = parameters;
|
|
@@ -48209,7 +47946,7 @@ function encode4(...parameters) {
|
|
|
48209
47946
|
return parameters;
|
|
48210
47947
|
})();
|
|
48211
47948
|
const { bytecode, args } = options;
|
|
48212
|
-
return concat3(bytecode, abiConstructor.inputs?.length && args?.length ?
|
|
47949
|
+
return concat3(bytecode, abiConstructor.inputs?.length && args?.length ? encode2(abiConstructor.inputs, args) : "0x");
|
|
48213
47950
|
}
|
|
48214
47951
|
function from11(abiConstructor) {
|
|
48215
47952
|
return from10(abiConstructor);
|
|
@@ -48237,7 +47974,7 @@ function encodeData3(...parameters) {
|
|
|
48237
47974
|
args
|
|
48238
47975
|
}) : abiFunction;
|
|
48239
47976
|
const selector = getSelector2(item);
|
|
48240
|
-
const data = args.length > 0 ?
|
|
47977
|
+
const data = args.length > 0 ? encode2(item.inputs, args) : void 0;
|
|
48241
47978
|
return data ? concat3(selector, data) : selector;
|
|
48242
47979
|
}
|
|
48243
47980
|
function from12(abiFunction, options = {}) {
|
|
@@ -48270,7 +48007,7 @@ async function simulateCalls(client, parameters) {
|
|
|
48270
48007
|
const account = parameters.account ? parseAccount(parameters.account) : void 0;
|
|
48271
48008
|
if (traceAssetChanges && !account)
|
|
48272
48009
|
throw new BaseError4("`account` is required when `traceAssetChanges` is true");
|
|
48273
|
-
const getBalanceData = account ?
|
|
48010
|
+
const getBalanceData = account ? encode3(from11("constructor(bytes, bytes)"), {
|
|
48274
48011
|
bytecode: deploylessCallViaBytecodeBytecode,
|
|
48275
48012
|
args: [
|
|
48276
48013
|
getBalanceCode,
|
|
@@ -48537,7 +48274,7 @@ function unwrap2(wrapped) {
|
|
|
48537
48274
|
}
|
|
48538
48275
|
function wrap2(value) {
|
|
48539
48276
|
const { data, signature, to } = value;
|
|
48540
|
-
return concat3(
|
|
48277
|
+
return concat3(encode2(from5("address, bytes, bytes"), [
|
|
48541
48278
|
to,
|
|
48542
48279
|
data,
|
|
48543
48280
|
signature
|
|
@@ -49662,7 +49399,6 @@ function http(url, config = {}) {
|
|
|
49662
49399
|
}
|
|
49663
49400
|
|
|
49664
49401
|
// ../../node_modules/.pnpm/viem@2.51.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.25.76/node_modules/viem/_esm/index.js
|
|
49665
|
-
init_encodeDeployData();
|
|
49666
49402
|
init_encodeFunctionData2();
|
|
49667
49403
|
init_getAddress2();
|
|
49668
49404
|
init_isAddress2();
|
|
@@ -49893,8 +49629,6 @@ function startServer(sailDir, { port = PORT } = {}) {
|
|
|
49893
49629
|
app.use((0, import_cors.default)({ origin: "http://localhost:3333" }));
|
|
49894
49630
|
app.use(import_express.default.json());
|
|
49895
49631
|
const at = (name) => import_node_path.default.join(sailDir, name);
|
|
49896
|
-
const projectRoot = import_node_path.default.dirname(sailDir);
|
|
49897
|
-
const outAt = (name) => import_node_path.default.join(projectRoot, "out", name);
|
|
49898
49632
|
const overviewCacheByAccount = /* @__PURE__ */ new Map();
|
|
49899
49633
|
const overviewInFlight = /* @__PURE__ */ new Set();
|
|
49900
49634
|
const overviewSnapshotPath = (safe) => at(`state/overview/${safe.toLowerCase()}.json`);
|
|
@@ -50296,514 +50030,6 @@ function startServer(sailDir, { port = PORT } = {}) {
|
|
|
50296
50030
|
res.status(500).json({ error: String(err) });
|
|
50297
50031
|
}
|
|
50298
50032
|
});
|
|
50299
|
-
const rotationContext = () => {
|
|
50300
|
-
let account;
|
|
50301
|
-
try {
|
|
50302
|
-
account = JSON.parse(import_node_fs2.default.readFileSync(at("account.json"), "utf-8"));
|
|
50303
|
-
} catch {
|
|
50304
|
-
return { error: "no-account", message: "No active SMA. Deploy one first." };
|
|
50305
|
-
}
|
|
50306
|
-
const env = parseEnvFile(at(".env.local"));
|
|
50307
|
-
const chainId = Number(account.chainId ?? env.CHAIN_ID ?? 0);
|
|
50308
|
-
let kernel = env.KERNEL_ADDRESS;
|
|
50309
|
-
let governance;
|
|
50310
|
-
try {
|
|
50311
|
-
const deployment = getSailDeployment(chainId);
|
|
50312
|
-
kernel = kernel ?? deployment?.kernel;
|
|
50313
|
-
governance = deployment?.governance;
|
|
50314
|
-
} catch {
|
|
50315
|
-
}
|
|
50316
|
-
const rpcUrl = env.RPC_URL;
|
|
50317
|
-
if (!kernel || !isAddress2(kernel)) {
|
|
50318
|
-
return { error: "no-kernel", message: "No kernel address for this chain." };
|
|
50319
|
-
}
|
|
50320
|
-
if (!rpcUrl) {
|
|
50321
|
-
return { error: "no-rpc", message: "No RPC_URL configured (.sail/.env.local)." };
|
|
50322
|
-
}
|
|
50323
|
-
const client = createPublicClient({ transport: http(rpcUrl) });
|
|
50324
|
-
return { account, env, chainId, kernel: getAddress(kernel), governance, rpcUrl, client };
|
|
50325
|
-
};
|
|
50326
|
-
app.get("/api/account/rotation-preview", async (_req, res) => {
|
|
50327
|
-
const ctx = rotationContext();
|
|
50328
|
-
if (ctx.error) {
|
|
50329
|
-
res.status(400).json({ error: ctx.error, message: ctx.message });
|
|
50330
|
-
return;
|
|
50331
|
-
}
|
|
50332
|
-
try {
|
|
50333
|
-
const safe = getAddress(ctx.account.safe);
|
|
50334
|
-
const [configs, permissions] = await Promise.all([
|
|
50335
|
-
ctx.client.readContract({ address: ctx.kernel, abi: SailKernelAbi, functionName: "configs", args: [safe] }),
|
|
50336
|
-
ctx.client.readContract({ address: ctx.kernel, abi: SailKernelAbi, functionName: "getPermissions", args: [safe] })
|
|
50337
|
-
]);
|
|
50338
|
-
const [permissionSigner, manager] = configs;
|
|
50339
|
-
res.json({
|
|
50340
|
-
safe,
|
|
50341
|
-
chainId: ctx.chainId,
|
|
50342
|
-
owner: getAddress(ctx.account.owner),
|
|
50343
|
-
permissionSigner: getAddress(permissionSigner),
|
|
50344
|
-
currentManager: manager && getAddress(manager) !== zeroAddress2 ? getAddress(manager) : null,
|
|
50345
|
-
permissions: permissions.map((p) => getAddress(p))
|
|
50346
|
-
});
|
|
50347
|
-
} catch (err) {
|
|
50348
|
-
res.status(502).json({ error: "rpc", message: String(err) });
|
|
50349
|
-
}
|
|
50350
|
-
});
|
|
50351
|
-
app.post("/api/account/build-set-manager", async (req, res) => {
|
|
50352
|
-
const { newManager } = req.body ?? {};
|
|
50353
|
-
if (!isAddress2(newManager)) {
|
|
50354
|
-
res.status(400).json({ error: "newManager must be a valid address" });
|
|
50355
|
-
return;
|
|
50356
|
-
}
|
|
50357
|
-
const ctx = rotationContext();
|
|
50358
|
-
if (ctx.error) {
|
|
50359
|
-
res.status(400).json({ error: ctx.error, message: ctx.message });
|
|
50360
|
-
return;
|
|
50361
|
-
}
|
|
50362
|
-
try {
|
|
50363
|
-
const safe = getAddress(ctx.account.safe);
|
|
50364
|
-
const owner = getAddress(ctx.account.owner);
|
|
50365
|
-
const configs = await ctx.client.readContract({
|
|
50366
|
-
address: ctx.kernel,
|
|
50367
|
-
abi: SailKernelAbi,
|
|
50368
|
-
functionName: "configs",
|
|
50369
|
-
args: [safe]
|
|
50370
|
-
});
|
|
50371
|
-
const oldManager = configs[1] && getAddress(configs[1]) !== zeroAddress2 ? getAddress(configs[1]) : null;
|
|
50372
|
-
if (oldManager && oldManager.toLowerCase() === getAddress(newManager).toLowerCase()) {
|
|
50373
|
-
res.status(400).json({ error: "same-signer", message: "New signer is the same as the current one." });
|
|
50374
|
-
return;
|
|
50375
|
-
}
|
|
50376
|
-
const permissions = await ctx.client.readContract({
|
|
50377
|
-
address: ctx.kernel,
|
|
50378
|
-
abi: SailKernelAbi,
|
|
50379
|
-
functionName: "getPermissions",
|
|
50380
|
-
args: [safe]
|
|
50381
|
-
});
|
|
50382
|
-
const { to, data } = buildSetManagerExecTransaction({
|
|
50383
|
-
safe,
|
|
50384
|
-
kernel: ctx.kernel,
|
|
50385
|
-
newManager: getAddress(newManager),
|
|
50386
|
-
owner
|
|
50387
|
-
});
|
|
50388
|
-
res.json({ to, data, chainId: ctx.chainId, oldManager, permissions: permissions.map((p) => getAddress(p)) });
|
|
50389
|
-
} catch (err) {
|
|
50390
|
-
res.status(502).json({ error: "rpc", message: String(err) });
|
|
50391
|
-
}
|
|
50392
|
-
});
|
|
50393
|
-
app.post("/api/account/rotate-generate-key", async (req, res) => {
|
|
50394
|
-
const target = at("keys/manager.json");
|
|
50395
|
-
try {
|
|
50396
|
-
const passphrase = req.body?.passphrase ?? "";
|
|
50397
|
-
if (import_node_fs2.default.existsSync(target)) {
|
|
50398
|
-
const backup = `${target}.${Date.now()}.bak`;
|
|
50399
|
-
import_node_fs2.default.copyFileSync(target, backup);
|
|
50400
|
-
}
|
|
50401
|
-
const privateKey = generatePrivateKey2();
|
|
50402
|
-
const keyring = LocalKeyring.fromPrivateKey(privateKey);
|
|
50403
|
-
const keystore = await keyring.exportKeystore(passphrase);
|
|
50404
|
-
import_node_fs2.default.mkdirSync(at("keys"), { recursive: true });
|
|
50405
|
-
import_node_fs2.default.writeFileSync(target, `${JSON.stringify(keystore, null, 2)}
|
|
50406
|
-
`);
|
|
50407
|
-
res.json({ address: getAddress(keyring.address) });
|
|
50408
|
-
} catch (err) {
|
|
50409
|
-
res.status(500).json({ error: String(err) });
|
|
50410
|
-
}
|
|
50411
|
-
});
|
|
50412
|
-
app.post("/api/account/build-reattach", async (req, res) => {
|
|
50413
|
-
const permissions = Array.isArray(req.body?.permissions) ? req.body.permissions : [];
|
|
50414
|
-
if (permissions.length === 0 || !permissions.every((p) => isAddress2(p))) {
|
|
50415
|
-
res.status(400).json({ error: "permissions must be a non-empty array of addresses" });
|
|
50416
|
-
return;
|
|
50417
|
-
}
|
|
50418
|
-
const ctx = rotationContext();
|
|
50419
|
-
if (ctx.error) {
|
|
50420
|
-
res.status(400).json({ error: ctx.error, message: ctx.message });
|
|
50421
|
-
return;
|
|
50422
|
-
}
|
|
50423
|
-
try {
|
|
50424
|
-
const safe = getAddress(ctx.account.safe);
|
|
50425
|
-
const nonce = await ctx.client.readContract({
|
|
50426
|
-
address: ctx.kernel,
|
|
50427
|
-
abi: SailKernelAbi,
|
|
50428
|
-
functionName: "signerNonces",
|
|
50429
|
-
args: [safe]
|
|
50430
|
-
});
|
|
50431
|
-
const deadline = BigInt(Math.floor(Date.now() / 1e3) + 600);
|
|
50432
|
-
const typedData = buildRegisterPermissionsBatchTypedData({
|
|
50433
|
-
chainId: ctx.chainId,
|
|
50434
|
-
kernel: ctx.kernel,
|
|
50435
|
-
account: safe,
|
|
50436
|
-
permissions: permissions.map((p) => getAddress(p)),
|
|
50437
|
-
nonce,
|
|
50438
|
-
deadline
|
|
50439
|
-
});
|
|
50440
|
-
res.json({ typedData, deadline: deadline.toString() });
|
|
50441
|
-
} catch (err) {
|
|
50442
|
-
res.status(502).json({ error: "rpc", message: String(err) });
|
|
50443
|
-
}
|
|
50444
|
-
});
|
|
50445
|
-
app.post("/api/account/build-reattach-tx", async (req, res) => {
|
|
50446
|
-
const { permissions, deadline, signature } = req.body ?? {};
|
|
50447
|
-
if (!Array.isArray(permissions) || permissions.length === 0 || !permissions.every((p) => isAddress2(p))) {
|
|
50448
|
-
res.status(400).json({ error: "permissions must be a non-empty array of addresses" });
|
|
50449
|
-
return;
|
|
50450
|
-
}
|
|
50451
|
-
if (typeof signature !== "string" || !signature.startsWith("0x")) {
|
|
50452
|
-
res.status(400).json({ error: "signature is required" });
|
|
50453
|
-
return;
|
|
50454
|
-
}
|
|
50455
|
-
if (deadline == null) {
|
|
50456
|
-
res.status(400).json({ error: "deadline is required" });
|
|
50457
|
-
return;
|
|
50458
|
-
}
|
|
50459
|
-
const ctx = rotationContext();
|
|
50460
|
-
if (ctx.error) {
|
|
50461
|
-
res.status(400).json({ error: ctx.error, message: ctx.message });
|
|
50462
|
-
return;
|
|
50463
|
-
}
|
|
50464
|
-
try {
|
|
50465
|
-
const safe = getAddress(ctx.account.safe);
|
|
50466
|
-
const perms = permissions.map((p) => getAddress(p));
|
|
50467
|
-
let fee = 0n;
|
|
50468
|
-
if (ctx.governance && isAddress2(ctx.governance)) {
|
|
50469
|
-
for (const permission of perms) {
|
|
50470
|
-
fee += await estimatePermissionFee(ctx.client, ctx.governance, permission);
|
|
50471
|
-
}
|
|
50472
|
-
}
|
|
50473
|
-
const data = encodeFunctionData2({
|
|
50474
|
-
abi: SailKernelAbi,
|
|
50475
|
-
functionName: "registerPermissions",
|
|
50476
|
-
args: [safe, perms, BigInt(deadline), signature]
|
|
50477
|
-
});
|
|
50478
|
-
res.json({ to: ctx.kernel, data, value: fee.toString(), chainId: ctx.chainId });
|
|
50479
|
-
} catch (err) {
|
|
50480
|
-
res.status(502).json({ error: "rpc", message: String(err) });
|
|
50481
|
-
}
|
|
50482
|
-
});
|
|
50483
|
-
const REVOKE_PERMISSIONS_ABI = [
|
|
50484
|
-
{
|
|
50485
|
-
type: "function",
|
|
50486
|
-
name: "revokePermissions",
|
|
50487
|
-
stateMutability: "nonpayable",
|
|
50488
|
-
inputs: [
|
|
50489
|
-
{ name: "account", type: "address" },
|
|
50490
|
-
{ name: "permissions", type: "address[]" },
|
|
50491
|
-
{ name: "deadline", type: "uint256" },
|
|
50492
|
-
{ name: "sig", type: "bytes" }
|
|
50493
|
-
],
|
|
50494
|
-
outputs: []
|
|
50495
|
-
}
|
|
50496
|
-
];
|
|
50497
|
-
const REVOKE_PERMISSIONS_TYPES = {
|
|
50498
|
-
RevokePermissions: [
|
|
50499
|
-
{ name: "account", type: "address" },
|
|
50500
|
-
{ name: "permissions", type: "address[]" },
|
|
50501
|
-
{ name: "nonce", type: "uint256" },
|
|
50502
|
-
{ name: "deadline", type: "uint256" }
|
|
50503
|
-
]
|
|
50504
|
-
};
|
|
50505
|
-
app.post("/api/account/build-revoke", async (req, res) => {
|
|
50506
|
-
const permissions = Array.isArray(req.body?.permissions) ? req.body.permissions : [];
|
|
50507
|
-
if (permissions.length === 0 || !permissions.every((p) => isAddress2(p))) {
|
|
50508
|
-
res.status(400).json({ error: "permissions must be a non-empty array of addresses" });
|
|
50509
|
-
return;
|
|
50510
|
-
}
|
|
50511
|
-
const ctx = rotationContext();
|
|
50512
|
-
if (ctx.error) {
|
|
50513
|
-
res.status(400).json({ error: ctx.error, message: ctx.message });
|
|
50514
|
-
return;
|
|
50515
|
-
}
|
|
50516
|
-
try {
|
|
50517
|
-
const safe = getAddress(ctx.account.safe);
|
|
50518
|
-
const [active, nonce] = await Promise.all([
|
|
50519
|
-
ctx.client.readContract({ address: ctx.kernel, abi: SailKernelAbi, functionName: "getPermissions", args: [safe] }),
|
|
50520
|
-
ctx.client.readContract({ address: ctx.kernel, abi: SailKernelAbi, functionName: "signerNonces", args: [safe] })
|
|
50521
|
-
]);
|
|
50522
|
-
const activeSet = new Set(active.map((p) => getAddress(p).toLowerCase()));
|
|
50523
|
-
const targets = permissions.map((p) => getAddress(p));
|
|
50524
|
-
const missing = targets.filter((p) => !activeSet.has(p.toLowerCase()));
|
|
50525
|
-
if (missing.length > 0) {
|
|
50526
|
-
res.status(409).json({ error: "not-active", message: `Not in the SMA's active permission set: ${missing.join(", ")}` });
|
|
50527
|
-
return;
|
|
50528
|
-
}
|
|
50529
|
-
const deadline = BigInt(Math.floor(Date.now() / 1e3) + 600);
|
|
50530
|
-
const typedData = {
|
|
50531
|
-
domain: { name: "SailKernel", version: "1", chainId: ctx.chainId, verifyingContract: ctx.kernel },
|
|
50532
|
-
types: REVOKE_PERMISSIONS_TYPES,
|
|
50533
|
-
primaryType: "RevokePermissions",
|
|
50534
|
-
message: { account: safe, permissions: targets, nonce: nonce.toString(), deadline: deadline.toString() }
|
|
50535
|
-
};
|
|
50536
|
-
res.json({ typedData, deadline: deadline.toString() });
|
|
50537
|
-
} catch (err) {
|
|
50538
|
-
res.status(502).json({ error: "rpc", message: String(err) });
|
|
50539
|
-
}
|
|
50540
|
-
});
|
|
50541
|
-
app.post("/api/account/build-revoke-tx", async (req, res) => {
|
|
50542
|
-
const { permissions, deadline, signature } = req.body ?? {};
|
|
50543
|
-
if (!Array.isArray(permissions) || permissions.length === 0 || !permissions.every((p) => isAddress2(p))) {
|
|
50544
|
-
res.status(400).json({ error: "permissions must be a non-empty array of addresses" });
|
|
50545
|
-
return;
|
|
50546
|
-
}
|
|
50547
|
-
if (typeof signature !== "string" || !signature.startsWith("0x")) {
|
|
50548
|
-
res.status(400).json({ error: "signature is required" });
|
|
50549
|
-
return;
|
|
50550
|
-
}
|
|
50551
|
-
if (deadline == null) {
|
|
50552
|
-
res.status(400).json({ error: "deadline is required" });
|
|
50553
|
-
return;
|
|
50554
|
-
}
|
|
50555
|
-
const ctx = rotationContext();
|
|
50556
|
-
if (ctx.error) {
|
|
50557
|
-
res.status(400).json({ error: ctx.error, message: ctx.message });
|
|
50558
|
-
return;
|
|
50559
|
-
}
|
|
50560
|
-
try {
|
|
50561
|
-
const safe = getAddress(ctx.account.safe);
|
|
50562
|
-
const perms = permissions.map((p) => getAddress(p));
|
|
50563
|
-
const data = encodeFunctionData2({
|
|
50564
|
-
abi: REVOKE_PERMISSIONS_ABI,
|
|
50565
|
-
functionName: "revokePermissions",
|
|
50566
|
-
args: [safe, perms, BigInt(deadline), signature]
|
|
50567
|
-
});
|
|
50568
|
-
res.json({ to: ctx.kernel, data, chainId: ctx.chainId });
|
|
50569
|
-
} catch (err) {
|
|
50570
|
-
res.status(502).json({ error: "rpc", message: String(err) });
|
|
50571
|
-
}
|
|
50572
|
-
});
|
|
50573
|
-
app.post("/api/account/revoke-complete", (req, res) => {
|
|
50574
|
-
const { permissions, txHash } = req.body ?? {};
|
|
50575
|
-
if (!Array.isArray(permissions) || permissions.length === 0 || !permissions.every((p) => isAddress2(p))) {
|
|
50576
|
-
res.status(400).json({ error: "permissions must be a non-empty array of addresses" });
|
|
50577
|
-
return;
|
|
50578
|
-
}
|
|
50579
|
-
const safe = readActiveSafe();
|
|
50580
|
-
if (!safe) {
|
|
50581
|
-
res.status(400).json({ error: "No active SMA." });
|
|
50582
|
-
return;
|
|
50583
|
-
}
|
|
50584
|
-
try {
|
|
50585
|
-
const nameByAddr = /* @__PURE__ */ new Map();
|
|
50586
|
-
try {
|
|
50587
|
-
const tracked = JSON.parse(import_node_fs2.default.readFileSync(at("state/mandates.json"), "utf-8"));
|
|
50588
|
-
for (const m of tracked.mandates ?? []) {
|
|
50589
|
-
if (m.address && m.name) nameByAddr.set(m.address.toLowerCase(), m.name);
|
|
50590
|
-
}
|
|
50591
|
-
} catch {
|
|
50592
|
-
}
|
|
50593
|
-
const ts = (/* @__PURE__ */ new Date()).toISOString();
|
|
50594
|
-
for (const p of permissions) {
|
|
50595
|
-
const permission = getAddress(p);
|
|
50596
|
-
const ev = {
|
|
50597
|
-
ts,
|
|
50598
|
-
actor: "owner",
|
|
50599
|
-
type: "permission_revoked",
|
|
50600
|
-
permission,
|
|
50601
|
-
safe,
|
|
50602
|
-
...nameByAddr.has(permission.toLowerCase()) ? { name: nameByAddr.get(permission.toLowerCase()) } : {},
|
|
50603
|
-
...txHash ? { txHash } : {}
|
|
50604
|
-
};
|
|
50605
|
-
import_node_fs2.default.appendFileSync(at("activity.jsonl"), `${JSON.stringify(ev)}
|
|
50606
|
-
`);
|
|
50607
|
-
}
|
|
50608
|
-
overviewCacheByAccount.delete(safe.toLowerCase());
|
|
50609
|
-
try {
|
|
50610
|
-
import_node_fs2.default.rmSync(overviewSnapshotPath(safe));
|
|
50611
|
-
} catch {
|
|
50612
|
-
}
|
|
50613
|
-
res.json({ ok: true, revoked: permissions.length });
|
|
50614
|
-
} catch (err) {
|
|
50615
|
-
res.status(500).json({ error: String(err) });
|
|
50616
|
-
}
|
|
50617
|
-
});
|
|
50618
|
-
const isSafeArtifactName = (name) => typeof name === "string" && /^[A-Za-z0-9_]+$/.test(name);
|
|
50619
|
-
const readArtifact = (name) => {
|
|
50620
|
-
if (!isSafeArtifactName(name)) return null;
|
|
50621
|
-
try {
|
|
50622
|
-
const artifact = JSON.parse(import_node_fs2.default.readFileSync(outAt(`${name}.sol/${name}.json`), "utf-8"));
|
|
50623
|
-
const bytecodeRaw = artifact.bytecode?.object ?? artifact.bytecode;
|
|
50624
|
-
if (!artifact.abi || !bytecodeRaw) return null;
|
|
50625
|
-
const bytecode = String(bytecodeRaw).startsWith("0x") ? bytecodeRaw : `0x${bytecodeRaw}`;
|
|
50626
|
-
if (bytecode.length <= 2) return null;
|
|
50627
|
-
return { abi: artifact.abi, bytecode, path: outAt(`${name}.sol/${name}.json`) };
|
|
50628
|
-
} catch {
|
|
50629
|
-
return null;
|
|
50630
|
-
}
|
|
50631
|
-
};
|
|
50632
|
-
app.get("/api/mandate-templates", (_req, res) => {
|
|
50633
|
-
const templates = [];
|
|
50634
|
-
try {
|
|
50635
|
-
const outDir = import_node_path.default.join(projectRoot, "out");
|
|
50636
|
-
for (const dir of import_node_fs2.default.readdirSync(outDir)) {
|
|
50637
|
-
if (!dir.endsWith(".sol")) continue;
|
|
50638
|
-
const name = dir.slice(0, -4);
|
|
50639
|
-
if (!/permission/i.test(name)) continue;
|
|
50640
|
-
const art = readArtifact(name);
|
|
50641
|
-
if (!art) continue;
|
|
50642
|
-
const ctor = (art.abi ?? []).find((x) => x.type === "constructor");
|
|
50643
|
-
templates.push({
|
|
50644
|
-
name,
|
|
50645
|
-
inputs: (ctor?.inputs ?? []).map((i) => ({ name: i.name, type: i.type }))
|
|
50646
|
-
});
|
|
50647
|
-
}
|
|
50648
|
-
} catch {
|
|
50649
|
-
}
|
|
50650
|
-
res.json({ templates });
|
|
50651
|
-
});
|
|
50652
|
-
const coerceArg = (type, value) => {
|
|
50653
|
-
const asList = (v) => {
|
|
50654
|
-
if (Array.isArray(v)) return v;
|
|
50655
|
-
const s = String(v ?? "").trim();
|
|
50656
|
-
if (!s) return [];
|
|
50657
|
-
if (s.startsWith("[")) return JSON.parse(s);
|
|
50658
|
-
return s.split(/[\n,]+/).map((x) => x.trim()).filter(Boolean);
|
|
50659
|
-
};
|
|
50660
|
-
if (type.endsWith("[]")) {
|
|
50661
|
-
const base = type.slice(0, -2);
|
|
50662
|
-
return asList(value).map((v) => coerceArg(base, v));
|
|
50663
|
-
}
|
|
50664
|
-
if (type.startsWith("uint") || type.startsWith("int")) return BigInt(String(value).trim() || "0");
|
|
50665
|
-
if (type === "bool") return value === true || /^(true|1|yes)$/i.test(String(value).trim());
|
|
50666
|
-
if (type === "address") return getAddress(String(value).trim());
|
|
50667
|
-
return String(value).trim();
|
|
50668
|
-
};
|
|
50669
|
-
app.post("/api/account/build-deploy-mandate", (req, res) => {
|
|
50670
|
-
const { template, args } = req.body ?? {};
|
|
50671
|
-
const art = readArtifact(template);
|
|
50672
|
-
if (!art) {
|
|
50673
|
-
res.status(404).json({ error: "no-artifact", message: `No compiled artifact for "${template}". Run \`forge build\` in the project first.` });
|
|
50674
|
-
return;
|
|
50675
|
-
}
|
|
50676
|
-
const ctx = rotationContext();
|
|
50677
|
-
if (ctx.error) {
|
|
50678
|
-
res.status(400).json({ error: ctx.error, message: ctx.message });
|
|
50679
|
-
return;
|
|
50680
|
-
}
|
|
50681
|
-
try {
|
|
50682
|
-
const ctor = (art.abi ?? []).find((x) => x.type === "constructor");
|
|
50683
|
-
const inputs = ctor?.inputs ?? [];
|
|
50684
|
-
const provided = Array.isArray(args) ? args : [];
|
|
50685
|
-
if (provided.length !== inputs.length) {
|
|
50686
|
-
res.status(400).json({ error: "args", message: `Expected ${inputs.length} constructor arg(s), got ${provided.length}.` });
|
|
50687
|
-
return;
|
|
50688
|
-
}
|
|
50689
|
-
const coerced = inputs.map((inp, i) => coerceArg(inp.type, provided[i]));
|
|
50690
|
-
const data = encodeDeployData({ abi: art.abi, bytecode: art.bytecode, args: coerced });
|
|
50691
|
-
res.json({ data, chainId: ctx.chainId, name: template });
|
|
50692
|
-
} catch (err) {
|
|
50693
|
-
res.status(400).json({ error: "encode", message: String(err) });
|
|
50694
|
-
}
|
|
50695
|
-
});
|
|
50696
|
-
app.post("/api/account/mandate-complete", (req, res) => {
|
|
50697
|
-
const { name, address, template, constructorArgs, deployTxHash, registerTxHash } = req.body ?? {};
|
|
50698
|
-
if (!isAddress2(address)) {
|
|
50699
|
-
res.status(400).json({ error: "address must be a valid address" });
|
|
50700
|
-
return;
|
|
50701
|
-
}
|
|
50702
|
-
const safe = readActiveSafe();
|
|
50703
|
-
if (!safe) {
|
|
50704
|
-
res.status(400).json({ error: "No active SMA." });
|
|
50705
|
-
return;
|
|
50706
|
-
}
|
|
50707
|
-
try {
|
|
50708
|
-
const permission = getAddress(address);
|
|
50709
|
-
const label = name || template || "Mandate";
|
|
50710
|
-
const account = (() => {
|
|
50711
|
-
try {
|
|
50712
|
-
return JSON.parse(import_node_fs2.default.readFileSync(at("account.json"), "utf-8"));
|
|
50713
|
-
} catch {
|
|
50714
|
-
return {};
|
|
50715
|
-
}
|
|
50716
|
-
})();
|
|
50717
|
-
const chainId = Number(account.chainId ?? 0) || void 0;
|
|
50718
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
50719
|
-
const storePath = at("state/mandates.json");
|
|
50720
|
-
let store = { version: 1, mandates: [] };
|
|
50721
|
-
try {
|
|
50722
|
-
store = JSON.parse(import_node_fs2.default.readFileSync(storePath, "utf-8"));
|
|
50723
|
-
} catch {
|
|
50724
|
-
}
|
|
50725
|
-
if (!Array.isArray(store.mandates)) store.mandates = [];
|
|
50726
|
-
const attachment = { sma: safe, txHash: registerTxHash ?? null, at: now };
|
|
50727
|
-
const idx = store.mandates.findIndex((m) => m.address?.toLowerCase() === permission.toLowerCase());
|
|
50728
|
-
if (idx === -1) {
|
|
50729
|
-
store.mandates.push({
|
|
50730
|
-
name: label,
|
|
50731
|
-
address: permission,
|
|
50732
|
-
txHash: deployTxHash ?? null,
|
|
50733
|
-
chainId,
|
|
50734
|
-
...template ? { artifactPath: outAt(`${template}.sol/${template}.json`) } : {},
|
|
50735
|
-
...Array.isArray(constructorArgs) ? { constructorArgs } : {},
|
|
50736
|
-
deployedAt: now,
|
|
50737
|
-
attachments: [attachment]
|
|
50738
|
-
});
|
|
50739
|
-
} else {
|
|
50740
|
-
store.mandates[idx].attachments = [...store.mandates[idx].attachments ?? [], attachment];
|
|
50741
|
-
}
|
|
50742
|
-
import_node_fs2.default.mkdirSync(at("state"), { recursive: true });
|
|
50743
|
-
import_node_fs2.default.writeFileSync(storePath, `${JSON.stringify(store, null, 2)}
|
|
50744
|
-
`);
|
|
50745
|
-
if (deployTxHash) {
|
|
50746
|
-
import_node_fs2.default.appendFileSync(at("activity.jsonl"), `${JSON.stringify({ ts: now, actor: "owner", type: "mandate_deployed", name: label, address: permission, safe, txHash: deployTxHash, ...chainId ? { chainId } : {} })}
|
|
50747
|
-
`);
|
|
50748
|
-
}
|
|
50749
|
-
import_node_fs2.default.appendFileSync(at("activity.jsonl"), `${JSON.stringify({ ts: now, actor: "owner", type: "permission_registered", permission, name: label, sma: safe, safe, ...registerTxHash ? { txHash: registerTxHash } : {}, ...chainId ? { chainId } : {} })}
|
|
50750
|
-
`);
|
|
50751
|
-
overviewCacheByAccount.delete(safe.toLowerCase());
|
|
50752
|
-
try {
|
|
50753
|
-
import_node_fs2.default.rmSync(overviewSnapshotPath(safe));
|
|
50754
|
-
} catch {
|
|
50755
|
-
}
|
|
50756
|
-
res.json({ ok: true, address: permission });
|
|
50757
|
-
} catch (err) {
|
|
50758
|
-
res.status(500).json({ error: String(err) });
|
|
50759
|
-
}
|
|
50760
|
-
});
|
|
50761
|
-
app.post("/api/account/rotate-complete", (req, res) => {
|
|
50762
|
-
const { newManager, txHash, reattachTxHash, permissions } = req.body ?? {};
|
|
50763
|
-
if (!isAddress2(newManager)) {
|
|
50764
|
-
res.status(400).json({ error: "newManager must be a valid address" });
|
|
50765
|
-
return;
|
|
50766
|
-
}
|
|
50767
|
-
try {
|
|
50768
|
-
const account = JSON.parse(import_node_fs2.default.readFileSync(at("account.json"), "utf-8"));
|
|
50769
|
-
const safe = account.safe;
|
|
50770
|
-
const manager = getAddress(newManager);
|
|
50771
|
-
const oldManager = account.manager ? getAddress(account.manager) : null;
|
|
50772
|
-
import_node_fs2.default.writeFileSync(at("account.json"), `${JSON.stringify({ ...account, manager }, null, 2)}
|
|
50773
|
-
`);
|
|
50774
|
-
try {
|
|
50775
|
-
const listPath = at("state/accounts.json");
|
|
50776
|
-
const list = JSON.parse(import_node_fs2.default.readFileSync(listPath, "utf-8"));
|
|
50777
|
-
const idx = list.findIndex((a) => a.safe.toLowerCase() === safe.toLowerCase());
|
|
50778
|
-
if (idx !== -1) {
|
|
50779
|
-
list[idx] = { ...list[idx], manager };
|
|
50780
|
-
import_node_fs2.default.writeFileSync(listPath, `${JSON.stringify(list, null, 2)}
|
|
50781
|
-
`);
|
|
50782
|
-
}
|
|
50783
|
-
} catch {
|
|
50784
|
-
}
|
|
50785
|
-
const append = (event) => {
|
|
50786
|
-
try {
|
|
50787
|
-
import_node_fs2.default.mkdirSync(sailDir, { recursive: true });
|
|
50788
|
-
import_node_fs2.default.appendFileSync(at("activity.jsonl"), `${JSON.stringify({ ts: (/* @__PURE__ */ new Date()).toISOString(), safe, ...event })}
|
|
50789
|
-
`);
|
|
50790
|
-
} catch {
|
|
50791
|
-
}
|
|
50792
|
-
};
|
|
50793
|
-
append({ actor: "owner", type: "signer_rotated", oldManager, newManager: manager, txHash, chainId: account.chainId });
|
|
50794
|
-
if (reattachTxHash && Array.isArray(permissions) && permissions.length > 0) {
|
|
50795
|
-
append({ actor: "owner", type: "mandates_reattached", permissions, txHash: reattachTxHash, chainId: account.chainId });
|
|
50796
|
-
}
|
|
50797
|
-
overviewCacheByAccount.delete(safe.toLowerCase());
|
|
50798
|
-
try {
|
|
50799
|
-
import_node_fs2.default.rmSync(overviewSnapshotPath(safe));
|
|
50800
|
-
} catch {
|
|
50801
|
-
}
|
|
50802
|
-
res.json({ ok: true, manager });
|
|
50803
|
-
} catch (err) {
|
|
50804
|
-
res.status(500).json({ error: String(err) });
|
|
50805
|
-
}
|
|
50806
|
-
});
|
|
50807
50033
|
app.get("/api/mandate", (_req, res) => {
|
|
50808
50034
|
try {
|
|
50809
50035
|
res.json(JSON.parse(import_node_fs2.default.readFileSync(at("mandate.json"), "utf-8")));
|
|
@@ -50818,6 +50044,13 @@ function startServer(sailDir, { port = PORT } = {}) {
|
|
|
50818
50044
|
res.json(null);
|
|
50819
50045
|
}
|
|
50820
50046
|
});
|
|
50047
|
+
app.delete("/api/mandate-draft", (_req, res) => {
|
|
50048
|
+
try {
|
|
50049
|
+
import_node_fs2.default.rmSync(at("mandate-draft.json"), { force: true });
|
|
50050
|
+
} catch {
|
|
50051
|
+
}
|
|
50052
|
+
res.json({ ok: true });
|
|
50053
|
+
});
|
|
50821
50054
|
app.post("/api/mandate-submit", (req, res) => {
|
|
50822
50055
|
const { signature, signedAt } = req.body ?? {};
|
|
50823
50056
|
if (!signature) {
|
|
@@ -50896,13 +50129,7 @@ function startServer(sailDir, { port = PORT } = {}) {
|
|
|
50896
50129
|
if (match) repoUrl = match[1].replace(/\.git$/, "");
|
|
50897
50130
|
} catch {
|
|
50898
50131
|
}
|
|
50899
|
-
|
|
50900
|
-
try {
|
|
50901
|
-
const cm = content.match(/cron:\s*["']([^"']+)["']/);
|
|
50902
|
-
if (cm) cron = cm[1].trim();
|
|
50903
|
-
} catch {
|
|
50904
|
-
}
|
|
50905
|
-
return { file, repoUrl, cron };
|
|
50132
|
+
return { file, repoUrl };
|
|
50906
50133
|
}
|
|
50907
50134
|
} catch {
|
|
50908
50135
|
}
|
|
@@ -51015,12 +50242,20 @@ function startServer(sailDir, { port = PORT } = {}) {
|
|
|
51015
50242
|
deployment = getSailDeployment(chainId);
|
|
51016
50243
|
} catch {
|
|
51017
50244
|
}
|
|
50245
|
+
const SUPPORTED_CHAIN_IDS = [8453, 42161, 130, 84532];
|
|
50246
|
+
const rpcByChain = {};
|
|
50247
|
+
for (const cid of SUPPORTED_CHAIN_IDS) {
|
|
50248
|
+
const perChainKey = `RPC_URL_${cid}`;
|
|
50249
|
+
if (env[perChainKey]) rpcByChain[cid] = env[perChainKey];
|
|
50250
|
+
}
|
|
50251
|
+
if (env.RPC_URL && !rpcByChain[chainId]) rpcByChain[chainId] = env.RPC_URL;
|
|
51018
50252
|
res.json({
|
|
51019
50253
|
hasAccount,
|
|
51020
50254
|
hasManagerKey: Boolean(managerAddress),
|
|
51021
50255
|
managerAddress,
|
|
51022
|
-
hasRpc: Boolean(env.RPC_URL),
|
|
50256
|
+
hasRpc: Boolean(env.RPC_URL || Object.keys(rpcByChain).length > 0),
|
|
51023
50257
|
rpcUrl: env.RPC_URL ?? null,
|
|
50258
|
+
rpcByChain,
|
|
51024
50259
|
hasSailApiKey: Boolean(env.SAIL_API_KEY),
|
|
51025
50260
|
chainId,
|
|
51026
50261
|
projectName: config?.name ?? null,
|
|
@@ -51034,9 +50269,22 @@ function startServer(sailDir, { port = PORT } = {}) {
|
|
|
51034
50269
|
app.post("/api/onboard/save-config", (req, res) => {
|
|
51035
50270
|
const { rpcUrl, sailApiKey, chainId } = req.body ?? {};
|
|
51036
50271
|
try {
|
|
50272
|
+
const config = (() => {
|
|
50273
|
+
try {
|
|
50274
|
+
return JSON.parse(import_node_fs2.default.readFileSync(at("config.json"), "utf-8"));
|
|
50275
|
+
} catch {
|
|
50276
|
+
return null;
|
|
50277
|
+
}
|
|
50278
|
+
})();
|
|
50279
|
+
const activeChainId = config?.chainId ?? 8453;
|
|
51037
50280
|
const envPath = at(".env.local");
|
|
51038
50281
|
const existing = parseEnvFile(envPath);
|
|
51039
|
-
if (rpcUrl
|
|
50282
|
+
if (rpcUrl && chainId) {
|
|
50283
|
+
existing[`RPC_URL_${chainId}`] = rpcUrl;
|
|
50284
|
+
if (Number(chainId) === Number(activeChainId)) existing.RPC_URL = rpcUrl;
|
|
50285
|
+
} else if (rpcUrl) {
|
|
50286
|
+
existing.RPC_URL = rpcUrl;
|
|
50287
|
+
}
|
|
51040
50288
|
if (sailApiKey) existing.SAIL_API_KEY = sailApiKey;
|
|
51041
50289
|
if (chainId) existing.CHAIN_ID = String(chainId);
|
|
51042
50290
|
const content = Object.entries(existing).map(([k, v]) => `${k}=${v}`).join("\n") + "\n";
|
|
@@ -51242,7 +50490,49 @@ function startServer(sailDir, { port = PORT } = {}) {
|
|
|
51242
50490
|
res.status(500).json({ error: String(err) });
|
|
51243
50491
|
}
|
|
51244
50492
|
});
|
|
51245
|
-
app.get("/api/
|
|
50493
|
+
app.get("/api/wizard-state", (_req, res) => {
|
|
50494
|
+
try {
|
|
50495
|
+
const raw = import_node_fs2.default.readFileSync(at(".wizard-state.json"), "utf-8");
|
|
50496
|
+
res.json(JSON.parse(raw));
|
|
50497
|
+
} catch {
|
|
50498
|
+
res.json(null);
|
|
50499
|
+
}
|
|
50500
|
+
});
|
|
50501
|
+
app.post("/api/wizard-state", (req, res) => {
|
|
50502
|
+
try {
|
|
50503
|
+
import_node_fs2.default.mkdirSync(sailDir, { recursive: true });
|
|
50504
|
+
import_node_fs2.default.writeFileSync(at(".wizard-state.json"), `${JSON.stringify(req.body, null, 2)}
|
|
50505
|
+
`);
|
|
50506
|
+
res.json({ ok: true });
|
|
50507
|
+
} catch (err) {
|
|
50508
|
+
res.status(500).json({ error: String(err) });
|
|
50509
|
+
}
|
|
50510
|
+
});
|
|
50511
|
+
app.get("/api/positions", (_req, res) => {
|
|
50512
|
+
try {
|
|
50513
|
+
const account = JSON.parse(import_node_fs2.default.readFileSync(at("account.json"), "utf-8"));
|
|
50514
|
+
const chainId = account?.chainId ?? 8453;
|
|
50515
|
+
const file = at(`state/positions-${chainId}.json`);
|
|
50516
|
+
res.json(JSON.parse(import_node_fs2.default.readFileSync(file, "utf-8")));
|
|
50517
|
+
} catch {
|
|
50518
|
+
res.status(404).json({ error: "no positions snapshot" });
|
|
50519
|
+
}
|
|
50520
|
+
});
|
|
50521
|
+
function mandatesFromStore(at2, account, nameByAddr, templateByAddr, network) {
|
|
50522
|
+
try {
|
|
50523
|
+
const store = JSON.parse(import_node_fs2.default.readFileSync(at2("state/mandates.json"), "utf-8"));
|
|
50524
|
+
const safe = account?.safe?.toLowerCase();
|
|
50525
|
+
return (store.mandates ?? []).filter((m) => m.address && m.chainId === account?.chainId && (m.attachments ?? []).some((a) => a.sma?.toLowerCase() === safe)).map((m) => ({
|
|
50526
|
+
address: m.address,
|
|
50527
|
+
name: m.name ?? nameByAddr.get(m.address.toLowerCase()) ?? null,
|
|
50528
|
+
template: m.name ?? templateByAddr.get(m.address.toLowerCase()) ?? null,
|
|
50529
|
+
network
|
|
50530
|
+
}));
|
|
50531
|
+
} catch {
|
|
50532
|
+
return [];
|
|
50533
|
+
}
|
|
50534
|
+
}
|
|
50535
|
+
app.get("/api/overview", async (_req, res) => {
|
|
51246
50536
|
let account = null;
|
|
51247
50537
|
try {
|
|
51248
50538
|
account = JSON.parse(import_node_fs2.default.readFileSync(at("account.json"), "utf-8"));
|
|
@@ -51255,16 +50545,6 @@ function startServer(sailDir, { port = PORT } = {}) {
|
|
|
51255
50545
|
return;
|
|
51256
50546
|
}
|
|
51257
50547
|
const key = account.safe.toLowerCase();
|
|
51258
|
-
if (req.query?.fresh != null) {
|
|
51259
|
-
try {
|
|
51260
|
-
const data2 = await computeOverview(account);
|
|
51261
|
-
storeOverview(account.safe, data2);
|
|
51262
|
-
res.json(data2);
|
|
51263
|
-
} catch {
|
|
51264
|
-
res.json(overviewCacheByAccount.get(key)?.data ?? readOverviewSnapshot(account.safe) ?? null);
|
|
51265
|
-
}
|
|
51266
|
-
return;
|
|
51267
|
-
}
|
|
51268
50548
|
const cached = overviewCacheByAccount.get(key);
|
|
51269
50549
|
if (cached && Date.now() - cached.at < OVERVIEW_TTL_MS) {
|
|
51270
50550
|
res.json(cached.data);
|
|
@@ -51280,74 +50560,6 @@ function startServer(sailDir, { port = PORT } = {}) {
|
|
|
51280
50560
|
storeOverview(account.safe, data);
|
|
51281
50561
|
res.json(data);
|
|
51282
50562
|
});
|
|
51283
|
-
const buildMandateLedger = (safe, activeAddrs, nameByAddr, templateByAddr, network) => {
|
|
51284
|
-
const safeLower = safe.toLowerCase();
|
|
51285
|
-
const meta = /* @__PURE__ */ new Map();
|
|
51286
|
-
try {
|
|
51287
|
-
const tracked = JSON.parse(import_node_fs2.default.readFileSync(at("state/mandates.json"), "utf-8"));
|
|
51288
|
-
for (const m of tracked.mandates ?? []) {
|
|
51289
|
-
if (!m.address) continue;
|
|
51290
|
-
const mine = (m.attachments ?? []).filter((a) => a.sma?.toLowerCase() === safeLower);
|
|
51291
|
-
if (mine.length === 0) continue;
|
|
51292
|
-
const first = mine.reduce((a, b) => a.at && b.at && a.at < b.at ? a : b);
|
|
51293
|
-
meta.set(m.address.toLowerCase(), { firstAt: first?.at ?? m.deployedAt ?? null, txHash: first?.txHash ?? m.txHash ?? null });
|
|
51294
|
-
}
|
|
51295
|
-
} catch {
|
|
51296
|
-
}
|
|
51297
|
-
const registeredAt = /* @__PURE__ */ new Map();
|
|
51298
|
-
const revokedAt = /* @__PURE__ */ new Map();
|
|
51299
|
-
try {
|
|
51300
|
-
for (const line of import_node_fs2.default.readFileSync(at("activity.jsonl"), "utf-8").split("\n")) {
|
|
51301
|
-
if (!line.trim()) continue;
|
|
51302
|
-
let e;
|
|
51303
|
-
try {
|
|
51304
|
-
e = JSON.parse(line);
|
|
51305
|
-
} catch {
|
|
51306
|
-
continue;
|
|
51307
|
-
}
|
|
51308
|
-
if (e.safe && e.safe.toLowerCase() !== safeLower) continue;
|
|
51309
|
-
const addrs = [];
|
|
51310
|
-
if (typeof e.permission === "string") addrs.push(e.permission);
|
|
51311
|
-
if (Array.isArray(e.permissions)) addrs.push(...e.permissions);
|
|
51312
|
-
if (e.type === "mandate_deployed" && typeof e.address === "string") addrs.push(e.address);
|
|
51313
|
-
const reg = e.type === "permission_registered" || e.type === "mandates_reattached" || e.type === "mandate_deployed";
|
|
51314
|
-
const rev = e.type === "permission_revoked" || e.type === "mandate_revoked" || e.type === "permission_detached";
|
|
51315
|
-
for (const a of addrs) {
|
|
51316
|
-
const al = a.toLowerCase();
|
|
51317
|
-
if (reg && (!registeredAt.has(al) || e.ts < registeredAt.get(al))) registeredAt.set(al, e.ts);
|
|
51318
|
-
if (rev && (!revokedAt.has(al) || e.ts > revokedAt.get(al))) revokedAt.set(al, e.ts);
|
|
51319
|
-
}
|
|
51320
|
-
}
|
|
51321
|
-
} catch {
|
|
51322
|
-
}
|
|
51323
|
-
const all = /* @__PURE__ */ new Set([...activeAddrs, ...meta.keys(), ...registeredAt.keys()]);
|
|
51324
|
-
const ledger = [];
|
|
51325
|
-
for (const al of all) {
|
|
51326
|
-
const isActive = activeAddrs.has(al);
|
|
51327
|
-
const revoked = revokedAt.get(al);
|
|
51328
|
-
let status;
|
|
51329
|
-
if (isActive) status = "active";
|
|
51330
|
-
else if (revoked) status = "revoked";
|
|
51331
|
-
else if (meta.has(al) || registeredAt.has(al)) status = "revoked";
|
|
51332
|
-
else continue;
|
|
51333
|
-
ledger.push({
|
|
51334
|
-
address: getAddress(`0x${al.replace(/^0x/, "")}`),
|
|
51335
|
-
name: nameByAddr.get(al) ?? null,
|
|
51336
|
-
template: templateByAddr.get(al) ?? null,
|
|
51337
|
-
status,
|
|
51338
|
-
registeredAt: registeredAt.get(al) ?? meta.get(al)?.firstAt ?? null,
|
|
51339
|
-
revokedAt: revoked ?? null,
|
|
51340
|
-
txHash: meta.get(al)?.txHash ?? null,
|
|
51341
|
-
network
|
|
51342
|
-
});
|
|
51343
|
-
}
|
|
51344
|
-
const ts = (m) => m.revokedAt ?? m.registeredAt ?? "";
|
|
51345
|
-
ledger.sort((a, b) => {
|
|
51346
|
-
if (a.status === "active" !== (b.status === "active")) return a.status === "active" ? -1 : 1;
|
|
51347
|
-
return ts(b).localeCompare(ts(a));
|
|
51348
|
-
});
|
|
51349
|
-
return ledger;
|
|
51350
|
-
};
|
|
51351
50563
|
async function computeOverview(account) {
|
|
51352
50564
|
const env = parseEnvFile(at(".env.local"));
|
|
51353
50565
|
const chainId = Number(account.chainId ?? env.CHAIN_ID ?? 0);
|
|
@@ -51441,8 +50653,12 @@ function startServer(sailDir, { port = PORT } = {}) {
|
|
|
51441
50653
|
result.sma.balanceWei = safeBal.toString();
|
|
51442
50654
|
result.sma.balanceEth = formatEther(safeBal);
|
|
51443
50655
|
result.sma.balanceStatus = balanceStatus(safeBal);
|
|
51444
|
-
|
|
51445
|
-
|
|
50656
|
+
result.mandates = perms.length > 0 ? perms.map((addr) => ({
|
|
50657
|
+
address: addr,
|
|
50658
|
+
name: nameByAddr.get(addr.toLowerCase()) ?? null,
|
|
50659
|
+
template: templateByAddr.get(addr.toLowerCase()) ?? null,
|
|
50660
|
+
network
|
|
50661
|
+
})) : mandatesFromStore(at, account, nameByAddr, templateByAddr, network);
|
|
51446
50662
|
let managerEntry;
|
|
51447
50663
|
if (managerSet) {
|
|
51448
50664
|
managerEntry = signerEntry("manager", managerAddr, balanceByAddr);
|
|
@@ -51464,22 +50680,11 @@ function startServer(sailDir, { port = PORT } = {}) {
|
|
|
51464
50680
|
];
|
|
51465
50681
|
} catch (err) {
|
|
51466
50682
|
result.onchainError = err instanceof Error ? err.message : String(err);
|
|
51467
|
-
|
|
51468
|
-
const local = JSON.parse(import_node_fs2.default.readFileSync(at("mandate.json"), "utf-8"));
|
|
51469
|
-
result.mandates = (local.permissions ?? []).map((p) => {
|
|
51470
|
-
const addr = typeof p === "string" ? p : p.address;
|
|
51471
|
-
return {
|
|
51472
|
-
address: addr,
|
|
51473
|
-
name: nameByAddr.get(addr.toLowerCase()) ?? null,
|
|
51474
|
-
template: (typeof p === "object" ? p.template : null) ?? templateByAddr.get(addr.toLowerCase()) ?? null,
|
|
51475
|
-
network
|
|
51476
|
-
};
|
|
51477
|
-
});
|
|
51478
|
-
} catch {
|
|
51479
|
-
}
|
|
50683
|
+
result.mandates = mandatesFromStore(at, account, nameByAddr, templateByAddr, network);
|
|
51480
50684
|
}
|
|
51481
50685
|
} else {
|
|
51482
50686
|
result.onchainError = "No kernel/RPC configured for on-chain reads";
|
|
50687
|
+
result.mandates = mandatesFromStore(at, account, nameByAddr, templateByAddr, network);
|
|
51483
50688
|
}
|
|
51484
50689
|
if (result.signers.length === 0 && localManagerAddrs.size > 0) {
|
|
51485
50690
|
result.signers = [...localManagerAddrs].map((la) => ({
|
|
@@ -51514,20 +50719,6 @@ function startServer(sailDir, { port = PORT } = {}) {
|
|
|
51514
50719
|
socket.destroy();
|
|
51515
50720
|
return;
|
|
51516
50721
|
}
|
|
51517
|
-
const origin = req.headers.origin;
|
|
51518
|
-
if (origin) {
|
|
51519
|
-
try {
|
|
51520
|
-
const { hostname } = new URL(origin);
|
|
51521
|
-
if (hostname !== "localhost" && hostname !== "127.0.0.1") {
|
|
51522
|
-
socket.write("HTTP/1.1 403 Forbidden\r\n\r\n");
|
|
51523
|
-
socket.destroy();
|
|
51524
|
-
return;
|
|
51525
|
-
}
|
|
51526
|
-
} catch {
|
|
51527
|
-
socket.destroy();
|
|
51528
|
-
return;
|
|
51529
|
-
}
|
|
51530
|
-
}
|
|
51531
50722
|
wss.handleUpgrade(req, socket, head, (client) => relayToDaemon(client));
|
|
51532
50723
|
});
|
|
51533
50724
|
async function relayToDaemon(client) {
|