Расширение внедряет контентный скрипт содержащий переменную с веб3 провайдером: vizonator. Любое действие направляется к исполнительной логике расширения, которое проверяет сохраненные правила для автоматического подтверждения или отказа в действии. Если правил для конкретного сайта не было найдено — расширение спросит пользователя об утверждении запроса.

Эта документация больше для фронтенд разработчиков на javascript.

Доступные операции

Типы операций: подпись и исполнение операций, запрос данных расширения, запросы через API.

Каждая операция запрашивает разные виды правил. Если пользователь отметил галочкой запомнить свое решение, расширение сохранит это для конкретного сайта.


check_vizonator

Проверьте переменную vizonator перед тем как делать запросы на операции.

if(typeof vizonator !== "undefined"){
	$(".vizonator_callback.test_check_vizonator").html("Vizonator initialized!");
}
else{
	$(".vizonator_callback.test_check_vizonator").html("Vizonator NOT initialized...");
}
Запустить пример

get_account

Запрашиваемые правила: account

Запрашивает информацию о текущем аккаунт у расширения: логин, уровень энергии, заполнены ли ключи для шифрования заметок (memo) и управления активами (active).

vizonator.get_account(function(error,result){
	let el=$(".vizonator_callback.test_get_account");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text(JSON.stringify(result,null,2));
	}
});
Запустить пример

get_settings

Запрашиваемые правила: settings

Запрашивает настройки расширения: шаг энергии, затрачиваемая операцией награждения энергия по умолчанию, темный режим, выбранный язык.

vizonator.get_settings(function(error,result){
	let el=$(".vizonator_callback.test_get_settings");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text(JSON.stringify(result,null,2));
	}
});
Запустить пример

get_accounts

Запрашиваемые правила: accounts

Запрашивает список аккаунтов, добавленных в сессию расширения: логины, признак текущего аккаунта и булевы флаги наличия ключей (regular, active, memo). Приватные ключи не покидают расширение — в ответе их нет. Нужен dApp-ам, чтобы показать пользователю выбор аккаунта перед switch_account. Список отдаётся в порядке добавления аккаунтов.

vizonator.get_accounts(function(error,result){
	let el=$(".vizonator_callback.test_get_accounts");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text(JSON.stringify(result,null,2));
	}
});
Запустить пример

switch_account

Запрашиваемые правила: account_switch

Просит сделать текущим другой аккаунт сессии (dApp берёт список из get_accounts, пользователь выбирает). Расширение всегда показывает окно подтверждения: сайт не может переключить кошелёк молча, даже если ему уже доверены другие операции, и решение не запоминается (правило account_switch не сохраняется). Если запрошен уже текущий аккаунт — ответ приходит сразу, без окна. Неизвестный логин → отказ unknown_account. Результат: {login, switched}.

let account="on1x";//any login from the get_accounts list
vizonator.switch_account({account:account},function(error,result){
	let el=$(".vizonator_callback.test_switch_account");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text(JSON.stringify(result,null,2));
	}
});
Запустить пример

import_account

Запрашиваемые правила: account

let account="invite";
let regular_key=false;
let active_key="5KcfoRuDfkhrLCxVcE9x51J6KN9aM9fpb78tLrvvFckxVV6FyFW";
let memo_key=false;
vizonator.import_account(account,regular_key,active_key,memo_key,function(error,result){
	let el=$(".vizonator_callback.test_import_account");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text(JSON.stringify(result,null,2));
	}
});
Запустить пример

get_custom_account

Запрашиваемые правила: account, api

API запрос по любому аккаунту VIZ с счетчиком для кастомного (custom) протокола. Если аккаунт пустой или булево ложь (false) — запрашивает аккаунт пользователя.

let account="on1x";
let protocol="V";//can be empty
vizonator.get_custom_account(account,protocol,function(error,result){
	let el=$(".vizonator_callback.test_get_custom_account");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text(JSON.stringify(result,null,2));
	}
});
Запустить пример

get_account_history

Запрашиваемые правила: account, api

API запрос для получения истории операций любого аккаунта VIZ. Если аккаунт пустой или булево ложь (false) — запрашивает аккаунт пользователя.

let account="on1x";
let from=-1;//from the latest activity
let limit=5;
vizonator.get_account_history(account,from,limit,function(error,result){
	let el=$(".vizonator_callback.test_get_account_history");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text(JSON.stringify(result,null,2));
	}
});
Запустить пример

get_accounts_on_sale

Запрашиваемые правила: account, api

let from=0;//from first entry
let limit=50;//max 1000
vizonator.get_accounts_on_sale(from,limit,function(error,result){
	let el=$(".vizonator_callback.test_get_accounts_on_sale");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text(JSON.stringify(result,null,2));
	}
});
Запустить пример

get_subaccounts_on_sale

Запрашиваемые правила: account, api

let from=0;//from first entry
let limit=50;//max 1000
vizonator.get_subaccounts_on_sale(from,limit,function(error,result){
	let el=$(".vizonator_callback.test_get_subaccounts_on_sale");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text(JSON.stringify(result,null,2));
	}
});
Запустить пример

account_metadata

Запрашиваемые правила: meta, regular, account

Перезаписывает/обновляет информацию об метаданных аккаунта. Обычно используется для модификации профиля (в начале - получение метаданных из блокчейна, после - изменение их структуры, наконец - запись данных в блокчейн этой операцией).

let metadata="{}";//be careful, this operation will be clear account metadata
vizonator.account_metadata({json:metadata},function(error,result){
	let el=$(".vizonator_callback.test_account_metadata");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text("Result: "+JSON.stringify(result));
	}
});
Запустить пример

award

Запрашиваемые правила: award, regular

Дополнительные параметры: beneficiaries (бенефициары, структура в виде массива аккаунтов с процентом получаемой награды [{"account":"login1","weight":100},{"account":"login2","weight":200}]), custom_sequence (used by social gateways), force_memo_encoding (принудительное шифрование заметки), optional_memo_encoding (0.81+, оставляет выбор — шифровать или нет — пользователю: в окне подтверждения появляется галочка, по умолчанию включена; показывается только если у аккаунта пользователя есть memo-ключ).
Результат содержит объект с свойством approximate_amount в виде дробного значения. Оно содержит приблизительное количество социального капитала которым был награжден получатель.

vizonator.award({receiver:"on1x",energy:500,memo:"Vizonator docs"},function(error,result){
	let el=$(".vizonator_callback.test_award");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text(JSON.stringify(result));
	}
});
Запустить пример

fixed_award

Запрашиваемые правила: award, regular

Идентично award, отличие в переменной reward_amount и max_energy для фиксированной награды.

vizonator.fixed_award({receiver:"on1x",reward_amount:"1.000 VIZ",max_energy:500,memo:"Vizonator docs"},function(error,result){
	let el=$(".vizonator_callback.test_fixed_award");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text(JSON.stringify(result));
	}
});
Запустить пример

committee_vote_request

Запрашиваемые правила: committee, regular

Голосует за активную заявку в ДАО VIZ. Параметр процент голоса (vote_percent) может быт в диапазоне от -10000 (-100.00%) до 10000 (100.00%).

vizonator.committee_vote_request({request_id:5,vote_percent:10000},function(error,result){
	let el=$(".vizonator_callback.test_committee_vote_request");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text("Result: "+JSON.stringify(result));
	}
});
Запустить пример

custom

Запрашиваемые правила: custom, protocol_*, regular*, active*

Отправляет json данные кастомного (custom) протокола в блокчейн. Тип доступа (authority) может быть как активным (active), так и обычным (regular).

let authority_type="regular";//can be "active"
let protocol_id="test";
let json_data='{"hello":"world"}';
vizonator.custom({authority:authority_type,id:protocol_id,json:json_data},function(error,result){
	let el=$(".vizonator_callback.test_custom");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text("Result: "+JSON.stringify(result));
	}
});
Запустить пример

delegate_vesting_shares

Запрашиваемые правила: delegate, active

Делегирование социального капитала другому аккаунту или разделегирование. Влияет на эффективность награждений и весу голоса в ДАО.

let amount="1.000000 SHARES";//"0.000000 SHARES" for undelegate
vizonator.delegate_vesting_shares({delegatee:"on1x",vesting_shares:amount},function(error,result){
	let el=$(".vizonator_callback.test_delegate_vesting_shares");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text("Result: "+JSON.stringify(result));
	}
});
Запустить пример

passwordless_auth

Запрашиваемые правила: auth, account, regular*, active*

Подписывает уникальную строку для беспарольного доказательства аутентификации: domain:auth:account:authority:timestamp:nonce. Сайт обрабатывает полученную строку, верифицирует подпись и должен кэшировать ее с двух-минутной экспирацией, чтобы блокировать попытки авторизации от других источников (в случае MITM атаки).
Необязательное поле domain (с версии 0.77) — за какой домен просят подпись; без него подписывается ваш собственный хост, как и раньше (старые вызовы работают автоматически). Для http/https назвать можно СВОЙ хост, а со 0.77 — ещё и свой главный домен: страница на app.example.com вправе подписать за example.com, потому что владелец у них один. Тогда окно показывает оранжевое предупреждение: строка уйдёт на главный домен, а не на тот хост, где открыта страница, и молча такое не одобряется никогда (даже когда сайту доверены другие операции). Главный домен не может подписать за поддомен, а поддомен — за соседний поддомен; на площадках, где поддомены раздают всем (github.io, vercel.app и подобных), главным доменом считается только собственный поддомен — иначе evil.github.io подписал бы за всех сразу. Имена viz:// (VIZ DNS) разрешены с любой страницы, но такое имя никогда не одобряется молча — пользователь видит в окне и домен, и аккаунт, которым подписывает.
Коды ошибок: domain_mismatch — назван чужой домен, соседний поддомен или главный домен вместо своего поддомена; bad_domain — схема не http/https и не viz://; unknown_account / account_changed — аккаунт пропал или сменился, пока окно было открыто; refuse — сайту отказано правилом auth; no key — в сессии нет ключа запрошенного типа доступа.

let authority_type="regular";//can be "active"
/* domain необязателен: без него подпись делается за домен страницы (как раньше).
   Свой хост можно назвать явно, имя viz://... — только после подтверждения пользователем. */
//let domain="hub.viz.world";//or "viz://on1x" for a VIZ DNS name
vizonator.passwordless_auth({authority:authority_type/*,domain:domain*/},function(error,result){
	let el=$(".vizonator_callback.test_passwordless_auth");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text(JSON.stringify(result,null,2));
	}
});
Запустить пример

sign_data

Запрашиваемые правила: sign, account, regular*, active*

Подписывает произвольную строку ключом аккаунта (в отличие от passwordless_auth, где строку формирует само расширение). Параметры: data (строка для подписи), authority (по умолчанию regular, можно active). Результат: {account, signature, public_key}. В блокчейн ничего не отправляется — подпись это только доказательство для вашего бэкенда, поэтому строка обязана содержать ваш домен и временную отметку/nonce, иначе подпись можно переиспользовать.

let authority_type="regular";//can be "active"
let data_to_sign="hub.viz.world:inbox.list:"+Math.floor(Date.now()/1000);
vizonator.sign_data({authority:authority_type,data:data_to_sign},function(error,result){
	let el=$(".vizonator_callback.test_sign_data");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text(JSON.stringify(result,null,2));
	}
});
Запустить пример

transfer

Запрашиваемые правила: transfer, active

Запрашивает у пользователя перевод определенного количества viz. Может запросить принудительное (force_memo_encoding) либо опциональное (optional_memo_encoding, 0.81+ — пользователь решает галочкой в окне подтверждения) шифрование заметки. Поле amount необязательно: если его не передать, пользователь сам вводит сумму в окне подтверждения (проверяется по балансу).

let amount="0.001 VIZ";
let memo="Vizonator docs";
let force_encoding=false;//can be boolean true for force encoding by shared memo key
vizonator.transfer({to:"committee",amount:amount,memo,force_memo_encoding:force_encoding},function(error,result){
	let el=$(".vizonator_callback.test_transfer");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text("Result: "+JSON.stringify(result));
	}
});
Запустить пример

transfer_to_vesting

Запрашиваемые правила: vesting, active

Запрашивает у пользователя перевод суммы viz в социальный капитал.

vizonator.transfer_to_vesting({to:"committee",amount:"0.001 VIZ"},function(error,result){
	let el=$(".vizonator_callback.test_transfer_to_vesting");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text("Result: "+JSON.stringify(result));
	}
});
Запустить пример

withdraw_vesting

Запрашиваемые правила: vesting, active

Запрашивает у пользователя вывод из социального капитала определенную сумму в viz.

vizonator.withdraw_vesting({vesting_shares:"10.000000 SHARES"},function(error,result){
	let el=$(".vizonator_callback.test_withdraw_vesting");//debug element
	if(error){
		el.text("Error: "+JSON.stringify(error));
	}
	else{
		el.text("Result: "+JSON.stringify(result));
	}
});
Запустить пример

accountsChanged

Запрашиваемые правила: accounts

Событие смены аккаунта: расширение само сообщает странице, что текущий аккаунт стал другим, вместо того чтобы страница ждала следующего запроса (get_account / get_accounts). Подписка — vizonator.on("accountsChanged",callback), снятие — vizonator.off("accountsChanged",callback) (без callback снимает все обработчики события). Событие приходит и когда пользователь переключил аккаунт сам в попапе расширения, и когда смену одобрили по switch_account — в том числе с другого сайта.
Правило: accounts. Сам канал окна не открывает, но данные отдаются только сайту с уже одобренным правилом accounts: иначе событие приходит с ошибкой no_rule и страница не получает ни логина, ни окна. Сохранённый отказ сайту уважается (refuse). Данные в событии — тот же снимок, что у get_accounts: {current,accounts:[{login,current,regular,active,memo}]}, приватных ключей в нём нет.
Подписка живёт, пока открыта страница: после перезагрузки подписаться нужно заново.

/* accountsChanged: расширение само сообщает о смене аккаунта.
   Данные приходят, только если сайту одобрено правило accounts,
   иначе error = "no_rule" (окна при этом не будет). */
vizonator.on("accountsChanged",function(error,result){
	if(error){
		console.log("accountsChanged: "+JSON.stringify(error));
		return;
	}
	console.log("current account: "+result.current);//снимок как у get_accounts
});

Шифрование memo-ключом

С версии 0.74 страница может зашифровать сообщение для другого аккаунта и расшифровать письма, адресованные текущему, с помощью memo-ключа: vizonator.encrypt(data,callback) и vizonator.decrypt(data,callback).

Схема: ECDH на secp256k1, общая точка хешируется SHA-512, первые 32 байта — ключ AES-256-GCM; тег аутентификации приклеен в конец шифротекста, nonce 12 байт. И то, и другое передаётся в base64.

  • Ничего не отправляется в цепь и ничего не подписывается — транзакция не строится, операция не стоит ни VIZ, ни энергии. Страница никогда не видит ни memo-ключ, ни общий секрет — только шифротекст или открытый текст.
  • Аккаунт берётся из сессии. Необязательное поле account — это проверка, а не выбор: чужой логин в нём получает отказ unknown_account, а не молчаливый ответ за текущего пользователя.
  • Правила раздельные по направлению: memo_crypto, encrypt, memo и memo_crypto, decrypt, memo. Разрешение сайту «писать» не даёт ему «читать».
  • Лимит объявлен явно: 8 МБ символов на вызов (для батча — сумма ct), дальше отказ too_large с числом. Молчаливой обрезки нет — делите на своей стороне.

Ответ приходит как {success:true,result:…}: {ct,iv} у encrypt, открытый текст у одиночного decrypt, массив {id,ok,message|error} у батча. Ошибка — код строкой.

Примеры ниже статические: для полного круга нужен публичный ключ собеседника и сохранённое письмо, поэтому запускать со страницы нечего.


encrypt

Запрашиваемые правила: memo_crypto, encrypt, memo

Шифрует сообщение для аккаунта, чей публичный memo-ключ передан в to. Принимается только key:"memo", другой тип ключа — отказ bad_key_type. Контрольная сумма публичного ключа принимается в обоих видах (канон VIZ на RIPEMD-160 и двойной SHA-256, который использует VIZ Hub), тело в любом случае проверяется как точка кривой.

ПолеТипОбязательное
accountstringнет
keystringнет
tostringда
messagestringда
//memo public key of the recipient, for example from get_custom_account().memo_key
let recipient_memo_public_key="VIZ...";
vizonator.encrypt({key:"memo",to:recipient_memo_public_key,message:"hello"},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));//error code as a string
	}
	else{
		console.log(result.result);//{ct,iv} — base64 ciphertext and 12-byte nonce
	}
});

decrypt

Запрашиваемые правила: memo_crypto, decrypt, memo

Расшифровывает письмо, адресованное текущему аккаунту. Одно письмо: from (публичный memo-ключ отправителя), ct, iv — в результате открытый текст. Батч: items массивом {id,from,ct,iv} — каждая строка отвечается отдельно, одно нечитаемое письмо не отменяет остальные. Ошибка уровня вызова (нет memo-ключа в сессии, отказ пользователя, кривой батч) отменяет вызов целиком.

ПолеТипОбязательное
accountstringнет
keystringнет
fromstringда
ctstringда
ivstringда
itemsarrayнет
vizonator.decrypt({key:"memo",from:sender_memo_public_key,ct:letter.ct,iv:letter.iv},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result.result);//plain text
	}
});

//batch: one unreadable letter does not cancel the rest
vizonator.decrypt({key:"memo",items:[
	{id:1,from:sender_memo_public_key,ct:letter1.ct,iv:letter1.iv},
	{id:2,from:sender_memo_public_key,ct:letter2.ct,iv:letter2.iv}
]},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		result.result.forEach(function(item){
			console.log(item.id,item.ok?item.message:item.error);
		});
	}
});

Коды ошибок

КодЧто означает
user_rejectedПользователь отказал в окне подтверждения.
no_memo_keyВ сессии нет приватного memo-ключа текущего аккаунта.
unknown_accountВ поле account указан не текущий аккаунт.
bad_key_typekey не равен "memo".
bad_public_keyto или from — не валидный публичный ключ.
bad_ciphertextКривая форма вызова или нечитаемые ct/iv (в батче сообщается по строке).
auth_failedНе сошёлся GCM-тег: письмо адресовано не этому аккаунту либо повреждено.
too_largeБольше 8 МБ символов в одном вызове; в коде передаётся лимит.

Операции рынка предсказаний

С версии 0.73 расширение отдаёт странице все 23 бродкастовые операции рынка предсказаний блокчейна VIZ (HF14 / Onix). Вызов у всех одинаковый: vizonator.pm_place_bet(data,callback).

Три отличия от операций выше:

  • Аккаунт никогда не берётся со страницы. Расширение само подставляет в поле актора текущего пользователя, сайт передаёт только поля операции.
  • Отсутствие обязательного поля — отказ ещё до окна подтверждения: денежные поля и идентификаторы не дефолтятся в ноль. Пропущенные необязательные поля уходят со значением по умолчанию; у pm_oracle_update, где поля на проводе optional<>, пропущенное поле остаётся отсутствующим и означает «оставить как есть».
  • Правила гранулярные: prediction_market, <операция>, <тип доступа>. Доверие сайту на pm_place_bet не даёт ему pm_create_market.

Всем операциям нужен active-ключ, кроме pm_dispute_vote (regular). Если нужного ключа в сессии нет — отказ сразу.

Суммы передаются строкой с тикером: "1.000 VIZ", время — отметкой блокчейна: "2026-12-31T12:00:00". Примеры ниже намеренно без кнопки запуска — каждый из них тратит деньги.


pm_oracle_register

Запрашиваемые правила: prediction_market, pm_oracle_register, active

Регистрирует аккаунт как оракула: страховой депозит, комиссии, ссылка на правила и политика авто-приёма рынков.

Поле аккаунта, которое заполняет расширение: owner

ПолеТипОбязательное
insuranceassetда
fee_percentuintнет
fixed_feeassetда
rules_urlstringнет
auto_accept_creatorstringнет
auto_accept_resolverstringнет
auto_acceptboolнет
vizonator.pm_oracle_register({insurance:"100.000 VIZ",fixed_fee:"1.000 VIZ"},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_oracle_update

Запрашиваемые правила: prediction_market, pm_oracle_update, active

Меняет настройки оракула. Все поля необязательные: пропущенное остаётся как есть, insurance_delta прибавляет (или убавляет) страховой депозит.

Поле аккаунта, которое заполняет расширение: owner

ПолеТипОбязательное
insurance_deltaoptionalнет
fee_percentoptionalнет
fixed_feeoptionalнет
rules_urloptionalнет
auto_accept_creatoroptionalнет
auto_accept_resolveroptionalнет
auto_acceptoptionalнет
vizonator.pm_oracle_update({insurance_delta:"100.000 VIZ",fee_percent:200},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_create_market

Запрашиваемые правила: prediction_market, pm_create_market, active

Создаёт рынок: оракул, исходы, стартовая ликвидность, комиссии, дедлайны ставок и резолва, политика споров и штрафов за поздние ставки.

Поле аккаунта, которое заполняет расширение: creator

ПолеТипОбязательное
oraclestringда
market_typeuintнет
outcomesarrayда
urlstringнет
oracle_fee_percentuintнет
oracle_fixed_feeassetда
creator_fee_percentuintнет
liquidity_fee_percentuintнет
liquidityassetда
lmsr_bintнет
betting_expirationtimeда
result_expirationtimeда
time_penalty_typeuintнет
time_penalty_valueuintнет
penalty_curve_typeuintнет
allow_early_resolutionboolнет
allow_cancellationboolнет
allow_batchboolнет
allow_instant_betboolнет
endogeneity_tieruintнет
dispute_modeuintнет
dispute_resolverstringнет
dispute_penalty_percentintнет
metadatastringнет
vizonator.pm_create_market({oracle:"polymarket",outcomes:["yes","no"],oracle_fixed_fee:"1.000 VIZ",liquidity:"100.000 VIZ",betting_expiration:"2026-12-31T12:00:00",result_expiration:"2026-12-31T12:00:00"},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_oracle_accept_market

Запрашиваемые правила: prediction_market, pm_oracle_accept_market, active

Оракул принимает (или отклоняет) рынок в обслуживание и фиксирует по нему свою комиссию.

Поле аккаунта, которое заполняет расширение: oracle

ПолеТипОбязательное
market_idintда
acceptboolнет
oracle_fee_percentuintнет
oracle_fixed_feeassetда
vizonator.pm_oracle_accept_market({market_id:0,oracle_fixed_fee:"1.000 VIZ"},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_place_bet

Запрашиваемые правила: prediction_market, pm_place_bet, active

Ставка: сторона (покупка/продажа), индекс исхода, сумма и min_tokens как защита от проскальзывания.

Поле аккаунта, которое заполняет расширение: account

ПолеТипОбязательное
market_idintда
sideintда
outcome_indexintда
amountassetда
min_tokensintнет
modeuintнет
vizonator.pm_place_bet({market_id:0,side:0,outcome_index:0,amount:"1.000 VIZ"},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_commit_bet

Запрашиваемые правила: prediction_market, pm_commit_bet, active

Скрытая ставка, первая фаза: публикуется хэш ставки и запирается залог (commit-reveal).

Поле аккаунта, которое заполняет расширение: account

ПолеТипОбязательное
market_idintда
commitmentstringда
escrow_amountassetда
no_reveal_fee_percentuintда
vizonator.pm_commit_bet({market_id:0,commitment:"<sha256 of the bet>",escrow_amount:"1.000 VIZ",no_reveal_fee_percent:0},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_reveal_bet

Запрашиваемые правила: prediction_market, pm_reveal_bet, active

Скрытая ставка, вторая фаза: раскрытие ставки и соли, сходящихся с опубликованным хэшем.

Поле аккаунта, которое заполняет расширение: account

ПолеТипОбязательное
commit_idintда
sideintда
outcome_indexintда
amountassetда
saltstringда
min_tokensintнет
vizonator.pm_reveal_bet({commit_id:0,side:0,outcome_index:0,amount:"1.000 VIZ",salt:"<random salt>"},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_cancel_bet

Запрашиваемые правила: prediction_market, pm_cancel_bet, active

Продаёт позицию обратно в кривую до закрытия рынка (если рынок это разрешает), min_return защищает цену.

Поле аккаунта, которое заполняет расширение: account

ПолеТипОбязательное
bet_idintда
min_returnintнет
vizonator.pm_cancel_bet({bet_id:0},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_add_liquidity

Запрашиваемые правила: prediction_market, pm_add_liquidity, active

Вносит ликвидность в кривую рынка и получает долю комиссий.

Поле аккаунта, которое заполняет расширение: provider

ПолеТипОбязательное
market_idintда
amountassetда
vizonator.pm_add_liquidity({market_id:0,amount:"1.000 VIZ"},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_withdraw_liquidity

Запрашиваемые правила: prediction_market, pm_withdraw_liquidity, active

Выводит ликвидность до закрытия ставок. Комиссия начисляется на сеттлменте, поэтому ранний выход возвращает только принципал.

Поле аккаунта, которое заполняет расширение: provider

ПолеТипОбязательное
liquidity_idintда
amountassetда
vizonator.pm_withdraw_liquidity({liquidity_id:0,amount:"1.000 VIZ"},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_resolve_market

Запрашиваемые правила: prediction_market, pm_resolve_market, active

Оракул публикует исход рынка со ссылкой и обоснованием решения.

Поле аккаунта, которое заполняет расширение: oracle

ПолеТипОбязательное
market_idintда
winning_outcomeintда
decision_urlstringнет
decision_reasonstringнет
vizonator.pm_resolve_market({market_id:0,winning_outcome:0},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_no_contest

Запрашиваемые правила: prediction_market, pm_no_contest, active

Оракул аннулирует рынок — все ставки возвращаются.

Поле аккаунта, которое заполняет расширение: oracle

ПолеТипОбязательное
market_idintда
reasonstringнет
vizonator.pm_no_contest({market_id:0},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_dispute_create

Запрашиваемые правила: prediction_market, pm_dispute_create, active

Оспаривает опубликованный исход в окне для споров. Требует залог.

Поле аккаунта, которое заполняет расширение: disputer

ПолеТипОбязательное
market_idintда
proposed_outcomeintда
reasonstringнет
vizonator.pm_dispute_create({market_id:0,proposed_outcome:0},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_dispute_vote

Запрашиваемые правила: prediction_market, pm_dispute_vote, regular

Голос в споре весом своей доли. Единственная операция на regular-ключе.

Поле аккаунта, которое заполняет расширение: voter

ПолеТипОбязательное
market_idintда
vote_outcomeintда
vote_percentintда
vizonator.pm_dispute_vote({market_id:0,vote_outcome:0,vote_percent:0},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_dispute_resolve

Запрашиваемые правила: prediction_market, pm_dispute_resolve, active

Резолвер спора публикует верный исход, штрафует оракула и может забанить оракула или создателя рынка.

Поле аккаунта, которое заполняет расширение: resolver

ПолеТипОбязательное
market_idintда
correct_outcomeintда
penalty_amountassetда
ban_oracleboolнет
ban_oracle_untiltimeда
ban_creatorboolнет
ban_creator_untiltimeда
vizonator.pm_dispute_resolve({market_id:0,correct_outcome:0,penalty_amount:"1.000 VIZ",ban_oracle_until:"2026-12-31T12:00:00",ban_creator_until:"2026-12-31T12:00:00"},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_dispute_oracle_respond

Запрашиваемые правила: prediction_market, pm_dispute_oracle_respond, active

Ответ оракула на спор до финализации голосования.

Поле аккаунта, которое заполняет расширение: oracle

ПолеТипОбязательное
market_idintда
responsestringда
vizonator.pm_dispute_oracle_respond({market_id:0,response:"oracle answer"},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_unban

Запрашиваемые правила: prediction_market, pm_unban, active

Резолвер снимает бан с оракула или создателя рынка.

Поле аккаунта, которое заполняет расширение: resolver

ПолеТипОбязательное
targetstringда
unban_oracleboolнет
unban_creatorboolнет
vizonator.pm_unban({target:"on1x"},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_transfer_position

Запрашиваемые правила: prediction_market, pm_transfer_position, active

Передаёт позицию по ставке (целиком или частично) другому аккаунту. Сумма — в долях, не в целых токенах.

Поле аккаунта, которое заполняет расширение: from

ПолеТипОбязательное
bet_idintда
tostringда
amountintда
memostringнет
vizonator.pm_transfer_position({bet_id:0,to:"on1x",amount:0},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_lazy_deposit

Запрашиваемые правила: prediction_market, pm_lazy_deposit, active

Вклад в ленивый пул ликвидности — пассивный продукт, который фондирует плечевые позиции.

Поле аккаунта, которое заполняет расширение: account

ПолеТипОбязательное
amountassetда
vizonator.pm_lazy_deposit({amount:"1.000 VIZ"},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_lazy_withdraw

Запрашиваемые правила: prediction_market, pm_lazy_withdraw, active

Вывод из ленивого пула. Экстренный вывод штрафуется на награды; если свободного баланса в пуле нет — выплата встаёт в очередь.

Поле аккаунта, которое заполняет расширение: account

ПолеТипОбязательное
sharesintда
emergencyboolнет
vizonator.pm_lazy_withdraw({shares:0},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_leverage_open

Запрашиваемые правила: prediction_market, pm_leverage_open, active

Открывает позицию с плечом: свой залог плюс заём из ленивого пула.

Поле аккаунта, которое заполняет расширение: account

ПолеТипОбязательное
market_idintда
outcome_indexintда
collateralassetда
loanassetда
min_tokensintнет
max_slippage_percentuintнет
vizonator.pm_leverage_open({market_id:0,outcome_index:0,collateral:"1.000 VIZ",loan:"1.000 VIZ"},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_leverage_close

Запрашиваемые правила: prediction_market, pm_leverage_close, active

Закрывает плечевую позицию и возвращает заём.

Поле аккаунта, которое заполняет расширение: account

ПолеТипОбязательное
position_idintда
min_returnintнет
vizonator.pm_leverage_close({position_id:0},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});

pm_leverage_convert

Запрашиваемые правила: prediction_market, pm_leverage_convert, active

Конвертирует плечевую позицию в обычную ставку, погасив заём.

Поле аккаунта, которое заполняет расширение: account

ПолеТипОбязательное
position_idintда
conversion_profit_costuintнет
vizonator.pm_leverage_convert({position_id:0},function(error,result){
	if(error){
		console.log("Error: "+JSON.stringify(error));
	}
	else{
		console.log(result);//{block_num,id,trx_num}
	}
});
Privacy Policy