# Транзакция обмена
Транзакция обмена обменивает два различных токена между двумя аккаунтами.
Транзакция содержит два встречных ордера: ордер на покупку и ордер на продажу. Блокчейн гарантирует, что условия обмена не хуже, чем указаны в каждом из ордеров.
Ордер может быть выполнен частично. Ордер может участвовать в нескольких транзакциях обмена, с разными встречными ордерами.
Как правило, транзакция обмена создается матчером — сервисом, который выполняет биржевые ордера на покупку и продажу токенов. Пример матчера — матчер WX Network, разработанный сторонней командой из сообщества, см. документацию WX Network.
В паре обмениваемых токенов один является amount-ассетом (базовой валютой), а другой — price-ассетом (валютой котировки). В транзакции и входящих в нее ордерах указывается количество amount-ассета и его цена в price-ассете. Например, в паре WAVES/XTN amount-ассетом является WAVES, а price-ассетом — XTN, поэтому транзакция содержит количество WAVES к обмену и цену WAVES, выраженную в XTN.
Количество price-ассета, передаваемое в обмен на amount-ассет, рассчитывается аналогично ордеру, см. формулы и пример в разделе Oрдер.
# Комиссия за транзакцию
Минимальная комиссия за транзакцию обмена — 0,003 WAVES. В случае обмена смарт-ассета на обычный ассет — 0,007 WAVES, обмена двух смарт-ассетов — 0,011 WAVES.
Если отправитель транзакции — dApp или смарт-аккаунт, а сложность скрипта аккаунта или функции-верификатора dApp-скрипта больше порога сложности отправителя, минимальная комиссия увеличивается на 0,004 WAVES. (До активации фичи № 16 “Ride V5, dApp-to-dApp invocations” дополнительная комиссия 0,004 WAVES требовалась независимо от сложности скрипта аккаунта или наличия и сложности функции-верификатора скрипта dApp.)
⚠️ В случае если ордер отправлен со смарт-аккаунта или комиссия матчера задана в смарт-ассете, минимальная комиссия за транзакцию не увеличивается.
# Комиссия матчера
Матчер получает комиссию за выполнение ордера с отправителя каждого ордера. Матчер устанавливает минимальный размер комиссии. Отправитель указывает в ордере комиссию не менее минимальной.
Если ордер полностью выполнен в результате транзакции обмена, матчер получает всю сумму комиссии, указанную в ордере. Если ордер выполнен частично, матчер получает часть комиссии. Блокчейн гарантирует, что суммарная комиссия матчера, полученная с отправителя ордера во всех транзакциях обмена, не превышает указанную в ордере.
# JSON-представление
Приведенная ниже транзакция — это обмен 1 WAVES по цене заявка на покупку 15,637504 NSBT по цене не выше 1,21140511 WAVES за 1 NSBT.
{
"senderPublicKey": "9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5",
"amount": 100000000,
"fee": 300000,
"type": 7,
"version": 2,
"sellMatcherFee": 750,
"sender": "3PEjHv3JGjcWNpYEEkif2w8NXV4kbhnoGgu",
"feeAssetId": null,
"proofs": [
"LQD8VoFhHEW2b6o2e2ujzDHdZatwMMwigC2tmoSHcFNRGXrowA1yyVxD6nZBNeABLWjs59dnuLhgNP7UMfFKDuR"
],
"price": 1134500,
"id": "EHLccXcemZPEvUpM9UkASG1GciwMt9R5B3QuYFxywj9g",
"order2": {
"version": 3,
"id": "JCiF3gmprLc8u7xdWR7KUkJ3YfM6yfgxB6CvhJYGJFAa",
"sender": "3PRBeeFD64wvTMfS3HEoDDFPXfJs3gFdAxk",
"senderPublicKey": "ytgWVbKG9e6TSsQ5buMryr2QyxNoL3RezXP3f9RJ2As",
"matcherPublicKey": "9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5",
"assetPair": {
"amountAsset": null,
"priceAsset": "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p"
},
"orderType": "sell",
"amount": 40000000000,
"price": 1134500,
"timestamp": 1591356602063,
"expiration": 1593862202062,
"matcherFee": 300000,
"matcherFeeAssetId": null,
"signature": "3D2Ngr7H6MQRs1izMQSix3dMHmDfg4bcRjxamFXFsb4Ku28neNWHdtwE6LtR3eq69Jqr1CvEsAKCWkQEeEEomcoK",
"proofs": [
"3D2Ngr7H6MQRs1izMQSix3dMHmDfg4bcRjxamFXFsb4Ku28neNWHdtwE6LtR3eq69Jqr1CvEsAKCWkQEeEEomcoK"
]
},
"order1": {
"version": 3,
"id": "FNvEGPgUqEWnrnpxevZQnaZS3DUTBGE2wa6L75xCw7mo",
"sender": "3PDxxx7eSeYLgzTAtuAV7gUCtHeeXeU85fP",
"senderPublicKey": "3WEkbavP3Sw4y5tsgxbZvKkWh87BdB3CPVVxhcRUDBsJ",
"matcherPublicKey": "9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5",
"assetPair": {
"amountAsset": null,
"priceAsset": "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p"
},
"orderType": "buy",
"amount": 100000000,
"price": 1134500,
"timestamp": 1591356752271,
"expiration": 1593862352271,
"matcherFee": 300000,
"matcherFeeAssetId": null,
"signature": "2gvqaYy2BFbK4BJZS8taRJnhgfQ1z2CytF2RqjcyEfzFiu9tkTjN5q4UyFXpPqS3E6eD2WQBUaYCTYDKv98iW1sy",
"proofs": [
"2gvqaYy2BFbK4BJZS8taRJnhgfQ1z2CytF2RqjcyEfzFiu9tkTjN5q4UyFXpPqS3E6eD2WQBUaYCTYDKv98iW1sy"
]
},
"buyMatcherFee": 300000,
"timestamp": 1591356752456,
"height": 2093333
}
Поле | Описание |
---|---|
amount | Количество amount-ассета. Целое число, выраженное в минимальных неделимых единицах («копейках») amount-ассета |
price | Стоимость 1 amount-ассета, выраженная в price-ассете, умноженная на коэффициент: • 108 для транзакции обмена версии 3; • 108 + priceAssetDecimals – amountAssetDecimals для транзакции обмена версии 2 или 1, где amountAssetDecimals , priceAssetDecimals — количество знаков после запятой (параметр токена) |
buyMatcherFee | Комиссия матчера за выполнение ордера на покупку. ID токена комиссии указан в ордере на покупку |
sellMatcherFee | Комиссия матчера за выполнение ордера на продажу. ID токена комиссии указан в ордере на продажу |
order1, order2 | Ордер на покупку и ордер на продажу. См. раздел Oрдер |
Описание полей, общих для всех типов транзакций, представлено в разделе JSON-представление транзакции.
# Бинарный формат
См. раздел Бинарный формат транзакции обмена.
# Структура Ride
Для операций с транзакцией в смарт-контрактах используется структура ExchangeTransaction.