# Invocation
Структура содержит поля вызова, которые может использовать вызываемая функция.
# Конструктор
Invocation(payments: List[ AttachedPayment], caller: Address, callerPublicKey: ByteVector, transactionId: ByteVector, fee: Int, feeAssetId: ByteVector|Unit, originCaller: Address, originCallerPublicKey: ByteVector)
# Поля
Значения полей отличаются в зависимости от того, каким образом вызван скрипт.
Если скрипт вызван с помощью транзакции вызова скрипта или транзакции в формате Ethereum:
# | Название | Тип данных | Описание |
---|---|---|---|
1 | payments | List[AttachedPayment] | Платежи, указанные в транзакции |
2 | caller | Address | Адрес аккаунта, который отправил транзакцию |
3 | callerPublicKey | ByteVector | Открытый ключ аккаунта, который отправил транзакцию |
4 | transactionId | ByteVector | ID транзакции |
5 | fee | Int | Комиссия за транзакцию |
6 | feeAssetId | ByteVector|Unit | ID токена, в котором указана комиссия. Значение unit соответствует WAVES |
7 | originCaller | Address | Дублирует поле caller |
8 | originCallerPublicKey | ByteVector | Дублирует поле callerPublicKey |
Если вызываемая функция вызвана с помощью функции invoke
или reentrantInvoke
(см. раздел Вызов dApp из dApp):
# | Название | Тип данных | Описание |
---|---|---|---|
1 | payments | List[AttachedPayment] | Платежи, указанные в функции invoke или reentrantInvoke |
2 | caller | Address | Адрес dApp, который вызвал функцию |
3 | callerPublicKey | ByteVector | Открытый ключ аккаунта dApp, который вызвал функцию |
4 | transactionId | ByteVector | ID транзакции |
5 | fee | Int | Комиссия за транзакцию |
6 | feeAssetId | ByteVector|Unit | ID токена, в котором указана комиссия. Значение unit соответствует WAVES |
7 | originCaller | Address | Адрес аккаунта, который отправил транзакцию |
8 | originCallerPublicKey | ByteVector | Открытый ключ аккаунта, который отправил транзакцию |
Значения
originCaller
,originCallerPublicKey
,transactionId
,fee
,feeAssetId
одни и те же для всех вызовов dApp из dApp, выполняемых в рамках одной транзакции.
# Пример: обработка платежей
Следующая функция проверяет, что первый платеж в транзакции составляет не менее 1 WAVES или 5 в указанном ассете.
{-# STDLIB_VERSION 8 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
func isPaymentOk(i: Invocation) = {
let acceptableAssetId = base58'3JmaWyFqWo8YSA8x3DXCBUW7veesxacvKx19dMv7wTMg'
if (size(i.payments) == 0) then {
throw("Payment not attached")
} else {
let p = i.payments[0]
match p.assetId {
case assetId: ByteVector => assetId == acceptableAssetId && p.amount >= 500000000
case _ => p.amount >= 100000000
}
}
}
@Callable(i)
func foo() = {
if isPaymentOk(i) then ([],unit) else throw("Wrong payment amount or asset")
}