From 20af66cbb45ad22aa54eaffb8a99a48b3a5cc4ca Mon Sep 17 00:00:00 2001 From: Ejirosoft Date: Tue, 25 Aug 2026 09:21:25 +0000 Subject: [PATCH 1/6] fix(api): require CID ownership to unpin IPFS content (IDOR) POST /api/ipfs/unpin previously authorized any wallet with a valid JWT to unpin any CID, since a fresh JWT costs nothing (challenge/response needs no on-chain history) and the wallet address was never checked against who actually pinned the content. Add a pin-ownership registry (api/_lib/pinOwnership.ts) populated by upload-json.ts / upload-file.ts at pin time, and a new unpin.ts endpoint that resolves a CID back to its pinning wallet before calling Pinata. A CID with no ownership record is denied by default rather than allowed, and every attempt (allowed or rejected) is audit-logged with address, cid, and outcome. Closes #1155 --- SECURITY.md | 31 +++--- api/_lib/pinOwnership.ts | 122 +++++++++++++++++++++++ api/_lib/schemaValidation.ts | 55 +++++++---- api/ipfs/unpin.test.ts | 163 +++++++++++++++++++++++++++++++ api/ipfs/unpin.ts | 129 ++++++++++++++++++++++++ api/ipfs/upload-file.ts | 183 ++++++++++++++++++++--------------- api/ipfs/upload-json.ts | 114 ++++++++++++++-------- 7 files changed, 642 insertions(+), 155 deletions(-) create mode 100644 api/_lib/pinOwnership.ts create mode 100644 api/ipfs/unpin.test.ts create mode 100644 api/ipfs/unpin.ts diff --git a/SECURITY.md b/SECURITY.md index 9260cf39..78be5a64 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -10,6 +10,7 @@ Instead, report it privately using one of the following channels: 2. **Email** — send details to `security@stellarforge.app` with the subject line `[SECURITY] `. Please include: + - A clear description of the vulnerability and its impact. - Steps to reproduce (proof-of-concept code or exploit path). - Affected contract addresses or frontend versions. @@ -19,24 +20,24 @@ We will acknowledge your report within **72 hours** and provide an estimated fix ## Scope -| Component | In scope | -|---|---| -| Token factory Soroban contract (mainnet + testnet) | ✅ | -| React frontend (wallet integration, transaction flow) | ✅ | -| IPFS / Pinata integration | ✅ | -| Admin key custody and access controls | ✅ | -| Dependency vulnerabilities with active exploit paths | ✅ | +| Component | In scope | +| ---------------------------------------------------------------- | ------------------------------------ | +| Token factory Soroban contract (mainnet + testnet) | ✅ | +| React frontend (wallet integration, transaction flow) | ✅ | +| IPFS / Pinata integration | ✅ | +| Admin key custody and access controls | ✅ | +| Dependency vulnerabilities with active exploit paths | ✅ | | Third-party services (Stellar network itself, Pinata, Freighter) | ❌ — report to the respective vendor | -| Theoretical issues with no practical exploit path | ❌ | +| Theoretical issues with no practical exploit path | ❌ | ## Severity definitions -| Severity | Description | -|---|---| +| Severity | Description | +| ------------ | ---------------------------------------------------------------------------------------------- | | **Critical** | Remote code execution, admin key theft, total loss of funds, contract upgrade to attacker WASM | -| **High** | Partial fund loss, admin privilege escalation, persistent denial of service | -| **Medium** | Temporary DoS, fee manipulation without fund loss, user-data leakage | -| **Low** | Minor information disclosure, UX security issues | +| **High** | Partial fund loss, admin privilege escalation, persistent denial of service | +| **Medium** | Temporary DoS, fee manipulation without fund loss, user-data leakage | +| **Low** | Minor information disclosure, UX security issues | ## Incident response @@ -59,6 +60,10 @@ The factory contract's `admin` address can upgrade the contract, change fees, re The `upgrade` function currently emits no Soroban event. Detection of a malicious WASM replacement currently requires active polling of the on-chain WASM hash. The monitoring script is documented in the [Incident Response Runbook](./docs/incident-response.md#22-wasm-hash-polling-required-until-issue-9-is-resolved). +### IPFS unpin requires CID ownership (issue #1155) + +`POST /api/ipfs/unpin` requires more than a valid JWT: any wallet can obtain one for free via the challenge/response flow, so JWT possession alone does not prove a right to delete someone else's pinned content. The endpoint additionally checks the requesting wallet address against an ownership record captured at upload time (`api/_lib/pinOwnership.ts`, populated by `upload-json.ts` / `upload-file.ts`). A CID with no ownership record on file is **denied by default** — it is never treated as unpinnable-by-anyone. See `api/ipfs/unpin.ts` and its regression tests in `api/ipfs/unpin.test.ts`. + ### Content Security Policy A strict CSP is enforced both as a `` tag and via HTTP response headers on the hosted deployment. See the [README](./README.md#content-security-policy-csp) for configuration details. diff --git a/api/_lib/pinOwnership.ts b/api/_lib/pinOwnership.ts new file mode 100644 index 00000000..9bec1662 --- /dev/null +++ b/api/_lib/pinOwnership.ts @@ -0,0 +1,122 @@ +/** + * Tracks which wallet address pinned a given IPFS CID, so the unpin endpoint + * can verify ownership before deleting content from Pinata on someone's + * behalf. Recorded at upload time by upload-json.ts / upload-file.ts. + * + * Uses Vercel KV for durability across serverless instances, matching the + * pattern in rateLimit.ts. Falls back to per-instance memory when KV isn't + * configured — note that this fallback fails *closed*: a CID pinned by one + * instance won't be found by a different instance's in-memory map, so + * getPinOwner() returns null and the caller denies the unpin. Configure + * Vercel KV in production so legitimate owners aren't denied. + */ + +interface PinOwnerRecord { + ownerAddress: string; + pinnedAt: number; +} + +const memoryRegistry = new Map(); + +function pinKey(cid: string): string { + return `pinowner:${cid}`; +} + +/** Records the wallet address that pinned `cid`. Called after a successful Pinata pin. */ +export async function recordPinOwner( + cid: string, + ownerAddress: string, +): Promise { + const kvUrl = process.env.VERCEL_KV_REST_API_URL; + const kvToken = process.env.VERCEL_KV_REST_API_TOKEN; + const record: PinOwnerRecord = { ownerAddress, pinnedAt: Date.now() }; + + if (kvUrl && kvToken) { + try { + await kvSet(kvUrl, kvToken, pinKey(cid), JSON.stringify(record)); + return; + } catch (err) { + console.error( + "Failed to record pin owner in KV, falling back to memory:", + err, + ); + } + } + + memoryRegistry.set(cid, record); +} + +/** + * Returns the wallet address that pinned `cid`, or null if the CID is not + * indexed. Callers MUST treat null as "ownership cannot be verified" and + * deny the request — never allow-by-default for an unknown CID. + */ +export async function getPinOwner(cid: string): Promise { + const kvUrl = process.env.VERCEL_KV_REST_API_URL; + const kvToken = process.env.VERCEL_KV_REST_API_TOKEN; + + if (kvUrl && kvToken) { + try { + const data = await kvGet(kvUrl, kvToken, pinKey(cid)); + if (!data) return null; + const record = JSON.parse(data) as PinOwnerRecord; + return record.ownerAddress; + } catch (err) { + console.error("Failed to read pin owner from KV:", err); + return null; + } + } + + return memoryRegistry.get(cid)?.ownerAddress ?? null; +} + +/** Removes ownership tracking for `cid` after it has been successfully unpinned. */ +export async function clearPinOwner(cid: string): Promise { + const kvUrl = process.env.VERCEL_KV_REST_API_URL; + const kvToken = process.env.VERCEL_KV_REST_API_TOKEN; + + if (kvUrl && kvToken) { + try { + await kvDel(kvUrl, kvToken, pinKey(cid)); + return; + } catch (err) { + console.error("Failed to clear pin owner from KV:", err); + } + } + + memoryRegistry.delete(cid); +} + +// Vercel KV REST API helpers (mirrors rateLimit.ts) +async function kvGet( + url: string, + token: string, + key: string, +): Promise { + const response = await fetch(`${url}/get/${encodeURIComponent(key)}`, { + headers: { Authorization: `Bearer ${token}` }, + }); + if (!response.ok) return null; + const data = (await response.json()) as { result: string | null }; + return data.result; +} + +async function kvSet( + url: string, + token: string, + key: string, + value: string, +): Promise { + await fetch(`${url}/set/${encodeURIComponent(key)}`, { + method: "POST", + headers: { Authorization: `Bearer ${token}` }, + body: JSON.stringify({ value }), + }); +} + +async function kvDel(url: string, token: string, key: string): Promise { + await fetch(`${url}/del/${encodeURIComponent(key)}`, { + method: "POST", + headers: { Authorization: `Bearer ${token}` }, + }); +} diff --git a/api/_lib/schemaValidation.ts b/api/_lib/schemaValidation.ts index 911b610f..40a32e26 100644 --- a/api/_lib/schemaValidation.ts +++ b/api/_lib/schemaValidation.ts @@ -4,15 +4,24 @@ */ export interface TokenMetadata { - name: string - description: string - image: string // Must be ipfs://CID format + name: string; + description: string; + image: string; // Must be ipfs://CID format } -const MAX_METADATA_JSON_SIZE = 8 * 1024 // 8 KiB strict limit -const MAX_NAME_LENGTH = 128 -const MAX_DESCRIPTION_LENGTH = 2000 -const IPFS_URI_PATTERN = /^ipfs:\/\/[a-zA-Z0-9]+$/ +const MAX_METADATA_JSON_SIZE = 8 * 1024; // 8 KiB strict limit +const MAX_NAME_LENGTH = 128; +const MAX_DESCRIPTION_LENGTH = 2000; +const IPFS_URI_PATTERN = /^ipfs:\/\/[a-zA-Z0-9]+$/; + +// CIDv0: Qm + 44 base58 chars (total 46); CIDv1: b + base32 (lowercase) +const CID_V0_PATTERN = /^Qm[1-9A-HJ-NP-Za-km-z]{44}$/; +const CID_V1_PATTERN = /^b[a-z2-7]{58,}$/; + +/** Validates a bare IPFS CID (no `ipfs://` prefix), CIDv0 or CIDv1. */ +export function isValidCid(cid: string): boolean { + return CID_V0_PATTERN.test(cid) || CID_V1_PATTERN.test(cid); +} /** * Validate a TokenMetadata object and its JSON serialization. @@ -29,49 +38,53 @@ export function validateTokenMetadata( return { valid: false, error: `Metadata exceeds maximum size of ${MAX_METADATA_JSON_SIZE} bytes.`, - } + }; } // Type check - if (typeof metadata !== 'object' || metadata === null) { - return { valid: false, error: 'Metadata must be a JSON object.' } + if (typeof metadata !== "object" || metadata === null) { + return { valid: false, error: "Metadata must be a JSON object." }; } - const obj = metadata as Record + const obj = metadata as Record; // Required fields - if (typeof obj.name !== 'string' || obj.name.length === 0 || obj.name.length > MAX_NAME_LENGTH) { + if ( + typeof obj.name !== "string" || + obj.name.length === 0 || + obj.name.length > MAX_NAME_LENGTH + ) { return { valid: false, error: `name must be a non-empty string, max ${MAX_NAME_LENGTH} characters.`, - } + }; } if ( - typeof obj.description !== 'string' || + typeof obj.description !== "string" || obj.description.length === 0 || obj.description.length > MAX_DESCRIPTION_LENGTH ) { return { valid: false, error: `description must be a non-empty string, max ${MAX_DESCRIPTION_LENGTH} characters.`, - } + }; } - if (typeof obj.image !== 'string' || !IPFS_URI_PATTERN.test(obj.image)) { + if (typeof obj.image !== "string" || !IPFS_URI_PATTERN.test(obj.image)) { return { valid: false, - error: 'image must be in ipfs://CID format (e.g., ipfs://QmXxxx).', - } + error: "image must be in ipfs://CID format (e.g., ipfs://QmXxxx).", + }; } // No extra fields allowed - const allowedKeys = new Set(['name', 'description', 'image']) + const allowedKeys = new Set(["name", "description", "image"]); for (const key of Object.keys(obj)) { if (!allowedKeys.has(key)) { - return { valid: false, error: `Unexpected field: ${key}.` } + return { valid: false, error: `Unexpected field: ${key}.` }; } } - return { valid: true } + return { valid: true }; } diff --git a/api/ipfs/unpin.test.ts b/api/ipfs/unpin.test.ts new file mode 100644 index 00000000..612d9c49 --- /dev/null +++ b/api/ipfs/unpin.test.ts @@ -0,0 +1,163 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import type { VercelRequest, VercelResponse } from "@vercel/node"; +import handler from "./unpin"; +import { issueToken } from "../_lib/jwt"; +import { recordPinOwner } from "../_lib/pinOwnership"; + +function fakeReqRes( + body: unknown, + token: string | undefined, + ip = "127.0.0.1", +) { + const headers: Record = { "x-forwarded-for": ip }; + if (token) headers.authorization = `Bearer ${token}`; + + const req = { + method: "POST", + headers, + socket: { remoteAddress: ip }, + body, + } as unknown as VercelRequest; + + const json = vi.fn(); + const status = vi.fn(() => ({ json })); + const res = { status } as unknown as VercelResponse; + + return { req, res, status, json }; +} + +/** A syntactically valid CIDv0, unique per test via `seed`. */ +function makeCid(seed: string): string { + return `Qm${seed.padEnd(44, "a")}`; +} + +describe("POST /api/ipfs/unpin", () => { + beforeEach(() => { + process.env.JWT_SECRET = "test-jwt-secret"; + process.env.PINATA_API_KEY = "test-key"; + process.env.PINATA_API_SECRET = "test-secret"; + vi.stubGlobal( + "fetch", + vi.fn().mockResolvedValue({ + ok: true, + json: async () => ({}), + } as Response), + ); + }); + + afterEach(() => { + vi.unstubAllGlobals(); + delete process.env.JWT_SECRET; + delete process.env.PINATA_API_KEY; + delete process.env.PINATA_API_SECRET; + }); + + it("rejects non-POST methods", async () => { + const { req, res, status } = fakeReqRes({}, undefined, "203.0.113.20"); + req.method = "GET"; + + await handler(req, res); + + expect(status).toHaveBeenCalledWith(405); + }); + + it("rejects requests without a valid JWT", async () => { + const cid = makeCid("noauth"); + const { req, res, status } = fakeReqRes({ cid }, undefined, "203.0.113.21"); + + await handler(req, res); + + expect(status).toHaveBeenCalledWith(401); + expect(fetch).not.toHaveBeenCalled(); + }); + + it("rejects a malformed cid before checking ownership", async () => { + const token = issueToken( + "GREQUESTERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + ); + const { req, res, status } = fakeReqRes( + { cid: "not-a-real-cid" }, + token, + "203.0.113.22", + ); + + await handler(req, res); + + expect(status).toHaveBeenCalledWith(400); + expect(fetch).not.toHaveBeenCalled(); + }); + + it("denies unpinning a CID with no ownership record on file (deny by default)", async () => { + const cid = makeCid("unknown1"); + const token = issueToken( + "GREQUESTERBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + ); + const { req, res, status, json } = fakeReqRes( + { cid }, + token, + "203.0.113.23", + ); + + await handler(req, res); + + expect(status).toHaveBeenCalledWith(403); + expect(json).toHaveBeenCalledWith( + expect.objectContaining({ + error: expect.stringContaining("denied by default"), + }), + ); + expect(fetch).not.toHaveBeenCalled(); + }); + + it("denies a wallet that does not own the CID (IDOR check)", async () => { + const cid = makeCid("ownedbyA"); + await recordPinOwner( + cid, + "GOWNERWALLETAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + ); + + const attackerToken = issueToken( + "GATTACKERWALLETBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + ); + const { req, res, status, json } = fakeReqRes( + { cid }, + attackerToken, + "203.0.113.24", + ); + + await handler(req, res); + + expect(status).toHaveBeenCalledWith(403); + expect(json).toHaveBeenCalledWith( + expect.objectContaining({ + error: expect.stringContaining("not authorized"), + }), + ); + expect(fetch).not.toHaveBeenCalled(); + }); + + it("allows the legitimate owner to unpin their own CID", async () => { + const cid = makeCid("ownedbyB"); + const ownerAddress = + "GOWNERWALLETCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"; + await recordPinOwner(cid, ownerAddress); + + const ownerToken = issueToken(ownerAddress); + const { req, res, status, json } = fakeReqRes( + { cid }, + ownerToken, + "203.0.113.25", + ); + + await handler(req, res); + + expect(status).toHaveBeenCalledWith(200); + expect(json).toHaveBeenCalledWith({ cid, unpinned: true }); + + const [url, options] = vi.mocked(fetch).mock.calls[0]; + expect(url).toBe(`https://api.pinata.cloud/pinning/unpin/${cid}`); + expect((options as RequestInit).method).toBe("DELETE"); + const headers = (options as RequestInit).headers as Record; + expect(headers.pinata_api_key).toBe("test-key"); + }); +}); diff --git a/api/ipfs/unpin.ts b/api/ipfs/unpin.ts new file mode 100644 index 00000000..47645a64 --- /dev/null +++ b/api/ipfs/unpin.ts @@ -0,0 +1,129 @@ +import type { VercelRequest, VercelResponse } from "@vercel/node"; +import { isRateLimited } from "../_lib/rateLimit"; +import { PINATA_API_URL, pinataHeaders } from "../_lib/pinata"; +import { isValidCid } from "../_lib/schemaValidation"; +import { verifyToken } from "../_lib/jwt"; +import { getPinOwner, clearPinOwner } from "../_lib/pinOwnership"; + +interface UnpinBody { + cid: string; +} + +export default async function handler(req: VercelRequest, res: VercelResponse) { + if (req.method !== "POST") { + res.status(405).json({ error: "Method not allowed" }); + return; + } + + // Authenticate: require a valid JWT from the challenge → signature flow + const authHeader = req.headers.authorization; + if (!authHeader || !authHeader.startsWith("Bearer ")) { + res.status(401).json({ + error: + "Authorization required. Request a challenge and sign with your wallet.", + }); + return; + } + + let walletAddress: string; + try { + const token = authHeader.slice(7); // Remove "Bearer " + const payload = verifyToken(token); + walletAddress = payload.address; + } catch (err) { + res.status(401).json({ + error: err instanceof Error ? err.message : "Invalid or expired token.", + }); + return; + } + + // Check rate limits (per wallet address, durable across instances) + if (await isRateLimited(walletAddress)) { + res + .status(429) + .json({ error: "Too many requests. Please try again later." }); + return; + } + + const body = req.body as UnpinBody | undefined; + const rawCid = typeof body?.cid === "string" ? body.cid : null; + if (!rawCid || !isValidCid(rawCid)) { + auditUnpin(walletAddress, rawCid ?? "(missing)", "denied_invalid_cid"); + res + .status(400) + .json({ error: "Request body must include a valid { cid: string }." }); + return; + } + const cid = rawCid; + + // Ownership check: a CID may only be unpinned by the wallet that pinned + // it. An unindexed/unknown CID is denied by default — we never assume + // the requester owns content we have no record of. + const ownerAddress = await getPinOwner(cid); + + if (ownerAddress === null) { + auditUnpin(walletAddress, cid, "denied_unknown_cid"); + res.status(403).json({ + error: + "This CID has no known owner on record. Unpin is denied by default for unindexed content.", + }); + return; + } + + if (ownerAddress !== walletAddress) { + auditUnpin(walletAddress, cid, "denied_not_owner"); + res + .status(403) + .json({ error: "You are not authorized to unpin this content." }); + return; + } + + let headers: Record; + try { + headers = pinataHeaders(); + } catch (err) { + res + .status(500) + .json({ + error: err instanceof Error ? err.message : "Server misconfiguration.", + }); + return; + } + + try { + const pinataRes = await fetch(`${PINATA_API_URL}/pinning/unpin/${cid}`, { + method: "DELETE", + headers, + }); + + if (!pinataRes.ok) { + auditUnpin(walletAddress, cid, "pinata_error"); + res + .status(502) + .json({ error: `Pinata unpin failed (HTTP ${pinataRes.status}).` }); + return; + } + + await clearPinOwner(cid); + auditUnpin(walletAddress, cid, "allowed"); + res.status(200).json({ cid, unpinned: true }); + } catch { + auditUnpin(walletAddress, cid, "error"); + res + .status(500) + .json({ error: "Unexpected error while unpinning from IPFS." }); + } +} + +/** Structured audit log for every unpin attempt, allowed or rejected. */ +function auditUnpin(address: string, cid: string, outcome: string): void { + console.log( + JSON.stringify({ + event: "ipfs_unpin", + address, + cid, + outcome, + at: new Date().toISOString(), + }), + ); +} diff --git a/api/ipfs/upload-file.ts b/api/ipfs/upload-file.ts index 6a201afc..cbcc6a23 100644 --- a/api/ipfs/upload-file.ts +++ b/api/ipfs/upload-file.ts @@ -1,17 +1,18 @@ -import type { VercelRequest, VercelResponse } from '@vercel/node' -import Busboy from 'busboy' -import { isRateLimited } from '../_lib/rateLimit' -import { PINATA_API_URL, pinataHeaders } from '../_lib/pinata' -import { validateFileMagicBytes } from '../_lib/fileValidation' -import { verifyToken } from '../_lib/jwt' +import type { VercelRequest, VercelResponse } from "@vercel/node"; +import Busboy from "busboy"; +import { isRateLimited } from "../_lib/rateLimit"; +import { PINATA_API_URL, pinataHeaders } from "../_lib/pinata"; +import { validateFileMagicBytes } from "../_lib/fileValidation"; +import { verifyToken } from "../_lib/jwt"; +import { recordPinOwner } from "../_lib/pinOwnership"; // Kept just under Vercel's 4.5MB serverless function request-body ceiling. -const MAX_FILE_SIZE = 4 * 1024 * 1024 +const MAX_FILE_SIZE = 4 * 1024 * 1024; interface ParsedFile { - buffer: Buffer - filename: string - mimeType: string + buffer: Buffer; + filename: string; + mimeType: string; } function parseMultipart(req: VercelRequest): Promise { @@ -19,122 +20,148 @@ function parseMultipart(req: VercelRequest): Promise { const bb = Busboy({ headers: req.headers as Record, limits: { fileSize: MAX_FILE_SIZE, files: 1 }, - }) - - let found: ParsedFile | null = null - let fileTooLarge = false - - bb.on('file', (_name, stream, info) => { - const chunks: Buffer[] = [] - stream.on('data', (chunk: Buffer) => chunks.push(chunk)) - stream.on('limit', () => { - fileTooLarge = true - }) - stream.on('end', () => { + }); + + let found: ParsedFile | null = null; + let fileTooLarge = false; + + bb.on("file", (_name, stream, info) => { + const chunks: Buffer[] = []; + stream.on("data", (chunk: Buffer) => chunks.push(chunk)); + stream.on("limit", () => { + fileTooLarge = true; + }); + stream.on("end", () => { if (!fileTooLarge) { - found = { buffer: Buffer.concat(chunks), filename: info.filename, mimeType: info.mimeType } + found = { + buffer: Buffer.concat(chunks), + filename: info.filename, + mimeType: info.mimeType, + }; } - }) - }) + }); + }); - bb.on('error', reject) - bb.on('close', () => { + bb.on("error", reject); + bb.on("close", () => { if (fileTooLarge) { - reject(new Error('FILE_TOO_LARGE')) - return + reject(new Error("FILE_TOO_LARGE")); + return; } if (!found) { - reject(new Error('NO_FILE')) - return + reject(new Error("NO_FILE")); + return; } - resolve(found) - }) + resolve(found); + }); - req.pipe(bb) - }) + req.pipe(bb); + }); } export default async function handler(req: VercelRequest, res: VercelResponse) { - if (req.method !== 'POST') { - res.status(405).json({ error: 'Method not allowed' }) - return + if (req.method !== "POST") { + res.status(405).json({ error: "Method not allowed" }); + return; } // Authenticate: require a valid JWT from the challenge → signature flow - const authHeader = req.headers.authorization - if (!authHeader || !authHeader.startsWith('Bearer ')) { + const authHeader = req.headers.authorization; + if (!authHeader || !authHeader.startsWith("Bearer ")) { res.status(401).json({ - error: 'Authorization required. Request a challenge and sign with your wallet.', - }) - return + error: + "Authorization required. Request a challenge and sign with your wallet.", + }); + return; } - let walletAddress: string + let walletAddress: string; try { - const token = authHeader.slice(7) // Remove "Bearer " - const payload = verifyToken(token) - walletAddress = payload.address + const token = authHeader.slice(7); // Remove "Bearer " + const payload = verifyToken(token); + walletAddress = payload.address; } catch (err) { res.status(401).json({ - error: err instanceof Error ? err.message : 'Invalid or expired token.', - }) - return + error: err instanceof Error ? err.message : "Invalid or expired token.", + }); + return; } // Check rate limits (per wallet address, durable across instances) if (await isRateLimited(walletAddress)) { - res.status(429).json({ error: 'Too many upload requests. Please try again later.' }) - return + res + .status(429) + .json({ error: "Too many upload requests. Please try again later." }); + return; } - let file: ParsedFile + let file: ParsedFile; try { - file = await parseMultipart(req) + file = await parseMultipart(req); } catch (err) { - if (err instanceof Error && err.message === 'FILE_TOO_LARGE') { - res.status(413).json({ error: 'File exceeds the 4MB limit.' }) - return + if (err instanceof Error && err.message === "FILE_TOO_LARGE") { + res.status(413).json({ error: "File exceeds the 4MB limit." }); + return; } - res.status(400).json({ error: 'No valid file uploaded.' }) - return + res.status(400).json({ error: "No valid file uploaded." }); + return; } // Validate file content against magic bytes, not client-supplied MIME type - const magicValidation = validateFileMagicBytes(file.buffer, file.mimeType) + const magicValidation = validateFileMagicBytes(file.buffer, file.mimeType); if (!magicValidation.valid) { - res.status(400).json({ error: magicValidation.error }) - return + res.status(400).json({ error: magicValidation.error }); + return; } - const verifiedMimeType = magicValidation.mimeType + const verifiedMimeType = magicValidation.mimeType; - let headers: Record + let headers: Record; try { - headers = pinataHeaders() + headers = pinataHeaders(); } catch (err) { - res.status(500).json({ error: err instanceof Error ? err.message : 'Server misconfiguration.' }) - return + res + .status(500) + .json({ + error: err instanceof Error ? err.message : "Server misconfiguration.", + }); + return; } try { - const formData = new FormData() - formData.append('file', new Blob([file.buffer], { type: verifiedMimeType }), file.filename) - formData.append('pinataMetadata', JSON.stringify({ name: file.filename })) - formData.append('pinataOptions', JSON.stringify({ cidVersion: 1 })) + const formData = new FormData(); + formData.append( + "file", + new Blob([file.buffer], { type: verifiedMimeType }), + file.filename, + ); + formData.append("pinataMetadata", JSON.stringify({ name: file.filename })); + formData.append("pinataOptions", JSON.stringify({ cidVersion: 1 })); const pinataRes = await fetch(`${PINATA_API_URL}/pinning/pinFileToIPFS`, { - method: 'POST', + method: "POST", headers, body: formData, - }) + }); if (!pinataRes.ok) { - res.status(502).json({ error: `Pinata upload failed (HTTP ${pinataRes.status}).` }) - return + res + .status(502) + .json({ error: `Pinata upload failed (HTTP ${pinataRes.status}).` }); + return; } - const data = (await pinataRes.json()) as { IpfsHash: string } - res.status(200).json({ cid: data.IpfsHash }) + const data = (await pinataRes.json()) as { IpfsHash: string }; + + try { + await recordPinOwner(data.IpfsHash, walletAddress); + } catch (err) { + console.error("Failed to record pin owner:", err); + } + + res.status(200).json({ cid: data.IpfsHash }); } catch { - res.status(500).json({ error: 'Unexpected error while uploading to IPFS.' }) + res + .status(500) + .json({ error: "Unexpected error while uploading to IPFS." }); } } diff --git a/api/ipfs/upload-json.ts b/api/ipfs/upload-json.ts index ca9f2ada..249f45ea 100644 --- a/api/ipfs/upload-json.ts +++ b/api/ipfs/upload-json.ts @@ -1,89 +1,117 @@ -import type { VercelRequest, VercelResponse } from '@vercel/node' -import { isRateLimited } from '../_lib/rateLimit' -import { PINATA_API_URL, pinataHeaders } from '../_lib/pinata' -import { validateTokenMetadata } from '../_lib/schemaValidation' -import { verifyToken } from '../_lib/jwt' +import type { VercelRequest, VercelResponse } from "@vercel/node"; +import { isRateLimited } from "../_lib/rateLimit"; +import { PINATA_API_URL, pinataHeaders } from "../_lib/pinata"; +import { validateTokenMetadata } from "../_lib/schemaValidation"; +import { verifyToken } from "../_lib/jwt"; +import { recordPinOwner } from "../_lib/pinOwnership"; interface UploadJsonBody { - metadata: unknown - name: string + metadata: unknown; + name: string; } export default async function handler(req: VercelRequest, res: VercelResponse) { - if (req.method !== 'POST') { - res.status(405).json({ error: 'Method not allowed' }) - return + if (req.method !== "POST") { + res.status(405).json({ error: "Method not allowed" }); + return; } // Authenticate: require a valid JWT from the challenge → signature flow - const authHeader = req.headers.authorization - if (!authHeader || !authHeader.startsWith('Bearer ')) { + const authHeader = req.headers.authorization; + if (!authHeader || !authHeader.startsWith("Bearer ")) { res.status(401).json({ - error: 'Authorization required. Request a challenge and sign with your wallet.', - }) - return + error: + "Authorization required. Request a challenge and sign with your wallet.", + }); + return; } - let walletAddress: string + let walletAddress: string; try { - const token = authHeader.slice(7) // Remove "Bearer " - const payload = verifyToken(token) - walletAddress = payload.address + const token = authHeader.slice(7); // Remove "Bearer " + const payload = verifyToken(token); + walletAddress = payload.address; } catch (err) { res.status(401).json({ - error: err instanceof Error ? err.message : 'Invalid or expired token.', - }) - return + error: err instanceof Error ? err.message : "Invalid or expired token.", + }); + return; } // Check rate limits (per wallet address, durable across instances) if (await isRateLimited(walletAddress)) { - res.status(429).json({ error: 'Too many upload requests. Please try again later.' }) - return + res + .status(429) + .json({ error: "Too many upload requests. Please try again later." }); + return; } - const body = req.body as UploadJsonBody | undefined - if (!body || typeof body.name !== 'string' || typeof body.metadata !== 'object' || body.metadata === null) { - res.status(400).json({ error: 'Request body must include { metadata: object, name: string }.' }) - return + const body = req.body as UploadJsonBody | undefined; + if ( + !body || + typeof body.name !== "string" || + typeof body.metadata !== "object" || + body.metadata === null + ) { + res + .status(400) + .json({ + error: "Request body must include { metadata: object, name: string }.", + }); + return; } // Validate metadata against schema (name, description, image fields) // and enforce strict 8 KiB size limit - const jsonString = JSON.stringify(body.metadata) - const schemaValidation = validateTokenMetadata(body.metadata, jsonString) + const jsonString = JSON.stringify(body.metadata); + const schemaValidation = validateTokenMetadata(body.metadata, jsonString); if (!schemaValidation.valid) { - res.status(400).json({ error: schemaValidation.error }) - return + res.status(400).json({ error: schemaValidation.error }); + return; } - let headers: Record + let headers: Record; try { - headers = pinataHeaders({ 'Content-Type': 'application/json' }) + headers = pinataHeaders({ "Content-Type": "application/json" }); } catch (err) { - res.status(500).json({ error: err instanceof Error ? err.message : 'Server misconfiguration.' }) - return + res + .status(500) + .json({ + error: err instanceof Error ? err.message : "Server misconfiguration.", + }); + return; } try { const pinataRes = await fetch(`${PINATA_API_URL}/pinning/pinJSONToIPFS`, { - method: 'POST', + method: "POST", headers, body: JSON.stringify({ pinataContent: body.metadata, pinataMetadata: { name: body.name }, pinataOptions: { cidVersion: 1 }, }), - }) + }); if (!pinataRes.ok) { - res.status(502).json({ error: `Pinata upload failed (HTTP ${pinataRes.status}).` }) - return + res + .status(502) + .json({ error: `Pinata upload failed (HTTP ${pinataRes.status}).` }); + return; } - const data = (await pinataRes.json()) as { IpfsHash: string } - res.status(200).json({ cid: data.IpfsHash }) + const data = (await pinataRes.json()) as { IpfsHash: string }; + + try { + await recordPinOwner(data.IpfsHash, walletAddress); + } catch (err) { + console.error("Failed to record pin owner:", err); + } + + res.status(200).json({ cid: data.IpfsHash }); } catch { - res.status(500).json({ error: 'Unexpected error while uploading metadata to IPFS.' }) + res + .status(500) + .json({ error: "Unexpected error while uploading metadata to IPFS." }); } } From afc59c721d18736a249d70ade9f9e66704a050e7 Mon Sep 17 00:00:00 2001 From: Ejirosoft Date: Tue, 25 Aug 2026 09:27:33 +0000 Subject: [PATCH 2/6] fix(frontend): align react-dom with react at 19.2.8 PR #1049 bumped react to 19.2.8 but left react-dom pinned to 19.2.7, which React now hard-errors on at runtime ("Incompatible React versions"), breaking the entire frontend test suite and blocking the pre-push hook. --- frontend/package-lock.json | 12 ++++++------ frontend/package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 70e27bc4..a82085cb 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -14,7 +14,7 @@ "i18next": "^26.3.6", "qrcode.react": "^4.2.0", "react": "^19.2.8", - "react-dom": "^19.2.7", + "react-dom": "^19.2.8", "react-hook-form": "^7.83.0", "react-i18next": "^17.0.11", "react-router-dom": "^7.18.1", @@ -10268,15 +10268,15 @@ } }, "node_modules/react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.7" + "react": "^19.2.8" } }, "node_modules/react-hook-form": { @@ -11792,7 +11792,7 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", diff --git a/frontend/package.json b/frontend/package.json index 3740c8f0..b17e6ec0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -30,7 +30,7 @@ "i18next": "^26.3.6", "qrcode.react": "^4.2.0", "react": "^19.2.8", - "react-dom": "^19.2.7", + "react-dom": "^19.2.8", "react-hook-form": "^7.83.0", "react-i18next": "^17.0.11", "react-router-dom": "^7.18.1", From 13cd7f74a19a0e86faeba6fd2e081d45a9c19d32 Mon Sep 17 00:00:00 2001 From: Ejirosoft Date: Tue, 25 Aug 2026 10:36:44 +0000 Subject: [PATCH 3/6] fix(contract): unbreak build, tests and formatting after admin-rotation merge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The two-step admin-rotation change landed with a contract that does not compile, so Contract Build, Contract Tests and Rust Formatting all fail on this branch's merge of main. - `BatchSizeExceeded`, `NoPendingProposal` and `ProposalExpired` were all assigned discriminant 24 (E0081). Renumber them 25/26/27 and update the error tables in docs/contract-abi.md and README.md. - `test.rs` called `Ledger::with_mut` without importing the trait (E0599). - Apply `cargo fmt`. Two test failures the compile error had been masking: - `migrate`: the v3 `TokenInfo` walk is chunked and may still be mid-flight, but the new v4 step ran unconditionally and pushed the version marker to 4. Every later `migrate` call then skipped the v3 block, stranding the entries beyond the cursor in instance storage — exactly what the v3 chunking comment warns against. Return early while v3 is incomplete. - `accept_admin` cleared an expired proposal and then returned `ProposalExpired`; the error reverts the invocation, so the write never persisted. Drop the dead write and state the real behaviour: an expired proposal stays on record but is inert, and the admin cancels or re-proposes. Docs and the test now assert that. Regenerate the test snapshots, which were stale from the same merge. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01HFDD5GssS1ik3KcH3XMx43 --- README.md | 6 +- contracts/token-factory/src/lib.rs | 41 +- contracts/token-factory/src/test.rs | 19 +- ...est_accept_admin_completes_rotation.1.json | 481 +++++++++++ ...accept_admin_old_admin_loses_access.1.json | 521 ++++++++++++ ...ept_admin_with_no_proposal_rejected.1.json | 400 +++++++++ ...accept_admin_wrong_address_rejected.1.json | 447 ++++++++++ ..._to_whitelist_succeeds_and_persists.1.json | 16 +- .../test_add_to_whitelist_unauthorized.1.json | 16 +- .../test_admin_can_pause_and_unpause.1.json | 16 +- ..._capped_supply_allows_headroom_mint.1.json | 16 +- ...pped_supply_cannot_be_applied_twice.1.json | 16 +- ...ed_supply_rejects_token_without_cap.1.json | 16 +- ...pped_supply_rejects_value_above_cap.1.json | 16 +- ...l_capped_supply_seeds_untracked_cap.1.json | 16 +- ...backfill_capped_supply_unauthorized.1.json | 16 +- ...address_cannot_hijack_another_index.1.json | 16 +- ...ackfill_token_address_is_idempotent.1.json | 16 +- ...ddress_rejects_unregistered_address.1.json | 16 +- ...ddress_repairs_a_pre_existing_token.1.json | 16 +- ..._batch_blocked_when_not_whitelisted.1.json | 16 +- .../test_batch_blocked_when_paused.1.json | 16 +- .../test/test_batch_empty_rejected.1.json | 16 +- ...est_batch_insufficient_fee_rejected.1.json | 16 +- ...h_invalid_name_rejects_entire_batch.1.json | 16 +- .../test/test_batch_reentrancy_guard.1.json | 16 +- ...isted_creator_passes_whitelist_gate.1.json | 16 +- .../test_snapshots/test/test_burn.1.json | 16 +- ...st_burn_allowed_when_factory_paused.1.json | 16 +- .../test_burn_amount_exceeds_balance.1.json | 16 +- .../test/test_burn_disabled.1.json | 16 +- .../test/test_burn_disabled_no_bypass.1.json | 16 +- ...vent_only_emitted_for_factory_token.1.json | 16 +- .../test/test_burn_exact_balance.1.json | 16 +- .../test/test_burn_invalid_amount_zero.1.json | 16 +- ...st_burn_lock_released_after_success.1.json | 16 +- .../test/test_burn_reentrancy_guard.1.json | 16 +- ...registered_index_missing_info_fails.1.json | 16 +- .../test_burn_unregistered_token_fails.1.json | 16 +- .../test/test_cancel_admin_proposal.1.json | 481 +++++++++++ ...st_cancel_admin_proposal_idempotent.1.json | 438 ++++++++++ ..._cancel_admin_proposal_unauthorized.1.json | 447 ++++++++++ ...ken_allowed_when_whitelist_disabled.1.json | 16 +- ..._token_blocked_when_not_whitelisted.1.json | 16 +- ...st_create_token_blocked_when_paused.1.json | 16 +- .../test_create_token_insufficient_fee.1.json | 16 +- .../test_create_token_invalid_decimals.1.json | 16 +- ...create_token_invalid_decimals_large.1.json | 16 +- ...est_create_token_invalid_name_empty.1.json | 16 +- ...t_create_token_invalid_symbol_empty.1.json | 16 +- ...n_max_supply_below_initial_rejected.1.json | 16 +- ...st_create_token_min_supply_rejected.1.json | 16 +- ...eate_token_negative_supply_rejected.1.json | 16 +- ...ken_nonpositive_max_supply_rejected.1.json | 16 +- ...st_create_token_overflow_protection.1.json | 16 +- .../test_create_token_reentrancy_guard.1.json | 16 +- ...n_supply_i128_max_passes_validation.1.json | 16 +- ...token_supply_zero_passes_validation.1.json | 16 +- ...isted_creator_passes_whitelist_gate.1.json | 16 +- ...s_batch_overflow_protection_upfront.1.json | 16 +- ...ntrancy_lock_blocks_all_entrypoints.1.json | 16 +- ...expired_proposal_cannot_be_accepted.1.json | 526 ++++++++++++ ..._fee_distributed_according_to_split.1.json | 16 +- ..._fee_goes_to_treasury_when_no_split.1.json | 16 +- ...ee_split_largest_remainder_dust_fee.1.json | 16 +- ...e_split_max_recipients_conservation.1.json | 16 +- ...d_amount_remainder_goes_to_treasury.1.json | 16 +- ...split_sum_invariant_many_recipients.1.json | 16 +- ...pient_skipped_remainder_to_treasury.1.json | 16 +- ...ce_rejects_with_no_partial_transfer.1.json | 16 +- .../test_freeze_metadata_idempotent.1.json | 16 +- .../test_freeze_metadata_unauthorized.1.json | 16 +- ...ata_none_before_set_then_some_after.1.json | 16 +- ...n_address_enumerates_full_token_set.1.json | 16 +- ...ss_round_trips_with_get_token_index.1.json | 16 +- ...ess_unknown_index_returns_not_found.1.json | 16 +- ..._not_found_for_unregistered_address.1.json | 16 +- ...n_index_resolves_registered_address.1.json | 16 +- .../test/test_get_token_info.1.json | 16 +- ..._info_by_address_missing_info_entry.1.json | 16 +- ...get_token_info_by_address_not_found.1.json | 16 +- ...ress_returns_authoritative_identity.1.json | 16 +- .../test/test_get_token_info_not_found.1.json | 16 +- .../test/test_get_tokens_by_creator.1.json | 16 +- ...s_by_creator_clamps_oversized_limit.1.json | 16 +- ...tokens_by_creator_empty_for_unknown.1.json | 16 +- ...st_get_tokens_by_creator_first_page.1.json | 16 +- ...ens_by_creator_isolated_per_creator.1.json | 16 +- ...t_tokens_by_creator_offset_past_end.1.json | 16 +- ...tokens_by_creator_partial_last_page.1.json | 16 +- ...t_get_tokens_by_creator_second_page.1.json | 16 +- ...st_get_tokens_by_creator_zero_limit.1.json | 16 +- .../test/test_initialize.1.json | 16 +- ...test_initialize_already_initialized.1.json | 16 +- ...test_initialize_sets_schema_version.1.json | 16 +- ...ialize_sets_whitelist_enabled_false.1.json | 16 +- .../test_initialize_zero_fees_allowed.1.json | 16 +- ..._storage_size_stays_flat_under_load.1.json | 16 +- ...telisted_returns_false_after_remove.1.json | 16 +- ...itelisted_returns_false_for_unknown.1.json | 16 +- ..._whitelisted_returns_true_after_add.1.json | 16 +- ...sted_view_agrees_with_creation_gate.1.json | 16 +- ...grate_from_v0_walks_all_steps_to_v4.1.json | 448 ++++++++++ ...rate_from_version_0_walks_all_steps.1.json | 16 +- ...rom_version_1_walks_remaining_steps.1.json | 16 +- .../test/test_migrate_is_idempotent.1.json | 16 +- ...test_migrate_preserves_state_fields.1.json | 16 +- ...te_preserves_whitelist_enabled_flag.1.json | 16 +- .../test/test_migrate_unauthorized.1.json | 16 +- ...igrate_upgrades_pre_versioned_state.1.json | 16 +- ..._to_v3_sets_whitelist_enabled_false.1.json | 16 +- ...te_v2_idempotent_at_current_version.1.json | 16 +- ..._v3_completes_across_repeated_calls.1.json | 16 +- ...v3_completes_in_one_call_when_small.1.json | 16 +- ...omplete_in_one_chunk_when_oversized.1.json | 12 + ..._v3_to_v4_adds_pending_admin_fields.1.json | 440 ++++++++++ ...ate_v4_idempotent_for_pending_admin.1.json | 478 +++++++++++ ...igrate_whitelist_step_is_idempotent.1.json | 16 +- .../test/test_mint_tokens.1.json | 16 +- .../test_mint_tokens_exactly_at_cap.1.json | 16 +- .../test/test_mint_tokens_exceeds_cap.1.json | 16 +- ...lit_sums_to_charged_fee_not_payment.1.json | 16 +- .../test_mint_tokens_insufficient_fee.1.json | 16 +- ...nt_tokens_lock_released_after_error.1.json | 16 +- ..._tokens_lock_released_after_success.1.json | 16 +- .../test/test_mint_tokens_one_over_cap.1.json | 16 +- ..._overpayment_charges_exact_fee_only.1.json | 16 +- .../test_mint_tokens_reentrancy_guard.1.json | 16 +- ..._tokens_rejects_real_reentrant_call.1.json | 795 ++++++++++++++++++ .../test/test_mint_tokens_unauthorized.1.json | 16 +- ...int_tokens_unregistered_token_fails.1.json | 16 +- .../test/test_mint_tokens_within_cap.1.json | 16 +- ...st_mint_tokens_zero_amount_rejected.1.json | 16 +- .../test/test_non_admin_cannot_pause.1.json | 16 +- ...propose_admin_records_pending_state.1.json | 446 ++++++++++ ...ropose_admin_self_transfer_rejected.1.json | 400 +++++++++ .../test_propose_admin_unauthorized.1.json | 400 +++++++++ ...eentrancy_lock_released_after_error.1.json | 16 +- ..._from_whitelist_succeeds_and_clears.1.json | 16 +- ..._remove_from_whitelist_unauthorized.1.json | 16 +- ...st_second_proposal_overwrites_first.1.json | 525 ++++++++++++ ...urn_enabled_disables_then_reenables.1.json | 16 +- ...enabled_lock_released_after_success.1.json | 16 +- ...t_set_burn_enabled_reentrancy_guard.1.json | 16 +- .../test_set_burn_enabled_unauthorized.1.json | 16 +- ...rn_enabled_unregistered_token_fails.1.json | 16 +- ...ee_split_at_max_recipients_accepted.1.json | 16 +- ...st_set_fee_split_empty_clears_split.1.json | 16 +- ...t_fee_split_exactly_at_cap_accepted.1.json | 16 +- ..._set_fee_split_invalid_sum_rejected.1.json | 16 +- ..._split_over_max_recipients_rejected.1.json | 16 +- ..._split_too_many_recipients_rejected.1.json | 16 +- .../test_set_fee_split_unauthorized.1.json | 16 +- .../test/test_set_fee_split_valid.1.json | 16 +- ...est_set_fee_split_zero_bps_rejected.1.json | 16 +- .../test/test_set_metadata.1.json | 16 +- .../test/test_set_metadata_already_set.1.json | 16 +- ...tadata_different_tokens_independent.1.json | 16 +- ...t_set_metadata_fee_goes_to_treasury.1.json | 16 +- .../test_set_metadata_insufficient_fee.1.json | 16 +- ...etadata_lock_released_after_success.1.json | 16 +- ..._overpayment_charges_exact_fee_only.1.json | 16 +- .../test_set_metadata_reentrancy_guard.1.json | 16 +- ...test_set_metadata_rejects_empty_uri.1.json | 16 +- ...etadata_rejects_missing_ipfs_prefix.1.json | 16 +- ...st_set_metadata_rejects_prefix_only.1.json | 16 +- ...t_set_metadata_rejects_uri_too_long.1.json | 16 +- .../test_set_metadata_unauthorized.1.json | 16 +- ...t_metadata_unregistered_token_fails.1.json | 16 +- ...est_set_metadata_update_then_freeze.1.json | 16 +- ...est_set_metadata_version_increments.1.json | 16 +- ..._enabled_succeeds_and_updates_state.1.json | 16 +- ..._set_whitelist_enabled_toggles_flag.1.json | 16 +- ..._set_whitelist_enabled_unauthorized.1.json | 16 +- ...and_update_admin_produce_same_state.1.json | 22 +- ...and_update_admin_produce_same_state.2.json | 22 +- ...admin_and_update_admin_share_guards.1.json | 16 +- ...er_admin_delegates_to_propose_admin.1.json | 483 +++++++++++ ...nsfer_admin_grants_new_admin_rights.1.json | 58 +- ...ransfer_admin_same_address_rejected.1.json | 16 +- .../test_transfer_admin_unauthorized.1.json | 16 +- .../test_ttl_extended_after_initialize.1.json | 16 +- ...te_admin_delegates_to_propose_admin.1.json | 483 +++++++++++ .../test_update_admin_old_loses_access.1.json | 58 +- .../test/test_update_fees.1.json | 16 +- .../test_update_fees_i128_min_rejected.1.json | 16 +- ...ate_fees_negative_base_fee_rejected.1.json | 16 +- ...ees_negative_does_not_corrupt_state.1.json | 16 +- ...fees_negative_metadata_fee_rejected.1.json | 16 +- .../test/test_update_fees_partial.1.json | 16 +- .../test/test_update_fees_unauthorized.1.json | 16 +- .../test/test_update_fees_zero_allowed.1.json | 16 +- .../test/test_upgrade_unauthorized.1.json | 16 +- ...hitelist_add_remove_create_sequence.1.json | 16 +- ...t_whitelist_disable_reopens_factory.1.json | 16 +- .../test_whitelist_disabled_by_default.1.json | 16 +- ..._consistent_across_single_and_batch.1.json | 16 +- ...t_gate_honors_legacy_instance_entry.1.json | 16 +- ...telist_gate_honors_persistent_entry.1.json | 16 +- docs/contract-abi.md | 10 +- 200 files changed, 11276 insertions(+), 379 deletions(-) create mode 100644 contracts/token-factory/test_snapshots/test/test_accept_admin_completes_rotation.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_accept_admin_old_admin_loses_access.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_accept_admin_with_no_proposal_rejected.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_accept_admin_wrong_address_rejected.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_cancel_admin_proposal.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_cancel_admin_proposal_idempotent.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_cancel_admin_proposal_unauthorized.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_expired_proposal_cannot_be_accepted.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_migrate_from_v0_walks_all_steps_to_v4.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_migrate_v3_to_v4_adds_pending_admin_fields.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_migrate_v4_idempotent_for_pending_admin.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_mint_tokens_rejects_real_reentrant_call.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_propose_admin_records_pending_state.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_propose_admin_self_transfer_rejected.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_propose_admin_unauthorized.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_second_proposal_overwrites_first.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_transfer_admin_delegates_to_propose_admin.1.json create mode 100644 contracts/token-factory/test_snapshots/test/test_update_admin_delegates_to_propose_admin.1.json diff --git a/README.md b/README.md index 0dff5f3f..23c47dd1 100644 --- a/README.md +++ b/README.md @@ -292,11 +292,11 @@ The authoritative, field-by-field reference — including parameter tables, ever ### Errors -All fallible entrypoints return `Result`. See the full table (25 variants, e.g. `InsufficientFee`, `Unauthorized`, `ContractPaused`, `MaxSupplyExceeded`, `InvalidFeeSplit`, `NoPendingProposal`, `ProposalExpired`) in [`docs/contract-abi.md`](./docs/contract-abi.md#errors). +All fallible entrypoints return `Result`. See the full table (27 variants, e.g. `InsufficientFee`, `Unauthorized`, `ContractPaused`, `MaxSupplyExceeded`, `InvalidFeeSplit`, `NoPendingProposal`, `ProposalExpired`) in [`docs/contract-abi.md`](./docs/contract-abi.md#errors). ### Events -The contract publishes Soroban events on `(factory, action)` topics — `init`, `created`, `meta`, `mint`, `burn`, `fees`, `pause`, `unpause`, `adm_upd` — parsed by the frontend in `frontend/src/services/stellar-impl.ts` and rendered in the Transaction History view. See [`docs/contract-abi.md`](./docs/contract-abi.md#events) for the exact payload of each. +The contract publishes Soroban events on `(factory, action)` topics — `init`, `created`, `meta`, `mint`, `burn`, `fees`, `pause`, `unpause`, `adm_prop`, `adm_acc`, `adm_can` — parsed by the frontend in `frontend/src/services/stellar-impl.ts` and rendered in the Transaction History view. See [`docs/contract-abi.md`](./docs/contract-abi.md#events) for the exact payload of each. ## Usage @@ -980,7 +980,7 @@ The factory contract supports in-place WASM upgrades without redeploying or migr | 1 | Initial versioned schema — added `schema_version` field to `FactoryState` | | 2 | Max-supply accounting fix (issue #1006) — `deploy_one` now seeds the per-token supply counter with `initial_supply`; version bump only, no `FactoryState` field changes. Pre-fix capped tokens must be back-filled individually via `backfill_capped_supply` (see [docs/contract-abi.md](./docs/contract-abi.md#supply-cap-accounting)) | | 3 | Persistent-storage migration (issue #1007) — per-token bookkeeping (`TokenInfo`, `TokenIndex`, `Metadata`, `owner`, `supply`, `CreatorTokens`) moves out of the shared `instance` ledger entry into `persistent` storage, keeping `instance` storage O(1) in `token_count`. `TokenInfo` migrates in bounded, resumable chunks per `migrate` call; everything else migrates lazily on next access (see [docs/contract-abi.md](./docs/contract-abi.md#storage-architecture)) | -| 4 | Two-step admin rotation — added `pending_admin: Option
` and `pending_admin_expiry: Option` to `FactoryState`; new `propose_admin`, `accept_admin`, `cancel_admin_proposal` entrypoints; `transfer_admin` and `update_admin` now delegate to `propose_admin` (no single-step rotation path remains). New error codes 24 (`NoPendingProposal`) and 25 (`ProposalExpired`). New events `adm_prop`, `adm_acc`, `adm_can`. | +| 4 | Two-step admin rotation — added `pending_admin: Option
` and `pending_admin_expiry: Option` to `FactoryState`; new `propose_admin`, `accept_admin`, `cancel_admin_proposal` entrypoints; `transfer_admin` and `update_admin` now delegate to `propose_admin` (no single-step rotation path remains). New error codes 26 (`NoPendingProposal`) and 27 (`ProposalExpired`). New events `adm_prop`, `adm_acc`, `adm_can`. | ### Adding a new migration (version N → N+1) diff --git a/contracts/token-factory/src/lib.rs b/contracts/token-factory/src/lib.rs index 9dcc71f5..a69ea046 100644 --- a/contracts/token-factory/src/lib.rs +++ b/contracts/token-factory/src/lib.rs @@ -210,13 +210,13 @@ pub enum Error { /// this is a hard error that aborts the call. TreasuryTransferFailed = 24, /// `create_tokens_batch` batch size exceeds `MAX_BATCH_SIZE` - BatchSizeExceeded = 24, + BatchSizeExceeded = 25, /// `accept_admin` called when no proposal is pending, or the proposed /// address does not match the caller - NoPendingProposal = 24, + NoPendingProposal = 26, /// The pending admin proposal has passed its expiry ledger and can no /// longer be accepted; the current admin must open a new proposal - ProposalExpired = 25, + ProposalExpired = 27, } #[contract] @@ -485,7 +485,10 @@ impl TokenFactory { { return Err(Error::TreasuryTransferFailed); } - } else if fee_client.try_transfer(payer, &state.treasury, &amount).is_err() { + } else if fee_client + .try_transfer(payer, &state.treasury, &amount) + .is_err() + { return Err(Error::TreasuryTransferFailed); } Ok(()) @@ -1603,6 +1606,15 @@ impl TokenFactory { } } + // The v3 walk is chunked, so it may still be mid-flight here. Every + // later step must wait: bumping the version marker past 3 would make + // the next `migrate` call skip the v3 block entirely and strand the + // `TokenInfo` entries beyond the cursor in `instance` storage forever. + // Return successfully so the caller simply calls `migrate` again. + if on_chain_version < 3 { + return Ok(()); + } + // Each future migration step follows the same pattern: // // if on_chain_version < N { @@ -1705,7 +1717,11 @@ impl TokenFactory { /// Does **not** complete the rotation — only `accept_admin` does that. /// There is no single-step rotation path: `transfer_admin` and /// `update_admin` both delegate here. - pub fn propose_admin(env: Env, current_admin: Address, new_admin: Address) -> Result<(), Error> { + pub fn propose_admin( + env: Env, + current_admin: Address, + new_admin: Address, + ) -> Result<(), Error> { current_admin.require_auth(); let mut state = Self::load_state(&env)?; if state.admin != current_admin { @@ -1752,14 +1768,19 @@ impl TokenFactory { if proposed != new_admin { return Err(Error::NoPendingProposal); } - let expiry = state.pending_admin_expiry.take().unwrap_or(0); - // Clear the proposal now — whether expired or accepted we don't want it live. - state.pending_admin = None; + let expiry = state.pending_admin_expiry.unwrap_or(0); if (env.ledger().sequence() as u64) >= expiry { - // Proposal expired — clear it and report. - Self::save_state(&env, &state); + // Returning an error reverts the whole invocation, so an expired + // proposal cannot be cleared from here — any write we made would + // be rolled back with the rest of the call. It simply stays on + // record as inert: it can never be accepted, and the current + // admin removes it with `cancel_admin_proposal` or replaces it by + // calling `propose_admin` again. return Err(Error::ProposalExpired); } + // Accepted — the proposal is consumed. + state.pending_admin = None; + state.pending_admin_expiry = None; let old_admin = state.admin.clone(); state.admin = new_admin.clone(); Self::save_state(&env, &state); diff --git a/contracts/token-factory/src/test.rs b/contracts/token-factory/src/test.rs index 3c8834e6..bb9d71a9 100644 --- a/contracts/token-factory/src/test.rs +++ b/contracts/token-factory/src/test.rs @@ -5,7 +5,7 @@ extern crate std; use super::*; use soroban_sdk::{ contract, contractimpl, - testutils::{Address as _, Events as _}, + testutils::{Address as _, Events as _, Ledger as _}, token::{StellarAssetClient, TokenClient}, Address, BytesN, Env, Map, MuxedAddress, String, }; @@ -1783,17 +1783,28 @@ fn test_expired_proposal_cannot_be_accepted() { // Advance the ledger past the TTL. s.env.ledger().with_mut(|li| { - li.sequence_number = li.sequence_number.saturating_add(ADMIN_PROPOSAL_TTL_LEDGERS as u32 + 1); + li.sequence_number = li + .sequence_number + .saturating_add(ADMIN_PROPOSAL_TTL_LEDGERS as u32 + 1); }); assert_eq!( s.client.try_accept_admin(&new_admin), Err(Ok(Error::ProposalExpired)) ); - // After expiry the state must be cleared so the admin can propose again. + // The rejection reverts the whole call, so the expired proposal is still + // on record — inert, never acceptable, and harmless. The admin clears it + // by cancelling, or replaces it by proposing again. let state = s.client.get_state(); - assert_eq!(state.pending_admin, None); + assert_eq!(state.pending_admin, Some(new_admin.clone())); assert_eq!(state.admin, s.admin); + + // Re-proposing overwrites the expired entry with a fresh expiry window, + // and the new proposal is acceptable. + s.client.propose_admin(&s.admin, &new_admin); + s.client.accept_admin(&new_admin); + assert_eq!(s.client.get_state().admin, new_admin); + assert_eq!(s.client.get_state().pending_admin, None); } #[test] diff --git a/contracts/token-factory/test_snapshots/test/test_accept_admin_completes_rotation.1.json b/contracts/token-factory/test_snapshots/test/test_accept_admin_completes_rotation.1.json new file mode 100644 index 00000000..0fdd6ebb --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_accept_admin_completes_rotation.1.json @@ -0,0 +1,481 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "propose_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "accept_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_accept_admin_old_admin_loses_access.1.json b/contracts/token-factory/test_snapshots/test/test_accept_admin_old_admin_loses_access.1.json new file mode 100644 index 00000000..09100a44 --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_accept_admin_old_admin_loses_access.1.json @@ -0,0 +1,521 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "propose_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "accept_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "pause", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "4270020994084947596" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_accept_admin_with_no_proposal_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_accept_admin_with_no_proposal_rejected.1.json new file mode 100644 index 00000000..da796622 --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_accept_admin_with_no_proposal_rejected.1.json @@ -0,0 +1,400 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_accept_admin_wrong_address_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_accept_admin_wrong_address_rejected.1.json new file mode 100644 index 00000000..328f6b6d --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_accept_admin_wrong_address_rejected.1.json @@ -0,0 +1,447 @@ +{ + "generators": { + "address": 6, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "propose_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": { + "u64": "17280" + } + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_add_to_whitelist_succeeds_and_persists.1.json b/contracts/token-factory/test_snapshots/test/test_add_to_whitelist_succeeds_and_persists.1.json index 1e528f74..51445821 100644 --- a/contracts/token-factory/test_snapshots/test/test_add_to_whitelist_succeeds_and_persists.1.json +++ b/contracts/token-factory/test_snapshots/test/test_add_to_whitelist_succeeds_and_persists.1.json @@ -221,7 +221,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -282,12 +282,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_add_to_whitelist_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_add_to_whitelist_unauthorized.1.json index 879e51a4..14a8fb0c 100644 --- a/contracts/token-factory/test_snapshots/test/test_add_to_whitelist_unauthorized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_add_to_whitelist_unauthorized.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_admin_can_pause_and_unpause.1.json b/contracts/token-factory/test_snapshots/test/test_admin_can_pause_and_unpause.1.json index df5206e5..4ba486f7 100644 --- a/contracts/token-factory/test_snapshots/test/test_admin_can_pause_and_unpause.1.json +++ b/contracts/token-factory/test_snapshots/test/test_admin_can_pause_and_unpause.1.json @@ -231,7 +231,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -292,12 +292,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_allows_headroom_mint.1.json b/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_allows_headroom_mint.1.json index 886d78b9..03abf737 100644 --- a/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_allows_headroom_mint.1.json +++ b/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_allows_headroom_mint.1.json @@ -650,7 +650,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -711,12 +711,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_cannot_be_applied_twice.1.json b/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_cannot_be_applied_twice.1.json index f8d76e77..236f150a 100644 --- a/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_cannot_be_applied_twice.1.json +++ b/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_cannot_be_applied_twice.1.json @@ -539,7 +539,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -600,12 +600,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_rejects_token_without_cap.1.json b/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_rejects_token_without_cap.1.json index 2ec71cfe..a33181fa 100644 --- a/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_rejects_token_without_cap.1.json +++ b/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_rejects_token_without_cap.1.json @@ -438,7 +438,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -499,12 +499,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_rejects_value_above_cap.1.json b/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_rejects_value_above_cap.1.json index d9c71753..2e1f962b 100644 --- a/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_rejects_value_above_cap.1.json +++ b/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_rejects_value_above_cap.1.json @@ -440,7 +440,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -501,12 +501,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_seeds_untracked_cap.1.json b/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_seeds_untracked_cap.1.json index 5bd8f4bf..2b0455f2 100644 --- a/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_seeds_untracked_cap.1.json +++ b/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_seeds_untracked_cap.1.json @@ -581,7 +581,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -642,12 +642,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_unauthorized.1.json index 24c3ad0b..e3fe9663 100644 --- a/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_unauthorized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_backfill_capped_supply_unauthorized.1.json @@ -440,7 +440,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -501,12 +501,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_backfill_token_address_cannot_hijack_another_index.1.json b/contracts/token-factory/test_snapshots/test/test_backfill_token_address_cannot_hijack_another_index.1.json index 64aa9e8f..96b79062 100644 --- a/contracts/token-factory/test_snapshots/test/test_backfill_token_address_cannot_hijack_another_index.1.json +++ b/contracts/token-factory/test_snapshots/test/test_backfill_token_address_cannot_hijack_another_index.1.json @@ -671,7 +671,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -732,12 +732,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_backfill_token_address_is_idempotent.1.json b/contracts/token-factory/test_snapshots/test/test_backfill_token_address_is_idempotent.1.json index 2ad22966..d8d326a9 100644 --- a/contracts/token-factory/test_snapshots/test/test_backfill_token_address_is_idempotent.1.json +++ b/contracts/token-factory/test_snapshots/test/test_backfill_token_address_is_idempotent.1.json @@ -442,7 +442,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -503,12 +503,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_backfill_token_address_rejects_unregistered_address.1.json b/contracts/token-factory/test_snapshots/test/test_backfill_token_address_rejects_unregistered_address.1.json index 101a980a..ba9a9cc9 100644 --- a/contracts/token-factory/test_snapshots/test/test_backfill_token_address_rejects_unregistered_address.1.json +++ b/contracts/token-factory/test_snapshots/test/test_backfill_token_address_rejects_unregistered_address.1.json @@ -213,7 +213,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -274,12 +274,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_backfill_token_address_repairs_a_pre_existing_token.1.json b/contracts/token-factory/test_snapshots/test/test_backfill_token_address_repairs_a_pre_existing_token.1.json index 2ad22966..d8d326a9 100644 --- a/contracts/token-factory/test_snapshots/test/test_backfill_token_address_repairs_a_pre_existing_token.1.json +++ b/contracts/token-factory/test_snapshots/test/test_backfill_token_address_repairs_a_pre_existing_token.1.json @@ -442,7 +442,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -503,12 +503,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_batch_blocked_when_not_whitelisted.1.json b/contracts/token-factory/test_snapshots/test/test_batch_blocked_when_not_whitelisted.1.json index 36e1aba0..a28800c1 100644 --- a/contracts/token-factory/test_snapshots/test/test_batch_blocked_when_not_whitelisted.1.json +++ b/contracts/token-factory/test_snapshots/test/test_batch_blocked_when_not_whitelisted.1.json @@ -236,7 +236,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -297,12 +297,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_batch_blocked_when_paused.1.json b/contracts/token-factory/test_snapshots/test/test_batch_blocked_when_paused.1.json index ae773042..6cba0d2c 100644 --- a/contracts/token-factory/test_snapshots/test/test_batch_blocked_when_paused.1.json +++ b/contracts/token-factory/test_snapshots/test/test_batch_blocked_when_paused.1.json @@ -191,7 +191,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -252,12 +252,24 @@ "bool": true } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_batch_empty_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_batch_empty_rejected.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_batch_empty_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_batch_empty_rejected.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_batch_insufficient_fee_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_batch_insufficient_fee_rejected.1.json index ea5a7e89..d546880f 100644 --- a/contracts/token-factory/test_snapshots/test/test_batch_insufficient_fee_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_batch_insufficient_fee_rejected.1.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -255,12 +255,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_batch_invalid_name_rejects_entire_batch.1.json b/contracts/token-factory/test_snapshots/test/test_batch_invalid_name_rejects_entire_batch.1.json index 132bf828..567c4987 100644 --- a/contracts/token-factory/test_snapshots/test/test_batch_invalid_name_rejects_entire_batch.1.json +++ b/contracts/token-factory/test_snapshots/test/test_batch_invalid_name_rejects_entire_batch.1.json @@ -195,7 +195,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -256,12 +256,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_batch_reentrancy_guard.1.json b/contracts/token-factory/test_snapshots/test/test_batch_reentrancy_guard.1.json index 9d36a82f..6458358a 100644 --- a/contracts/token-factory/test_snapshots/test/test_batch_reentrancy_guard.1.json +++ b/contracts/token-factory/test_snapshots/test/test_batch_reentrancy_guard.1.json @@ -153,7 +153,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -214,12 +214,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_batch_whitelisted_creator_passes_whitelist_gate.1.json b/contracts/token-factory/test_snapshots/test/test_batch_whitelisted_creator_passes_whitelist_gate.1.json index 81063008..03e0f283 100644 --- a/contracts/token-factory/test_snapshots/test/test_batch_whitelisted_creator_passes_whitelist_gate.1.json +++ b/contracts/token-factory/test_snapshots/test/test_batch_whitelisted_creator_passes_whitelist_gate.1.json @@ -263,7 +263,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -324,12 +324,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_burn.1.json b/contracts/token-factory/test_snapshots/test/test_burn.1.json index 625d369f..9960ce81 100644 --- a/contracts/token-factory/test_snapshots/test/test_burn.1.json +++ b/contracts/token-factory/test_snapshots/test/test_burn.1.json @@ -503,7 +503,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -564,12 +564,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_burn_allowed_when_factory_paused.1.json b/contracts/token-factory/test_snapshots/test/test_burn_allowed_when_factory_paused.1.json index 2ecd6659..42c3d260 100644 --- a/contracts/token-factory/test_snapshots/test/test_burn_allowed_when_factory_paused.1.json +++ b/contracts/token-factory/test_snapshots/test/test_burn_allowed_when_factory_paused.1.json @@ -542,7 +542,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -603,12 +603,24 @@ "bool": true } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_burn_amount_exceeds_balance.1.json b/contracts/token-factory/test_snapshots/test/test_burn_amount_exceeds_balance.1.json index e5f770a9..db6a4fe9 100644 --- a/contracts/token-factory/test_snapshots/test/test_burn_amount_exceeds_balance.1.json +++ b/contracts/token-factory/test_snapshots/test/test_burn_amount_exceeds_balance.1.json @@ -460,7 +460,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -521,12 +521,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_burn_disabled.1.json b/contracts/token-factory/test_snapshots/test/test_burn_disabled.1.json index a3584c9e..926f95e4 100644 --- a/contracts/token-factory/test_snapshots/test/test_burn_disabled.1.json +++ b/contracts/token-factory/test_snapshots/test/test_burn_disabled.1.json @@ -460,7 +460,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -521,12 +521,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_burn_disabled_no_bypass.1.json b/contracts/token-factory/test_snapshots/test/test_burn_disabled_no_bypass.1.json index 6c2a83e6..d7bdd728 100644 --- a/contracts/token-factory/test_snapshots/test/test_burn_disabled_no_bypass.1.json +++ b/contracts/token-factory/test_snapshots/test/test_burn_disabled_no_bypass.1.json @@ -461,7 +461,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -522,12 +522,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_burn_event_only_emitted_for_factory_token.1.json b/contracts/token-factory/test_snapshots/test/test_burn_event_only_emitted_for_factory_token.1.json index 9f3ff0ec..5b18261e 100644 --- a/contracts/token-factory/test_snapshots/test/test_burn_event_only_emitted_for_factory_token.1.json +++ b/contracts/token-factory/test_snapshots/test/test_burn_event_only_emitted_for_factory_token.1.json @@ -587,7 +587,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -648,12 +648,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_burn_exact_balance.1.json b/contracts/token-factory/test_snapshots/test/test_burn_exact_balance.1.json index 6eccc276..920eca46 100644 --- a/contracts/token-factory/test_snapshots/test/test_burn_exact_balance.1.json +++ b/contracts/token-factory/test_snapshots/test/test_burn_exact_balance.1.json @@ -503,7 +503,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -564,12 +564,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_burn_invalid_amount_zero.1.json b/contracts/token-factory/test_snapshots/test/test_burn_invalid_amount_zero.1.json index 101a980a..ba9a9cc9 100644 --- a/contracts/token-factory/test_snapshots/test/test_burn_invalid_amount_zero.1.json +++ b/contracts/token-factory/test_snapshots/test/test_burn_invalid_amount_zero.1.json @@ -213,7 +213,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -274,12 +274,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_burn_lock_released_after_success.1.json b/contracts/token-factory/test_snapshots/test/test_burn_lock_released_after_success.1.json index 0f1d9d22..4e4f1c65 100644 --- a/contracts/token-factory/test_snapshots/test/test_burn_lock_released_after_success.1.json +++ b/contracts/token-factory/test_snapshots/test/test_burn_lock_released_after_success.1.json @@ -503,7 +503,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -564,12 +564,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_burn_reentrancy_guard.1.json b/contracts/token-factory/test_snapshots/test/test_burn_reentrancy_guard.1.json index 321376fd..d617630a 100644 --- a/contracts/token-factory/test_snapshots/test/test_burn_reentrancy_guard.1.json +++ b/contracts/token-factory/test_snapshots/test/test_burn_reentrancy_guard.1.json @@ -461,7 +461,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -522,12 +522,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_burn_registered_index_missing_info_fails.1.json b/contracts/token-factory/test_snapshots/test/test_burn_registered_index_missing_info_fails.1.json index 44fd928a..b7c64e2a 100644 --- a/contracts/token-factory/test_snapshots/test/test_burn_registered_index_missing_info_fails.1.json +++ b/contracts/token-factory/test_snapshots/test/test_burn_registered_index_missing_info_fails.1.json @@ -236,7 +236,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -297,12 +297,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_burn_unregistered_token_fails.1.json b/contracts/token-factory/test_snapshots/test/test_burn_unregistered_token_fails.1.json index dd88b33c..c693b2b1 100644 --- a/contracts/token-factory/test_snapshots/test/test_burn_unregistered_token_fails.1.json +++ b/contracts/token-factory/test_snapshots/test/test_burn_unregistered_token_fails.1.json @@ -236,7 +236,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -297,12 +297,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_cancel_admin_proposal.1.json b/contracts/token-factory/test_snapshots/test/test_cancel_admin_proposal.1.json new file mode 100644 index 00000000..293e5415 --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_cancel_admin_proposal.1.json @@ -0,0 +1,481 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "propose_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "cancel_admin_proposal", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_cancel_admin_proposal_idempotent.1.json b/contracts/token-factory/test_snapshots/test/test_cancel_admin_proposal_idempotent.1.json new file mode 100644 index 00000000..5ddcc9d5 --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_cancel_admin_proposal_idempotent.1.json @@ -0,0 +1,438 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "cancel_admin_proposal", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_cancel_admin_proposal_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_cancel_admin_proposal_unauthorized.1.json new file mode 100644 index 00000000..328f6b6d --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_cancel_admin_proposal_unauthorized.1.json @@ -0,0 +1,447 @@ +{ + "generators": { + "address": 6, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "propose_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": { + "u64": "17280" + } + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_allowed_when_whitelist_disabled.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_allowed_when_whitelist_disabled.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_allowed_when_whitelist_disabled.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_allowed_when_whitelist_disabled.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_blocked_when_not_whitelisted.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_blocked_when_not_whitelisted.1.json index 25990886..e8ed2235 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_blocked_when_not_whitelisted.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_blocked_when_not_whitelisted.1.json @@ -236,7 +236,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -297,12 +297,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_blocked_when_paused.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_blocked_when_paused.1.json index ae773042..6cba0d2c 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_blocked_when_paused.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_blocked_when_paused.1.json @@ -191,7 +191,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -252,12 +252,24 @@ "bool": true } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_insufficient_fee.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_insufficient_fee.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_insufficient_fee.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_insufficient_fee.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_invalid_decimals.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_invalid_decimals.1.json index 5caa94fa..b0e1b6c0 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_invalid_decimals.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_invalid_decimals.1.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -255,12 +255,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_invalid_decimals_large.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_invalid_decimals_large.1.json index 5caa94fa..b0e1b6c0 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_invalid_decimals_large.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_invalid_decimals_large.1.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -255,12 +255,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_invalid_name_empty.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_invalid_name_empty.1.json index 5caa94fa..b0e1b6c0 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_invalid_name_empty.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_invalid_name_empty.1.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -255,12 +255,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_invalid_symbol_empty.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_invalid_symbol_empty.1.json index 5caa94fa..b0e1b6c0 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_invalid_symbol_empty.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_invalid_symbol_empty.1.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -255,12 +255,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_max_supply_below_initial_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_max_supply_below_initial_rejected.1.json index 5caa94fa..b0e1b6c0 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_max_supply_below_initial_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_max_supply_below_initial_rejected.1.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -255,12 +255,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_min_supply_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_min_supply_rejected.1.json index 5caa94fa..b0e1b6c0 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_min_supply_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_min_supply_rejected.1.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -255,12 +255,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_negative_supply_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_negative_supply_rejected.1.json index 5caa94fa..b0e1b6c0 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_negative_supply_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_negative_supply_rejected.1.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -255,12 +255,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_nonpositive_max_supply_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_nonpositive_max_supply_rejected.1.json index 5caa94fa..b0e1b6c0 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_nonpositive_max_supply_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_nonpositive_max_supply_rejected.1.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -255,12 +255,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_overflow_protection.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_overflow_protection.1.json index 8137187d..b76b44e9 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_overflow_protection.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_overflow_protection.1.json @@ -195,7 +195,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -256,12 +256,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_reentrancy_guard.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_reentrancy_guard.1.json index 9d36a82f..6458358a 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_reentrancy_guard.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_reentrancy_guard.1.json @@ -153,7 +153,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -214,12 +214,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_supply_i128_max_passes_validation.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_supply_i128_max_passes_validation.1.json index 2bd871e1..588696d0 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_supply_i128_max_passes_validation.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_supply_i128_max_passes_validation.1.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -255,12 +255,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_supply_zero_passes_validation.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_supply_zero_passes_validation.1.json index 2bd871e1..588696d0 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_supply_zero_passes_validation.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_supply_zero_passes_validation.1.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -255,12 +255,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_token_whitelisted_creator_passes_whitelist_gate.1.json b/contracts/token-factory/test_snapshots/test/test_create_token_whitelisted_creator_passes_whitelist_gate.1.json index 81063008..03e0f283 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_token_whitelisted_creator_passes_whitelist_gate.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_token_whitelisted_creator_passes_whitelist_gate.1.json @@ -263,7 +263,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -324,12 +324,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_create_tokens_batch_overflow_protection_upfront.1.json b/contracts/token-factory/test_snapshots/test/test_create_tokens_batch_overflow_protection_upfront.1.json index c8e774a9..98e94ae7 100644 --- a/contracts/token-factory/test_snapshots/test/test_create_tokens_batch_overflow_protection_upfront.1.json +++ b/contracts/token-factory/test_snapshots/test/test_create_tokens_batch_overflow_protection_upfront.1.json @@ -197,7 +197,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -258,12 +258,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_cross_function_reentrancy_lock_blocks_all_entrypoints.1.json b/contracts/token-factory/test_snapshots/test/test_cross_function_reentrancy_lock_blocks_all_entrypoints.1.json index 32b1569a..75ca8be9 100644 --- a/contracts/token-factory/test_snapshots/test/test_cross_function_reentrancy_lock_blocks_all_entrypoints.1.json +++ b/contracts/token-factory/test_snapshots/test/test_cross_function_reentrancy_lock_blocks_all_entrypoints.1.json @@ -508,7 +508,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -569,12 +569,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_expired_proposal_cannot_be_accepted.1.json b/contracts/token-factory/test_snapshots/test/test_expired_proposal_cannot_be_accepted.1.json new file mode 100644 index 00000000..59598cd2 --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_expired_proposal_cannot_be_accepted.1.json @@ -0,0 +1,526 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "propose_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "propose_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "accept_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 17281, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6329280 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "4270020994084947596" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6329280 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_fee_distributed_according_to_split.1.json b/contracts/token-factory/test_snapshots/test/test_fee_distributed_according_to_split.1.json index 2cedddeb..29bb33c6 100644 --- a/contracts/token-factory/test_snapshots/test/test_fee_distributed_according_to_split.1.json +++ b/contracts/token-factory/test_snapshots/test/test_fee_distributed_according_to_split.1.json @@ -654,7 +654,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -715,12 +715,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_fee_goes_to_treasury_when_no_split.1.json b/contracts/token-factory/test_snapshots/test/test_fee_goes_to_treasury_when_no_split.1.json index a7a4006f..4f66697e 100644 --- a/contracts/token-factory/test_snapshots/test/test_fee_goes_to_treasury_when_no_split.1.json +++ b/contracts/token-factory/test_snapshots/test/test_fee_goes_to_treasury_when_no_split.1.json @@ -549,7 +549,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -610,12 +610,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_fee_split_largest_remainder_dust_fee.1.json b/contracts/token-factory/test_snapshots/test/test_fee_split_largest_remainder_dust_fee.1.json index 276abd21..710ba837 100644 --- a/contracts/token-factory/test_snapshots/test/test_fee_split_largest_remainder_dust_fee.1.json +++ b/contracts/token-factory/test_snapshots/test/test_fee_split_largest_remainder_dust_fee.1.json @@ -697,7 +697,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -758,12 +758,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_fee_split_max_recipients_conservation.1.json b/contracts/token-factory/test_snapshots/test/test_fee_split_max_recipients_conservation.1.json index 1c0de807..75dbb447 100644 --- a/contracts/token-factory/test_snapshots/test/test_fee_split_max_recipients_conservation.1.json +++ b/contracts/token-factory/test_snapshots/test/test_fee_split_max_recipients_conservation.1.json @@ -994,7 +994,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -1055,12 +1055,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_fee_split_odd_amount_remainder_goes_to_treasury.1.json b/contracts/token-factory/test_snapshots/test/test_fee_split_odd_amount_remainder_goes_to_treasury.1.json index 30477951..fd15a0d8 100644 --- a/contracts/token-factory/test_snapshots/test/test_fee_split_odd_amount_remainder_goes_to_treasury.1.json +++ b/contracts/token-factory/test_snapshots/test/test_fee_split_odd_amount_remainder_goes_to_treasury.1.json @@ -698,7 +698,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -759,12 +759,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_fee_split_sum_invariant_many_recipients.1.json b/contracts/token-factory/test_snapshots/test/test_fee_split_sum_invariant_many_recipients.1.json index a88850e2..495130e7 100644 --- a/contracts/token-factory/test_snapshots/test/test_fee_split_sum_invariant_many_recipients.1.json +++ b/contracts/token-factory/test_snapshots/test/test_fee_split_sum_invariant_many_recipients.1.json @@ -808,7 +808,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -869,12 +869,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_fee_split_zero_share_recipient_skipped_remainder_to_treasury.1.json b/contracts/token-factory/test_snapshots/test/test_fee_split_zero_share_recipient_skipped_remainder_to_treasury.1.json index 3bf7ca0d..eb5e3dff 100644 --- a/contracts/token-factory/test_snapshots/test/test_fee_split_zero_share_recipient_skipped_remainder_to_treasury.1.json +++ b/contracts/token-factory/test_snapshots/test/test_fee_split_zero_share_recipient_skipped_remainder_to_treasury.1.json @@ -678,7 +678,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -739,12 +739,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_fee_update_race_rejects_with_no_partial_transfer.1.json b/contracts/token-factory/test_snapshots/test/test_fee_update_race_rejects_with_no_partial_transfer.1.json index 6ce329d5..fef03f19 100644 --- a/contracts/token-factory/test_snapshots/test/test_fee_update_race_rejects_with_no_partial_transfer.1.json +++ b/contracts/token-factory/test_snapshots/test/test_fee_update_race_rejects_with_no_partial_transfer.1.json @@ -526,7 +526,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -587,12 +587,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_freeze_metadata_idempotent.1.json b/contracts/token-factory/test_snapshots/test/test_freeze_metadata_idempotent.1.json index d36d1fb1..506850c6 100644 --- a/contracts/token-factory/test_snapshots/test/test_freeze_metadata_idempotent.1.json +++ b/contracts/token-factory/test_snapshots/test/test_freeze_metadata_idempotent.1.json @@ -509,7 +509,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -570,12 +570,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_freeze_metadata_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_freeze_metadata_unauthorized.1.json index e19c4314..800477e3 100644 --- a/contracts/token-factory/test_snapshots/test/test_freeze_metadata_unauthorized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_freeze_metadata_unauthorized.1.json @@ -438,7 +438,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -499,12 +499,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_metadata_none_before_set_then_some_after.1.json b/contracts/token-factory/test_snapshots/test/test_get_metadata_none_before_set_then_some_after.1.json index a6935d22..30904828 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_metadata_none_before_set_then_some_after.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_metadata_none_before_set_then_some_after.1.json @@ -440,7 +440,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -516,12 +516,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_token_address_enumerates_full_token_set.1.json b/contracts/token-factory/test_snapshots/test/test_get_token_address_enumerates_full_token_set.1.json index 1f061d8b..003dcefb 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_token_address_enumerates_full_token_set.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_token_address_enumerates_full_token_set.1.json @@ -1355,7 +1355,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -1416,12 +1416,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_token_address_round_trips_with_get_token_index.1.json b/contracts/token-factory/test_snapshots/test/test_get_token_address_round_trips_with_get_token_index.1.json index 6fdf0579..5a284671 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_token_address_round_trips_with_get_token_index.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_token_address_round_trips_with_get_token_index.1.json @@ -439,7 +439,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -500,12 +500,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_token_address_unknown_index_returns_not_found.1.json b/contracts/token-factory/test_snapshots/test/test_get_token_address_unknown_index_returns_not_found.1.json index 26b08f97..2268ab7f 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_token_address_unknown_index_returns_not_found.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_token_address_unknown_index_returns_not_found.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_token_index_not_found_for_unregistered_address.1.json b/contracts/token-factory/test_snapshots/test/test_get_token_index_not_found_for_unregistered_address.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_token_index_not_found_for_unregistered_address.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_token_index_not_found_for_unregistered_address.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_token_index_resolves_registered_address.1.json b/contracts/token-factory/test_snapshots/test/test_get_token_index_resolves_registered_address.1.json index 2ec71cfe..a33181fa 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_token_index_resolves_registered_address.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_token_index_resolves_registered_address.1.json @@ -438,7 +438,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -499,12 +499,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_token_info.1.json b/contracts/token-factory/test_snapshots/test/test_get_token_info.1.json index 2cce96fa..f3035a72 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_token_info.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_token_info.1.json @@ -153,7 +153,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -214,12 +214,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_token_info_by_address_missing_info_entry.1.json b/contracts/token-factory/test_snapshots/test/test_get_token_info_by_address_missing_info_entry.1.json index ace28538..447cd6b5 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_token_info_by_address_missing_info_entry.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_token_info_by_address_missing_info_entry.1.json @@ -214,7 +214,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -275,12 +275,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_token_info_by_address_not_found.1.json b/contracts/token-factory/test_snapshots/test/test_get_token_info_by_address_not_found.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_token_info_by_address_not_found.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_token_info_by_address_not_found.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_token_info_by_address_returns_authoritative_identity.1.json b/contracts/token-factory/test_snapshots/test/test_get_token_info_by_address_returns_authoritative_identity.1.json index 7ae4d840..2236acee 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_token_info_by_address_returns_authoritative_identity.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_token_info_by_address_returns_authoritative_identity.1.json @@ -214,7 +214,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -275,12 +275,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_token_info_not_found.1.json b/contracts/token-factory/test_snapshots/test/test_get_token_info_not_found.1.json index 26b08f97..2268ab7f 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_token_info_not_found.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_token_info_not_found.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator.1.json b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator.1.json index d96d7e2f..48843fb9 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator.1.json @@ -666,7 +666,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -727,12 +727,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_clamps_oversized_limit.1.json b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_clamps_oversized_limit.1.json index 7e1a54da..826dd062 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_clamps_oversized_limit.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_clamps_oversized_limit.1.json @@ -13922,7 +13922,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -13983,12 +13983,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_empty_for_unknown.1.json b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_empty_for_unknown.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_empty_for_unknown.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_empty_for_unknown.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_first_page.1.json b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_first_page.1.json index 3503cf76..5558339a 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_first_page.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_first_page.1.json @@ -3631,7 +3631,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -3692,12 +3692,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_isolated_per_creator.1.json b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_isolated_per_creator.1.json index 90c0715d..4dbe025f 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_isolated_per_creator.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_isolated_per_creator.1.json @@ -2779,7 +2779,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -2840,12 +2840,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_offset_past_end.1.json b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_offset_past_end.1.json index f85af7eb..1c57d451 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_offset_past_end.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_offset_past_end.1.json @@ -1352,7 +1352,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -1413,12 +1413,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_partial_last_page.1.json b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_partial_last_page.1.json index ffe74e52..d68daf4d 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_partial_last_page.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_partial_last_page.1.json @@ -1810,7 +1810,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -1871,12 +1871,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_second_page.1.json b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_second_page.1.json index 3503cf76..5558339a 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_second_page.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_second_page.1.json @@ -3631,7 +3631,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -3692,12 +3692,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_zero_limit.1.json b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_zero_limit.1.json index 409e6ac9..d196f532 100644 --- a/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_zero_limit.1.json +++ b/contracts/token-factory/test_snapshots/test/test_get_tokens_by_creator_zero_limit.1.json @@ -895,7 +895,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -956,12 +956,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_initialize.1.json b/contracts/token-factory/test_snapshots/test/test_initialize.1.json index 26b08f97..2268ab7f 100644 --- a/contracts/token-factory/test_snapshots/test/test_initialize.1.json +++ b/contracts/token-factory/test_snapshots/test/test_initialize.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_initialize_already_initialized.1.json b/contracts/token-factory/test_snapshots/test/test_initialize_already_initialized.1.json index 26b08f97..2268ab7f 100644 --- a/contracts/token-factory/test_snapshots/test/test_initialize_already_initialized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_initialize_already_initialized.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_initialize_sets_schema_version.1.json b/contracts/token-factory/test_snapshots/test/test_initialize_sets_schema_version.1.json index 8fdd471f..4cf9b07d 100644 --- a/contracts/token-factory/test_snapshots/test/test_initialize_sets_schema_version.1.json +++ b/contracts/token-factory/test_snapshots/test/test_initialize_sets_schema_version.1.json @@ -153,7 +153,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -214,12 +214,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_initialize_sets_whitelist_enabled_false.1.json b/contracts/token-factory/test_snapshots/test/test_initialize_sets_whitelist_enabled_false.1.json index 26b08f97..2268ab7f 100644 --- a/contracts/token-factory/test_snapshots/test/test_initialize_sets_whitelist_enabled_false.1.json +++ b/contracts/token-factory/test_snapshots/test/test_initialize_sets_whitelist_enabled_false.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_initialize_zero_fees_allowed.1.json b/contracts/token-factory/test_snapshots/test/test_initialize_zero_fees_allowed.1.json index 184e71a1..2f234cb1 100644 --- a/contracts/token-factory/test_snapshots/test/test_initialize_zero_fees_allowed.1.json +++ b/contracts/token-factory/test_snapshots/test/test_initialize_zero_fees_allowed.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_instance_storage_size_stays_flat_under_load.1.json b/contracts/token-factory/test_snapshots/test/test_instance_storage_size_stays_flat_under_load.1.json index 5e5f2b30..0ead02b4 100644 --- a/contracts/token-factory/test_snapshots/test/test_instance_storage_size_stays_flat_under_load.1.json +++ b/contracts/token-factory/test_snapshots/test/test_instance_storage_size_stays_flat_under_load.1.json @@ -68769,7 +68769,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -68830,12 +68830,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_is_whitelisted_returns_false_after_remove.1.json b/contracts/token-factory/test_snapshots/test/test_is_whitelisted_returns_false_after_remove.1.json index 46cb5a80..84d60065 100644 --- a/contracts/token-factory/test_snapshots/test/test_is_whitelisted_returns_false_after_remove.1.json +++ b/contracts/token-factory/test_snapshots/test/test_is_whitelisted_returns_false_after_remove.1.json @@ -236,7 +236,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -297,12 +297,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_is_whitelisted_returns_false_for_unknown.1.json b/contracts/token-factory/test_snapshots/test/test_is_whitelisted_returns_false_for_unknown.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_is_whitelisted_returns_false_for_unknown.1.json +++ b/contracts/token-factory/test_snapshots/test/test_is_whitelisted_returns_false_for_unknown.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_is_whitelisted_returns_true_after_add.1.json b/contracts/token-factory/test_snapshots/test/test_is_whitelisted_returns_true_after_add.1.json index 1e528f74..51445821 100644 --- a/contracts/token-factory/test_snapshots/test/test_is_whitelisted_returns_true_after_add.1.json +++ b/contracts/token-factory/test_snapshots/test/test_is_whitelisted_returns_true_after_add.1.json @@ -221,7 +221,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -282,12 +282,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_is_whitelisted_view_agrees_with_creation_gate.1.json b/contracts/token-factory/test_snapshots/test/test_is_whitelisted_view_agrees_with_creation_gate.1.json index 09053383..e5c0a3f1 100644 --- a/contracts/token-factory/test_snapshots/test/test_is_whitelisted_view_agrees_with_creation_gate.1.json +++ b/contracts/token-factory/test_snapshots/test/test_is_whitelisted_view_agrees_with_creation_gate.1.json @@ -325,7 +325,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -386,12 +386,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_from_v0_walks_all_steps_to_v4.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_from_v0_walks_all_steps_to_v4.1.json new file mode 100644 index 00000000..f8f058bc --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_migrate_from_v0_walks_all_steps_to_v4.1.json @@ -0,0 +1,448 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "migrate", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "mig3cur" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_from_version_0_walks_all_steps.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_from_version_0_walks_all_steps.1.json index b58e4f4d..da58e82c 100644 --- a/contracts/token-factory/test_snapshots/test/test_migrate_from_version_0_walks_all_steps.1.json +++ b/contracts/token-factory/test_snapshots/test/test_migrate_from_version_0_walks_all_steps.1.json @@ -202,7 +202,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -263,12 +263,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_from_version_1_walks_remaining_steps.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_from_version_1_walks_remaining_steps.1.json index 1df024a1..dea6e048 100644 --- a/contracts/token-factory/test_snapshots/test/test_migrate_from_version_1_walks_remaining_steps.1.json +++ b/contracts/token-factory/test_snapshots/test/test_migrate_from_version_1_walks_remaining_steps.1.json @@ -201,7 +201,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -262,12 +262,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_is_idempotent.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_is_idempotent.1.json index 85331122..9217c6a2 100644 --- a/contracts/token-factory/test_snapshots/test/test_migrate_is_idempotent.1.json +++ b/contracts/token-factory/test_snapshots/test/test_migrate_is_idempotent.1.json @@ -230,7 +230,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -291,12 +291,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_preserves_state_fields.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_preserves_state_fields.1.json index bc1da95c..f0a9ca64 100644 --- a/contracts/token-factory/test_snapshots/test/test_migrate_preserves_state_fields.1.json +++ b/contracts/token-factory/test_snapshots/test/test_migrate_preserves_state_fields.1.json @@ -191,7 +191,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -252,12 +252,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_preserves_whitelist_enabled_flag.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_preserves_whitelist_enabled_flag.1.json index 83804984..b924d465 100644 --- a/contracts/token-factory/test_snapshots/test/test_migrate_preserves_whitelist_enabled_flag.1.json +++ b/contracts/token-factory/test_snapshots/test/test_migrate_preserves_whitelist_enabled_flag.1.json @@ -233,7 +233,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -294,12 +294,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_unauthorized.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_migrate_unauthorized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_migrate_unauthorized.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_upgrades_pre_versioned_state.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_upgrades_pre_versioned_state.1.json index 1df024a1..dea6e048 100644 --- a/contracts/token-factory/test_snapshots/test/test_migrate_upgrades_pre_versioned_state.1.json +++ b/contracts/token-factory/test_snapshots/test/test_migrate_upgrades_pre_versioned_state.1.json @@ -201,7 +201,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -262,12 +262,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_v1_to_v3_sets_whitelist_enabled_false.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_v1_to_v3_sets_whitelist_enabled_false.1.json index 1df024a1..dea6e048 100644 --- a/contracts/token-factory/test_snapshots/test/test_migrate_v1_to_v3_sets_whitelist_enabled_false.1.json +++ b/contracts/token-factory/test_snapshots/test/test_migrate_v1_to_v3_sets_whitelist_enabled_false.1.json @@ -201,7 +201,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -262,12 +262,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_v2_idempotent_at_current_version.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_v2_idempotent_at_current_version.1.json index 7b865de2..762270f0 100644 --- a/contracts/token-factory/test_snapshots/test/test_migrate_v2_idempotent_at_current_version.1.json +++ b/contracts/token-factory/test_snapshots/test/test_migrate_v2_idempotent_at_current_version.1.json @@ -232,7 +232,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -293,12 +293,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_v3_completes_across_repeated_calls.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_v3_completes_across_repeated_calls.1.json index 184e6102..969202e2 100644 --- a/contracts/token-factory/test_snapshots/test/test_migrate_v3_completes_across_repeated_calls.1.json +++ b/contracts/token-factory/test_snapshots/test/test_migrate_v3_completes_across_repeated_calls.1.json @@ -5199,7 +5199,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -5260,12 +5260,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_v3_completes_in_one_call_when_small.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_v3_completes_in_one_call_when_small.1.json index 2117d827..296560df 100644 --- a/contracts/token-factory/test_snapshots/test/test_migrate_v3_completes_in_one_call_when_small.1.json +++ b/contracts/token-factory/test_snapshots/test/test_migrate_v3_completes_in_one_call_when_small.1.json @@ -446,7 +446,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -507,12 +507,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_v3_does_not_complete_in_one_chunk_when_oversized.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_v3_does_not_complete_in_one_chunk_when_oversized.1.json index a5619505..5d29b778 100644 --- a/contracts/token-factory/test_snapshots/test/test_migrate_v3_does_not_complete_in_one_chunk_when_oversized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_migrate_v3_does_not_complete_in_one_chunk_when_oversized.1.json @@ -1902,6 +1902,18 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_v3_to_v4_adds_pending_admin_fields.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_v3_to_v4_adds_pending_admin_fields.1.json new file mode 100644 index 00000000..d29c4c8d --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_migrate_v3_to_v4_adds_pending_admin_fields.1.json @@ -0,0 +1,440 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "migrate", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_v4_idempotent_for_pending_admin.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_v4_idempotent_for_pending_admin.1.json new file mode 100644 index 00000000..9217c6a2 --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_migrate_v4_idempotent_for_pending_admin.1.json @@ -0,0 +1,478 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "migrate", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "migrate", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_migrate_whitelist_step_is_idempotent.1.json b/contracts/token-factory/test_snapshots/test/test_migrate_whitelist_step_is_idempotent.1.json index 58c8a381..232faacc 100644 --- a/contracts/token-factory/test_snapshots/test/test_migrate_whitelist_step_is_idempotent.1.json +++ b/contracts/token-factory/test_snapshots/test/test_migrate_whitelist_step_is_idempotent.1.json @@ -231,7 +231,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -292,12 +292,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens.1.json index edcd9e75..9ad0ccb2 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens.1.json @@ -549,7 +549,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -610,12 +610,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_exactly_at_cap.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_exactly_at_cap.1.json index f8319324..0b5052e0 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens_exactly_at_cap.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_exactly_at_cap.1.json @@ -647,7 +647,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -708,12 +708,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_exceeds_cap.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_exceeds_cap.1.json index 1bfa31cb..a830d135 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens_exceeds_cap.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_exceeds_cap.1.json @@ -482,7 +482,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -543,12 +543,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_fee_split_sums_to_charged_fee_not_payment.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_fee_split_sums_to_charged_fee_not_payment.1.json index 3e88247d..477d155f 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens_fee_split_sums_to_charged_fee_not_payment.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_fee_split_sums_to_charged_fee_not_payment.1.json @@ -656,7 +656,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -717,12 +717,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_insufficient_fee.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_insufficient_fee.1.json index f38149d5..d1791606 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens_insufficient_fee.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_insufficient_fee.1.json @@ -480,7 +480,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -541,12 +541,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_lock_released_after_error.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_lock_released_after_error.1.json index 1d96af2a..80dfd5fa 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens_lock_released_after_error.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_lock_released_after_error.1.json @@ -439,7 +439,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -500,12 +500,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_lock_released_after_success.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_lock_released_after_success.1.json index a7a4006f..4f66697e 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens_lock_released_after_success.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_lock_released_after_success.1.json @@ -549,7 +549,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -610,12 +610,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_one_over_cap.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_one_over_cap.1.json index e8977ad1..d1d0867d 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens_one_over_cap.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_one_over_cap.1.json @@ -578,7 +578,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -639,12 +639,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_overpayment_charges_exact_fee_only.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_overpayment_charges_exact_fee_only.1.json index 215fdec9..2b5195da 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens_overpayment_charges_exact_fee_only.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_overpayment_charges_exact_fee_only.1.json @@ -551,7 +551,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -612,12 +612,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_reentrancy_guard.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_reentrancy_guard.1.json index f1c6e104..4cb6d7a7 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens_reentrancy_guard.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_reentrancy_guard.1.json @@ -481,7 +481,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -542,12 +542,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_rejects_real_reentrant_call.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_rejects_real_reentrant_call.1.json new file mode 100644 index 00000000..fc1525c9 --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_rejects_real_reentrant_call.1.json @@ -0,0 +1,795 @@ +{ + "generators": { + "address": 6, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "mint_tokens", + "args": [ + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "100" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "100" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "CreatorTokenCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "CreatorTokens" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u32": 1 + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "TokenAddress" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "TokenIndex" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "TokenInfo" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "burn_enabled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "max_supply" + }, + "val": "void" + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "T" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "T" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + }, + { + "symbol": "owner" + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "attacker" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "blocked" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "factory" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_unauthorized.1.json index b87cbd44..9241f07f 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens_unauthorized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_unauthorized.1.json @@ -480,7 +480,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -541,12 +541,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_unregistered_token_fails.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_unregistered_token_fails.1.json index 56dbaa65..3041e3f7 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens_unregistered_token_fails.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_unregistered_token_fails.1.json @@ -255,7 +255,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -316,12 +316,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_within_cap.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_within_cap.1.json index b6f28300..ac83d789 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens_within_cap.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_within_cap.1.json @@ -578,7 +578,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -639,12 +639,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_mint_tokens_zero_amount_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_mint_tokens_zero_amount_rejected.1.json index 52ab9969..5532e719 100644 --- a/contracts/token-factory/test_snapshots/test/test_mint_tokens_zero_amount_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_mint_tokens_zero_amount_rejected.1.json @@ -480,7 +480,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -541,12 +541,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_non_admin_cannot_pause.1.json b/contracts/token-factory/test_snapshots/test/test_non_admin_cannot_pause.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_non_admin_cannot_pause.1.json +++ b/contracts/token-factory/test_snapshots/test/test_non_admin_cannot_pause.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_propose_admin_records_pending_state.1.json b/contracts/token-factory/test_snapshots/test/test_propose_admin_records_pending_state.1.json new file mode 100644 index 00000000..88127139 --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_propose_admin_records_pending_state.1.json @@ -0,0 +1,446 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "propose_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": { + "u64": "17280" + } + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_propose_admin_self_transfer_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_propose_admin_self_transfer_rejected.1.json new file mode 100644 index 00000000..2268ab7f --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_propose_admin_self_transfer_rejected.1.json @@ -0,0 +1,400 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_propose_admin_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_propose_admin_unauthorized.1.json new file mode 100644 index 00000000..14a8fb0c --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_propose_admin_unauthorized.1.json @@ -0,0 +1,400 @@ +{ + "generators": { + "address": 6, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_reentrancy_lock_released_after_error.1.json b/contracts/token-factory/test_snapshots/test/test_reentrancy_lock_released_after_error.1.json index 9239610f..85f386b6 100644 --- a/contracts/token-factory/test_snapshots/test/test_reentrancy_lock_released_after_error.1.json +++ b/contracts/token-factory/test_snapshots/test/test_reentrancy_lock_released_after_error.1.json @@ -153,7 +153,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -214,12 +214,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_remove_from_whitelist_succeeds_and_clears.1.json b/contracts/token-factory/test_snapshots/test/test_remove_from_whitelist_succeeds_and_clears.1.json index 46cb5a80..84d60065 100644 --- a/contracts/token-factory/test_snapshots/test/test_remove_from_whitelist_succeeds_and_clears.1.json +++ b/contracts/token-factory/test_snapshots/test/test_remove_from_whitelist_succeeds_and_clears.1.json @@ -236,7 +236,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -297,12 +297,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_remove_from_whitelist_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_remove_from_whitelist_unauthorized.1.json index 879e51a4..14a8fb0c 100644 --- a/contracts/token-factory/test_snapshots/test/test_remove_from_whitelist_unauthorized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_remove_from_whitelist_unauthorized.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_second_proposal_overwrites_first.1.json b/contracts/token-factory/test_snapshots/test/test_second_proposal_overwrites_first.1.json new file mode 100644 index 00000000..597b9857 --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_second_proposal_overwrites_first.1.json @@ -0,0 +1,525 @@ +{ + "generators": { + "address": 6, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "propose_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "propose_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "accept_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "4270020994084947596" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_disables_then_reenables.1.json b/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_disables_then_reenables.1.json index 58ae3e81..bd55c227 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_disables_then_reenables.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_disables_then_reenables.1.json @@ -554,7 +554,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -615,12 +615,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_lock_released_after_success.1.json b/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_lock_released_after_success.1.json index 4fefff36..bd16bedd 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_lock_released_after_success.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_lock_released_after_success.1.json @@ -463,7 +463,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -524,12 +524,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_reentrancy_guard.1.json b/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_reentrancy_guard.1.json index 59d7b116..d2ed9fb4 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_reentrancy_guard.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_reentrancy_guard.1.json @@ -439,7 +439,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -500,12 +500,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_unauthorized.1.json index e19c4314..800477e3 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_unauthorized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_unauthorized.1.json @@ -438,7 +438,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -499,12 +499,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_unregistered_token_fails.1.json b/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_unregistered_token_fails.1.json index 101a980a..ba9a9cc9 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_unregistered_token_fails.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_burn_enabled_unregistered_token_fails.1.json @@ -213,7 +213,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -274,12 +274,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_fee_split_at_max_recipients_accepted.1.json b/contracts/token-factory/test_snapshots/test/test_set_fee_split_at_max_recipients_accepted.1.json index 5e1b0939..f3f93645 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_fee_split_at_max_recipients_accepted.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_fee_split_at_max_recipients_accepted.1.json @@ -364,7 +364,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -425,12 +425,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_fee_split_empty_clears_split.1.json b/contracts/token-factory/test_snapshots/test/test_set_fee_split_empty_clears_split.1.json index 3710d228..cd099359 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_fee_split_empty_clears_split.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_fee_split_empty_clears_split.1.json @@ -253,7 +253,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -314,12 +314,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_fee_split_exactly_at_cap_accepted.1.json b/contracts/token-factory/test_snapshots/test/test_set_fee_split_exactly_at_cap_accepted.1.json index 15dc6b64..93007af7 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_fee_split_exactly_at_cap_accepted.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_fee_split_exactly_at_cap_accepted.1.json @@ -364,7 +364,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -425,12 +425,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_fee_split_invalid_sum_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_set_fee_split_invalid_sum_rejected.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_fee_split_invalid_sum_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_fee_split_invalid_sum_rejected.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_fee_split_over_max_recipients_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_set_fee_split_over_max_recipients_rejected.1.json index d24ef771..d319f004 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_fee_split_over_max_recipients_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_fee_split_over_max_recipients_rejected.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_fee_split_too_many_recipients_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_set_fee_split_too_many_recipients_rejected.1.json index d24ef771..d319f004 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_fee_split_too_many_recipients_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_fee_split_too_many_recipients_rejected.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_fee_split_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_set_fee_split_unauthorized.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_fee_split_unauthorized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_fee_split_unauthorized.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_fee_split_valid.1.json b/contracts/token-factory/test_snapshots/test/test_set_fee_split_valid.1.json index 3bdc587d..cad5aacd 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_fee_split_valid.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_fee_split_valid.1.json @@ -236,7 +236,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -297,12 +297,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_fee_split_zero_bps_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_set_fee_split_zero_bps_rejected.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_fee_split_zero_bps_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_fee_split_zero_bps_rejected.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata.1.json index 823155af..693d2516 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata.1.json @@ -583,7 +583,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -644,12 +644,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_already_set.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_already_set.1.json index 3eef882b..591ffaa4 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_already_set.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_already_set.1.json @@ -779,7 +779,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -840,12 +840,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_different_tokens_independent.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_different_tokens_independent.1.json index eef9a6c9..56ab3766 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_different_tokens_independent.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_different_tokens_independent.1.json @@ -913,7 +913,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -974,12 +974,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_fee_goes_to_treasury.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_fee_goes_to_treasury.1.json index 823155af..693d2516 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_fee_goes_to_treasury.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_fee_goes_to_treasury.1.json @@ -583,7 +583,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -644,12 +644,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_insufficient_fee.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_insufficient_fee.1.json index 101a980a..ba9a9cc9 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_insufficient_fee.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_insufficient_fee.1.json @@ -213,7 +213,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -274,12 +274,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_lock_released_after_success.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_lock_released_after_success.1.json index e8affa9f..742bd793 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_lock_released_after_success.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_lock_released_after_success.1.json @@ -583,7 +583,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -644,12 +644,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_overpayment_charges_exact_fee_only.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_overpayment_charges_exact_fee_only.1.json index 7fbd6a11..970688b2 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_overpayment_charges_exact_fee_only.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_overpayment_charges_exact_fee_only.1.json @@ -584,7 +584,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -645,12 +645,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_reentrancy_guard.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_reentrancy_guard.1.json index b87ce810..2d841251 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_reentrancy_guard.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_reentrancy_guard.1.json @@ -481,7 +481,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -542,12 +542,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_empty_uri.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_empty_uri.1.json index 6d9ed580..c107d48f 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_empty_uri.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_empty_uri.1.json @@ -480,7 +480,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -541,12 +541,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_missing_ipfs_prefix.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_missing_ipfs_prefix.1.json index 6d9ed580..c107d48f 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_missing_ipfs_prefix.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_missing_ipfs_prefix.1.json @@ -480,7 +480,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -541,12 +541,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_prefix_only.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_prefix_only.1.json index 6d9ed580..c107d48f 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_prefix_only.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_prefix_only.1.json @@ -480,7 +480,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -541,12 +541,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_uri_too_long.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_uri_too_long.1.json index 6d9ed580..c107d48f 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_uri_too_long.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_rejects_uri_too_long.1.json @@ -480,7 +480,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -541,12 +541,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_unauthorized.1.json index 13da5c6a..bca8824e 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_unauthorized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_unauthorized.1.json @@ -480,7 +480,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -541,12 +541,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_unregistered_token_fails.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_unregistered_token_fails.1.json index 05397772..2fc09187 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_unregistered_token_fails.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_unregistered_token_fails.1.json @@ -255,7 +255,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -316,12 +316,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_update_then_freeze.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_update_then_freeze.1.json index 772400ab..16705735 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_update_then_freeze.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_update_then_freeze.1.json @@ -685,7 +685,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -746,12 +746,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_metadata_version_increments.1.json b/contracts/token-factory/test_snapshots/test/test_set_metadata_version_increments.1.json index b280f9b2..dcd061c3 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_metadata_version_increments.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_metadata_version_increments.1.json @@ -683,7 +683,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -744,12 +744,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_whitelist_enabled_succeeds_and_updates_state.1.json b/contracts/token-factory/test_snapshots/test/test_set_whitelist_enabled_succeeds_and_updates_state.1.json index 35aebd42..18274a96 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_whitelist_enabled_succeeds_and_updates_state.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_whitelist_enabled_succeeds_and_updates_state.1.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -255,12 +255,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_whitelist_enabled_toggles_flag.1.json b/contracts/token-factory/test_snapshots/test/test_set_whitelist_enabled_toggles_flag.1.json index 902d3e6d..98491f35 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_whitelist_enabled_toggles_flag.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_whitelist_enabled_toggles_flag.1.json @@ -237,7 +237,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -298,12 +298,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_set_whitelist_enabled_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_set_whitelist_enabled_unauthorized.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_set_whitelist_enabled_unauthorized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_set_whitelist_enabled_unauthorized.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_transfer_admin_and_update_admin_produce_same_state.1.json b/contracts/token-factory/test_snapshots/test/test_transfer_admin_and_update_admin_produce_same_state.1.json index 3fd5565b..31f817b2 100644 --- a/contracts/token-factory/test_snapshots/test/test_transfer_admin_and_update_admin_produce_same_state.1.json +++ b/contracts/token-factory/test_snapshots/test/test_transfer_admin_and_update_admin_produce_same_state.1.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -212,7 +212,7 @@ "symbol": "admin" }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" } }, { @@ -255,12 +255,28 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": { + "u64": "17280" + } + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_transfer_admin_and_update_admin_produce_same_state.2.json b/contracts/token-factory/test_snapshots/test/test_transfer_admin_and_update_admin_produce_same_state.2.json index 1d2b3953..0fb89009 100644 --- a/contracts/token-factory/test_snapshots/test/test_transfer_admin_and_update_admin_produce_same_state.2.json +++ b/contracts/token-factory/test_snapshots/test/test_transfer_admin_and_update_admin_produce_same_state.2.json @@ -194,7 +194,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -212,7 +212,7 @@ "symbol": "admin" }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" } }, { @@ -255,12 +255,28 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": { + "u64": "17280" + } + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_transfer_admin_and_update_admin_share_guards.1.json b/contracts/token-factory/test_snapshots/test/test_transfer_admin_and_update_admin_share_guards.1.json index da3a8ba9..70fff4ae 100644 --- a/contracts/token-factory/test_snapshots/test/test_transfer_admin_and_update_admin_share_guards.1.json +++ b/contracts/token-factory/test_snapshots/test/test_transfer_admin_and_update_admin_share_guards.1.json @@ -155,7 +155,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -216,12 +216,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_transfer_admin_delegates_to_propose_admin.1.json b/contracts/token-factory/test_snapshots/test/test_transfer_admin_delegates_to_propose_admin.1.json new file mode 100644 index 00000000..e0cad748 --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_transfer_admin_delegates_to_propose_admin.1.json @@ -0,0 +1,483 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "transfer_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "accept_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_transfer_admin_grants_new_admin_rights.1.json b/contracts/token-factory/test_snapshots/test/test_transfer_admin_grants_new_admin_rights.1.json index 4748effd..e5320beb 100644 --- a/contracts/token-factory/test_snapshots/test/test_transfer_admin_grants_new_admin_rights.1.json +++ b/contracts/token-factory/test_snapshots/test/test_transfer_admin_grants_new_admin_rights.1.json @@ -82,6 +82,28 @@ ] ], [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "accept_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", @@ -215,7 +237,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -276,12 +298,24 @@ "bool": true } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -328,6 +362,26 @@ }, "live_until": 535000 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/token-factory/test_snapshots/test/test_transfer_admin_same_address_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_transfer_admin_same_address_rejected.1.json index 26b08f97..2268ab7f 100644 --- a/contracts/token-factory/test_snapshots/test/test_transfer_admin_same_address_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_transfer_admin_same_address_rejected.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_transfer_admin_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_transfer_admin_unauthorized.1.json index 879e51a4..14a8fb0c 100644 --- a/contracts/token-factory/test_snapshots/test/test_transfer_admin_unauthorized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_transfer_admin_unauthorized.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_ttl_extended_after_initialize.1.json b/contracts/token-factory/test_snapshots/test/test_ttl_extended_after_initialize.1.json index 26b08f97..2268ab7f 100644 --- a/contracts/token-factory/test_snapshots/test/test_ttl_extended_after_initialize.1.json +++ b/contracts/token-factory/test_snapshots/test/test_ttl_extended_after_initialize.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_update_admin_delegates_to_propose_admin.1.json b/contracts/token-factory/test_snapshots/test/test_update_admin_delegates_to_propose_admin.1.json new file mode 100644 index 00000000..319f5e3b --- /dev/null +++ b/contracts/token-factory/test_snapshots/test/test_update_admin_delegates_to_propose_admin.1.json @@ -0,0 +1,483 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + { + "function": { + "contract_fn": { + "contract_address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "i128": "1000" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "update_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "accept_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "sv" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "State" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "base_fee" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "fee_token" + }, + "val": { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "metadata_fee" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, + { + "key": { + "symbol": "schema_version" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token_wasm_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "treasury" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "whitelist_enabled" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 535000 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO6V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 535000 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token-factory/test_snapshots/test/test_update_admin_old_loses_access.1.json b/contracts/token-factory/test_snapshots/test/test_update_admin_old_loses_access.1.json index c04dea9c..ec9bb37e 100644 --- a/contracts/token-factory/test_snapshots/test/test_update_admin_old_loses_access.1.json +++ b/contracts/token-factory/test_snapshots/test/test_update_admin_old_loses_access.1.json @@ -82,6 +82,26 @@ ] ], [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "accept_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", @@ -214,7 +234,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -275,12 +295,24 @@ "bool": true } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -336,7 +368,27 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": "2032731177588607455" + "nonce": "4270020994084947596" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" } }, "durability": "temporary", diff --git a/contracts/token-factory/test_snapshots/test/test_update_fees.1.json b/contracts/token-factory/test_snapshots/test/test_update_fees.1.json index 1b1a816c..f455e94d 100644 --- a/contracts/token-factory/test_snapshots/test/test_update_fees.1.json +++ b/contracts/token-factory/test_snapshots/test/test_update_fees.1.json @@ -197,7 +197,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -258,12 +258,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_update_fees_i128_min_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_update_fees_i128_min_rejected.1.json index 26b08f97..2268ab7f 100644 --- a/contracts/token-factory/test_snapshots/test/test_update_fees_i128_min_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_update_fees_i128_min_rejected.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_update_fees_negative_base_fee_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_update_fees_negative_base_fee_rejected.1.json index 8fdd471f..4cf9b07d 100644 --- a/contracts/token-factory/test_snapshots/test/test_update_fees_negative_base_fee_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_update_fees_negative_base_fee_rejected.1.json @@ -153,7 +153,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -214,12 +214,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_update_fees_negative_does_not_corrupt_state.1.json b/contracts/token-factory/test_snapshots/test/test_update_fees_negative_does_not_corrupt_state.1.json index 8fdd471f..4cf9b07d 100644 --- a/contracts/token-factory/test_snapshots/test/test_update_fees_negative_does_not_corrupt_state.1.json +++ b/contracts/token-factory/test_snapshots/test/test_update_fees_negative_does_not_corrupt_state.1.json @@ -153,7 +153,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -214,12 +214,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_update_fees_negative_metadata_fee_rejected.1.json b/contracts/token-factory/test_snapshots/test/test_update_fees_negative_metadata_fee_rejected.1.json index 8fdd471f..4cf9b07d 100644 --- a/contracts/token-factory/test_snapshots/test/test_update_fees_negative_metadata_fee_rejected.1.json +++ b/contracts/token-factory/test_snapshots/test/test_update_fees_negative_metadata_fee_rejected.1.json @@ -153,7 +153,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -214,12 +214,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_update_fees_partial.1.json b/contracts/token-factory/test_snapshots/test/test_update_fees_partial.1.json index 6737e345..5f42a2b9 100644 --- a/contracts/token-factory/test_snapshots/test/test_update_fees_partial.1.json +++ b/contracts/token-factory/test_snapshots/test/test_update_fees_partial.1.json @@ -195,7 +195,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -256,12 +256,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_update_fees_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_update_fees_unauthorized.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_update_fees_unauthorized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_update_fees_unauthorized.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_update_fees_zero_allowed.1.json b/contracts/token-factory/test_snapshots/test/test_update_fees_zero_allowed.1.json index b4da30c1..ec6e2b61 100644 --- a/contracts/token-factory/test_snapshots/test/test_update_fees_zero_allowed.1.json +++ b/contracts/token-factory/test_snapshots/test/test_update_fees_zero_allowed.1.json @@ -197,7 +197,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -258,12 +258,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_upgrade_unauthorized.1.json b/contracts/token-factory/test_snapshots/test/test_upgrade_unauthorized.1.json index 19a651ac..da796622 100644 --- a/contracts/token-factory/test_snapshots/test/test_upgrade_unauthorized.1.json +++ b/contracts/token-factory/test_snapshots/test/test_upgrade_unauthorized.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_whitelist_add_remove_create_sequence.1.json b/contracts/token-factory/test_snapshots/test/test_whitelist_add_remove_create_sequence.1.json index a1e7fff9..689c41a4 100644 --- a/contracts/token-factory/test_snapshots/test/test_whitelist_add_remove_create_sequence.1.json +++ b/contracts/token-factory/test_snapshots/test/test_whitelist_add_remove_create_sequence.1.json @@ -280,7 +280,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -341,12 +341,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_whitelist_disable_reopens_factory.1.json b/contracts/token-factory/test_snapshots/test/test_whitelist_disable_reopens_factory.1.json index 50ba636f..c04f236b 100644 --- a/contracts/token-factory/test_snapshots/test/test_whitelist_disable_reopens_factory.1.json +++ b/contracts/token-factory/test_snapshots/test/test_whitelist_disable_reopens_factory.1.json @@ -279,7 +279,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -340,12 +340,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_whitelist_disabled_by_default.1.json b/contracts/token-factory/test_snapshots/test/test_whitelist_disabled_by_default.1.json index 26b08f97..2268ab7f 100644 --- a/contracts/token-factory/test_snapshots/test/test_whitelist_disabled_by_default.1.json +++ b/contracts/token-factory/test_snapshots/test/test_whitelist_disabled_by_default.1.json @@ -152,7 +152,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -213,12 +213,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_whitelist_gate_consistent_across_single_and_batch.1.json b/contracts/token-factory/test_snapshots/test/test_whitelist_gate_consistent_across_single_and_batch.1.json index c4d50972..14a44ab8 100644 --- a/contracts/token-factory/test_snapshots/test/test_whitelist_gate_consistent_across_single_and_batch.1.json +++ b/contracts/token-factory/test_snapshots/test/test_whitelist_gate_consistent_across_single_and_batch.1.json @@ -306,7 +306,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -367,12 +367,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_whitelist_gate_honors_legacy_instance_entry.1.json b/contracts/token-factory/test_snapshots/test/test_whitelist_gate_honors_legacy_instance_entry.1.json index af1ab1dd..78074092 100644 --- a/contracts/token-factory/test_snapshots/test/test_whitelist_gate_honors_legacy_instance_entry.1.json +++ b/contracts/token-factory/test_snapshots/test/test_whitelist_gate_honors_legacy_instance_entry.1.json @@ -238,7 +238,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -299,12 +299,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/contracts/token-factory/test_snapshots/test/test_whitelist_gate_honors_persistent_entry.1.json b/contracts/token-factory/test_snapshots/test/test_whitelist_gate_honors_persistent_entry.1.json index 12975201..1e29b088 100644 --- a/contracts/token-factory/test_snapshots/test/test_whitelist_gate_honors_persistent_entry.1.json +++ b/contracts/token-factory/test_snapshots/test/test_whitelist_gate_honors_persistent_entry.1.json @@ -264,7 +264,7 @@ "symbol": "sv" }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -325,12 +325,24 @@ "bool": false } }, + { + "key": { + "symbol": "pending_admin" + }, + "val": "void" + }, + { + "key": { + "symbol": "pending_admin_expiry" + }, + "val": "void" + }, { "key": { "symbol": "schema_version" }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/docs/contract-abi.md b/docs/contract-abi.md index 4c408ce1..1705de76 100644 --- a/docs/contract-abi.md +++ b/docs/contract-abi.md @@ -372,8 +372,8 @@ Emits `adm_acc` with `(old_admin, new_admin)` on success. Errors: -- `NoPendingProposal` (code 24) — no proposal is pending, or `new_admin` does not match the proposed address. -- `ProposalExpired` (code 25) — the proposal's expiry ledger has passed. The expired proposal is cleared from state; the current admin must issue a new `propose_admin` call. +- `NoPendingProposal` (code 26) — no proposal is pending, or `new_admin` does not match the proposed address. +- `ProposalExpired` (code 27) — the proposal's expiry ledger has passed. The rejection reverts the call, so the expired proposal stays on record but can never be accepted; the current admin clears it with `cancel_admin_proposal` or replaces it with a new `propose_admin` call. ### `cancel_admin_proposal(current_admin)` @@ -450,9 +450,9 @@ Read-only: returns `true` if `address` is on the whitelist. | 22 | `ZeroFeeSplitEntry` | `set_fee_split` map contains an entry with `bps == 0` | | 23 | `MetadataFrozen` | metadata is frozen (via `freeze_metadata` or auto-freeze after max updates) | | 24 | `TreasuryTransferFailed` | payment/redirect of a fee share to `treasury` itself failed (no further fallback) | -| 24 | `BatchSizeExceeded` | `create_tokens_batch` called with more than `MAX_BATCH_SIZE` (20) tokens | -| 24 | `NoPendingProposal` | `accept_admin` called with no live proposal, or the caller is not the proposed address | -| 25 | `ProposalExpired` | the pending proposal's expiry ledger has passed; current admin must re-propose | +| 25 | `BatchSizeExceeded` | `create_tokens_batch` called with more than `MAX_BATCH_SIZE` (20) tokens | +| 26 | `NoPendingProposal` | `accept_admin` called with no live proposal, or the caller is not the proposed address | +| 27 | `ProposalExpired` | the pending proposal's expiry ledger has passed; current admin must re-propose | ## Test/fuzz-only helpers From 7c2d133da6dbaf730b6bb88d121ae3f0f1e1eaa6 Mon Sep 17 00:00:00 2001 From: Ejirosoft Date: Tue, 25 Aug 2026 10:36:58 +0000 Subject: [PATCH 4/6] fix(frontend): map the two-step admin-rotation event topics `Contract/Frontend Drift` fails because `CONTRACT_TOPIC_MAP` still carries the retired single-step `adm_upd` topic and is missing `fee_redir`. The contract now emits `adm_prop`, `adm_acc` and `adm_can` for a rotation, so every admin event was being dropped from Transaction History and CSV exports. Map all four topics, decode their payloads (including `adm_prop`'s expiry ledger and `fee_redir`'s skipped recipient and amount), and update the regression tests with real XDR fixtures for each. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01HFDD5GssS1ik3KcH3XMx43 --- frontend/src/services/stellar-impl.test.ts | 110 ++++++++++++++++----- frontend/src/services/stellar-impl.ts | 35 ++++++- frontend/src/types/index.ts | 13 ++- 3 files changed, 125 insertions(+), 33 deletions(-) diff --git a/frontend/src/services/stellar-impl.test.ts b/frontend/src/services/stellar-impl.test.ts index 1055cf28..a5ba1c61 100644 --- a/frontend/src/services/stellar-impl.test.ts +++ b/frontend/src/services/stellar-impl.test.ts @@ -63,11 +63,28 @@ const XDR = { topic1: 'AAAADwAAAAd1bnBhdXNlAA==', value: 'AAAAEAAAAAEAAAABAAAAEgAAAAAAAAAA/7SpxpEMV33pXktl+ZP53F+vX2pv4CdwdZDOdAw7Z/k=', }, - adm_upd: { - topic1: 'AAAADwAAAAdhZG1fdXBkAA==', + // Admin rotation is two-step: adm_prop (proposed) → adm_acc (accepted), + // or adm_can (cancelled by the current admin). There is no adm_upd topic. + adm_prop: { + topic1: 'AAAADwAAAAhhZG1fcHJvcA==', + value: + 'AAAAEAAAAAEAAAADAAAAEgAAAAAAAAAA/7SpxpEMV33pXktl+ZP53F+vX2pv4CdwdZDOdAw7Z/kAAAASAAAAAAAAAAB7ANe3xwFAZ5WBGpHb4OKOc//iQMFL1TPn/ZAo86i36QAAAAUAAAAAAAAH0A==', + }, + adm_acc: { + topic1: 'AAAADwAAAAdhZG1fYWNjAA==', value: 'AAAAEAAAAAEAAAACAAAAEgAAAAAAAAAA/7SpxpEMV33pXktl+ZP53F+vX2pv4CdwdZDOdAw7Z/kAAAASAAAAAAAAAAB7ANe3xwFAZ5WBGpHb4OKOc//iQMFL1TPn/ZAo86i36Q==', }, + adm_can: { + topic1: 'AAAADwAAAAdhZG1fY2FuAA==', + value: + 'AAAAEAAAAAEAAAACAAAAEgAAAAAAAAAA/7SpxpEMV33pXktl+ZP53F+vX2pv4CdwdZDOdAw7Z/kAAAASAAAAAAAAAAB7ANe3xwFAZ5WBGpHb4OKOc//iQMFL1TPn/ZAo86i36Q==', + }, + fee_redir: { + topic1: 'AAAADwAAAAlmZWVfcmVkaXIAAAA=', + value: + 'AAAAEAAAAAEAAAACAAAAEgAAAAAAAAAAewDXt8cBQGeVgRqR2+DijnP/4kDBS9Uz5/2QKPOot+kAAAAKAAAAAAAAAAAAAAAAAA9CQA==', + }, } as const // ── Helpers ─────────────────────────────────────────────────────────────────── @@ -105,26 +122,32 @@ describe('CONTRACT_TOPIC_MAP', () => { 'mint', 'burn', 'fees', + 'fee_redir', 'split_set', 'split_clr', 'pause', 'unpause', - 'adm_upd', + 'adm_prop', + 'adm_acc', + 'adm_can', 'wl_add', 'wl_rm', 'wl_tog', ] as const - it('contains exactly the fifteen contract topics', () => { + it('contains exactly the eighteen contract topics', () => { expect(Object.keys(CONTRACT_TOPIC_MAP).sort()).toEqual([...EXPECTED_TOPICS].sort()) }) - it('maps adm_upd to adm_upd (not admin_update)', () => { - expect(CONTRACT_TOPIC_MAP['adm_upd']).toBe('adm_upd') + it('maps each two-step admin-rotation topic to itself', () => { + expect(CONTRACT_TOPIC_MAP['adm_prop']).toBe('adm_prop') + expect(CONTRACT_TOPIC_MAP['adm_acc']).toBe('adm_acc') + expect(CONTRACT_TOPIC_MAP['adm_can']).toBe('adm_can') }) - it('does NOT contain the legacy admin_update key', () => { + it('does NOT contain the legacy admin_update or single-step adm_upd keys', () => { expect(CONTRACT_TOPIC_MAP).not.toHaveProperty('admin_update') + expect(CONTRACT_TOPIC_MAP).not.toHaveProperty('adm_upd') }) }) @@ -144,7 +167,7 @@ describe('parseRpcEvent – edge cases', () => { it('returns null for an unrecognised topic (e.g. admin_update)', async () => { // The old, incorrect topic string that used to be in the frontend const unknownTopic = 'AAAADwAAAAxhZG1pbl91cGRhdGU=' // scvSymbol("admin_update") - const raw = makeRaw('adm_upd', { topic: [FACTORY_TOPIC, unknownTopic] }) + const raw = makeRaw('adm_acc', { topic: [FACTORY_TOPIC, unknownTopic] }) expect(await parseRpcEvent(raw)).toBeNull() }) @@ -254,28 +277,47 @@ describe('parseRpcEvent – unpause', () => { }) }) -// ── parseRpcEvent – adm_upd (THE KEY REGRESSION TEST) ──────────────────────── +// ── parseRpcEvent – admin rotation (THE KEY REGRESSION TESTS) ─────────────── -describe('parseRpcEvent – adm_upd (admin rotation)', () => { +describe('parseRpcEvent – admin rotation (adm_prop / adm_acc / adm_can)', () => { /** - * This is the regression test for the adm_upd vs admin_update mismatch. + * These are the regression tests for the admin-topic mismatch. * - * Before the fix, the frontend EVENT_TOPICS contained 'admin_update' while - * the contract emits symbol_short!("adm_upd"). The decoded topic 'adm_upd' - * was not in the allow-list, so parseRpcEvent returned null and every - * admin-rotation event was silently dropped from Transaction History and - * CSV exports. + * The frontend EVENT_TOPICS first contained 'admin_update', then the + * single-step 'adm_upd'; the contract now performs a two-step rotation and + * emits symbol_short!("adm_prop") / ("adm_acc") / ("adm_can"). A decoded + * topic missing from the allow-list makes parseRpcEvent return null, so + * every admin-rotation event is silently dropped from Transaction History + * and CSV exports. */ - it('decodes an adm_upd event — the critical admin-rotation regression', async () => { - const result = await parseRpcEvent(makeRaw('adm_upd')) + it('decodes an adm_prop event — a rotation proposed but not yet accepted', async () => { + const result = await parseRpcEvent(makeRaw('adm_prop')) expect(result).not.toBeNull() - expect(result!.type).toBe('adm_upd') + expect(result!.type).toBe('adm_prop') expect(result!.data.currentAdmin).toBe(ADDR1) expect(result!.data.newAdmin).toBe(ADDR2) + // The expiry ledger tells a watcher when the proposal lapses. + expect(result!.data.expiryLedger).toBe('2000') + }) + + it('decodes an adm_acc event — the rotation that actually changes the admin', async () => { + const result = await parseRpcEvent(makeRaw('adm_acc')) + expect(result).not.toBeNull() + expect(result!.type).toBe('adm_acc') + expect(result!.data.currentAdmin).toBe(ADDR1) + expect(result!.data.newAdmin).toBe(ADDR2) + }) + + it('decodes an adm_can event — a pending proposal cancelled', async () => { + const result = await parseRpcEvent(makeRaw('adm_can')) + expect(result).not.toBeNull() + expect(result!.type).toBe('adm_can') + expect(result!.data.currentAdmin).toBe(ADDR1) + expect(result!.data.cancelledAdmin).toBe(ADDR2) }) it('preserves both admin addresses in the data payload', async () => { - const result = await parseRpcEvent(makeRaw('adm_upd')) + const result = await parseRpcEvent(makeRaw('adm_acc')) // Both must be present and distinct — this is the information that // users and auditors need to audit who controls the factory. expect(result!.data.currentAdmin).not.toBe(result!.data.newAdmin) @@ -286,22 +328,40 @@ describe('parseRpcEvent – adm_upd (admin rotation)', () => { it('returns null for the legacy admin_update topic string (no regression back)', async () => { // Verify that the raw string "admin_update" is never silently accepted const legacyTopic = 'AAAADwAAAAxhZG1pbl91cGRhdGU=' // scvSymbol("admin_update") - const raw = makeRaw('adm_upd', { topic: [FACTORY_TOPIC, legacyTopic] }) + const raw = makeRaw('adm_acc', { topic: [FACTORY_TOPIC, legacyTopic] }) + expect(await parseRpcEvent(raw)).toBeNull() + }) + + it('returns null for the retired single-step adm_upd topic string', async () => { + const retiredTopic = 'AAAADwAAAAdhZG1fdXBkAA==' // scvSymbol("adm_upd") + const raw = makeRaw('adm_acc', { topic: [FACTORY_TOPIC, retiredTopic] }) expect(await parseRpcEvent(raw)).toBeNull() }) }) +// ── parseRpcEvent – fee redirect ───────────────────────────────────────────── + +describe('parseRpcEvent – fee_redir (fee share redirected to treasury)', () => { + it('decodes the skipped recipient and the redirected amount', async () => { + const result = await parseRpcEvent(makeRaw('fee_redir')) + expect(result).not.toBeNull() + expect(result!.type).toBe('fee_redir') + expect(result!.data.recipient).toBe(ADDR2) + expect(result!.data.amount).toBe('1000000') + }) +}) + // ── CSV serialization includes admin rotation ───────────────────────────────── -describe('adm_upd CSV serialization', () => { +describe('admin-rotation CSV serialization', () => { /** - * Verify that once an adm_upd event is parsed, serializeTransactionsToCSV + * Verify that once an admin-rotation event is parsed, serializeTransactionsToCSV * would capture it. We test the data shape because the CSV util operates * on TransactionHistoryItem (Horizon op model), but we can verify the parsed * event has the right shape to be mapped to a CSV row. */ - it('parsed adm_upd event has currentAdmin and newAdmin in data', async () => { - const result = await parseRpcEvent(makeRaw('adm_upd')) + it('parsed adm_acc event has currentAdmin and newAdmin in data', async () => { + const result = await parseRpcEvent(makeRaw('adm_acc')) expect(result).not.toBeNull() // These fields must be present for a UI row to show both addresses expect(Object.keys(result!.data)).toContain('currentAdmin') diff --git a/frontend/src/services/stellar-impl.ts b/frontend/src/services/stellar-impl.ts index 66428137..3a99c804 100644 --- a/frontend/src/services/stellar-impl.ts +++ b/frontend/src/services/stellar-impl.ts @@ -429,16 +429,27 @@ function scValToString(val: xdr.ScVal | undefined): string { * leaving holes in the audit trail this table is supposed to reconstruct * (issue #917). * - * Audit of all fifteen contract topics (lib.rs → frontend): + * Admin rotation is two-step, so there is no single `adm_upd` topic: the + * contract emits `adm_prop` when a rotation is proposed, `adm_acc` when the + * proposed admin accepts it, and `adm_can` when the current admin cancels a + * pending proposal. + * + * Audit of all eighteen contract topics (lib.rs → frontend): * init → 'init' (factory init) * created → 'created' (token deployed) * meta → 'meta' (metadata URI set) + * meta_frz → 'meta_frz' (metadata frozen) * mint → 'mint' (tokens minted) * burn → 'burn' (tokens burned) * fees → 'fees' (fees updated) + * fee_redir → 'fee_redir' (fee share redirected to treasury) + * split_set → 'split_set' (fee split configured) + * split_clr → 'split_clr' (fee split cleared) * pause → 'pause' (factory paused) * unpause → 'unpause' (factory unpaused) - * adm_upd → 'adm_upd' (admin rotated) ← was incorrectly 'admin_update' + * adm_prop → 'adm_prop' (admin rotation proposed) + * adm_acc → 'adm_acc' (admin rotation accepted — admin changed) + * adm_can → 'adm_can' (pending admin rotation cancelled) * wl_add → 'wl_add' (address added to whitelist) * wl_rm → 'wl_rm' (address removed from whitelist) * wl_tog → 'wl_tog' (whitelist enforcement toggled) @@ -451,11 +462,14 @@ export const CONTRACT_TOPIC_MAP: Record = { mint: 'mint', burn: 'burn', fees: 'fees', + fee_redir: 'fee_redir', split_set: 'split_set', split_clr: 'split_clr', pause: 'pause', unpause: 'unpause', - adm_upd: 'adm_upd', + adm_prop: 'adm_prop', + adm_acc: 'adm_acc', + adm_can: 'adm_can', wl_add: 'wl_add', wl_rm: 'wl_rm', wl_tog: 'wl_tog', @@ -509,10 +523,23 @@ export async function parseRpcEvent(raw: RpcEventResponse): Promise Date: Tue, 25 Aug 2026 10:37:01 +0000 Subject: [PATCH 5/6] fix(ci): stop access-control drift check truncating function bodies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `check-access-control-docs-drift.sh` stripped `//` comments with a naive regex, so `if &buf[..7] != b"ipfs://" {` lost its opening brace and the brace counter closed `set_metadata` forty lines early. The truncated body hid the `creator != admin` guard, and the check exited 1 — failing the workflow. Strip line comments with a scanner that skips string literals, add a rule for the stored-creator identity check, and correct `set_metadata`'s expected claims: it authorizes its caller and compares them against the token's stored creator, and factory-admin privilege grants nothing there. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01HFDD5GssS1ik3KcH3XMx43 --- scripts/check-access-control-docs-drift.sh | 43 +++++++++++++++++++++- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/scripts/check-access-control-docs-drift.sh b/scripts/check-access-control-docs-drift.sh index 52e8c6da..c8be8b02 100755 --- a/scripts/check-access-control-docs-drift.sh +++ b/scripts/check-access-control-docs-drift.sh @@ -71,7 +71,7 @@ get_expected_claims() { "is_whitelisted") echo "view_only" ;; "create_token") echo "creator_auth:whitelist_gate" ;; "create_tokens_batch") echo "creator_auth:whitelist_gate" ;; - "set_metadata") echo "admin_auth:creator_auth:admin_check" ;; + "set_metadata") echo "admin_auth:creator_check" ;; *) echo "" ;; esac } @@ -141,6 +141,34 @@ pattern = sys.argv[2] text = Path(lib_rs_file).read_text() lines = text.splitlines() + +def strip_line_comment(line): + """Drop a trailing `//` comment, ignoring `//` inside a string literal. + + A naive `re.sub(r'//.*$', ...)` truncates lines such as + `if &buf[..7] != b"ipfs://" {`, swallowing the opening brace and making + the brace counter close the enclosing function early. + """ + in_string = False + escaped = False + i = 0 + while i < len(line): + ch = line[i] + if in_string: + if escaped: + escaped = False + elif ch == '\\': + escaped = True + elif ch == '"': + in_string = False + elif ch == '"': + in_string = True + elif ch == '/' and line[i + 1:i + 2] == '/': + return line[:i] + i += 1 + return line + + for i, line in enumerate(lines): if not re.match(r'^\s*(?:pub\s+)?fn\s+[A-Za-z_][A-Za-z0-9_]*\s*\(', line): continue @@ -157,7 +185,7 @@ for i, line in enumerate(lines): while j < len(lines): raw = lines[j] - no_comments = re.sub(r'//.*$', '', raw) + no_comments = strip_line_comment(raw) body.append(no_comments) depth += no_comments.count('{') - no_comments.count('}') if not saw_open and depth > 0: @@ -185,6 +213,15 @@ detect_creator_auth() { fn_contains_pattern "$lib_rs_file" "creator\\.require_auth" > "$output_file" } +# Rule A2b: Detect stored-creator identity check (e.g., creator != admin). +# `set_metadata` names its caller `admin`, but the guard compares it against +# the token's stored creator — factory-admin privilege grants nothing here. +detect_creator_check() { + local lib_rs_file="$1" + local output_file="$2" + fn_contains_pattern "$lib_rs_file" "creator\\s*!=\\s*admin" > "$output_file" +} + # Rule A3: Detect admin identity check (e.g., state.admin != admin) detect_admin_check() { local lib_rs_file="$1" @@ -254,6 +291,7 @@ build_actual_claims() { # Apply detection rules detect_admin_auth "$lib_rs_file" "${temp_dir}/admin_auth_fns.txt" detect_creator_auth "$lib_rs_file" "${temp_dir}/creator_auth_fns.txt" + detect_creator_check "$lib_rs_file" "${temp_dir}/creator_check_fns.txt" detect_admin_check "$lib_rs_file" "${temp_dir}/admin_check_fns.txt" detect_whitelist_gate "$lib_rs_file" "${temp_dir}/whitelist_gate_fns.txt" @@ -268,6 +306,7 @@ build_actual_claims() { # Check each rule grep -q "^${fn}$" "${temp_dir}/admin_auth_fns.txt" 2>/dev/null && claims+=("admin_auth") grep -q "^${fn}$" "${temp_dir}/creator_auth_fns.txt" 2>/dev/null && claims+=("creator_auth") + grep -q "^${fn}$" "${temp_dir}/creator_check_fns.txt" 2>/dev/null && claims+=("creator_check") grep -q "^${fn}$" "${temp_dir}/admin_check_fns.txt" 2>/dev/null && claims+=("admin_check") grep -q "^${fn}$" "${temp_dir}/whitelist_gate_fns.txt" 2>/dev/null && claims+=("whitelist_gate") From 57230dc38b91904b1774b3bf13ee33013a16d10e Mon Sep 17 00:00:00 2001 From: Ejirosoft Date: Tue, 25 Aug 2026 10:47:37 +0000 Subject: [PATCH 6/6] fix(contract): collapse nested if to satisfy clippy `cargo clippy -- -D warnings` failed on `collapsible_if` in the fee distribution loop. Collapsing into `share > 0 && ...is_err()` keeps the short-circuit semantics: the transfer is still only attempted for a non-zero share. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_019E8cJSSGUUPiea6LFYL8wN --- contracts/token-factory/src/lib.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/contracts/token-factory/src/lib.rs b/contracts/token-factory/src/lib.rs index a69ea046..047b0da9 100644 --- a/contracts/token-factory/src/lib.rs +++ b/contracts/token-factory/src/lib.rs @@ -462,16 +462,14 @@ impl TokenFactory { let mut treasury_extra: i128 = remainder; // any unassigned rounding remainder for i in 0..n { if let (Ok(Some(addr)), Ok(Some(share))) = (addrs.try_get(i), floors.try_get(i)) { - if share > 0 { - if fee_client.try_transfer(payer, &addr, &share).is_err() { - treasury_extra = treasury_extra - .checked_add(share) - .ok_or(Error::ArithmeticOverflow)?; - env.events().publish( - (symbol_short!("factory"), symbol_short!("fee_redir")), - (addr, share), - ); - } + if share > 0 && fee_client.try_transfer(payer, &addr, &share).is_err() { + treasury_extra = treasury_extra + .checked_add(share) + .ok_or(Error::ArithmeticOverflow)?; + env.events().publish( + (symbol_short!("factory"), symbol_short!("fee_redir")), + (addr, share), + ); } } }