# Inline Actions

# Overview

Actions sent from inside a smart contract are referred to as inline actions.

Important: Understand the Execution Order of smart contracts before using inline actions.

# Sending Inline Action

import { Name, Asset, Contract, ActionData, InlineAction } from "proton-tsc"

// Create packer class for object to send
@packer
export class TokenTransfer extends ActionData {
    constructor (
        public from: Name = new Name(),
        public to: Name = new Name(),
        public quantity: Asset = new Asset(),
        public memo: string = "",
    ) {
        super();
    }
}

class SenderContract extends Contract {
  @action("sendinline")
  sendinline(): void {
    // Create transfer action
    const tokenContract = "xtokens"
    const transfer = new InlineAction<TokenTransfer>("transfer")
    const action = transfer.act(tokenContract, new PermissionLevel(this.receiver))

    // Create transfer object
    const actionParams = new TokenTransfer(this.receiver, Name.fromString("receiver"), Asset.fromString("1.000000 XUSDC"), "memo")

    // Send action (add to queue)
    action.send(actionParams)
  }
}

Note: If the inline action aborts, it will revert the entire transaction.

# Send Tokens and NFTs

proton-tsc provides many inline action helpers for common tasks like sending tokens and NFTs

Tokens

import { sendTransferTokens } from "proton-tsc/token"

sendTransferTokens(
  Name.fromString("sender"),
  Name.fromString("receiver"),
  [new ExtendedAsset(Asset.fromString("1.000000 XUSDC"), Name.fromString("xtokens"))],
  "my memo"
)

NFTs

import { sendTransferNfts } from "proton-tsc/atomicassets"

sendTransferNfts(
  Name.fromString("sender"),
  Name.fromString("receiver"),
  [<u64>4398046836870, <u64>4398046836871],
  "my memo"
)