Переписать shine_payments и обновить тестовый UI с известным багом state

This commit is contained in:
AidarKC
2026-06-06 16:58:57 +04:00
parent c5ec32f87a
commit 89d06d317b
18 changed files with 1550 additions and 6578 deletions
@@ -65,6 +65,7 @@
<label>Кошелек менеджера: <input id="managerWallet" placeholder="Base58" /></label>
<label>Добавить лимит Q1 (USD): <input id="addQ1" value="100" /></label>
<label>Добавить лимит Q2 (USD): <input id="addQ2" value="50" /></label>
<label>Добавить лимит Q3 (USD): <input id="addQ3" value="25" /></label>
</div>
<div class="row">
<button id="grantBtn">Выдать лимиты</button>
@@ -87,9 +88,10 @@
const RPC_URL = "https://api.devnet.solana.com";
const connection = new solanaWeb3.Connection(RPC_URL, "confirmed");
const SEEDS = {
config: "shine_payments_v3_config",
managerAllowance: "shine_p_v3_manager_allow",
config: "shine_payments_config",
managerAllowance: "shine_p_manager_allow",
};
const IX = { grantManagerLimits: 3 };
let walletPubkey = null;
let configCache = null;
document.getElementById("programId").textContent = PROGRAM_ID.toBase58();
@@ -124,10 +126,8 @@
if (!Number.isFinite(v) || v < 0) throw new Error("Некорректная сумма USD");
return BigInt(Math.round(v * 100));
}
async function ixDiscriminator(name) {
const msg = utf8("global:" + name);
const hash = await crypto.subtle.digest("SHA-256", msg);
return new Uint8Array(hash).slice(0, 8);
function ixData(tag, ...parts) {
return concat(new Uint8Array([tag]), ...parts);
}
function isUnauthorizedDao(msg) {
const s = String(msg || "").toLowerCase();
@@ -147,7 +147,8 @@
const manager = new solanaWeb3.PublicKey(data.slice(o, o + 32)); o += 32;
const q1 = readU64(data, o); o += 8;
const q2 = readU64(data, o); o += 8;
return { version, manager, q1, q2 };
const q3 = readU64(data, o); o += 8;
return { version, manager, q1, q2, q3 };
}
function getProvider() {
@@ -216,11 +217,11 @@
const manager = new solanaWeb3.PublicKey(document.getElementById("managerWallet").value.trim());
const addQ1 = usdToCents(document.getElementById("addQ1").value.trim());
const addQ2 = usdToCents(document.getElementById("addQ2").value.trim());
if (addQ1 === 0n && addQ2 === 0n) throw new Error("Нужно указать сумму хотя бы для одной очереди.");
const addQ3 = usdToCents(document.getElementById("addQ3").value.trim());
if (addQ1 === 0n && addQ2 === 0n && addQ3 === 0n) throw new Error("Нужно указать сумму хотя бы для одной очереди.");
const allowancePda = deriveManagerAllowancePda(manager);
const disc = await ixDiscriminator("grant_manager_limits");
const data = concat(disc, manager.toBytes(), u64ToBytes(addQ1), u64ToBytes(addQ2));
const data = ixData(IX.grantManagerLimits, manager.toBytes(), u64ToBytes(addQ1), u64ToBytes(addQ2), u64ToBytes(addQ3));
const keys = [
{ pubkey: walletPubkey, isSigner: true, isWritable: true },
{ pubkey: configPda, isSigner: false, isWritable: true },
@@ -258,6 +259,7 @@
<div>PDA: <code>${allowancePda.toBase58()}</code></div>
<div>Доступно Q1: <b>${centsToUsdStr(st.q1)} USD</b></div>
<div>Доступно Q2: <b>${centsToUsdStr(st.q2)} USD</b></div>
<div>Доступно Q3: <b>${centsToUsdStr(st.q3)} USD</b></div>
`;
} catch (e) {
out.innerHTML = `<span class="err">${String(e.message || e)}</span>`;