ื™ื™ืฉื•ื ืฉืœ ื—ืฉื‘ื•ื ื•ืช ื—ื›ืžื™ื ืฉืœ Waves: ืžืžื›ื™ืจื•ืช ืคื•ืžื‘ื™ื•ืช ื•ืขื“ ืชื•ื›ื ื™ื•ืช ื‘ื•ื ื•ืก

ื™ื™ืฉื•ื ืฉืœ ื—ืฉื‘ื•ื ื•ืช ื—ื›ืžื™ื ืฉืœ Waves: ืžืžื›ื™ืจื•ืช ืคื•ืžื‘ื™ื•ืช ื•ืขื“ ืชื•ื›ื ื™ื•ืช ื‘ื•ื ื•ืก

ื‘ืœื•ืงืฆ'ื™ื™ืŸ ืžืงื•ืฉืจ ืœืจื•ื‘ ืจืง ืœืžื˜ื‘ืขื•ืช ืงืจื™ืคื˜ื•ื’ืจืคื™ื™ื, ืืš ืชื—ื•ืžื™ ื”ื™ื™ืฉื•ื ืฉืœ ื˜ื›ื ื•ืœื•ื’ื™ื™ืช DLT ืจื—ื‘ื™ื ื‘ื”ืจื‘ื”. ืื—ื“ ื”ืชื—ื•ืžื™ื ื”ืžื‘ื˜ื™ื—ื™ื ื‘ื™ื•ืชืจ ืœืฉื™ืžื•ืฉ ื‘ื‘ืœื•ืงืฆ'ื™ื™ืŸ ื”ื•ื ื—ื•ื–ื” ื—ื›ื ืฉืžืชื‘ืฆืข ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ื•ืื™ื ื• ืžืฆืจื™ืš ืืžื•ืŸ ื‘ื™ืŸ ื”ืฆื“ื“ื™ื ืฉื”ืชืงืฉืจื• ื‘ื•.

RIDE โ€“ ืฉืคื” ืœื—ื•ื–ื™ื ื—ื›ืžื™ื

Waves ืคื™ืชื—ื” ืฉืคื” ืžื™ื•ื—ื“ืช ืœื—ื•ื–ื™ื ื—ื›ืžื™ื - RIDE. ื”ืชื™ืขื•ื“ ื”ืžืœื ืฉืœื” ื ืžืฆื ื›ืืŸ. ื•ื”ื ื” - ืžืืžืจ ื‘ื ื•ืฉื ื–ื” ืขืœ ื”ื‘ืจ.

ื—ื•ื–ื” RIDE ื”ื•ื ืคืจื“ื™ืงื˜ ื•ืžื—ื–ื™ืจ "ื ื›ื•ืŸ" ืื• "ืฉืงืจ" ื›ืคืœื˜. ื‘ื”ืชืื ืœื›ืš, ื”ืขืกืงื” ื ืจืฉืžืช ื‘ื‘ืœื•ืงืฆ'ื™ื™ืŸ ืื• ื ื“ื—ื™ืช. ื”ื—ื•ื–ื” ื”ื—ื›ื ืžื‘ื˜ื™ื— ื‘ืื•ืคืŸ ืžืœื ืืช ืžื™ืœื•ื™ ื”ืชื ืื™ื ืฉืฆื•ื™ื ื•. ื™ืฆื™ืจืช ืขืกืงืื•ืช ืžื—ื•ื–ื” ื‘-RIDE ืื™ื ื” ืืคืฉืจื™ืช ื›ืจื’ืข.

ื›ื™ื•ื ื™ืฉื ื ืฉื ื™ ืกื•ื’ื™ื ืฉืœ ื—ื•ื–ื™ื ื—ื›ืžื™ื ืฉืœ Waves: ื—ืฉื‘ื•ื ื•ืช ื—ื›ืžื™ื ื•ื ื›ืกื™ื ื—ื›ืžื™ื. ื—ืฉื‘ื•ืŸ ื—ื›ื ื”ื•ื ื—ืฉื‘ื•ืŸ ืžืฉืชืžืฉ ืจื’ื™ืœ, ืืš ืžื•ื’ื“ืจ ืขื‘ื•ืจื• ืกืงืจื™ืคื˜ ื”ืฉื•ืœื˜ ื‘ื›ืœ ื”ืขืกืงืื•ืช. ืกืงืจื™ืคื˜ ื—ืฉื‘ื•ืŸ ื—ื›ื ืขืฉื•ื™ ืœื”ื™ืจืื•ืช ื›ืš, ืœื“ื•ื’ืžื”:

match tx {
  case t: TransferTransaction | MassTransferTransaction => false
  case _ => true
}

tx ื”ื™ื ืขืกืงื” ื‘ืขื™ื‘ื•ื“ ืฉืื ื• ืžืืคืฉืจื™ื ืœื”ืฉืชืžืฉ ื‘ืžื ื’ื ื•ืŸ ื”ืชืืžืช ื”ืชื‘ื ื™ื•ืช ืจืง ืื ื–ื• ืœื ืขืกืงืช ื”ืขื‘ืจื”. ื”ืชืืžืช ื“ืคื•ืกื™ื ื‘-RIDE ืžืฉืžืฉืช ืœื‘ื“ื™ืงืช ืกื•ื’ ื”ืขืกืงื”. ื ื™ืชืŸ ืœืขื‘ื“ ืืช ื›ืœ ื”ื—ืฉื‘ื•ื ื•ืช ื”ืงื™ื™ืžื™ื ื‘ืกืงืจื™ืคื˜ ื”ื—ืฉื‘ื•ืŸ ื”ื—ื›ื ืกื•ื’ื™ ืขืกืงืื•ืช.

ื”ืกืงืจื™ืคื˜ ื™ื›ื•ืœ ื’ื ืœื”ื›ืจื™ื– ืขืœ ืžืฉืชื ื™ื, ืœื”ืฉืชืžืฉ ื‘ืžื‘ื ื™ "ืื-ืื–-ืื—ืจ" ื•ื‘ืฉื™ื˜ื•ืช ืื—ืจื•ืช ืœื‘ื“ื™ืงื” ืžืœืื” ืฉืœ ื”ืชื ืื™ื. ื›ื“ื™ ืœื”ื‘ื˜ื™ื— ืฉืœื—ื•ื–ื™ื ื™ื”ื™ื• ืฉืœืžื•ืช ื•ืžื•ืจื›ื‘ื•ืช (ืขืœื•ืช) ืฉื ื™ืชืŸ ืœื”ื•ื›ื™ื— ืฉืงืœ ืœื—ื–ื•ืช ืื•ืชื ืœืคื ื™ ืชื—ื™ืœืช ื‘ื™ืฆื•ืข ื”ื—ื•ื–ื”, RIDE ืื™ื ื• ืžื›ื™ืœ ืœื•ืœืื•ืช ืื• ื”ืฆื”ืจื•ืช ืงืคื™ืฆื”.

ืชื›ื•ื ื•ืช ืื—ืจื•ืช ืฉืœ ื—ืฉื‘ื•ื ื•ืช Waves ื›ื•ืœืœื•ืช ื ื•ื›ื—ื•ืช ืฉืœ "ืžื“ื™ื ื”", ื›ืœื•ืžืจ, ืžืฆื‘ ื”ื—ืฉื‘ื•ืŸ. ื ื™ืชืŸ ืœื›ืชื•ื‘ ืžืกืคืจ ืื™ื ืกื•ืคื™ ืฉืœ ื–ื•ื’ื•ืช (ืžืคืชื—, ืขืจืš) ืœืžืฆื‘ ื”ื—ืฉื‘ื•ืŸ ื‘ืืžืฆืขื•ืช ืชื ื•ืขื•ืช ื ืชื•ื ื™ื (DataTransaction). ืœืื—ืจ ืžื›ืŸ ื ื™ืชืŸ ืœืขื‘ื“ ืžื™ื“ืข ื–ื” ื”ืŸ ื“ืจืš ื”- REST API ื•ื”ืŸ ื™ืฉื™ืจื•ืช ื‘ื—ื•ื–ื” ื”ื—ื›ื.

ื›ืœ ืขืกืงื” ื™ื›ื•ืœื” ืœื”ื›ื™ืœ ืžืขืจืš ื”ื•ื›ื—ื•ืช, ืฉืœืชื•ื›ื ื ื™ืชืŸ ืœื”ื–ื™ืŸ ืืช ื—ืชื™ืžืช ื”ืžืฉืชืชืฃ, ืžื–ื”ื” ื”ืขืกืงื” ื”ื ื“ืจืฉืช ื•ื›ื•'.

ืขื‘ื•ื“ื” ืขื RIDE via IDE ืžืืคืฉืจ ืœืš ืœืจืื•ืช ืืช ื”ืชืฆื•ื’ื” ื”ืงื•ืžืคื™ืœื˜ื™ืช ืฉืœ ื”ื—ื•ื–ื” (ืื ื”ื™ื ืžื•ืจื›ื‘ืช), ืœื™ืฆื•ืจ ื—ืฉื‘ื•ื ื•ืช ื—ื“ืฉื™ื ื•ืœื”ื’ื“ื™ืจ ืขื‘ื•ืจื• ืกืงืจื™ืคื˜ื™ื, ื›ืžื• ื’ื ืœืฉืœื•ื— ืขืกืงืื•ืช ื‘ืืžืฆืขื•ืช ืฉื•ืจืช ื”ืคืงื•ื“ื”.

ืœืžื—ื–ื•ืจ ืžืœื, ื›ื•ืœืœ ื™ืฆื™ืจืช ื—ืฉื‘ื•ืŸ, ื”ืชืงื ืช ื—ื•ื–ื” ื—ื›ื ืขืœื™ื• ื•ืฉืœื™ื—ืช ืขืกืงืื•ืช, ื ื™ืชืŸ ื’ื ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื” ืœืื™ื ื˜ืจืืงืฆื™ื” ืขื ื”- REST API (ืœื“ื•ื’ืžื”, C#, C, Java, JavaScript, Python, Rust, Elixir) . ื›ื“ื™ ืœื”ืชื—ื™ืœ ืœืขื‘ื•ื“ ืขื ื”-IDE, ืคืฉื•ื˜ ืœื—ืฅ ืขืœ ื”ืœื—ืฆืŸ NEW.

ื”ืืคืฉืจื•ื™ื•ืช ืœืฉื™ืžื•ืฉ ื‘ื—ื•ื–ื™ื ื—ื›ืžื™ื ื”ืŸ ืจื—ื‘ื•ืช: ืžืื™ืกื•ืจ ืขืกืงืื•ืช ืœื›ืชื•ื‘ื•ืช ืžืกื•ื™ืžื•ืช ("ืจืฉื™ืžื” ืฉื—ื•ืจื”") ื•ืขื“ ืœ-dApps ืžื•ืจื›ื‘ื•ืช.

ื›ืขืช ื ืกืชื›ืœ ืขืœ ื“ื•ื’ืžืื•ืช ืกืคืฆื™ืคื™ื•ืช ืœืฉื™ืžื•ืฉ ื‘ื—ื•ื–ื™ื ื—ื›ืžื™ื ื‘ืขืกืงื™ื: ื‘ืขืช ืขืจื™ื›ืช ืžื›ื™ืจื•ืช ืคื•ืžื‘ื™ื•ืช, ื‘ื™ื˜ื•ื— ื•ื™ืฆื™ืจืช ืชื•ื›ื ื™ื•ืช ื ืืžื ื•ืช.

ืžื›ื™ืจื•ืช ืคื•ืžื‘ื™ื•ืช

ืื—ื“ ื”ืชื ืื™ื ืœืžื›ื™ืจื” ืคื•ืžื‘ื™ืช ืžื•ืฆืœื—ืช ื”ื•ื ืฉืงื™ืคื•ืช: ืขืœ ื”ืžืฉืชืชืคื™ื ืœื”ื™ื•ืช ื‘ื˜ื•ื—ื™ื ืฉืื™ ืืคืฉืจ ืœืขืฉื•ืช ืžื ื™ืคื•ืœืฆื™ื•ืช ื‘ื”ืฆืขื•ืช. ื ื™ืชืŸ ืœื”ืฉื™ื’ ื–ืืช ื”ื•ื“ื•ืช ืœื‘ืœื•ืงืฆ'ื™ื™ืŸ, ืฉื‘ื• ื ืชื•ื ื™ื ื‘ืœืชื™ ื ื™ืชื ื™ื ืœืฉื™ื ื•ื™ ืขืœ ื›ืœ ื”ื”ื™ืžื•ืจื™ื ื•ื”ื–ืžืŸ ืฉื‘ื• ื”ื ื‘ื•ืฆืขื• ื™ื”ื™ื• ื–ืžื™ื ื™ื ืœื›ืœ ื”ืžืฉืชืชืคื™ื.

ื‘-Waves blockchain, ื ื™ืชืŸ ืœืจืฉื•ื ื”ืฆืขื•ืช ื‘ืžืฆื‘ ื—ืฉื‘ื•ืŸ ื”ืžื›ื™ืจื” ื”ืคื•ืžื‘ื™ืช ื‘ืืžืฆืขื•ืช DataTransaction.

ื ื™ืชืŸ ื’ื ืœื”ื’ื“ื™ืจ ืืช ืฉืขืช ื”ื”ืชื—ืœื” ื•ื”ืกื™ื•ื ืฉืœ ื”ืžื›ื™ืจื” ื”ืคื•ืžื‘ื™ืช ื‘ืืžืฆืขื•ืช ืžืกืคืจื™ ื‘ืœื•ืง: ืชื“ื™ืจื•ืช ื™ืฆื™ืจืช ื”ื‘ืœื•ืงื™ื ื‘ื‘ืœื•ืงืฆ'ื™ื™ืŸ Waves ืฉื•ื•ื” ื‘ืขืจืš ืœ 60 ืฉื ื™ื•ืช.

1. ืžื›ื™ืจื” ืคื•ืžื‘ื™ืช ืฉืœ ืžื—ื™ืจ ืขื•ืœื” ื‘ืื ื’ืœื™ืช

ื”ืžืฉืชืชืคื™ื ื‘ืžื›ื™ืจื” ืคื•ืžื‘ื™ืช ื‘ืื ื’ืœื™ืช ืžื’ื™ืฉื™ื ื”ืฆืขื•ืช ื‘ืชื—ืจื•ืช ื–ื” ืขื ื–ื”. ื›ืœ ื”ื™ืžื•ืจ ื—ื“ืฉ ื—ื™ื™ื‘ ืœืขืœื•ืช ืขืœ ื”ืงื•ื“ื. ื”ืžื›ืจื– ืžืกืชื™ื™ื ื›ืืฉืจ ืื™ืŸ ืขื•ื“ ืžืฆื™ืขื™ื ืฉื™ื—ืจื’ื• ืžื”ื”ืฆืขื” ื”ืื—ืจื•ื ื”. ื‘ืžืงืจื” ื–ื”, ืขืœ ื”ืžืฆื™ืข ื”ื’ื‘ื•ื” ื‘ื™ื•ืชืจ ืœืกืคืง ืืช ื”ืกื›ื•ื ื”ื ืงื•ื‘.

ืงื™ื™ืžืช ื’ื ืืคืฉืจื•ืช ืžื›ื™ืจื” ืคื•ืžื‘ื™ืช ื‘ื” ื”ืžื•ื›ืจ ืงื•ื‘ืข ืžื—ื™ืจ ืžื™ื ื™ืžื•ื ืœืžื’ืจืฉ, ื•ื”ืžื—ื™ืจ ื”ืกื•ืคื™ ื—ื™ื™ื‘ ืœืขืœื•ืช ืขืœื™ื•. ืื—ืจืช, ื”ืžื’ืจืฉ ืœื ื ืžื›ืจ.

ื‘ื“ื•ื’ืžื” ื–ื•, ืื ื• ืขื•ื‘ื“ื™ื ืขื ื—ืฉื‘ื•ืŸ ืฉื ื•ืฆืจ ื‘ืžื™ื•ื—ื“ ืขื‘ื•ืจ ื”ืžื›ื™ืจื” ื”ืคื•ืžื‘ื™ืช. ืžืฉืš ื”ืžื›ื™ืจื” ื”ืคื•ืžื‘ื™ืช ื”ื•ื 3000 ื‘ืœื•ืงื™ื, ื•ื”ืžื—ื™ืจ ื”ื”ืชื—ืœืชื™ ืฉืœ ื”ืžื’ืจืฉ ื”ื•ื 0,001 WAVES. ืžืฉืชืชืฃ ื™ื›ื•ืœ ืœื”ื’ื™ืฉ ื”ืฆืขื” ืขืœ ื™ื“ื™ ืฉืœื™ื—ืช DataTransaction ืขื ื”ืžืคืชื— "ืžื—ื™ืจ" ื•ืขืจืš ื”ื”ืฆืขื” ืฉืœื•.

ื”ืžื—ื™ืจ ืฉืœ ื”ื”ืฆืขื” ื”ื—ื“ืฉื” ื—ื™ื™ื‘ ืœื”ื™ื•ืช ื’ื‘ื•ื” ืžื”ืžื—ื™ืจ ื”ื ื•ื›ื—ื™ ืขื‘ื•ืจ ืžืคืชื— ื–ื”, ื•ืขืœ ื”ืžืฉืชืชืฃ ืœื”ื—ื–ื™ืง ื‘ื—ืฉื‘ื•ื ื• ืœืคื—ื•ืช ืืกื™ืžื•ื ื™ [new_bid + commission]. ื™ืฉ ืœืจืฉื•ื ืืช ื›ืชื•ื‘ืชื• ืฉืœ ื”ืžืฆื™ืข ื‘ืฉื“ื” "ืฉื•ืœื—" ื‘-DataTransaction, ื•ื’ื•ื‘ื” ื‘ืœื•ืง ื”ื”ืฆืขื•ืช ื”ื ื•ื›ื—ื™ ื—ื™ื™ื‘ ืœื”ื™ื•ืช ื‘ืชื•ืš ืชืงื•ืคืช ื”ืžื›ืจื–.

ืื ื‘ืกื•ืฃ ื”ืžื›ืจื– ื”ืžืฉืชืชืฃ ืงื‘ืข ืืช ื”ืžื—ื™ืจ ื”ื’ื‘ื•ื” ื‘ื™ื•ืชืจ, ื”ื•ื ื™ื›ื•ืœ ืœืฉืœื•ื— ExchangeTransaction ืœืชืฉืœื•ื ืขื‘ื•ืจ ื”ืžื’ืจืฉ ื”ืžืงื‘ื™ืœ ื‘ืžื—ื™ืจ ื•ืฆืžื“ ื”ืžื˜ื‘ืขื•ืช ืฉืฆื•ื™ื ื•.

let startHeight = 384120
let finishHeight = startHeight + 3000
let startPrice = 100000
 
#ะธะทะฒะปะตะบะฐะตะผ ะธะท ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ะฐะดั€ะตั ะพั‚ะฟั€ะฐะฒะธั‚ะตะปั
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
match tx {
case d : DataTransaction =>
  #ะฟั€ะพะฒะตั€ัะตะผ, ะทะฐะดะฐะฝะฐ ะปะธ ะฒ ัั‚ะตะนั‚ะต ั†ะตะฝะฐ
  let currentPrice = if isDefined(getInteger(this, "price"))
 
                      #ะธะทะฒะปะตะบะฐะตะผ ั†ะตะฝัƒ ะธะท ัั‚ะตะนั‚ะฐ
                      then extract(getInteger(this, "price"))
                      else startPrice
 
  #ะธะทะฒะปะตะบะฐะตะผ ั†ะตะฝัƒ ะธะท ั‚ั€ะฐะฝะทะฐะบั†ะธะธ
  let newPrice = extract(getInteger(d.data, "price"))
  let priceIsBigger = newPrice > currentPrice
  let fee = 700000
  let hasMoney = wavesBalance(tx.sender) + fee >= newPrice
 
  #ัƒะฑะตะถะดะฐะตะผัั, ั‡ั‚ะพ ะฒ ั‚ะตะบัƒั‰ะตะน ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ะดะฒะฐ ะฟะพะปั ะธ ั‡ั‚ะพ ะพั‚ะฟั€ะฐะฒะธั‚ะตะปัŒ ัะพะฒะฟะฐะดะฐะตั‚ ั ัƒะบะฐะทะฐะฝะฝั‹ะผ ะฒ ั‚ั€ะฐะฝะทะฐะบั†ะธะธ
  let correctFields = size(d.data) == 2 &&      
      d.sender == addressFromString(extract(getString(d.data,"sender")))
  startHeight <= height && height <= finishHeight && priceIsBigger && hasMoney && correctFields
case e : ExchangeTransaction =>
  let senderIsWinner = e.sender == addressFromString(extract(getString(this, "sender"))) #ัƒะฑะตะถะดะฐะตะผัั, ั‡ั‚ะพ ะปะพั‚ ะพะฑะผะตะฝะธะฒะฐะตั‚ ั‚ะพั‚, ะบั‚ะพ ะตะณะพ ะฒั‹ะธะณั€ะฐะป
  let correctAssetPair = e.sellOrder.assetPair.amountAsset == token && ! isDefined(e.sellOrder.assetPair.priceAsset)
  let correctAmount = e.amount == 1
  let correctPrice = e.price == extract(getInteger(this, "price"))
 
  height > finishHeight && senderIsWinner && correctAssetPair && correctAmount && correctPrice
case _ => false
}

2. ืžื›ื™ืจื” ืคื•ืžื‘ื™ืช ื”ื•ืœื ื“ื™ืช ืฉืœ ื™ืจื™ื“ืช ืžื—ื™ืจื™ื

ื‘ืžื›ื™ืจื” ืคื•ืžื‘ื™ืช ื”ื•ืœื ื“ื™ืช, ืžื’ืจืฉ ืžื•ืฆืข ื‘ืชื—ื™ืœื” ื‘ืžื—ื™ืจ ื’ื‘ื•ื” ืžืžื” ืฉื”ืงื•ื ื” ืžื•ื›ืŸ ืœืฉืœื. ื”ืžื—ื™ืจ ืžื•ืคื—ืช ืฆืขื“ ืื—ืจ ืฆืขื“ ืขื“ ืฉืื—ื“ ื”ืžืฉืชืชืคื™ื ืžืกื›ื™ื ืœืงื ื•ืช ืืช ื”ืžื’ืจืฉ ื‘ืžื—ื™ืจ ื”ื ื•ื›ื—ื™.

ื‘ื“ื•ื’ืžื” ื–ื• ืื ื• ืžืฉืชืžืฉื™ื ื‘ืงื‘ื•ืขื™ื ื›ืžื• ื‘ืงื•ื“ืžืชื”, ื›ืžื• ื’ื ื‘ืฆืขื“ ื”ืžื—ื™ืจ ื›ืืฉืจ ื”ื“ืœืชื ื™ื•ืจื“ืช. ืชืกืจื™ื˜ ื”ื—ืฉื‘ื•ืŸ ื‘ื•ื“ืง ื”ืื ื”ืžืฉืชืชืฃ ื”ื•ื ืื›ืŸ ื”ืจืืฉื•ืŸ ืœื”ืžืจ. ืื—ืจืช, ื”-DataTransaction ืœื ืžืชืงื‘ืœ ืขืœ ื™ื“ื™ ื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ.

let startHeight = 384120
let finishHeight = startHeight + 3000
let startPrice = 100000000
let delta = 100
 
#ะธะทะฒะปะตะบะฐะตะผ ะธะท ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ะฐะดั€ะตั ะพั‚ะฟั€ะฐะฒะธั‚ะตะปั
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
match tx {
case d : DataTransaction =>
  let currentPrice = startPrice - delta * (height - startHeight)
 
  #ะธะทะฒะปะตะบะฐะตะผ ะธะท ะฟะพัั‚ัƒะฟะธะฒัˆะตะน ะดะฐั‚ะฐ-ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ะฟะพะปะต "price"
  let newPrice = extract(getInteger(d.data, "price"))
 
  #ัƒะฑะตะถะดะฐะตะผัั, ั‡ั‚ะพ ะฒ ัั‚ะตะนั‚ะต ั‚ะตะบัƒั‰ะตะณะพ ะฐะบะบะฐัƒะฝั‚ะฐ ะฝะต ัะพะดะตั€ะถะธั‚ัั ะฟะพะปั "sender"
  let noBetsBefore = !isDefined(getInteger(this, "sender"))
  let fee = 700000
  let hasMoney = wavesBalance(tx.sender) + fee >= newPrice
 
  #ัƒะฑะตะถะดะฐะตะผัั, ั‡ั‚ะพ ะฒ ั‚ะตะบัƒั‰ะตะน ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ั‚ะพะปัŒะบะพ ะดะฒะฐ ะฟะพะปั
  let correctFields = size(d.data) == 2 && newPrice == currentPrice && d.sender == addressFromString(extract(getString(d.data, "sender")))
  startHeight <= height && height <= finishHeight && noBetsBefore && hasMoney && correctFields
case e : ExchangeTransaction =>
 
  #ัƒะฑะตะถะดะฐะตะผัั, ั‡ั‚ะพ ะพั‚ะฟั€ะฐะฒะธั‚ะตะปัŒ ั‚ะตะบัƒั‰ะตะน ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ัƒะบะฐะทะฐะฝ ะฒ ัั‚ะตะนั‚ะต ะฐะบะบะฐัƒะฝั‚ะฐ ะฟะพ ะบะปัŽั‡ัƒ sender
  let senderIsWinner = e.sender == addressFromString(extract(getString(this, "sender")))
 
  #ัƒะฑะตะถะดะฐะตะผัั, ั‡ั‚ะพ ะฐmount ะฐััะตั‚ะฐ ัƒะบะฐะทะฐะฝ ะบะพั€ั€ะตะบั‚ะฝะพ, ะธ ั‡ั‚ะพ ะฟั€ะฐะนั-ะฐััะตั‚ - waves
  let correctAssetPair = e.sellOrder.assetPair.amountAsset == token && ! isDefined(e.sellOrder.assetPair.priceAsset)
  let correctAmount = e.amount == 1
  let correctPrice = e.price == extract(getInteger(this, "price"))
  height > finishHeight && senderIsWinner && correctAssetPair && correctAmount && correctPrice
case _ => false
}

3. ืžื›ื™ืจื” ืคื•ืžื‘ื™ืช "ืชืฉืœื•ื ืžืœื"

"All-pay" ื”ื™ื ืžื›ื™ืจื” ืคื•ืžื‘ื™ืช ืฉื‘ื” ื›ืœ ื”ืžืฉืชืชืคื™ื ืžืฉืœืžื™ื ืืช ื”ื”ืฆืขื”, ืœืœื ืงืฉืจ ืœืžื™ ื–ื•ื›ื” ื‘ืžื’ืจืฉ. ื›ืœ ืžืฉืชืชืฃ ื—ื“ืฉ ืžืฉืœื ื”ืฆืขื”, ื•ื”ืžืฉืชืชืฃ ืฉืžืฆื™ืข ืืช ื”ื”ืฆืขื” ื”ืžืงืกื™ืžืœื™ืช ื–ื•ื›ื” ื‘ืžื’ืจืฉ.

ื‘ื“ื•ื’ืžื” ืฉืœื ื•, ื›ืœ ืžืฉืชืชืฃ ื‘ืžื›ื™ืจื” ื”ืคื•ืžื‘ื™ืช ืžื’ื™ืฉ ื”ืฆืขื” ื‘ืืžืฆืขื•ืช DataTransaction ืขื (ืžืคืชื—, ืขืจืš)* = ("ื–ื•ื›ื”", ื›ืชื•ื‘ืช), ("ืžื—ื™ืจ", ืžื—ื™ืจ). ืขืกืงืช ื ืชื•ื ื™ื ื›ื–ื• ืžืื•ืฉืจืช ืจืง ืื ืœืžืฉืชืชืฃ ื–ื” ื›ื‘ืจ ื™ืฉ ื˜ืจื ืกืืงืฆื™ื™ืช ื”ืขื‘ืจื” ืขื ื—ืชื™ืžืชื• ื•ื”ืฆืขืชื• ื’ื‘ื•ื”ื” ื™ื•ืชืจ ืžื›ืœ ื”ืงื•ื“ืžื•ืช. ื”ืžื›ื™ืจื” ื”ืคื•ืžื‘ื™ืช ื ืžืฉื›ืช ืขื“ ืœื”ืฉื’ืช endHeight.

let startHeight = 1000
let endHeight = 2000
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
match tx {
 case d: DataTransaction =>
   #ะธะทะฒะปะตะบะฐะตะผ ะธะท ะฟะพัั‚ัƒะฟะธะฒัˆะตะน ะดะฐั‚ะฐ-ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ะฟะพะปะต "price"
   let newPrice = extract(getInteger(d.data, "price"))
 
   #ะธะทะฒะปะตะบะฐะตะผ ะธะท ะฟั€ัƒั„ะพะฒ ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ะฟัƒะฑะปะธั‡ะฝั‹ะน ะบะปัŽั‡ ะฐะบะบะฐัƒะฝั‚ะฐ
   let pk = d.proofs[1]
   let address = addressFromPublicKey(pk)
 
   #ะธะทะฒะปะตะบะฐะตะผ ั‚ั€ะฐะฝะทะฐะบั†ะธัŽ ะดะพะบะฐะทะฐั‚ะตะปัŒัั‚ะฒะพ ะธะท ะฟั€ัƒั„ะพะฒ ะฟะพัั‚ัƒะฟะธะฒัˆะตะน ะดะฐั‚ะฐ ั‚ั€ะฐะฝะทะฐะบั†ะธะธ
   let proofTx = extract(transactionById(d.proofs[2]))
   
   height > startHeight && height < endHeight
   && size(d.data) == 2
   #ัƒะฑะตะถะดะฐะตะผัั, ั‡ั‚ะพ ะฐะดั€ะตั ะฟะพะฑะตะดะธั‚ะตะปั, ะธะทะฒะปะตั‡ะตะฝะฝั‹ะน ะธะท ั‚ะตะบัƒั‰ะตะน ั‚ั€ะฐะฝะทะฐะบั†ะธะธ, ัะพะฒะฟะฐะดะฐะตั‚ ั ะฐะดั€ะตัะพะผ, ะธะทะฒะปะตั‡ะตะฝะฝั‹ะผ ะธะท ะฟั€ัƒั„ะพะฒ
   && extract(getString(d.data, "winner")) == toBase58String(address.bytes)
   && newPrice > extract(getInteger(this, "price"))
   #ะฟั€ะพะฒะตั€ัะตะผ, ั‡ั‚ะพ ั‚ั€ะฐะฝะทะฐะบั†ะธั ะฟะพะดะฟะธัะฐะฝะฐ
   && sigVerify(d.bodyBytes, d.proofs[0], d.proofs[1])
   #ะฟั€ะพะฒะตั€ัะตะผ ะบะพั€ั€ะตะบั‚ะฝะพัั‚ัŒ ั‚ั€ะฐะฝะทะฐะบั†ะธะธ, ัƒะบะฐะทะฐะฝะฝะพะน ะฒ ะฟั€ัƒั„ะฐั…
   && match proofTx {
     case tr : TransferTransaction =>
       tr.sender == address &&
       tr.amount == newPrice
     case _ => false
   }
 case t: TransferTransaction =>
 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
 || (
   height > endHeight
   && extract(getString(this, "winner")) == toBase58String((addressFromRecipient(t.recipient)).bytes)
   && t.assetId == token
   && t.amount == 1
 )
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

ื‘ื™ื˜ื•ื— / ืžื™ืžื•ืŸ ื”ืžื•ื ื™ื

ื‘ื•ื ื ื‘ื—ืŸ ืžืฆื‘ ืฉื‘ื• ืืชื” ืฆืจื™ืš ืœื‘ื˜ื— ืืช ื ื›ืกื™ ื”ืžืฉืชืžืฉื™ื ืžืคื ื™ ื”ืคืกื“ื™ื ื›ืกืคื™ื™ื. ืœื“ื•ื’ืžื”, ืžืฉืชืžืฉ ืจื•ืฆื” ืœื”ื‘ื˜ื™ื— ืฉืื ืืกื™ืžื•ืŸ ื™ืคื—ืช, ื”ื•ื ื™ื•ื›ืœ ืœืงื‘ืœ ื‘ื—ื–ืจื” ืืช ืžืœื•ื ื”ืกื›ื•ื ืฉืฉื•ืœื ืขื‘ื•ืจ ื”ืืกื™ืžื•ื ื™ื ื”ืœืœื•, ื•ืžื•ื›ืŸ ืœืฉืœื ืกื›ื•ื ื‘ื™ื˜ื•ื— ืกื‘ื™ืจ.

ื›ื“ื™ ืœื™ื™ืฉื ื–ืืช, ื™ืฉ ืœื”ื ืคื™ืง "ืืกื™ืžื•ื ื™ ื‘ื™ื˜ื•ื—". ืœืื—ืจ ืžื›ืŸ ืžื•ืชืงืŸ ืกืงืจื™ืคื˜ ืขืœ ื—ืฉื‘ื•ืŸ ื‘ืขืœ ื”ืคื•ืœื™ืกื”, ื”ืžืืคืฉืจ ืœื‘ืฆืข ืจืง ืืช ืขืกืงืื•ืช ื”ื—ืœื™ืคื™ืŸ ืฉืขื•ืžื“ื•ืช ื‘ืชื ืื™ื ืžืกื•ื™ืžื™ื.

ื›ื“ื™ ืœืžื ื•ืข ื”ื•ืฆืื” ื›ืคื•ืœื”, ืขืœื™ืš ืœื‘ืงืฉ ืžื”ืžืฉืชืžืฉ ืœืฉืœื•ื— ืžืจืืฉ DataTransaction ืœื—ืฉื‘ื•ืŸ ื”ืžื‘ื•ื˜ื— ืขื (key, value) = (purchaseTransactionId, sellOrderId) ื•ืœืืกื•ืจ ืฉืœื™ื—ืช DataTransactions ืขื ืžืคืชื— ืฉื›ื‘ืจ ื ืขืฉื” ื‘ื• ืฉื™ืžื•ืฉ.

ืœื›ืŸ, ื”ื”ื•ื›ื—ื•ืช ืฉืœ ื”ืžืฉืชืžืฉ ื—ื™ื™ื‘ื•ืช ืœื”ื›ื™ืœ ืืช ืžื–ื”ื” ื”ืขืกืงื” ืฉืœ ืจื›ื™ืฉืช ืืกื™ืžื•ืŸ ื”ื‘ื™ื˜ื•ื—. ืฆืžื“ ื”ืžื˜ื‘ืขื•ืช ื—ื™ื™ื‘ ืœื”ื™ื•ืช ื–ื”ื” ืœื–ื• ืฉื‘ืขืกืงืช ื”ืจื›ื™ืฉื”. ื›ืžื• ื›ืŸ ื”ืขืœื•ืช ืฆืจื™ื›ื” ืœื”ื™ื•ืช ืฉื•ื•ื” ืœื–ื• ื”ืงื‘ื•ืขื” ื‘ืขืช ื”ืจื›ื™ืฉื”, ื‘ื ื™ื›ื•ื™ ืžื—ื™ืจ ื”ื‘ื™ื˜ื•ื—.

ืžื•ื‘ืŸ ื›ื™ ืœืื—ืจ ืžื›ืŸ ื—ืฉื‘ื•ืŸ ื”ื‘ื™ื˜ื•ื— ืงื•ื ื” ืžื”ืžืฉืชืžืฉ ืืกื™ืžื•ื ื™ ื‘ื™ื˜ื•ื— ื‘ืžื—ื™ืจ ืฉืื™ื ื• ื ืžื•ืš ืžื–ื” ืฉื‘ื• ืจื›ืฉ ืื•ืชื: ื—ืฉื‘ื•ืŸ ื”ื‘ื™ื˜ื•ื— ื™ื•ืฆืจ ExchangeTransaction, ื”ืžืฉืชืžืฉ ื—ื•ืชื ืขืœ ื”ื”ื–ืžื ื” (ืื ื”ืขืกืงื” ื”ื•ืฉืœืžื” ื›ื”ืœื›ื”), ื—ืฉื‘ื•ืŸ ื‘ื™ื˜ื•ื— ื—ื•ืชื ืขืœ ื”ื”ื–ืžื ื” ื”ืฉื ื™ื™ื” ื•ืขืœ ื›ืœ ื”ืขืกืงื” ื•ืฉื•ืœื— ืื•ืชื” ืœื‘ืœื•ืงืฆ'ื™ื™ืŸ.

ืื ืœื ืžืชืจื—ืฉืช ืจื›ื™ืฉื”, ื”ืžืฉืชืžืฉ ื™ื›ื•ืœ ืœื™ืฆื•ืจ ExchangeTransaction ืœืคื™ ื”ื›ืœืœื™ื ื”ืžืชื•ืืจื™ื ื‘ืกืงืจื™ืคื˜ ื•ืœืฉืœื•ื— ืืช ื”ืขืกืงื” ืœื‘ืœื•ืงืฆ'ื™ื™ืŸ. ื›ืš ื”ืžืฉืชืžืฉ ื™ื›ื•ืœ ืœื”ื—ื–ื™ืจ ืืช ื”ื›ืกืฃ ืฉื”ื•ืฆื ื‘ืจื›ื™ืฉืช ืืกื™ืžื•ื ื™ื ืžื‘ื•ื˜ื—ื™ื.

let insuranceToken = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
#ะธะทะฒะปะตะบะฐะตะผ ะธะท ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ะฐะดั€ะตั ะพั‚ะฟั€ะฐะฒะธั‚ะตะปั
let this = extract(tx.sender)
let freezePeriod = 150000
let insurancePrice = 10000
match tx {
 
 #ัƒะฑะตะถะดะฐะตะผัั, ั‡ั‚ะพ, ะตัะปะธ ะฟะพัั‚ัƒะฟะธะปะฐ ะดะฐั‚ะฐ-ั‚ั€ะฐะฝะทะฐะบั†ะธั, ั‚ะพ ัƒ ะฝะตะต ั€ะพะฒะฝะพ ะพะดะฝะพ ะฟะพะปะต ะธ ะฒ ัั‚ะตะนั‚ะต ะตั‰ะต ะฝะตั‚ ั‚ะฐะบะพะณะพ ะบะปัŽั‡ะฐ
 case d : DataTransaction => size(d.data) == 1 && !isDefined(getBinary(this, d.data[0].key))
 case e : ExchangeTransaction =>
 
   #ะตัะปะธ ัƒ ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ะฝะตั‚ ัะตะดัŒะผะพะณะพ ะฟั€ัƒั„ะฐ, ะฟั€ะพะฒะตั€ัะตะผ ะบะพั€ั€ะตะบั‚ะฝะพัั‚ัŒ ะฟะพะดะฟะธัะธ
   if !isDefined(e.proofs[7]) then
     sigVerify(e.bodyBytes, e.proofs[0], e.senderPublicKey)
   else
     #ะตัะปะธ ัƒ ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ะตัั‚ัŒ ัะตะดัŒะผะพะน ะฟั€ัƒั„, ะธะทะฒะปะตะบะฐะตะผ ะธะท ะฝะตะณะพ ั‚ั€ะฐะฝะทะฐะบั†ะธัŽ ะธ ัƒะทะฝะฐั‘ะผ ะตั‘ ะฒั‹ัะพั‚ัƒ
     let purchaseTx = transactionById(e.proofs[7])
     let purchaseTxHeight = extract(transactionHeightById(e.proofs[7]))
    
     #ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะตะผ ั‚ั€ะฐะฝะทะฐะบั†ะธัŽ ะธะท ะฟั€ัƒั„ะฐ
     match purchaseTx {
       case purchase : ExchangeTransaction =>
         let correctSender = purchase.sender == e.sellOrder.sender
         let correctAssetPair = e.sellOrder.assetPair.amountAsset == insuranceToken &&
                                purchase.sellOrder.assetPair.amountAsset == insuranceToken &&
                                e.sellOrder.assetPair.priceAsset == purchase.sellOrder.assetPair.priceAsset
         let correctPrice = e.price == purchase.price - insurancePrice && e.amount == purchase.amount
         let correctHeight = height > purchaseTxHeight + freezePeriod
 
         #ัƒะฑะตะถะดะฐะตะผัั, ั‡ั‚ะพ ะฒ ั‚ั€ะฐะฝะทะฐะบั†ะธะธ-ะฟั€ัƒั„ะต ัƒะบะฐะทะฐะฝ ะฒะตั€ะฝั‹ะน ID ั‚ะตะบัƒั‰ะตะน ั‚ั€ะฐะฝะทะฐะบั†ะธะธ
         let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == e.sellOrder.id
         correctSender && correctAssetPair && correctPrice && correctHeight && correctProof
     case _ => false
   }
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

ืืกื™ืžื•ืŸ ื‘ื™ื˜ื•ื— ื™ื›ื•ืœ ืœื”ืคื•ืš ืœื ื›ืก ื—ื›ื, ืœืžืฉืœ, ื›ื“ื™ ืœืืกื•ืจ ืืช ื”ืขื‘ืจืชื• ืœืฆื“ื“ื™ื ืฉืœื™ืฉื™ื™ื.

ื ื™ืชืŸ ืœื™ื™ืฉื ืชื›ื ื™ืช ื–ื• ื’ื ืขื‘ื•ืจ ืืกื™ืžื•ื ื™ ืžื™ืžื•ืŸ ื”ืžื•ื ื™ื, ื”ืžื•ื—ื–ืจื™ื ืœื‘ืขืœื™ื ืื ื”ืกื›ื•ื ื”ื ื“ืจืฉ ืœื ื ืืกืฃ.

ืžื™ืกื™ ืขืกืงื”

ื—ื•ื–ื™ื ื—ื›ืžื™ื ื—ืœื™ื ื’ื ื‘ืžืงืจื™ื ื‘ื”ื ื™ืฉ ืฆื•ืจืš ื‘ื’ื‘ื™ื™ืช ืžืก ืขืœ ื›ืœ ืขืกืงื” ืขื ืžืกืคืจ ืกื•ื’ื™ ื ื›ืกื™ื. ื ื™ืชืŸ ืœืขืฉื•ืช ื–ืืช ื‘ืืžืฆืขื•ืช ื ื›ืก ื—ื“ืฉ ืขื ืžื•ืชืงืŸ ื—ึธืกื•ึผืช ืขื‘ื•ืจ ืขืกืงืื•ืช ืขื ื ื›ืกื™ื ื—ื›ืžื™ื:

1. ืื ื• ืžื ืคื™ืงื™ื FeeCoin, ืฉื™ื™ืฉืœื— ืœืžืฉืชืžืฉื™ื ื‘ืžื—ื™ืจ ืงื‘ื•ืข: 0,01 WAVES = 0,001 FeeCoin.

2. ื”ื’ื“ืจ ื—ืกื•ืช ืขื‘ื•ืจ FeeCoin ื•ืฉืขืจ ื—ืœื™ืคื™ืŸ: 0,001 WAVES = 0,001 FeeCoin.

3. ื”ื’ื“ืจ ืืช ื”ืกืงืจื™ืคื˜ ื”ื‘ื ืขื‘ื•ืจ ื”ื ื›ืก ื”ื—ื›ื:

let feeAssetId = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let taxDivisor = 10
 
match tx {
  case t: TransferTransaction =>
    t.feeAssetId == feeAssetId && t.fee == t.amount / taxDivisor
  case e: ExchangeTransaction | MassTransferTransaction => false
  case _ => true
}

ืขื›ืฉื™ื• ื‘ื›ืœ ืคืขื ืฉืžื™ืฉื”ื• ื™ืขื‘ื™ืจ N ื ื›ืกื™ื ื—ื›ืžื™ื, ื”ื•ื ื™ื™ืชืŸ ืœืš FeeCoin ื‘ืกื›ื•ื ืฉืœ N/taxDivisor (ืฉื ื™ืชืŸ ืœืจื›ื•ืฉ ืžืžืš ื‘-10 *N/taxDivisor WAVES), ื•ืืชื” ืชื™ืชืŸ ืœื›ื•ืจื” N/taxDivisor WAVES. ื›ืชื•ืฆืื” ืžื›ืš, ื”ืจื•ื•ื— ืฉืœืš (ืžืก) ื™ื”ื™ื” 9*N / taxDivisor WAVES.

ืืชื” ื™ื›ื•ืœ ื’ื ืœื‘ืฆืข ืžื™ืกื•ื™ ื‘ืืžืฆืขื•ืช ืกืงืจื™ืคื˜ ื ื›ืก ื—ื›ื ื•- MassTransferTransaction:

let taxDivisor = 10
 
match tx {
  case t : MassTransferTransaction =>
    let twoTransfers = size(t.transfers) == 2
    let issuerIsRecipient = t.transfers[0].recipient == addressFromString("3MgkTXzD72BTfYpd9UW42wdqTVg8HqnXEfc")
    let taxesPaid = t.transfers[0].amount >= t.transfers[1].amount / taxDivisor
    twoTransfers && issuerIsRecipient && taxesPaid
  case _ => false
}

Cashback ื•ืชื•ื›ื ื™ื•ืช ื ืืžื ื•ืช

Cashback ื”ื•ื ืกื•ื’ ืฉืœ ืชื•ื›ื ื™ืช ื ืืžื ื•ืช ืฉื‘ื” ื”ืงื•ื ื” ืžืงื‘ืœ ื‘ื—ื–ืจื” ื—ืœืง ืžื”ืกื›ื•ื ืฉื”ื•ืฆื ืขืœ ืžื•ืฆืจ ืื• ืฉื™ืจื•ืช.

ื‘ืขืช ื™ื™ืฉื•ื ืžืงืจื” ื–ื” ื‘ืืžืฆืขื•ืช ื—ืฉื‘ื•ืŸ ื—ื›ื, ืขืœื™ื ื• ืœื‘ื“ื•ืง ืืช ื”ื”ื•ื›ื—ื•ืช ื‘ืื•ืชื• ืื•ืคืŸ ื›ืคื™ ืฉืขืฉื™ื ื• ื‘ืชื™ืง ื”ื‘ื™ื˜ื•ื—. ื›ื“ื™ ืœืžื ื•ืข ื”ื•ืฆืื” ื›ืคื•ืœื”, ืขืœ ื”ืžืฉืชืžืฉ ืœืฉืœื•ื— DataTransaction ืขื (ืžืคืชื—, ืขืจืš) = (purchaseTransactionId, cashbackTransactionId) ืœืคื ื™ ืงื‘ืœืช ื”ื—ื–ืจ ื›ืกืคื™.

ืขืœื™ื ื• ื’ื ืœื”ื’ื“ื™ืจ ืื™ืกื•ืจ ืขืœ ืžืคืชื—ื•ืช ืงื™ื™ืžื™ื ื‘ืืžืฆืขื•ืช DataTransaction. cashbackDivisor - ื™ื—ื™ื“ื” ื—ืœืงื™ืช ื‘ืžื ื™ื™ืช ื”-cashback. ื”ึธื”ึตืŸ. ืื ื ืชื— ื”-cashback ื”ื•ื 0.1, ืื– cashbackDivisor 1 / 0.1 = 10.

let cashbackToken = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
#ะธะทะฒะปะตะบะฐะตะผ ะธะท ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ะฐะดั€ะตั ะพั‚ะฟั€ะฐะฒะธั‚ะตะปั
let this = extract(tx.sender)
let cashbackDivisor = 10
match tx {
 
 #ัƒะฑะตะถะดะฐะตะผัั, ั‡ั‚ะพ, ะตัะปะธ ะฟะพัั‚ัƒะฟะธะปะฐ ะดะฐั‚ะฐ-ั‚ั€ะฐะฝะทะฐะบั†ะธั, ั‚ะพ ัƒ ะฝะตะต ั€ะพะฒะฝะพ ะพะดะฝะพ ะฟะพะปะต ะธ ะฒ ัั‚ะตะนั‚ะต ะตั‰ะต ะฝะตั‚ ั‚ะฐะบะพะณะพ ะบะปัŽั‡ะฐ
 case d : DataTransaction => size(d.data) == 1 && !isDefined(getBinary(this, d.data[0].key))
 case e : TransferTransaction =>
 
   #ะตัะปะธ ัƒ ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ะฝะตั‚ ัะตะดัŒะผะพะณะพ ะฟั€ัƒั„ะฐ, ะฟั€ะพะฒะตั€ัะตะผ ะบะพั€ั€ะตะบั‚ะฝะพัั‚ัŒ ะฟะพะดะฟะธัะธ
   if !isDefined(e.proofs[7]) then
     sigVerify(e.bodyBytes, e.proofs[0], e.senderPublicKey)
   else
 
     #ะตัะปะธ ัƒ ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ะตัั‚ัŒ ัะตะดัŒะผะพะน ะฟั€ัƒั„, ะธะทะฒะปะตะบะฐะตะผ ะธะท ะฝะตะณะพ ั‚ั€ะฐะฝะทะฐะบั†ะธัŽ ะธ ัƒะทะฝะฐั‘ะผ ะตั‘ ะฒั‹ัะพั‚ัƒ
     let purchaseTx = transactionById(e.proofs[7])
     let purchaseTxHeight = extract(transactionHeightById(e.proofs[7]))
    
     #ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะตะผ ั‚ั€ะฐะฝะทะฐะบั†ะธัŽ ะธะท ะฟั€ัƒั„ะฐ
     match purchaseTx {
       case purchase : TransferTransaction =>
         let correctSender = purchase.sender == e.sender
         let correctAsset = e.assetId == cashbackToken
         let correctPrice = e.amount == purchase.amount / cashbackDivisor
 
         #ัƒะฑะตะถะดะฐะตะผัั, ั‡ั‚ะพ ะฒ ั‚ั€ะฐะฝะทะฐะบั†ะธะธ-ะฟั€ัƒั„ะต ัƒะบะฐะทะฐะฝ ะฒะตั€ะฝั‹ะน ID ั‚ะตะบัƒั‰ะตะน ั‚ั€ะฐะฝะทะฐะบั†ะธะธ
         let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == e.id
         correctSender && correctAsset && correctPrice && correctProof
     case _ => false
   }
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

ื—ื™ืœื•ืคื™ ืื˜ื•ืžื™ื

ื”ื—ืœืคื” ืื˜ื•ืžื™ืช ืžืืคืฉืจืช ืœืžืฉืชืžืฉื™ื ืœื”ื—ืœื™ืฃ ื ื›ืกื™ื ืœืœื ืขื–ืจืช ื”ื—ืœืคื”. ื‘ื”ื—ืœืคื” ืื˜ื•ืžื™ืช, ืฉื ื™ ื”ืžืฉืชืชืคื™ื ื‘ืขืกืงื” ื ื“ืจืฉื™ื ืœืืฉืจ ื–ืืช ืชื•ืš ืคืจืง ื–ืžืŸ ืžืกื•ื™ื.

ืื ืœืคื—ื•ืช ืื—ื“ ืžื”ืžืฉืชืชืคื™ื ืœื ืžืกืคืง ืื™ืฉื•ืจ ื ื›ื•ืŸ ืขืœ ื”ืขืกืงื” ื‘ืชื•ืš ื”ื–ืžืŸ ืฉื ืงื‘ืข ืœืขืกืงื”, ื”ืขืกืงื” ืžื‘ื•ื˜ืœืช ื•ื”ื”ื—ืœืคื” ืœื ืžืชืจื—ืฉืช.

ื‘ื“ื•ื’ืžื” ืฉืœื ื•, ื ืฉืชืžืฉ ื‘ืกืงืจื™ืคื˜ ื”ื—ืฉื‘ื•ืŸ ื”ื—ื›ื ื”ื‘ื:

let Bob = Address(base58'3NBVqYXrapgJP9atQccdBPAgJPwHDKkh6A8')
let Alice = Address(base58'3PNX6XwMeEXaaP1rf5MCk8weYeF7z2vJZBg')
 
let beforeHeight = 100000
 
let secret = base58'BN6RTYGWcwektQfSFzH8raYo9awaLgQ7pLyWLQY4S4F5'
match tx {
  case t: TransferTransaction =>
    let txToBob = t.recipient == Bob && sha256(t.proofs[0]) == secret && 20 + beforeHeight >= height
    let backToAliceAfterHeight = height >= 21 + beforeHeight && t.recipient == Alice
    txToBob || backToAliceAfterHeight
  case _ => false
}

ื‘ืžืืžืจ ื”ื‘ื ื ื‘ื—ืŸ ืืช ื”ืฉื™ืžื•ืฉ ื‘ื—ืฉื‘ื•ื ื•ืช ื—ื›ืžื™ื ื‘ืžื›ืฉื™ืจื™ื ืคื™ื ื ืกื™ื™ื ื›ื’ื•ืŸ ืื•ืคืฆื™ื•ืช, ื—ื•ื–ื™ื ืขืชื™ื“ื™ื™ื ื•ืฉื˜ืจื•ืช.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”