Расширение внедряет контентный скрипт содержащий переменную с веб3 провайдером: vizonator. Любое действие направляется к исполнительной логике расширения, которое проверяет сохраненные правила для автоматического подтверждения или отказа в действии. Если правил для конкретного сайта не было найдено — расширение спросит пользователя об утверждении запроса.
Эта документация больше для фронтенд разработчиков на javascript.
Доступные операции
Типы операций: подпись и исполнение операций, запрос данных расширения, запросы через API.
Каждая операция запрашивает разные виды правил. Если пользователь отметил галочкой запомнить свое решение, расширение сохранит это для конкретного сайта.
- check vizonator variable
- get_account (extension data)
- get_settings (extension data)
- get_accounts (extension data)
- switch_account (extension data)
- import_account
- get_custom_account (API)
- get_account_history (API)
- get_accounts_on_sale (API)
- get_subaccounts_on_sale (API)
- account_metadata
- award
- fixed_award
- committee_vote_request
- custom
- delegate_vesting_shares
- passwordless_auth
- sign_data
- transfer
- transfer_to_vesting
- withdraw_vesting
- accountsChanged (event)
- Шифрование memo-ключом
- Операции рынка предсказаний
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), тело в любом случае проверяется как точка кривой.
| Поле | Тип | Обязательное |
|---|---|---|
account | string | нет |
key | string | нет |
to | string | да |
message | string | да |
//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-ключа в сессии, отказ пользователя, кривой батч) отменяет вызов целиком.
| Поле | Тип | Обязательное |
|---|---|---|
account | string | нет |
key | string | нет |
from | string | да |
ct | string | да |
iv | string | да |
items | array | нет |
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_type | key не равен "memo". |
bad_public_key | to или 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
- pm_oracle_update
- pm_create_market
- pm_oracle_accept_market
- pm_place_bet
- pm_commit_bet
- pm_reveal_bet
- pm_cancel_bet
- pm_add_liquidity
- pm_withdraw_liquidity
- pm_resolve_market
- pm_no_contest
- pm_dispute_create
- pm_dispute_vote
- pm_dispute_resolve
- pm_dispute_oracle_respond
- pm_unban
- pm_transfer_position
- pm_lazy_deposit
- pm_lazy_withdraw
- pm_leverage_open
- pm_leverage_close
- pm_leverage_convert
pm_oracle_register
Запрашиваемые правила: prediction_market, pm_oracle_register, active
Регистрирует аккаунт как оракула: страховой депозит, комиссии, ссылка на правила и политика авто-приёма рынков.
Поле аккаунта, которое заполняет расширение: owner
| Поле | Тип | Обязательное |
|---|---|---|
insurance | asset | да |
fee_percent | uint | нет |
fixed_fee | asset | да |
rules_url | string | нет |
auto_accept_creator | string | нет |
auto_accept_resolver | string | нет |
auto_accept | bool | нет |
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_delta | optional | нет |
fee_percent | optional | нет |
fixed_fee | optional | нет |
rules_url | optional | нет |
auto_accept_creator | optional | нет |
auto_accept_resolver | optional | нет |
auto_accept | optional | нет |
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
| Поле | Тип | Обязательное |
|---|---|---|
oracle | string | да |
market_type | uint | нет |
outcomes | array | да |
url | string | нет |
oracle_fee_percent | uint | нет |
oracle_fixed_fee | asset | да |
creator_fee_percent | uint | нет |
liquidity_fee_percent | uint | нет |
liquidity | asset | да |
lmsr_b | int | нет |
betting_expiration | time | да |
result_expiration | time | да |
time_penalty_type | uint | нет |
time_penalty_value | uint | нет |
penalty_curve_type | uint | нет |
allow_early_resolution | bool | нет |
allow_cancellation | bool | нет |
allow_batch | bool | нет |
allow_instant_bet | bool | нет |
endogeneity_tier | uint | нет |
dispute_mode | uint | нет |
dispute_resolver | string | нет |
dispute_penalty_percent | int | нет |
metadata | string | нет |
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_id | int | да |
accept | bool | нет |
oracle_fee_percent | uint | нет |
oracle_fixed_fee | asset | да |
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_id | int | да |
side | int | да |
outcome_index | int | да |
amount | asset | да |
min_tokens | int | нет |
mode | uint | нет |
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_id | int | да |
commitment | string | да |
escrow_amount | asset | да |
no_reveal_fee_percent | uint | да |
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_id | int | да |
side | int | да |
outcome_index | int | да |
amount | asset | да |
salt | string | да |
min_tokens | int | нет |
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_id | int | да |
min_return | int | нет |
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_id | int | да |
amount | asset | да |
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_id | int | да |
amount | asset | да |
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_id | int | да |
winning_outcome | int | да |
decision_url | string | нет |
decision_reason | string | нет |
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_id | int | да |
reason | string | нет |
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_id | int | да |
proposed_outcome | int | да |
reason | string | нет |
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_id | int | да |
vote_outcome | int | да |
vote_percent | int | да |
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_id | int | да |
correct_outcome | int | да |
penalty_amount | asset | да |
ban_oracle | bool | нет |
ban_oracle_until | time | да |
ban_creator | bool | нет |
ban_creator_until | time | да |
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_id | int | да |
response | string | да |
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
| Поле | Тип | Обязательное |
|---|---|---|
target | string | да |
unban_oracle | bool | нет |
unban_creator | bool | нет |
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_id | int | да |
to | string | да |
amount | int | да |
memo | string | нет |
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
| Поле | Тип | Обязательное |
|---|---|---|
amount | asset | да |
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
| Поле | Тип | Обязательное |
|---|---|---|
shares | int | да |
emergency | bool | нет |
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_id | int | да |
outcome_index | int | да |
collateral | asset | да |
loan | asset | да |
min_tokens | int | нет |
max_slippage_percent | uint | нет |
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_id | int | да |
min_return | int | нет |
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_id | int | да |
conversion_profit_cost | uint | нет |
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}
}
});