en | ru
Приложение для хранения данных пользователя
и проведения транзакций в блокчейн сети Waves.
Информация о сети Waves
На страницах браузера, работающим по протоколам http/https (не работает на локальных страничках по протоколу file://), с установленным расширением Turtle Shell становятся доступным глобальный объект TurtleShell в котором вы найдете следующие методы:
auth
publicState
signAndPublishCancelOrder
signAndPublishOrder
signAndPublishTransaction
signCancelOrder
signOrder
,signTransaction
signRequest
signTransactionPackage
on
Все методы кроме
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ние алиса на адрес в сети waves
11 - массовый перевод
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 - точность,reissuable
true|false - возможно перевыпускать,fee
MoneyLike -комиссия*script
string - скрипт для ассета*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/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
amount
MoneyLike - количество,recipient
string - адрес получателя или алиасattachment
[,140 bytes] string или Byte Array- доп информацияfee
MoneyLike - комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/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);
});
assetId
string - "Id ассета",quantity
[0 - (JLM)] number/string/MoneyLike - количество,reissuable
false - запретить перевыпускатьfee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/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
assetId
string - Id ассета,amount
[0 - (JLM)] number/string/MoneyLike - количество,fee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/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
.
recipient
string - адрес получателя или алиас,amount
[0 - (JLM)] number/string/MoneyLike - количество,fee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/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.
leaseId
string - id транзакции лизинга,fee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/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 - имяfee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/string - время в мс
Пример:
TurtleShell.signAndPublishTransaction({
type: 10,
data: {
alias: "testAlias",
fee: {
"tokens": "0.001",
"assetId": "TN"
}
}
}).then((tx) => {
console.log("Ура! Я теперь с алиасом!!!");
}).catch((error) => {
console.error("Что-то пошло не так", error);
});
В случае успеха для адреса создается алиас (дополнительное имя).
totalAmount
moneyLike - итого отошлется // можно не считать сумму и вставить { assetId: "id отправляемого ассета", coins: 0},transfers
массив объектов- {
recipient
: string - адрес/алиас, amount: number/string/moneyLike }
- {
fee
MoneyLike -комиссияattachment
[,140 bytes в base58] string - доп информация*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/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" - тип,key
string - название поляvalue
/string/string/number/boolean зависит от типа
fee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/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);
});
В случае успеха в стейте будут хранится новые данные.
script
string - скриптfee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/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);
});
В случае успеха на аккаунте будет новый скрипт разрешающий на аккаунте любые транзакции без подписи (будте осторожны!).
minSponsoredAssetFee
MoneyLike - цена комиссии в ассете.fee
MoneyLike - комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/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);
});
В случае успеха, в ассете можно платить комиссию за трансфер
assetId
string - id ассетаscript
string - скриптfee
MoneyLike -комиссия*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/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);
});
В случае успеха на ассете будет переписан скрипт
dappAddress
string адрес контрактаfee
MoneyLike комиссияcall
объект слкдующей структурыfunction
string название функцииargs
массив аргументов видаtype
"binary"/string/"integer"/"boolean" - тип,value
/string/string/number/boolean зависит от типа
*payment
массив MoneyLike (пока поддерживается 1 платеж)*senderPublicKey
string - публичный ключ отправителя в base58*timestamp
number/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: {
...данные
}
}
amount
MoneyLike - количествоprice
MoneyLike - ценаorderType
'sell'/'buy' - тип ордераmatcherFee
MoneyLike - комиссия (мин 0.003 Waves),matcherPublicKey
string публичный ключ exchange сервисаexpiration
string/number - время жизни ордера*timestamp
string/number щее время- теку*senderPublicKey
string публичный ключ в 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: {
...данные
}
}
id
string - id ордера*senderPublicKey
string публичный ключ в 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: {
...данные
}
}
В данный момент метод поддерживает следующие типы:
timestamp
number/string*senderPublicKey
string публичный ключ в 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 }
- неверные/неполные данные запроса
timestamp
number/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 }
- неверные/неполные данные запроса