Стандарт: SOLPDT 1.1 — Agentic Trust Layer Extension
Настоящее приложение определяет протокол автоматического списания нематериальных активов (НМА) в экосистеме SOLPDT при наступлении событий, прекращающих действие аттестата доверия sig.a. Документ устанавливает:
Протокол обеспечивает соответствие требованиям ФСБУ 14/2022 (п. 41) и IAS 38 (п. 112) в части выбытия и обесценения активов.
В соответствии с ФСБУ 14/2022 и IAS 38, нематериальный актив подлежит списанию с баланса при прекращении его признания. В экосистеме SOLPDT такими событиями являются:
| Код события | Наименование | Статус TRL | Основание по ФСБУ 14/2022 |
|---|---|---|---|
TRL_PROTOCOL_FRAUD | Доказанная попытка двойной траты или подделки Payload-V2 | PERMANENT | Утрата контроля (пп. «б» п. 4) |
TRL_COMPLIANCE_VIOLATION | Попадание оператора агента в санкционные списки | PERMANENT | Прекращение использования вследствие регуляторных ограничений |
TRL_SKILLS_INCONSISTENCY | Расхождение данных skills.json с блокчейн-историей | SUSPENDED → PERMANENT | Утрата способности приносить экономические выгоды |
TRL_CRITICAL_DRIFT | PDT-Score опустился ниже критического порога, установленного для данного агента в его Initial-Dossier, и сохранялся ниже этого порога в течение периода, определенного как критический | SUSPENDED → PERMANENT | Утрата способности приносить экономические выгоды (пп. «в» п. 4) |
TRL_STAKE_EXHAUSTED | Полное исчерпание залогового депозита при слэшинге | PERMANENT | Прекращение контроля вследствие экономической несостоятельности агента |
TRL_LICENSOR_REVOCATION | Отзыв DAT Уполномоченного Лицензиара (DAT-A) Корневым узлом | PERMANENT | Аннулирование аттестации всех агентов данного Лицензиара |
При наступлении любого из перечисленных событий актив перестаёт соответствовать критериям признания НМА:
sig.a аннулируется, агент более не может формировать доверенные транзакцииCGW / Мониторинг TRL / Отчёт оракула выявляет нарушение критериев признания НМА.
В реестр вносится запись со статусом SUSPENDED или PERMANENT. Присваивается уникальный ID записи.
Длительность, установленная для данного типа нарушений (типовое значение — 24 часа). Возможность оспаривания Лицензиаром.
Ошибочное срабатывание
▼
ВОССТАНОВЛЕНИЕ
TRL: RESTORED
sig.a активна
Нарушение подтверждено
▼
СПИСАНИЕ АКТИВА
(WRITE-OFF)
Триггер может быть обнаружен следующими компонентами:
| Компонент | Тип обнаруживаемых событий |
|---|---|
| Compliance-Gateway (CGW) | AML-нарушения, санкционные списки |
| PDT-Engine | Критическое падение PDT-Score |
| Мониторинг skills.json | Расхождение заявленных и фактических метрик |
| Корневой узел / Лицензиар | Ручное внесение при форс-мажоре |
При обнаружении триггера в реестр отозванного доверия (TRL) вносится запись со следующими полями:
{
"trl_entry_id": "TRL-2026-00158",
"agent_pubkey": "A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v",
"status": "SUSPENDED",
"reason_code": "TRL_CRITICAL_DRIFT",
"reason_details": {
"pdt_score_current": 0.32,
"pdt_score_threshold": 0.4,
"cycles_below_threshold": 3,
"last_valid_tx": "2026-04-01T12:00:00Z"
},
"reported_by": "PDT-Engine-01",
"reported_at": "2026-04-09T10:30:00Z",
"grace_period_ends_at": "2026-04-10T10:30:00Z",
"licensor_dat_ref": "DAT-888-REGIONAL-NODE-05"
} Длительность: Устанавливается в Initial-Dossier агента (типовое значение — 24 часа / 86 400 секунд) с момента reported_at.
В течение этого периода:
nma в Payload-V2 временно сбрасывается в false, но актив остаётся на балансе с пометкой «под вопросом»Возможные действия в Grace Period:
| Инициатор | Действие | Результат |
|---|---|---|
| Лицензиар | Подтверждение нарушения | Немедленный переход к Шагу 4 |
| Лицензиар | Оспаривание с доказательствами | Отмена записи TRL → RESTORED |
| Система | Истечение Grace Period без оспаривания | Автоматический переход к Шагу 4 |
При подтверждении нарушения или истечении Grace Period выполняется:
4.1. Обновление статуса TRL
{
"trl_entry_id": "TRL-2026-00158",
"status": "PERMANENT",
"confirmed_at": "2026-04-10T10:30:00Z",
"confirmed_by": "SYSTEM_AUTO"
} 4.2. Обновление метаданных Payload-V2
В блоке accounting_asset_details производятся следующие изменения:
{
"impairment_test": {
"last_test_timestamp": "2026-04-10T10:30:00Z",
"last_test_result": "written_off",
"write_off_reason": "TRL_CRITICAL_DRIFT",
"write_off_trl_ref": "TRL-2026-00158"
}
} 4.3. Обнуление балансовой стоимости
Остаточная стоимость (NBV) принудительно устанавливается в 0. Накопленная амортизация становится равной первоначальной стоимости за вычетом ликвидационной.
4.4. Отзыв sig.a
Подпись sig.a аннулируется. Любая проверка через https://solpdt.com/verify возвращает статус TRUST_REVOKED.
4.5. Слэшинг (если применимо)
При наличии неуплаченных обязательств или умышленного нарушения залоговый депозит (stake_account) изымается в пользу пострадавшей стороны или сжигается.
Compliance-Gateway автоматически формирует Акт списания НМА (шаблон — Приложение H).
use anchor_lang::prelude::*;
#[derive(AnchorSerialize, AnchorDeserialize, Clone, PartialEq, Eq)]
pub enum AssetStatus {
Active,
Suspended,
WrittenOff,
}
#[account]
pub struct AssetAccount {
pub agent_pubkey: Pubkey,
pub initial_cost: u64,
pub current_nbv: u64,
pub accumulated_amortization: u64,
pub status: AssetStatus,
pub sig_a: String, // Authoritative Attestation
pub trl_entry_id: Option, // Ссылка на запись в TRL
pub suspended_at: Option, // Unix-время приостановки
pub written_off_at: Option, // Unix-время списания
pub write_off_reason: Option, // Код причины
}
/// Обработчик события списания актива.
/// Вызывается после подтверждения нарушения и истечения Grace Period.
pub fn write_off_asset(ctx: Context<WriteOffAsset>, reason_code: String) -> Result<()> {
let asset = &mut ctx.accounts.asset_account;
let clock = Clock::get()?;
// Проверка, что актив ещё не списан
require!(
asset.status != AssetStatus::WrittenOff,
ErrorCode::AssetAlreadyWrittenOff
);
// Обнуление стоимости
asset.current_nbv = 0;
asset.accumulated_amortization = asset.initial_cost;
// Обновление статуса
asset.status = AssetStatus::WrittenOff;
asset.written_off_at = Some(clock.unix_timestamp);
asset.write_off_reason = Some(reason_code);
// Аннулирование подписи (помечается как невалидная)
asset.sig_a = String::from("REVOKED");
// Эмиссия события для off-chain систем
emit!(AssetWrittenOffEvent {
agent_pubkey: asset.agent_pubkey,
written_off_at: clock.unix_timestamp,
reason: reason_code,
trl_entry_id: asset.trl_entry_id.clone(),
});
Ok(())
}
#[event]
pub struct AssetWrittenOffEvent {
pub agent_pubkey: Pubkey,
pub written_off_at: i64,
pub reason: String,
pub trl_entry_id: Option,
}
#[error_code]
pub enum ErrorCode {
#[msg("Актив уже списан")]
AssetAlreadyWrittenOff,
} /// Проверяет, истёк ли Grace Period для приостановленного актива.
/// Вызывается периодически или при попытке совершения транзакции.
pub fn check_grace_period_expired(
suspended_at: i64,
current_timestamp: i64,
grace_period_seconds: i64,
) -> bool {
current_timestamp >= suspended_at + grace_period_seconds
}
/// Переводит актив из SUSPENDED в WRITTEN_OFF после истечения Grace Period.
pub fn finalize_suspension(ctx: Context<FinalizeSuspension>, grace_period_seconds: i64) -> Result<()> {
let asset = &mut ctx.accounts.asset_account;
let clock = Clock::get()?;
require!(
asset.status == AssetStatus::Suspended,
ErrorCode::AssetNotSuspended
);
let suspended_at = asset.suspended_at.ok_or(ErrorCode::MissingSuspendedAt)?;
require!(
check_grace_period_expired(suspended_at, clock.unix_timestamp, grace_period_seconds),
ErrorCode::GracePeriodNotExpired
);
// Автоматическое списание
write_off_asset(
ctx.accounts.as_write_off_context(),
String::from("TRL_GRACE_PERIOD_EXPIRED")
)?;
Ok(())
} При списании НМА формируется следующая бухгалтерская запись:
| Дебет | Кредит | Сумма | Основание |
|---|---|---|---|
| Счёт 05 (Амортизация НМА) | Счёт 04 (НМА) | Накопленная амортизация | Списание амортизации |
| Счёт 91.02 (Прочие расходы) | Счёт 04 (НМА) | Остаточная стоимость | Убыток от списания |
| Дебет | Кредит | Сумма |
|---|---|---|
| 05 | 04 | 50 000 ₽ |
| 91.02 | 04 | 100 000 ₽ |
Итого: счёт 04 закрыт, в прочих расходах отражён убыток 100 000 ₽.
Если списание сопровождается изъятием залогового депозита:
| Дебет | Кредит | Сумма | Основание |
|---|---|---|---|
| 91.02 (Прочие расходы) | 58 (Финансовые вложения) | Сумма изъятого залога | Потеря депозита при слэшинге |
Для получения рекомендаций по отражению операций списания НМА в налоговом учёте в соответствии с законодательством конкретной юрисдикции, пожалуйста, обращайтесь к авторизованным Лицензиарам или налоговым консультантам. Стандарт SOLPDT предоставляет техническую и бухгалтерскую (МСФО) основу для учёта, но не заменяет профессиональную налоговую консультацию.
Выход из TRL и восстановление статуса nma: true возможны только через переаттестацию у Лицензиара (или, в исключительных случаях, у Корневого узла).
| Условие | Доказательство |
|---|---|
| Устранение причины отзыва | PDT-Score восстановлен выше порога, установленного в Initial-Dossier для признания актива / skills.json синхронизирован / кошелёк легитимизирован |
| Повторный AML-скрининг | Пройден с риском ≤ допустимого порога |
| Методологический аудит | Подтверждение соответствия FEBA/SOL |
| Погашение задолженности (если применимо) | Транзакция погашения в Solana |
/// Восстанавливает актив после успешной переаттестации.
pub fn restore_asset(ctx: Context<RestoreAsset>, new_sig_a: String) -> Result<()> {
let asset = &mut ctx.accounts.asset_account;
let clock = Clock::get()?;
require!(
asset.status == AssetStatus::WrittenOff || asset.status == AssetStatus::Suspended,
ErrorCode::AssetNotRevoked
);
// Восстановление стоимости (из истории или заново)
// ВАЖНО: первоначальная стоимость не меняется,
// но срок полезного использования может быть скорректирован
asset.status = AssetStatus::Active;
asset.sig_a = new_sig_a;
asset.suspended_at = None;
asset.written_off_at = None;
asset.write_off_reason = None;
// Обновление записи в TRL
asset.trl_entry_id = None;
emit!(AssetRestoredEvent {
agent_pubkey: asset.agent_pubkey,
restored_at: clock.unix_timestamp,
new_sig_a,
});
Ok(())
} Согласно ФСБУ 14/2022, восстановление ранее списанного НМА не допускается. Актив должен быть принят к учёту заново:
Для обеспечения возможности внешнего аудита при списании фиксируются:
| Данные | Источник | Хранение |
|---|---|---|
trl_entry_id | TRL | Блокчейн |
write_off_reason | Смарт-контракт | Блокчейн |
written_off_at | Unix-время | Блокчейн |
nbv_before_write_off | Состояние до списания | История аккаунта |
accumulated_amortization | Состояние до списания | История аккаунта |
tx_hash | Хеш транзакции списания | Solana Explorer |
Аудитор может проверить легитимность списания, используя чек-лист из Приложения G: Чек-лист аудитора (Auditor Checklist).
| № | Проверка | Критерий | Подтверждающий документ |
|---|---|---|---|
| 1 | Основание для списания | Наличие записи в TRL со статусом PERMANENT | Выписка из TRL |
| 2 | Истечение Grace Period | Прошло ≥ установленного периода с момента reported_at | Системный лог |
| 3 | Остаточная стоимость | Корректно рассчитана на момент списания | Приложение E |
| 4 | Накопленная амортизация | Соответствует учётным данным | Оборотно-сальдовая ведомость |
| 5 | Первичный документ | Сформирован Акт списания НМА | Приложение H |
| 6 | Проводки | Соответствуют учётной политике | Журнал проводок |