en | ru
Приложение для хранения данных пользователя и проведения транзакций в блокчейн сети Waves. Информация о сети Waves
На страницах браузера, работающим по протоколам http/https (не работает на локальных страничках по протоколу file://
),
с установленным расширением Waves Keeper
становятся доступным глобальный объект WavesKeeper
в котором вы найдете следующие методы:
auth
publicState
signAndPublishCancelOrder
signAndPublishOrder
signAndPublishTransaction
signCancelOrder
signOrder
,signTransaction
signRequest
signCustomData
verifyCustomData
signTransactionPackage
resourceIsApproved
resourceIsBlocked
notification
on
Все методы кроме
on
работают асинхронно и возвращают Promise
В вашем коде вы можете использовать TypeScript types
При загрузке страницы в объекте WavesKeeper нет методов апи до окончания инициализации плагина.
Для облегчения работы с WavesKeeper при инициализации в window.WavesKeeper
есть initialPromise
,
который отрабатывает в момент окончания инициализации.
Пример:
WavesKeeper.initialPromise.then(keeperApi => {
/*...инициализация работы приложения с WavesKeeper*/
keeperApi.publicState().then(state => startApp(state));
});
В Waves Keeper, для большей безопасности и удобства использования,
каждый новый сайт использующий API должен быть разрешен пользователем.
При первой попытке использования API (кроме on
) пользователю будет показан запрос на
разрешение работы Waves Keeper с этим сайтом. Если пользователь согласен дать доступ,
сайт становится доверенным, и получает возможность использовать API на своих страницах.
В противном случае сайт блокируется и на все запросы будет возвращена ошибка
{message: "Api rejected by user", code: 12}
, пользователь не увидит новых уведомлений.
Для получения доступа, пользователь должен из интерфейса сделать сайт доверенным.
Если сайт доверенный, возвращает публичные данные Keeper.
Пример:
WavesKeeper.publicState()
.then(state => {
console.log(state); //вывод в консоль результата
/*...обработка данных */
})
.catch(error => {
console.error(error); //вывод в консоль результата
/*...обработка ошибок */
});
или
const getPublicState = async () => {
try {
const state = await WavesKeeper.publicState();
console.log(state); //вывод в консоль результата
/*...обработка данных */
} catch (error) {
console.error(error); //вывод в консоль результата
/*...обработка ошибок */
}
};
const result = await getPublicState();
ОТВЕТ
{
"initialized": true,
"locked": true,
"account": {
"name": "foo",
"publicKey": "bar",
"address": "waves адрес",
"networkCode": "байт сети",
"balance": {
"available": "баланс в waves",
"leasedOut": "баланс в лизинге"
}
},
"network": {
"code": "W",
"server": "https://nodes.wavesnodes.com/",
"matcher": "https://matcher.waves.exchange/"
},
"messages": [],
"txVersion": {
"3": [ 2 ],
"4": [ 2 ],
"5": [ 2 ],
...
}
}
Описание возвращаемых полей
initialized
- boolean Keeper проинициализированlocked
- boolean Keeper в режиме ожиданияaccount
- текущий аккаунт, если пользователь разрешит сайту доступ, или nullnetwork
- текущая сеть waves, адрес ноды и матчераmessages
- статусы запросов на подписьtxVersion
- доступные версии транзакций для каждого типа
Возможные ошибки
{ message: "Init Waves Keeper and add account" }
- Keeper не проинициализирован{ message: "Add Waves Keeper account" }
- вход в Keeper произведен, но нет аккаунтов{ message: "User denied message" }
- пользователь запретил сайту работать с Keeper API
Вы можете зашифровать текст для конкретного пользователя сети Waves, зная его публичный ключ.
WavesKeeper.encryptMessage(текст для шифрования
, публичный ключ в кодировке base58
, префикс строкой уникальный для каждого приложения
)
Пример:
WavesKeeper.encryptMessage(
'My message',
'416z9d8DQDy5MPTqDhvReRBaPb19gEyVRWvHcewpP6Nc',
'для меня'
).then(encryptedMessage => {
console.log(encryptedMessage);
});
Возможные ошибки
{ message: "Init Waves Keeper and add account" }
– кипер не проинициализирован{ message: "App is locked" }
– кипер заблокирован
{ message: "Add Waves Keeper account" }
- вход в кипер произведен, но нет аккаунтов{ message: "User denied message" }
- пользователь запретил сайту работать с Keeper API
Вы можете расшифровать сообщение, зашифрованное для вас пользователем сети Waves, зная сообщение и публичный ключ отправителя.
WavesKeeper.decryptMessage(
`зашифрованный текст`,
`публичный ключ в кодировке base58`,
`префикс строкой уникальный для каждого приложения`
);
Example:
WavesKeeper.decryptMessage(
'**encrypted msg**',
'416z9d8DQDy5MPTqDhvReRBaPb19gEyVRWvHcewpP6Nc'
).then(message => {
console.log(message);
});
Возможные ошибки
{ message: "Init Waves Keeper and add account" }
– кипер не проинициализирован{ message: "App is locked" }
– кипер заблокирован
{ message: "Add Waves Keeper account" }
- вход в кипер произведен, но нет аккаунтов{ message: "User denied message" }
- пользователь запретил сайту работать с Keeper API
Позволяет подписаться на события из Waves Keeper.
Поддерживает события:
update
- подписаться на изменения стейта
Пример:
WavesKeeper.on('update', state => {
//state бъект как из WavesKeeper.publicState
});
Если сайт не является доверенным, то события приходить не будут.
Метод для отправки пользователю сообщения от сайта. Разрешено посылать сообщение только разрешенным сайтам не чаще 1 раза за 30сек.
notification
может принимать на вход следующие данные
title
- строка до 20 символовmessage
- строка не более 250 символов (не обязательное)
Возвращает Promise
Пример:
WavesKeeper.notification({
title: 'Hello!',
message: 'Congratulation!!!',
});
ОШИБКИ
{message: "Incorrect notification data", data: "title has more than 20 characters", code: "19"}
- Длинный заголовок{message: "Incorrect notification data", data: null, code: "19"}
- Ошибки в данных нотификации{message: "Can't sent notification", data: {msg: "Min notification interval 30s. Wait 28.017s."}, code: "18"}
- Запрещено посылать сообщения чаще 1 раза в 30 сек{message: "Api rejected by user", code: 12}
сайт не является доверенным или запрещено посылать сообщения
Метод для получения подписи авторизационных данных при подтверждении пользователя Waves. Работает аналогично протоколу авторизации Waves Exchange.
Пример:
const authData = { data: 'Auth on my site' };
WavesKeeper.auth(authData)
.then(auth => {
console.log(auth); //вывод в консоль результата
/*...обработка данных */
})
.catch(error => {
console.error(error); //вывод в консоль результата
/*...обработка ошибок */
});
или
const getAuthData = async authData => {
try {
const state = await WavesKeeper.auth(authData);
console.log(state); //вывод в консоль результата
/*...обработка данных */
} catch (error) {
console.error(error); //вывод в консоль результата
/*...обработка ошибок */
}
};
const authData = { data: 'Auth on my site' };
getAuthData(authData);
auth
может принимать на вход следующие данные
name
- название сервиса (не обязательное поле)data
- строка с любыми строковыми данными (обязательное поле)referrer
- полный url до сайта для редиректа (не обязательное поле)icon
- путь до лого, относительноreferrer
или origin сайта (не обязательное поле)successPath
- относительный путь до апи аутентификации сайта (не обязательное поле)
Например
const authData = {
data: 'Generated string from server',
name: 'My test App',
icon: '/img/icons/waves_logo.svg',
referrer: 'https://waves.exchange/',
successPath: 'login',
};
WavesKeeper.auth(authData)
.then(data => {
//data - данные от кипера
//проверка подписи и сохранение адреса...
console.log(data);
})
.catch(error => {
//обработка ошибки
});
При удачном подтверждении кипер в Promise вернет объект содержащий данные для проверки подписи:
host
- хост, запросивший подписьname
- название приложения запрашивающее подписьprefix
- префикс, участвующий в подписиaddress
- адрес в сети WavespublicKey
- публичный ключ пользователяsignature
- подписьversion
- версия апи
ОШИБКИ
{message: "Invalid data", data: "[{"field":"data","type":"string","message":"field is required"}]", code: 9}
- в данных на подпись есть ошибки{message: "User denied message", code: 10}
- пользователь отклонил запрос{message: "Api rejected by user", code: 12}
сайт не является доверенным
Метод для подписи транзакций в сети Waves.
Пример:
const txData = {
type: 4,
data: {
amount: {
assetId: 'WAVES',
tokens: '1.567',
},
fee: {
assetId: 'WAVES',
tokens: '0.001',
},
recipient: 'test',
},
};
WavesKeeper.signTransaction(txData)
.then(data => {
//data - строка готовая для отсылки на ноду(сервер) сети Waves
})
.catch(error => {
//Обработка ошибок
});
Апи возвращает строки, а не объект, так как в javascript при работе с 8 байтными целыми (long) происходит потеря точности.
Описание поддерживаемых типов транзакций вы найдете ниже
В примере мы подписываем транзакцию на перевод токенов Waves на алиас test
в сети Waves.
ОТВЕТ
{
"version": 2,
"assetId": "",
"amount": 156700000,
"feeAssetId": "",
"fee": 100000,
"recipient": "получатель",
"attachment": "",
"timestamp": 1548770230589,
"senderPublicKey": "публичный ключ",
"proofs": ["подпись"],
"type": 4
}
ОШИБКИ
{message: "User denied message", code: 10}
- пользователь отклонил запрос{message: "Api rejected by user", code: 12}
- сайт не является доверенным{message: "Invalid data", data: "Причина", code: 9}
- неверные/неполные данные запроса
Аналогичен signTransaction
, но плюс еще отправляет транзакцию в блокчейн.
Пример:
const txData = {
type: 4,
data: {
amount: {
assetId: 'WAVES',
tokens: '1.567',
},
fee: {
assetId: 'WAVES',
tokens: '0.001',
},
recipient: 'test',
},
};
WavesKeeper.signAndPublishTransaction(txData)
.then(data => {
//data - строка готовая для отсылки на ноду(сервер) сети Waves
})
.catch(error => {
//Обработка ошибок
});
ОТВЕТ Возвращается строкой ответ от сети Waves - полное содержание прошедшей транзакции
ОШИБКИ
- Аналогично
signTransaction
{message: "Failed request", data: "Описание ошибки", code: 15}
- запрос подписали, но не смогли отправить дальше
Пакетная подпись транзакций. Иногда надо подписать сразу несколько транзакций, для удобства пользователя, допускается подписывать до 7 транзакций одновременно, и разрешены только определенные типы транзакций:
3
- выпускает токен4
- переводит токен на другой аккаунт5
- выпускает дополнительное количество токена6
- уменьшает количество токена8
– передает WAVES в лизинг9
– прекращает лизинг10
- создает псевдоним адреса11
- массовый перевод12
- добавляет, изменяет или удаляет запись в хранилище данных аккаунта отправителя13
- устанавливает dApp-скрипт или скрипт аккаунта14
- устанавливает или отменяет спонсирование15
- изменяет скрипт ассета16
- вызывает функцию из dApp-скрипта
Пример:
const name = 'For Test';
const tx = [
{
type: 4,
data: {
amount: {
assetId: 'WAVES',
tokens: '1.567',
},
fee: {
assetId: 'WAVES',
tokens: '0.001',
},
recipient: 'test',
},
},
{
type: 4,
data: {
amount: {
assetId: 'WAVES',
tokens: '0.51',
},
fee: {
assetId: 'WAVES',
tokens: '0.001',
},
recipient: 'merry',
},
},
];
WavesKeeper.signTransactionPackage(tx, name);
Подписать 2 транзакции:
- перевода на алиас test 1.567 Waves
- перевода на алиас merry 0.1 Waves
ОТВЕТ
Массив из 2-х строк, подписанных и готовых к отправке транзакций.
ОШИБКИ
Аналогично signTransaction
.
У каждого пользователя в сети waves есть стейт (балансы, ассеты, данные, скрипты), любая прошедшая транзакция меняет эти данные. В WavesKeeper API - отличается от NODE REST API.
signTransaction
, signAndPublishTransaction
принимают транзакцию в следующем виде
{
type: number, //тип транзакции
data: {
... //данные транзакции
}
}
Условные обозначения
* - необязательное поле, данные подставятся автоматически из WavesKeeper. [x,y] - ограничение длины от x, до y. [,x] - ограничение длины до x. [y,] - ограничение длины от y. [x-y] - число от x до y. x/y - x или y. (JLM) - JAVA LONG MAX = 9 223 372 036 854 775 807 MoneyLike - цена
MoneyLike может иметь вид:
{ tokens: 1, assetId: "WAVES" }
{ coins: 100000000, assetId: "WAVES" }
;
В обеих записях указана одинаковая цена 1 WAVES. Можно свободно перевести coins
в tokens
и обратно,
зная в каком ассете указана цена и получив его точность tokens = coins / (10 ** precision)
Если в поле указаны дополнительные типы кроме MoneyLike, например string/MoneyLike, сумма указывается числом в coins
.
name
[4, 16] string - Название токена,description
[0, 1000] string - Описание токена,quantity
[0 - (JLM)] number/string - количество,precision
[0 - 8] number - точность,reissuable
true|false - возможно перевыпускать,*fee
MoneyLike -комиссия*script
string - smart asset*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Пример:
WavesKeeper.signAndPublishTransaction({
type: 3,
data: {
name: 'Best Token',
description: 'Greate token',
quantity: 1000000,
precision: 2,
reissuable: true,
fee: {
tokens: '1',
assetId: 'WAVES',
},
},
})
.then(tx => {
console.log('Ура! Я создал свой ассет!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
В случае успеха мы выпускаем новыйй ассет в количестве 1000000 шт. которые будут на вашем балансе 10000.00 Best Token
amount
MoneyLike - количество,recipient
string - адрес получателя или алиасattachment
[,140 bytes] string или Byte Array- доп информация*fee
MoneyLike - комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Пример:
WavesKeeper.signAndPublishTransaction({
type: 4,
data: {
amount: { tokens: '3.3333333', assetId: 'WAVES' },
fee: { tokens: '0.001', assetId: 'WAVES' },
recipient: 'merry',
},
})
.then(tx => {
console.log('Ура! Я смог отправить Waves!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
assetId
string - "Id ассета",quantity
[0 - (JLM)] number/string/MoneyLike - количество,reissuable
false - запретить перевыпускать*fee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Пример:
WavesKeeper.signAndPublishTransaction({
type: 5,
data: {
quantity: 1000,
assetId: '8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS',
reissuable: true,
fee: {
tokens: '1',
assetId: 'WAVES',
},
},
})
.then(tx => {
console.log('Ура! Я довыпустил ассет!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
В случае успеха мы довыпускаем новый ассет в количестве 1000000 coins
,
которые будут на вашем балансе 10000.00 Best Token.
assetId
string - Id ассета,amount
[0 - (JLM)] number/string/MoneyLike - количество,*fee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Пример:
WavesKeeper.signAndPublishTransaction({
type: 6,
data: {
amount: 1000,
assetId: '8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS',
fee: {
tokens: '0.001',
assetId: 'WAVES',
},
},
})
.then(tx => {
console.log('Ура! Я сжег лишнее!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
В случае успеха сжигается 1000 coins
.
recipient
string - адрес получателя или алиас,amount
[0 - (JLM)] number/string/MoneyLike - количество,*fee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Пример:
WavesKeeper.signAndPublishTransaction({
type: 8,
data: {
amount: 1000,
recipient: 'merry',
fee: {
tokens: '0.001',
assetId: 'WAVES',
},
},
})
.then(tx => {
console.log('Ура! Я смог передать в лизинг!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
В случае успеха передается в лизинг 0.00001000 Waves.
leaseId
string - id транзакции лизинга,*fee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Пример:
WavesKeeper.signAndPublishTransaction({
type: 9,
data: {
leaseId: '6frvwF8uicAfyEfTfyC2sXqBJH7V5C8he5K4YH3BkNiS',
fee: {
tokens: '0.001',
assetId: 'WAVES',
},
},
})
.then(tx => {
console.log('Ура! Я отменил лизинг!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
В случае успеха отменяется лизинг.
alias
[4, 30] string - имя*fee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Пример:
WavesKeeper.signAndPublishTransaction({
type: 10,
data: {
alias: 'testAlias',
fee: {
tokens: '0.001',
assetId: 'WAVES',
},
},
})
.then(tx => {
console.log('Ура! Я теперь с алиасом!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
В случае успеха для адреса создается алиас (дополнительное имя).
totalAmount
moneyLike - итого отправлено (можно не считать сумму и вставить{ assetId: "id отправляемого ассета", coins: 0}
),transfers
массив объектов- {
recipient
: string - адрес/алиас,amount
: number/string/moneyLike }
- {
attachment
[,140 bytes в base58] string - доп информация*fee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Пример:
WavesKeeper.signAndPublishTransaction({
type: 11,
data: {
totalAmount: { assetId: 'WAVES', coins: 0 },
transfers: [
{ recipient: 'alias1', amount: '200000' },
{ recipient: 'alias2', amount: '200000' },
],
fee: {
tokens: '0.002',
assetId: 'WAVES',
},
},
})
.then(tx => {
console.log('Ура! Я друзьям отправил приветов!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
В случае успеха на адреса alias1, alias2 придет по 0.002 Waves.
data
массив объектовtype
"binary"/string/"integer"/"boolean" - тип,key
string - название поляvalue
/string/string/number/boolean зависит от типа
*fee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Пример:
WavesKeeper.signAndPublishTransaction({
type: 12,
data: {
data: [
{ key: 'string', value: 'testVal', type: 'string' },
{ key: 'binary', value: 'base64:AbCd', type: 'binary' },
{ key: 'integer', value: 20, type: 'integer' },
{ key: 'boolean', value: false, type: 'boolean' },
],
fee: {
tokens: '0.01',
assetId: 'WAVES',
},
},
})
.then(tx => {
console.log('Ура! Я сохранил данные!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
В случае успеха в стейте будут храниться новые данные.
script
string - скрипт*fee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Для снятия скрипта поле script
равно ``.
Разработка скрипта в RIDE
Пример:
WavesKeeper.signAndPublishTransaction({
type: 13,
data: {
script: '',
fee: {
tokens: '0.04',
assetId: 'WAVES',
},
},
})
.then(tx => {
console.log('Ура! Я отменил скрипт!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
В случае успеха удалится скрипт с аккаунта.
Пример2:
WavesKeeper.signAndPublishTransaction({
type: 13,
data: {
script: 'base64:AQa3b8tH',
fee: {
tokens: '0.01',
assetId: 'WAVES',
},
},
})
.then(tx => {
console.log('Ура! Я поставил скрипт!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
В случае успеха на аккаунте будет новый скрипт, разрешающий на аккаунте любые транзакции без подписи (будьте осторожны!).
minSponsoredAssetFee
MoneyLike - цена комиссии в ассете.*fee
MoneyLike - комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Пример:
WavesKeeper.signAndPublishTransaction({
type: 14,
data: {
minSponsoredAssetFee: {
assetId: '6frvwF8uicAfyEfTfyC2sXqBJH7V5C8he5K4YH3BkNiS',
tokens: 0.1,
},
fee: {
tokens: '1',
assetId: 'WAVES',
},
},
})
.then(tx => {
console.log('Ура! Я стал спонсором!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
В случае успеха, в ассете можно платить комиссию за трансфер
assetId
string - id ассетаscript
string - скрипт*fee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Снятие скрипта невозможно, только записать новый. Разработка скрипта в RIDE
Пример:
WavesKeeper.signAndPublishTransaction({
type: 15,
data: {
assetId: '',
script: 'base64:AQa3b8tH',
fee: {
tokens: '0.01',
assetId: 'WAVES',
},
},
})
.then(tx => {
console.log('Ура! Я переставил скрипт на ассете!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
В случае успеха на ассете будет переписан скрипт
dApp
string адрес контрактаcall
объект следующей структурыfunction
string название функцииargs
массив аргументов видаtype
"binary"/string/"integer"/"boolean" - тип,value
/string/string/number/boolean зависит от типа
*fee
MoneyLike комиссия*payment
массив MoneyLike*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Пример:
WavesKeeper.signAndPublishTransaction({
type: 16,
data: {
fee: {
tokens: '0.05',
assetId: 'WAVES',
},
dApp: '3N27HUMt4ddx2X7foQwZRmpFzg5PSzLrUgU',
call: {
function: 'tellme',
args: [
{
type: 'string',
value: 'Will?',
},
],
},
payment: [{ assetId: 'WAVES', tokens: 2 }],
},
})
.then(tx => {
console.log('Ура! Я выполнил скрипт!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
В случае успеха будет запущен скрипт
Метод Waves Keeper для подписи ордера в матчер. Принимает на вход объект похожий на транзакцию вида
{
type: 1002,
data: {
...данные
}
}
*version
1,2,3
amount
MoneyLike - количествоprice
MoneyLike - ценаorderType
'sell'/'buy' - тип ордераmatcherPublicKey
string публичный ключ exchange сервисаexpiration
string/number - время жизни ордера*matcherFee
MoneyLike - комиссия (мин 0.003 Waves),*timestamp
string/number текущее время*senderPublicKey
string публичный ключ в base58
Пример:
WavesKeeper.signOrder({
type: 1002,
data: {
matcherPublicKey: '7kPFrHDiGw1rCm7LPszuECwWYL3dMf6iMifLRDJQZMzy',
orderType: 'sell',
expiration: Date.now() + 100000,
amount: {
tokens: '100',
assetId: 'WAVES',
},
price: {
tokens: '0.01',
assetId: '8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS',
},
matcherFee: {
tokens: '0.03',
assetId: 'WAVES',
},
},
})
.then(tx => {
console.log('Ура! Я подписал ордер!!!');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
ОТВЕТ:
Строка с данными для отправки на матчер.
ОШИБКИ:
{ message: "User denied message", code: 10 }
- пользователь отклонил запрос{ message: "Api rejected by user", code: 12 }
- сайт не является доверенным{ message: "Invalid data", data: "Причина", code: 9 }
- неверные/неполные данные запроса
Метод Waves Keeper создания ордера на матчер работает идентично signOrder
, но еще пытается отослать данные на матчер
ОТВЕТ: Строка ответ матчера об успешной постановке ордера.
ОШИБКИ:
- аналогично
signOrder
{message: "Failed request", data: "Описание ошибки", code: 15}
- запрос подписали, но не смогли отправить дальше
Метод Waves Keeper подпись отмены ордера на матчер. Принимает на вход объект похожий на транзакцию вида
{
type: 1003,
data: {
...данные
}
}
id
string - id ордера*senderPublicKey
string публичный ключ в base58
Пример:
WavesKeeper.signCancelOrder({
type: 1003,
data: {
id: '31EeVpTAronk95TjCHdyaveDukde4nDr9BfFpvhZ3Sap',
},
});
ОТВЕТ: Строка с данными для отправки на матчер.
ОШИБКИ:
{ message: "User denied message", code: 10 }
- пользователь отклонил запрос{ message: "Api rejected by user", code: 12 }
- сайт не является доверенным{ message: "Invalid data", data: "Причина", code: 9 }
- неверные/неполные данные запроса
Метод Waves Keeper для отмены ордера на матчер, работает идентично signCancelOrder
,
но еще пытается отослать данные на матчер, для которого необходимо передать еще 2 поля priceAsset
и amountAsset
из ордера.
Пример:
WavesKeeper.signAndPublishCancelOrder({
type: 1003,
priceAsset: '8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS',
amountAsset: 'WAVES',
data: {
id: '31EeVpTAronk95TjCHdyaveDukde4nDr9BfFpvhZ3Sap',
},
})
.then(() => {
console.log('Ура! Я отменил ордер');
})
.catch(error => {
console.error('Что-то пошло не так', error);
});
ОТВЕТ:
Данные, пришедшие с матчера.
ОШИБКИ:
- аналогично
signCancelOrder
{message: "Failed request", data: "Описание ошибки", code: 15}
- запрос подписали, но не смогли отправить дальше
Метод Waves Keeper для подписи типизированных данных, для подтверждения запросов на разных сервисах. Принимает на вход объект похожий на транзакцию вида
{
type: number,
data: {
...данные
}
}
В данный момент метод поддерживает следующие типы:
timestamp
number/string*senderPublicKey
string публичный ключ в base58
Пример:
WavesKeeper.signRequest({
type: 1001,
data: {
timestamp: 234234242423423,
},
});
ОТВЕТ: Строка с подписью в base58.
ОШИБКИ:
{ message: "User denied message", code: 10 }
- пользователь отклонил запрос{ message: "Api rejected by user", code: 12 }
- сайт не является доверенным{ message: "Invalid data", data: "Причина", code: 9 }
- неверные/неполные данные запроса
Метод Waves Keeper для подписи данных, для подтверждения их на разных сервисах. Принимает на вход объект:
version
1binary
string 'base64:....'
Пример:
WavesKeeper.signCustomData({
version: 1,
binary: 'base64:AADDEE==',
});
ОТВЕТ:
{
version: 1,
binary: 'base64:AADDEE==',
signature: '...',
publicKey: '...'
}
ОШИБКИ:
{ message: "User denied message", code: 10 }
- пользователь отклонил запрос{ message: "Api rejected by user", code: 12 }
- сайт не является доверенным{ message: "Invalid data", data: "Причина", code: 9 }
- неверные/неполные данные запроса
version
2data
массив объектовtype
"binary"/string/"integer"/"boolean" - тип,key
string - название поляvalue
/string/string/number/boolean зависит от типа
Пример:
WavesKeeper.signCustomData({
version: 2,
data: [{ type: 'string', key: 'name', value: 'Mr. First' }],
});
ОТВЕТ:
{
version: 2,
data: [{ type: 'string', key: 'name', value: 'Mr. First' }],
signature: '...',
publicKey: '...'
}
ОШИБКИ:
{ message: "User denied message", code: 10 }
- пользователь отклонил запрос{ message: "Api rejected by user", code: 12 }
- сайт не является доверенным{ message: "Invalid data", data: "Причина", code: 9 }
- неверные/неполные данные запроса
Валидация подписи данных типа:
{
version: 1,
binary: 'base64:AADDEE==',
signature: '...',
publicKey: '...'
}
или
{
version: 2,
data: [{ type: 'string', key: 'name', value: 'Mr. First' }],
signature: '...',
publicKey: '...'
}
Пример:
WavesKeeper.verifyCustomData({
version: 2,
data: [{ type: 'string', key: 'name', value: 'Mr. First' }],
signature: 'wrong signature',
publicKey: '7kPFrHDiGw1rCm7LPszuECwWYL3dMf6iMifLRDJQZMzy',
}).then(result => {
console.log(result);
}); //true/false
Проверка разрешения использования Keeper API.
Пример:
WavesKeeper.resourceIsApproved().then(result => {
console.log(result);
});
Ответ: true/false
Проверка запрета на использование Keeper API.
Пример:
WavesKeeper.resourceIsBlocked().then(result => {
console.log(result);
});
Ответ: true/false