en | ru
Приложение для хранения данных пользователя
и проведения транзакций в блокчейн сети Waves.
Информация о сети Waves
На страницах браузера, работающим по протоколам http/https (не работает на локальных страничках по протоколу file://), с установленным расширением Turtle Shell становятся доступным глобальный объект TurtleShell в котором вы найдете следующие методы:
authpublicStatesignAndPublishCancelOrdersignAndPublishOrdersignAndPublishTransactionsignCancelOrdersignOrder,signTransactionsignRequestsignTransactionPackageon
Все методы кроме
onработают асинхронно и возвращают Promise
При загрузке страницы в объекте TurtleShell нет методов апи до окончания инициализации плагина. Для облегчения работы с TurtleShell при инициализации в window.TurtleShell есть initialPromise который отрабатывает в момент окончания инициализации. Пример:
TurtleShell.initialPromise
.then((keeperApi) => {
/*...инициализация работы приложения с TurtleShell*/
keeperApi.publicState().then( state => startApp(state));
})
В Turtle Shell, для большей безопасности и удобства использования,
каждый новый сайт использующий API должен быть разрешен пользователем.
При первой попытке использования API (кроме on) пользователю будет показан запрос на
разрешение работы Turtle Shell с этим сайтом. Если пользователь согласен дать доступ,
сайт становится доверенным, и получает возможность использовать API на своих страницах.
В противном случае, сайт блокируется и на все запросы будет возвращена ошибка
{message: "Api rejected by user", code: 12}, пользователь не увидит новых уведомлений.
Для получения доступа, пользователь должен из интерфейса сделать сайт доверенным.
Если сайт доверенный, возвращает публичные данные кипера.
Пример:
TurtleShell.publicState()
.then(state => {
console.log(state); //вывод в консоль результата
/*...обработка данных */
}).catch(error => {
console.error(error); //вывод в консоль результата
/*...обработка ошибок */
})
или
const getPublicState = async () => {
try {
const state = await TurtleShell.publicState();
console.log(state); //вывод в консоль результата
/*...обработка данных */
} catch(error) {
console.error(error); //вывод в консоль результата
/*...обработка ошибок */
}
}
const result = await getPublicState();
ОТВЕТ
{
"initialized": true,
"locked": true,
"account": {
"name": "foo",
"publicKey": "bar",
"address": "tn адресс",
"networkCode": "байт сети",
"balance": {
"available": "баланс в tn",
"leasedOut": "баланс в лизинге"
}
},
"network": {
"code": "L",
"server": "https://privatenode2.blackturtle.eu/",
"matcher": "https://privatematcher.blackturtle.eu/"
},
"messages": [],
"txVersion": {
"3": [ 2 ],
"4": [ 2 ],
"5": [ 2 ],
...
}
}
Описание возвращаемых полей
initialized- boolean кипер проинициализированlocked- boolean кипер в режиме ожиданияaccount- текущий аккаунт, если пользователь разрешит сайту доступ, или nullnetwork- текущая сеть waves, адрес ноды и матчераmessages- статусы запросов на подписьtxVersion- доступные версии транзакций для каждого типа
Возможные ошибки
{ message: "Init Turtle Shell and add account" }- кипер не проинициализирован{ message: "Add Turtle Shell account" }- вход в кипер произведен, но нет аккаунтов{ message: "User denied message" }- пользователь запретил сайту работать с кипером
Позволяет подписаться на события из Turtle Shell.
Поддерживает события:
update- подписаться на изменения стейта
Пример:
TurtleShell.on("update", state => {
//state бъект как из TurtleShell.publicState
});
Если сайт не является доверенным, то события приходить не будут.
Метод для получения подписи авторизационных данных при подтверждении пользователя Waves. Работает аналогично протоколу авторизации waves.
Пример:
const authData = { data: "Auth on my site" };
TurtleShell.auth(authData)
.then(auth => {
console.log(auth); //вывод в консоль результата
/*...обработка данных */
}).catch(error => {
console.error(error); //вывод в консоль результата
/*...обработка ошибок */
})
или
const getAuthData = async authData => {
try {
const state = await TurtleShell.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://client.turtlenetwork.eu/",
successPath: "login"
};
TurtleShell.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: "TN",
tokens: "1.567"
},
fee: {
assetId: "TN",
tokens: "0.001"
},
recipient: "test"
}
};
TurtleShell.signTransaction(txData).then((data) => {
//data - строка готовая для отсылки на ноду(сервер) сети Waves
}).catch((error) => {
//Обработка ошибок
});
Апи возвращает строки, а не объект, так как в javascript при работе с 8 байтными целыми происходит потеря точности.
Описание поддерживаемых типов транзакций вы найдете ниже
В примере мы подписываем транзакцию на перевод токенов 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}- cайт является не доверенным{message: "Invalid data", data: "Причина", code: 9}- неверные/неполные данные запроса
Аналогичен signTransaction, но плюс еще отправляет транзакцию в блокчейн.
Пример:
const txData = {
type: 4,
data: {
amount: {
assetId: "TN",
tokens: "1.567"
},
fee: {
assetId: "TN",
tokens: "0.001"
},
recipient: "test"
}
};
TurtleShell.signAndPublishTransaction(txData).then((data) => {
//data - строка готовая для отсылки на ноду(сервер) сети Waves
}).catch((error) => {
//Обработка ошибок
});
ОТВЕТ Возвращается строкой ответ от сети Waves - полное содержание прошедшей транзакции
ОШИБКИ
- Аналогично
signTransaction {message: "Filed request", data: "Описание ошибки", code: 15}- реквест подписали, но не смогли отправить дальше
Пакетная подпись транзакций. Иногда надо подписать сразу несколько транзакций, для удобства пользователя, допускается подписывать до 7 транзакций одновременно, и разрешены только определенные типы транзакций:
3 - выпуск токена4 - перевод токенов5 - перевыпуск токенов6 - сжигание токенов10 - создaние алиса на адрес в сети waves11 - массовый перевод12 - транзакция с данными
Пример:
const name = "For Test";
const tx = [{
type: 4,
data: {
amount: {
assetId: "TN",
tokens: "1.567"
},
fee: {
assetId: "TN",
tokens: "0.001"
},
recipient: "test"
}},{
type: 4,
data: {
amount: {
assetId: "TN",
tokens: "0.51"
},
fee: {
assetId: "TN",
tokens: "0.001"
},
recipient: "merry"
}
}];
TurtleShell.signTransactionPackage(tx, name)
Подписать 2 транзакции:
- перевода на алиас test 1.567 Waves
- перевода на алиас merry 0.1 Waves
ОТВЕТ
массив из 2-х строк, подписанных и готовых к отправке транзакций.
ОШИБКИ
Аналогично signTransaction.
У каждого пользователя в сети waves есть стейт (балансы, ассеты, данные, скрипты),
любая прошедшая транзакция меняет эти данные.
В TurtleShell API - отличается от NODE REST API.
signTransaction, signAndPublishTransaction принимают транзакцию в следующем виде
{
type: number //тип транзакции,
data: {
... //данные транзакции
}
}
Условные обозначения
* - необязательное поле, данные подставятся автоматически из TurtleShell.
[x,y] - oграничение длины от x, до y.
[,x] - oграничение длины до x.
[y,] - oграничение длины от 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: "TN" }{ coins: 100000000, assetId: "TN" };
В обоих записях указана одинаковая цена 1 TN. Можно свободно перевести 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 - точность,reissuabletrue|false - возможно перевыпускать,feeMoneyLike -комиссия*scriptstring - скрипт для ассета*senderPublicKeystring - публичный ключ отправителя в base58*timestampnumber/string - время в мс
Пример:
TurtleShell.signAndPublishTransaction({
type: 3,
data: {
"name": "Best Token",
"description": "Greate token",
"quantity": 1000000,
"precision": 2,
"reissuable": true,
fee: {
"tokens": "1",
"assetId": "TN"
}
}
}).then((tx) => {
console.log("Ура! Я создал свой ассет!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха мы выпускаем новыйй ассет в количестве 1000000 шт. которые будут на вашем балансе 10000.00 Best Token
amountMoneyLike - количество,recipientstring - адрес получателя или алиасattachment[,140 bytes] string или Byte Array- доп информацияfeeMoneyLike - комиссия*senderPublicKeystring - публичный ключ отправителя в base58*timestampnumber/string - время в мс
Пример:
TurtleShell.signAndPublishTransaction({
type: 4,
data: {
amount: { tokens: "3.3333333", assetId: "TN" },
fee: { tokens: "0.001", assetId: "TN"},
recipient: "merry"
}
}).then((tx) => {
console.log("Ура! Я смог отправить Waves!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
assetIdstring - "Id ассета",quantity[0 - (JLM)] number/string/MoneyLike - количество,reissuablefalse - запретить перевыпускатьfeeMoneyLike -комиссия*senderPublicKeystring - публичный ключ отправителя в base58*timestampnumber/string - время в мс
Пример:
TurtleShell.signAndPublishTransaction({
type: 5,
data: {
"quantity": 1000,
"assetId": "8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS",
"reissuable": true,
fee: {
"tokens": "1",
"assetId": "TN"
}
}
}).then((tx) => {
console.log("Ура! Я довыпустил ассет!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха мы довыпускаем новыйй ассет в количестве 1000000 coins.
которые будут на вашем балансе 10000.00 Best Token
assetIdstring - Id ассета,amount[0 - (JLM)] number/string/MoneyLike - количество,feeMoneyLike -комиссия*senderPublicKeystring - публичный ключ отправителя в base58*timestampnumber/string - время в мс
Пример:
TurtleShell.signAndPublishTransaction({
type: 6,
data: {
amount: 1000,
assetId: "8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS",
fee: {
"tokens": "0.001",
"assetId": "TN"
}
}
}).then((tx) => {
console.log("Ура! Я сжег лишнее!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха сжигается 1000 coins.
recipientstring - адрес получателя или алиас,amount[0 - (JLM)] number/string/MoneyLike - количество,feeMoneyLike -комиссия*senderPublicKeystring - публичный ключ отправителя в base58*timestampnumber/string - время в мс
Пример:
TurtleShell.signAndPublishTransaction({
type: 8,
data: {
"amount": 1000,
"recipient": "merry",
fee: {
"tokens": "0.001",
"assetId": "TN"
}
}
}).then((tx) => {
console.log("Ура! Я смог передать в лизинг!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха передается в лизинг 0.00001000 Waves.
leaseIdstring - id транзакции лизинга,feeMoneyLike -комиссия*senderPublicKeystring - публичный ключ отправителя в base58*timestampnumber/string - время в мс
Пример:
TurtleShell.signAndPublishTransaction({
type: 9,
data: {
leaseId: "6frvwF8uicAfyEfTfyC2sXqBJH7V5C8he5K4YH3BkNiS",
fee: {
"tokens": "0.001",
"assetId": "TN"
}
}
}).then((tx) => {
console.log("Ура! Я отменил лизинг!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха отменяется лизинг.
alias[4, 30] string - имяfeeMoneyLike -комиссия*senderPublicKeystring - публичный ключ отправителя в base58*timestampnumber/string - время в мс
Пример:
TurtleShell.signAndPublishTransaction({
type: 10,
data: {
alias: "testAlias",
fee: {
"tokens": "0.001",
"assetId": "TN"
}
}
}).then((tx) => {
console.log("Ура! Я теперь с алиасом!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха для адреса создается алиас (дополнительное имя).
totalAmountmoneyLike - итого отошлется // можно не считать сумму и вставить { assetId: "id отправляемого ассета", coins: 0},transfersмассив объектов- {
recipient: string - адрес/алиас, amount: number/string/moneyLike }
- {
feeMoneyLike -комиссияattachment[,140 bytes в base58] string - доп информация*senderPublicKeystring - публичный ключ отправителя в base58*timestampnumber/string - время в мс
Пример:
TurtleShell.signAndPublishTransaction({
type: 11,
data: {
totalAmount: { assetId: "TN", coins: 0},
transfers: [
{ recipient: "alias1", amount: "200000" },
{ recipient: "alias2", amount: "200000" },
],
fee: {
"tokens": "0.002",
"assetId": "TN"
}
}
}).then((tx) => {
console.log("Ура! Я друзьям отправил приветов!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха на адреса alias1, alias2 прийдет по 0.002 Waves.
dataмассив объектовtype"binary"/string/"integer"/"boolean" - тип,keystring - название поляvalue/string/string/number/boolean зависит от типа
feeMoneyLike -комиссия*senderPublicKeystring - публичный ключ отправителя в base58*timestampnumber/string - время в мс
Пример:
TurtleShell.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": "TN"
}
}
}).then((tx) => {
console.log("Ура! Я сохранил данные!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха в стейте будут хранится новые данные.
scriptstring - скриптfeeMoneyLike -комиссия*senderPublicKeystring - публичный ключ отправителя в base58*timestampnumber/string - время в мс
Для снятия скрипта поле script равно ``.
Разаработка скрипта в RIDE
Пример:
TurtleShell.signAndPublishTransaction({
type: 13,
data: {
script: "",
fee: {
"tokens": "0.04",
"assetId": "TN"
}
}
}).then((tx) => {
console.log("Ура! Я отменил скрипт!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха удалится скрипт с аккаунта.
Пример2:
TurtleShell.signAndPublishTransaction({
type: 13,
data: {
script: "base64:AQa3b8tH",
fee: {
"tokens": "0.01",
"assetId": "TN"
}
}
}).then((tx) => {
console.log("Ура! Я поставил скрипт!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха на аккаунте будет новый скрипт разрешающий на аккаунте любые транзакции без подписи (будте осторожны!).
minSponsoredAssetFeeMoneyLike - цена комиссии в ассете.feeMoneyLike - комиссия*senderPublicKeystring - публичный ключ отправителя в base58*timestampnumber/string - время в мс
Пример:
TurtleShell.signAndPublishTransaction({
type: 14,
data: {
minSponsoredAssetFee: {
assetId: "6frvwF8uicAfyEfTfyC2sXqBJH7V5C8he5K4YH3BkNiS",
tokens: 0.1
},
fee: {
"tokens": "1",
"assetId": "TN"
}
}
}).then((tx) => {
console.log("Ура! Я стал спонсором!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха, в ассете можно платить комиссию за трансфер
assetIdstring - id ассетаscriptstring - скриптfeeMoneyLike -комиссия*senderPublicKeystring - публичный ключ отправителя в base58*timestampnumber/string - время в мс
Снятие скрипта невозможно, только записать новый. Разаработка скрипта в RIDE
Пример:
TurtleShell.signAndPublishTransaction({
type: 15,
data: {
assetId: "",
script: "base64:AQa3b8tH",
fee: {
"tokens": "0.01",
"assetId": "TN"
}
}
}).then((tx) => {
console.log("Ура! Я переставил скрипт на ассете!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха на ассете будет переписан скрипт
dappAddressstring адрес контрактаfeeMoneyLike комиссияcallобъект слкдующей структурыfunctionstring название функцииargsмассив аргументов видаtype"binary"/string/"integer"/"boolean" - тип,value/string/string/number/boolean зависит от типа
*paymentмассив MoneyLike (пока поддерживается 1 платеж)*senderPublicKeystring - публичный ключ отправителя в base58*timestampnumber/string - время в мс
Пример:
TurtleShell.signAndPublishTransaction({
type: 16,
data: {
fee: {
"tokens": "0.05",
"assetId": "TN"
},
dappAddress: '3N27HUMt4ddx2X7foQwZRmpFzg5PSzLrUgU',
call: {
function: 'tellme',
args: [
{
"type": "string",
"value": "Will?"
}]
}, payment: [{assetId: "TN", tokens: 2}]
}
}).then((tx) => {
console.log("Ура! Я выполнил скрипт!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха будет запущен скрипт
Метод Turtle Shell для подписи ордера в матчер Принимает на вход объект похожий на транзакцию вида
{
type: 1002,
data: {
...данные
}
}
amountMoneyLike - количествоpriceMoneyLike - ценаorderType'sell'/'buy' - тип ордераmatcherFeeMoneyLike - комиссия (мин 0.003 Waves),matcherPublicKeystring публичный ключ exchange сервисаexpirationstring/number - время жизни ордера*timestampstring/number щее время- теку*senderPublicKeystring публичный ключ в base58
Пример:
TurtleShell.signOrder({
type: 1002,
data: {
matcherPublicKey: "7kPFrHDiGw1rCm7LPszuECwWYL3dMf6iMifLRDJQZMzy",
orderType: "sell",
expiration: Date.now() + 100000,
amount: {
tokens: "100",
assetId: "TN"
},
price: {
tokens: "0.01",
assetId: "8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS"
},
matcherFee: {
tokens: "0.03",
assetId: "TN"
}
}
}).then((tx) => {
console.log("Ура! Я подписал ордер!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
ОТВЕТ: Строка с данными для отправки на матчер.
ОШИБКИ:
{ message: "User denied message", code: 10 }- пользователь отклонил запрос{ message: "Api rejected by user", code: 12 }- cайт является не доверенным{ message: "Invalid data", data: "Причина", code: 9 }- неверные/неполные данные запроса
Метод Turtle Shell создания ордера на матчер работает идентично signOrder,
но еще пытается отослать данные на матчер
ОТВЕТ: Строка ответ матчера об успешной постановке ордера.
ОШИБКИ:
- аналогично
signOrder {message: "Filed request", data: "Описание ошибки", code: 15}- реквест подписали, но не смогли отправить дальше
Метод Turtle Shell подпись отмены ордера на матчер Принимает на вход объект похожий на транзакцию вида
{
type: 1003,
data: {
...данные
}
}
idstring - id ордера*senderPublicKeystring публичный ключ в base58
Пример:
TurtleShell.signCancelOrder({
type: 1003,
data: {
id: '31EeVpTAronk95TjCHdyaveDukde4nDr9BfFpvhZ3Sap'
}
});
ОТВЕТ: Строка с данными для отправки на матчер.
ОШИБКИ:
{ message: "User denied message", code: 10 }- пользователь отклонил запрос{ message: "Api rejected by user", code: 12 }- cайт является не доверенным{ message: "Invalid data", data: "Причина", code: 9 }- неверные/неполные данные запроса
Метод Turtle Shell для отмены ордера на матчер, работает идентично signCancelOrder,
но еще пытается отослать данные на матчер
Пример:
TurtleShell.signAndPublishCancelOrder({
type: 1003,
data: {
id: '31EeVpTAronk95TjCHdyaveDukde4nDr9BfFpvhZ3Sap'
}
}).then(() => {
console.log('Ура! Я отменил ордер');
}).catch((error) => {
console.error('Что-то пошло не так', error);
});
ОТВЕТ: Данные пришедшие с матчера
ОШИБКИ:
- аналогично
signCancelOrder {message: "Filed request", data: "Описание ошибки", code: 15}- реквест подписали, но не смогли отправить дальше
Метод Turtle Shell для подписи типизированных данных, для подтверждения запросов на разных сервисах Принимает на вход объект похожий на транзакцию вида
{
type: number,
data: {
...данные
}
}
В данный момент метод поддерживает следующие типы:
timestampnumber/string*senderPublicKeystring публичный ключ в base58
Пример:
TurtleShell.signRequest({
type: 1001,
data: {
timestamp: 234234242423423
}
});
ОТВЕТ: Строка c подписью в base58.
ОШИБКИ:
{ message: "User denied message", code: 10 }- пользователь отклонил запрос{ message: "Api rejected by user", code: 12 }- cайт является не доверенным{ message: "Invalid data", data: "Причина", code: 9 }- неверные/неполные данные запроса
timestampnumber/string
Пример:
TurtleShell.signRequest({
type: 1004,
data: {
timestamp: 234234242423423
}
});
ОТВЕТ: Строка c подписью в base58.
ОШИБКИ:
{ message: "User denied message", code: 10 }- пользователь отклонил запрос{ message: "Api rejected by user", code: 12 }- cайт является не доверенным{ message: "Invalid data", data: "Причина", code: 9 }- неверные/неполные данные запроса