āφāĻ°ā§āĻĨāĻŋāĻ• āωāĻĒāĻ•āϰāĻŖāϗ⧁āϞāĻŋāϤ⧇ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻāĻŦāĻ‚ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āϏāĻŽā§āĻĒāĻĻ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āĻ—

āφāĻ°ā§āĻĨāĻŋāĻ• āωāĻĒāĻ•āϰāĻŖāϗ⧁āϞāĻŋāϤ⧇ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻāĻŦāĻ‚ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āϏāĻŽā§āĻĒāĻĻ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āĻ—

āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āĻĒā§āϰāĻŦāĻ¨ā§āϧ āφāĻŽāϰāĻž āύāĻŋāϞāĻžāĻŽ āĻāĻŦāĻ‚ āφāύ⧁āĻ—āĻ¤ā§āϝ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϏāĻš āĻŦā§āϝāĻŦāϏāĻžāϝāĻŧ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻĻ⧇āϖ⧇āĻ›āĻŋāĨ¤
āφāϜ āφāĻŽāϰāĻž āφāϞ⧋āϚāύāĻž āĻ•āϰāĻŦ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻāĻŦāĻ‚ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āϏāĻŽā§āĻĒāĻĻāϗ⧁āϞāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ, āĻĢāĻŋāωāϚāĻžāϰ āĻāĻŦāĻ‚ āĻŦāĻŋāϞ⧇āϰ āĻŽāϤ⧋ āφāĻ°ā§āĻĨāĻŋāĻ• āωāĻĒāĻ•āϰāĻŖāϗ⧁āϞāĻŋāϰ āĻ¸ā§āĻŦāĻšā§āĻ›āϤāĻž āĻāĻŦāĻ‚ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝāϤāĻž āωāĻ¨ā§āύāϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ

āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻšāϞ āĻāĻ•āϟāĻŋ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āϚ⧁āĻ•ā§āϤāĻŋ āϝāĻž āĻ•ā§āϰ⧇āϤāĻžāϕ⧇ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŽā§‚āĻ˛ā§āϝ⧇ āĻŦāĻž āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϤāĻžāϰāĻŋāϖ⧇āϰ āφāϗ⧇ āĻāĻ•āϟāĻŋ āϏāĻŽā§āĻĒāĻĻ āϕ⧇āύāĻžāϰ āĻ…āϧāĻŋāĻ•āĻžāϰ āĻĻ⧇āϝāĻŧ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϤāĻžāϕ⧇ āϤāĻž āĻ•āϰāϤ⧇ āĻŦāĻžāĻ§ā§āϝ āĻ•āϰ⧇ āύāĻžāĨ¤

āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ āύāĻŋāĻŽā§āύāϰ⧂āĻĒ āĻšāϤ⧇ āĻĒāĻžāϰ⧇:

āφāĻŽāϰāĻž āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāϏ⧇āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋ āĻāĻ•āϟāĻŋ āωāĻĒāĻ•āϰāĻŖ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻāĻŦāĻ‚ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϝāĻž āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋ āχāĻ¸ā§āϝ⧁ āĻ•āϰ⧇⧎ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀ āĻĒā§āϰāϤāĻŋāĻļā§āϰ⧁āϤāĻŋ āĻĻ⧇āϝāĻŧ āϝ⧇ āϤāĻŋāύāĻŋ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āϏāĻŽā§āĻĒāĻĻ⧇āϰ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻŦāĻŋāĻ•ā§āϰāϝāĻŧāĻŽā§‚āĻ˛ā§āϝ⧇ āĻŽā§‡āϝāĻŧāĻžāĻĻāĻĒā§‚āĻ°ā§āϤāĻŋ āĻļ⧁āϰ⧁ āĻāĻŦāĻ‚ āĻŽā§‡āϝāĻŧāĻžāĻĻ āĻļ⧇āώ⧇āϰ āĻŦā§āϞāĻ• āωāĻšā§āϚāϤāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āĻŦāĻŋāĻ•ā§āϰāĻŋ āĻ•āϰāĻŦ⧇āύ)āĨ¤

āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāϏ⧇āϟ āϕ⧋āĻĄā§‡, āφāĻŽāϰāĻž āϏāĻšāϜāĻ­āĻžāĻŦ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻŦ āϝ⧇ āĻāϟāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āωāĻšā§āϚāϤāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āϞ⧇āύāĻĻ⧇āύ āĻšāĻšā§āϛ⧇, āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝ āĻ•āĻŋāϛ⧁ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻŦ āύāĻž; āφāĻŽāϰāĻž āύāĻŋāϝāĻŧāĻŽ āĻŽā§‡āύ⧇ āϚāϞāĻžāϰ āϜāĻ¨ā§āϝ āϏāĻŽāĻ¸ā§āϤ āĻĻāĻžāϝāĻŧāĻŋāĻ¤ā§āĻŦ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀āϰ āϕ⧋āĻĄā§‡āϰ āωāĻĒāϰ āϛ⧇āĻĄāĻŧ⧇ āĻĻ⧇āĻŦāĨ¤

āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āϏāĻŽā§āĻĒāĻĻ āϕ⧋āĻĄ:

let expirationStart = 100000
let expirationEnd = 101440

match tx {
   case some : ExchangeTransaction | TransferTransaction =>
       height > expirationStart && height <= expirationEnd
   case _ => false
}

āφāĻŽāϰāĻž āĻ…āύ⧁āĻŽāĻžāύ āĻ•āϰāĻŦ āϝ⧇ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāϗ⧁āϞāĻŋ āύāĻŋāĻŽā§āύāϰ⧂āĻĒ āϏāĻ‚āϘāϟāĻŋāϤ āĻšāϝāĻŧ: āĻāĻ•āϜāύ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀ āĻ•āĻŋāϛ⧁ āϏāĻŽā§āĻĒāĻĻ āϕ⧇āύāĻžāϰ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋ āĻŦāĻŋāĻ•ā§āϰāĻŋ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀āϰāĻž āĻāχ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋāϕ⧇ āĻĢāϰ⧋āϝāĻŧāĻžāĻ°ā§āĻĄ āĻ•āϰāϤ⧇ āĻŦāĻž āϤāĻžāĻĻ⧇āϰ āĻŦāĻžāĻŖāĻŋāĻœā§āϝ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇⧎ āϤāĻžāϰ āϕ⧇āύāĻžāϰ āĻ…āϧāĻŋāĻ•āĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āϏāĻŽā§āĻ­āĻžāĻŦā§āϝ āĻ•ā§āϰ⧇āϤāĻžāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻĒāĻ›āĻ¨ā§āĻĻāϏāχ āϏāĻ‚āĻ–ā§āϝāĻ• āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻŦāĻŋāĻ•ā§āϰ⧇āϤāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇, āĻ…āĻ°ā§āĻĨāĻžā§Ž āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀āĨ¤ āĻāϰ āĻĒāϰ⧇, āϤāĻŋāύāĻŋ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀āϰ āϰāĻžāĻˇā§āĻŸā§āϰ⧀āϝāĻŧ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϤāĻĨā§āϝ āϞ⧇āϖ⧇āύ āĻāĻŦāĻ‚ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϤāĻ–āύāχ āĻāĻ•ā§āϏāĻšā§‡āĻžā§āϜ āϞ⧇āύāĻĻ⧇āύ āĻ•ā§āϰāϝāĻŧ āĻāĻŦāĻ‚ āĻŦāĻŋāĻ•ā§āϰāϝāĻŧ⧇āϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻļāĻ°ā§āϤ āĻ…āύ⧁āϝāĻžāϝāĻŧā§€ āĻāĻ—āĻŋāϝāĻŧ⧇ āϝ⧇āϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāĻŦ⧇āĨ¤

āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϕ⧋āĻĄā§‡, āφāĻŽāĻžāĻĻ⧇āϰ āĻ…āĻŦāĻļā§āϝāχ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϝ⧇ āĻ•ā§āϰāϝāĻŧ-āĻŦāĻŋāĻ•ā§āϰāϝāĻŧ⧇āϰ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻāϟāĻŋāϰ āĻŽāĻ§ā§āϝ āĻĻāĻŋāϝāĻŧ⧇ āϝ⧇ āϕ⧋āύ⧋ āĻāĻ•ā§āϏāĻšā§‡āĻžā§āϜ āĻŸā§āϰāĻžāύāĻœā§āϝāĻžāĻ•āĻļāύ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻļāĻ°ā§āϤ āĻĒā§‚āϰāĻŖ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀ āĻāĻ•ā§āϏāĻšā§‡āĻžā§āϜ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀āϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡ āϝ⧇ āϏāĻ‚āĻ–ā§āϝāĻžāϟāĻŋ āĻĒāĻžāĻ āĻŋāϝāĻŧ⧇āϛ⧇ āĻ āĻŋāĻ• āϏ⧇āχ āϏāĻ‚āĻ–ā§āϝāĻ• āχāωāύāĻŋāϟ āĻ•āĻŋāύāĻŦ⧇āĨ¤ āϏāĻŽā§āĻ­āĻžāĻŦā§āϝ āĻ•ā§āϰ⧇āϤāĻžāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϏāĻ āĻŋāĻ• āĻĄā§‡āϟāĻž āϞ⧇āύāĻĻ⧇āύ āĻĒāĻžāĻ āĻžāϤ⧇ āĻšāĻŦ⧇ āϝāĻžāϤ⧇ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀ āĻĻā§āĻŦāĻŋāϗ⧁āĻŖ āĻŦā§āϝāϝāĻŧ āĻāĻĄāĻŧāĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāχ āĻĄā§‡āϟāĻž āϞ⧇āύāĻĻ⧇āύ⧇, āĻ•ā§āϰ⧇āϤāĻž āϤāĻžāϰ āĻ āĻŋāĻ•āĻžāύāĻžāϰ āϏāĻŽāĻžāύ āϕ⧀ āĻ…āύ⧁āϏāĻžāϰ⧇, āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀āϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰāĻŋāϤ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋāϰ āϏāĻ‚āĻ–ā§āϝāĻžāϰ āϏāĻŽāĻžāύ āĻāĻ•āϟāĻŋ āĻŽāĻžāύ āϰāĻžāϖ⧇, āĻ…āĻ°ā§āĻĨāĻžā§Ž, āϏ⧇ āĻ•āĻŋāύāϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŽāύ āϏāĻŽā§āĻĒāĻĻ āχāωāύāĻŋāĻŸā§‡āϰ āϏāĻ‚āĻ–ā§āϝāĻžāĨ¤

āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϕ⧋āĻĄ:

#вĐģадĐĩĐģĐĩ҆ аĐēĐēĐ°ŅƒĐŊŅ‚Đ° даĐĩŅ‚ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģŅŒŅŅ‚Đ˛Đž ĐŋŅ€ĐžĐ´Đ°Ņ‚ŅŒ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊĐžĐĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ŅŽĐŊĐ¸Ņ‚ĐžĐ˛ Đ°ŅŅĐĩŅ‚Đ°
#ĐŋĐž ҆ĐĩĐŊĐĩ sellPrice ĐŧĐĩĐļĐ´Ņƒ Đ˛Ņ‹ŅĐžŅ‚Đ°Đŧи ĐąĐģĐžĐēОв expirationStart и expirationEnd

let expirationStart = 100000
let expirationEnd = 101440
let sellPrice = 10000
let amountAsset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let priceAsset = base58'9jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
#ID Đ°ŅŅĐĩŅ‚Đ°-ĐžĐŋŅ†Đ¸ĐžĐŊа
let optionsAsset = base58'7jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
#иСвĐģĐĩĐēаĐĩĐŧ иС Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸Đ¸ Đ°Đ´Ņ€Đĩҁ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ĐĩĐģŅ
let this = tx.sender
match tx {
   case dataTx : DataTransaction =>
       #иСвĐģĐĩĐēаĐĩĐŧ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ŅŽĐŊĐ¸Ņ‚ĐžĐ˛ иС Đ´Đ°Ņ‚Đ°-Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸Đ¸ ĐŋĐž ĐēĐģŅŽŅ‡Ņƒ (ID ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ)
       let units = extract(getInteger(dataTx.data, dataTx.data[0].key))

       #иСвĐģĐĩĐēаĐĩĐŧ Ņ‚Ņ€Đ°ĐŊҁ҄ĐĩŅ€-Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸ŅŽ ĐžĐŋŅ†Đ¸ĐžĐŊОв иС ĐŋŅ€ŅƒŅ„Đ°
       let e = transactionById(dataTx.proofs[2]) #
       match e {
           case transferTx : TransferTransaction =>
               #ŅƒĐąĐĩĐļдаĐĩĐŧŅŅ, Ņ‡Ņ‚Đž Ņ‚Ņ€Đ°ĐŊҁ҄ĐĩŅ€ ĐąŅ‹Đģ ĐŊа Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đš Đ°Đ´Ņ€Đĩҁ
               (transferTx.recipient == this) &&
               #ŅƒĐąĐĩĐļдаĐĩĐŧŅŅ, Ņ‡Ņ‚Đž ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ĐĩĐģҌ Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸Đ¸ ĐŊаĐŋĐ¸ŅĐ°Đģ в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ĐēĐģŅŽŅ‡Đ° ŅĐ˛ĐžĐš ID
               dataTx.data[0].key == toBase58String(transferTx.sender.bytes) &&
               sigVerify(dataTx.bodyBytes, dataTx.proofs[0], transferTx.senderPublicKey) &&
               #ŅƒĐąĐĩĐļдаĐĩĐŧŅŅ, Ņ‡Ņ‚Đž ҃ĐēаСаĐŊĐŊĐžĐĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ŅŽĐŊĐ¸Ņ‚ĐžĐ˛ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐŋĐžŅĐģаĐŊĐŊĐžĐŧ҃ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Ņƒ ĐžĐŋŅ†Đ¸ĐžĐŊОв
               (units == transferTx.amount) &&
               #ŅƒĐąĐĩĐļдаĐĩĐŧŅŅ, Ņ‡Ņ‚Đž ĐąŅ‹Đģ ĐŋĐĩŅ€ĐĩвĐĩĐ´ĐĩĐŊ иĐŧĐĩĐŊĐŊĐž Đ°ŅŅĐĩŅ‚-ĐžĐŋŅ†Đ¸ĐžĐŊ
               (transferTx.assetId == optionsAsset)              
           case _ => false
       } &&
       size(dataTx.data) == 1 && !isDefined(getInteger(this, dataTx.data[0].key))
       && height > expirationStart && height <= expirationEnd
   case exchangeTx : ExchangeTransaction =>
       #ŅƒĐąĐĩĐļдаĐĩĐŧŅŅ, Ņ‡Ņ‚Đž Đ¸Ņ‚ĐžĐŗĐžĐ˛Ņ‹Đš ОйĐŧĐĩĐŊ ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚ ĐŋĐž ҃ĐēаСаĐŊĐŊŅ‹Đŧ ĐˇĐ°Ņ€Đ°ĐŊĐĩĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģаĐŧ
       let correctAssetPair = exchangeTx.sellOrder.assetPair.amountAsset == amountAsset &&
                                   exchangeTx.sellOrder.assetPair.priceAsset == priceAsset
       let correctPrice = exchangeTx.sellOrder.price == sellPrice
       #иСвĐģĐĩĐēаĐĩĐŧ Đ´Đ°Ņ‚Đ°-Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸ŅŽ иС ĐŋŅ€ŅƒŅ„Đ°      
       let d = transactionById(exchangeTx.proofs[2])
       match d{
           case dataTx : DataTransaction =>
               let buyOrderSender = dataTx.data[0].key
               toBase58String(exchangeTx.buyOrder.sender.bytes) == buyOrderSender &&
               exchangeTx.amount == extract(getInteger(dataTx.data, buyOrderSender))
           case _ => false
       } &&
       exchangeTx.sellOrder.sender == this &&
       correctAssetPair && correctPrice &&
       height > expirationStart && height <= expirationEnd
   case _ => false
}

āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āĻĢāĻŋāωāϚāĻžāϰ

āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻŦāĻŋāĻĒāϰ⧀āϤ⧇, āĻāĻ•āϟāĻŋ āĻĢāĻŋāωāϚāĻžāϰ (āĻĢāĻŋāωāϚāĻžāϰ āϚ⧁āĻ•ā§āϤāĻŋ) āĻāĻ•āϟāĻŋ āĻ…āϧāĻŋāĻ•āĻžāϰ āύāϝāĻŧ, āϤāĻŦ⧇ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽāϝāĻŧ⧇ āϚ⧁āĻ•ā§āϤāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāĻ°ā§āϧāĻžāϰāĻŋāϤ āĻŽā§‚āĻ˛ā§āϝ⧇ āĻāĻ•āϟāĻŋ āϏāĻŽā§āĻĒāĻĻ āĻ•ā§āϰāϝāĻŧ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ•ā§āϰ⧇āϤāĻžāϰ āĻāĻ•āϟāĻŋ āĻŦāĻžāĻ§ā§āϝāĻŦāĻžāϧāĻ•āϤāĻžāĨ¤

āϏāĻžāϧāĻžāϰāĻŖāĻ­āĻžāĻŦ⧇, āĻāĻ•āϟāĻŋ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ āϞ⧇āĻ–āĻž āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āϞ⧇āĻ–āĻžāϰ āĻ…āύ⧁āϰ⧂āĻĒāĨ¤ āĻāĻ–āĻžāύ⧇ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āϏāĻŽā§āĻĒāĻĻ āĻ­āĻŦāĻŋāĻˇā§āĻ¯ā§Ž āĻšāĻŋāϏ⧇āĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤

āφāĻĒāύāĻžāϕ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϝ⧇ āĻ•ā§āϰ⧇āϤāĻž āĻāĻŦāĻ‚ āĻŦāĻŋāĻ•ā§āϰ⧇āϤāĻž āωāĻ­āϝāĻŧāχ āĻ•ā§āϰāϝāĻŧ āφāĻĻ⧇āĻļ⧇ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āĻ•āϰ⧇āύāĨ¤ āĻāĻ•āϟāĻŋ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ āĻāĻ•āϟāĻŋ āĻŦāĻžāĻ§ā§āϝāĻŦāĻžāϧāĻ•āϤāĻž āϝāĻž āϝ⧇ āϕ⧋āύāĻ“ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇āχ āĻĒā§‚āϰāĻŖ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻāϰ āĻŽāĻžāύ⧇ āĻšāϞ āϝ⧇ āϝāĻĻāĻŋ āĻŦāĻŋāĻ•ā§āϰ⧇āϤāĻž āĻŦāĻž āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀ āϤāĻžāĻĻ⧇āϰ āĻŦāĻžāĻ§ā§āϝāĻŦāĻžāϧāĻ•āϤāĻž āĻĒā§āϰāĻ¤ā§āϝāĻžāĻ–ā§āϝāĻžāύ āĻ•āϰ⧇, āϤāĻžāĻšāϞ⧇ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇āϰ āϝ⧇āϕ⧋āύ⧋ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀ āĻāĻ•āϟāĻŋ āϞ⧇āύāĻĻ⧇āύ āĻĒāĻžāĻ āĻžāϤ⧇ āĻĒāĻžāϰ⧇, āĻāχāĻ­āĻžāĻŦ⧇ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰ⧇āĨ¤

āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāϏ⧇āϟ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻĢāĻŋāωāϚāĻžāϰ āĻ…ā§āϝāĻžāϏ⧇āĻŸā§‡āϰ āϏāĻŽāĻ¸ā§āϤ āĻŸā§āϰāĻžāĻ¨ā§āϏāĻĢāĻžāϰ āϞ⧇āύāĻĻ⧇āύ āĻāĻŦāĻ‚ āĻāĻ•ā§āϏāĻšā§‡āĻžā§āϜ āϞ⧇āύāĻĻ⧇āύ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰ⧇, āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻ•ā§āϰ⧇āϤāĻž āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀ āϝāĻĻāĻŋ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀āϰ āĻ•āĻžāĻ› āĻĨ⧇āϕ⧇ āĻĢāĻŋāωāϚāĻžāϰ āĻ…ā§āϝāĻžāϏ⧇āĻŸā§‡āϰ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ āĻ•ā§āϰāϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ…āĻ°ā§āĻĄāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āϤāĻŦ⧇āχ āϏ⧇āϗ⧁āϞāĻŋ āĻ…āύ⧁āĻŽā§‹āĻĻāύ āĻ•āϰ⧇āĨ¤

āĻāχ āφāĻĻ⧇āĻļāϟāĻŋ āĻ…āĻŦāĻļā§āϝāχ āĻŦ⧈āϧ āĻšāϤ⧇ āĻšāĻŦ⧇ āĻāĻŦāĻ‚ āϏ⧇āχ āĻļāĻ°ā§āϤāϗ⧁āϞāĻŋ āĻĒā§‚āϰāĻŖ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϝāĻžāϰ āĻ…āϧ⧀āύ⧇ āĻĢāĻŋāωāϚāĻžāϰ āϜāĻžāϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇⧎ āĻāĻ•āϟāĻŋ āĻ…āĻ°ā§āĻĄāĻžāϰ āϝāĻžāϚāĻžāχ āĻ•āϰāϤ⧇, āφāĻĒāύāĻŋ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰāĻŋāϤ āφāĻĻ⧇āĻļ⧇āϰ āĻŦāĻžāχāϟ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύāĻž āϏāĻš āĻ•ā§āϰ⧇āϤāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āϰāĻžāĻœā§āϝ⧇ āĻāϰ āϏāĻŽāĻ¸ā§āϤ āĻ•ā§āώ⧇āĻ¤ā§āϰ āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ⧇ āĻŦāĻžāĻšā§āϝāĻŋāĻ• āĻŦ⧈āϧāϤāĻž āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āĻāχ āĻŽā§āĻšā§āĻ°ā§āϤ⧇, RIDE-āĻ āϞ⧇āύāĻĻ⧇āύ āĻŦāĻžāχāϟ āĻĒāĻžāĻ°ā§āϏ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āύ⧇āϟāĻŋāĻ­ āĻĢāĻžāĻ‚āĻļāύ āύ⧇āχ, āϤāĻŦ⧇ āĻāϟāĻŋ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āϏāĻŽāĻ¸ā§āϤ āϏāϰāĻžā§āϜāĻžāĻŽ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āϰāϝāĻŧ⧇āϛ⧇⧎ āĻ…āϤāĻāĻŦ, āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀āϰāĻž āĻāχ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϟāĻŋ āύāĻŋāĻœā§‡āϰāĻžāχ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āĻŽāĻžāĻ˛ā§āϟāĻŋ-āϏāĻŋāĻ—āύ⧇āϚāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ / āĻāϏāĻ•ā§āϰ⧋

āĻāĻ•āϟāĻŋ āĻŦāĻšā§-āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻāĻ•āĻžāϧāĻŋāĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āϝ⧌āĻĨāĻ­āĻžāĻŦ⧇ āϏāĻŽā§āĻĒāĻĻ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āϝāĻŧ (āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āϏāĻŽā§āĻĒāĻĻ⧇āϰ āϏāĻžāĻĨ⧇ āϞ⧇āύāĻĻ⧇āύ āϕ⧇āĻŦāϞ āϤāĻ–āύāχ āϏāĻŽā§āĻ­āĻŦ āĻšāϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻĻāĻŋ āϚāĻžāϰāϜāύ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϤāĻŋāύāϜāύ⧇āϰ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āĻĨāĻžāϕ⧇)āĨ¤ RIDE āĻ­āĻžāώāĻžāϝāĻŧ āĻŦāĻšā§-āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇, āφāĻŽāϰāĻž āϞ⧇āύāĻĻ⧇āύ⧇āϰ āĻĒā§āϰāĻŽāĻžāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤

āĻāĻ•āϟāĻŋ āĻŦāĻšā§-āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻāĻ•āϟāĻŋ āĻāϏāĻ•ā§āϰ⧋ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻšāĻŋāϏāĻžāĻŦ⧇āĻ“ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇ āϝ⧇āĻ–āĻžāύ⧇ āϚ⧁āĻ•ā§āϤāĻŋāϰ āĻĒāĻ•ā§āώāϗ⧁āϞāĻŋ āϤāĻžāĻĻ⧇āϰ āĻŦāĻžāĻ§ā§āϝāĻŦāĻžāϧāĻ•āϤāĻž āĻĒā§‚āϰāĻŖ āύāĻž āĻ•āϰāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϤāĻšāĻŦāĻŋāϞ āϰāĻžāĻ–āĻž āĻšāϝāĻŧāĨ¤

let alicePubKey  = base58'5AzfA9UfpWVYiwFwvdr77k6LWupSTGLb14b24oVdEpMM'
let bobPubKey    = base58'2KwU4vzdgPmKyf7q354H9kSyX9NZjNiq4qbnH2wi2VDF'
let cooperPubKey = base58'GbrUeGaBfmyFJjSQb9Z8uTCej5GzjXfRDVGJGrmgt5cD'
#Đ˛Ņ‹ŅŅĐŊŅĐĩĐŧ, ĐēŅ‚Đž ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛Đ¸Đģ ĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊŅ‹Đĩ ĐŋОдĐŋĐ¸ŅĐ¸
let aliceSigned  = if(sigVerify(tx.bodyBytes, tx.proofs[0], alicePubKey)) then 1 else 0
let bobSigned    = if(sigVerify(tx.bodyBytes, tx.proofs[1], bobPubKey)) then 1 else 0
let cooperSigned = if(sigVerify(tx.bodyBytes, tx.proofs[2], cooperPubKey)) then 1 else 0
#ҁ҃ĐŧĐŧĐ¸Ņ€ŅƒĐĩĐŧ Đ˛ŅĐĩ ĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊŅ‹Đĩ ĐŋОдĐŋĐ¸ŅĐ¸ и ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩĐŧ Đ¸Ņ… ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž
aliceSigned + bobSigned + cooperSigned >= 2

āĻŸā§‹āϕ⧇āύ āĻ•āĻŋāωāϰ⧇āĻŸā§‡āĻĄ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰāĻŋ (TCR)

āĻ…āύ⧇āĻ• āĻŦā§āϞāĻ•āĻšā§‡āχāύ āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽā§‡āϰ āĻŦāĻŋāώāĻžāĻ•ā§āϤ āϏāĻŽā§āĻĒāĻĻ⧇āϰ āϏāĻŽāĻ¸ā§āϝāĻž āφāϛ⧇āĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āϝ⧇ āϕ⧋āύ⧋ āĻ āĻŋāĻ•āĻžāύāĻž āϝāĻž āĻ•āĻŽāĻŋāĻļāύ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āϛ⧇ āĻ“āϝāĻŧ⧇āĻ­āϏ⧇ āĻāĻ•āϟāĻŋ āϏāĻŽā§āĻĒāĻĻ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āĻŸā§‹āϕ⧇āύ āĻšā§‹āĻ˛ā§āĻĄāĻžāϰāĻĻ⧇āϰ āĻĻā§āĻŦāĻžāϰāĻž āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻŸā§‹āϕ⧇āύ āĻ•āĻŋāωāϰ⧇āĻŸā§‡āĻĄ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰāĻŋ (TCR) āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻāĻŦāĻ‚ āĻŦā§āϞāĻ•āĻšā§‡āχāύāϕ⧇ āĻŦāĻŋāώāĻžāĻ•ā§āϤ āϏāĻŽā§āĻĒāĻĻ āĻĨ⧇āϕ⧇ āϰāĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āϏāĻŽāĻ¸ā§āϝāĻžāϟāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āϤāĻžāϞāĻŋāĻ•āĻžāϝāĻŧ āϝ⧋āĻ— āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŸā§‹āϕ⧇āύ⧇āϰ āϜāĻ¨ā§āϝ āĻ­ā§‹āϟ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ, āϧāĻžāϰāĻ• āϤāĻžāϰ āĻŽā§‹āϟ āϜāĻžāϰāĻŋ āĻ•āϰāĻž āĻŸā§‹āϕ⧇āύ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻžāϰ āϏāĻŽāĻžāύ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻĄ āϰāĻžāϖ⧇āĨ¤ āĻāĻ•āϟāĻŋ āĻŸā§‹āϕ⧇āύ āϰ⧇āϜāĻŋāĻ¸ā§āϟāĻžāϰ⧇ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ•āϰāĻž āĻšāϝāĻŧ āϝāĻĻāĻŋ āĻāϰ āĻŦ⧇āĻļāĻŋāϰ āĻ­āĻžāĻ— āϧāĻžāϰāĻ• āĻāϟāĻŋāϕ⧇ āĻ­ā§‹āϟ āĻĻ⧇āϝāĻŧāĨ¤

āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻāĻžāĻšāϰāϪ⧇, āφāĻŽāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āϰāĻžāĻœā§āϝ āϕ⧀ āϕ⧀ = asset_name āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦāĻŋāĻŦ⧇āϚāύāĻžāϰ āϜāĻ¨ā§āϝ āϤāĻžāϞāĻŋāĻ•āĻžāϝāĻŧ āĻāĻ•āϟāĻŋ āĻŸā§‹āϕ⧇āύ āϝ⧋āĻ— āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻāĻŋāχ, āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻ—āĻŖāύāĻžāϰ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻŽāĻžāύ = 0āĨ¤

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ…āĻŦāĻļā§āϝāχ āϤāĻžāϰ āĻ“āϝāĻŧāĻžāϞ⧇āĻŸā§‡ āĻāχ āĻŸā§‹āϕ⧇āύ⧇āϰ āĻāĻ•āϟāĻŋ āύāύ-āϜāĻŋāϰ⧋ āĻŦā§āϝāĻžāϞ⧇āĻ¨ā§āϏ āĻĨāĻžāĻ•āϤ⧇ āĻšāĻŦ⧇āĨ¤ āϤāĻžāϰāĻĒāϰ⧇ āĻ­ā§‹āϟāĻĻāĻžāύ⧇āϰ āϏāĻŽāϝāĻŧ āφāϏ⧇, āϝ⧇ āϏāĻŽāϝāĻŧ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϤāĻžāϰ āĻ“āϝāĻŧāĻžāϞ⧇āĻŸā§‡ āĻĨāĻžāĻ•āĻž āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻŽā§āĻĒāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āĻ­ā§‹āϟ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āĻŦāĻžāϰ, 1 āĻĨ⧇āϕ⧇ 10 āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϰ⧇āϟāĻŋāĻ‚ āĻĻ⧇āϝāĻŧāĨ¤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ­ā§‹āϟāϗ⧁āϞāĻŋ user_address+assetID āĻĢāĻ°ā§āĻŽā§‡āϰ āϕ⧀ āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāĻ¤ā§āĻŦ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

let asset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let addingStartHeight = 1000
let votingStartHeight = 2000
let votingEndHeight = 3000

#иСвĐģĐĩĐēаĐĩĐŧ иС Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸Đ¸ Đ°Đ´Ņ€Đĩҁ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ĐĩĐģŅ
let this = extract(tx.sender)

#иСвĐģĐĩĐēаĐĩĐŧ Đ°Đ´Ņ€Đĩҁ иС ĐŋŅ€ŅƒŅ„Đ° Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸Đ¸
let address = addressFromPublicKey(tx.proofs[1])
match tx {
   case t: DataTransaction =>
       if(height > addingStartHeight)
       then(
           if(height < votingStartHeight)
           then(
               #adding
               #Đ˛Ņ‹ŅŅĐŊŅĐĩĐŧ, ĐĩŅŅ‚ŅŒ Đģи ŅŅ‚ĐžŅ‚ Đ°ŅŅĐĩŅ‚ ҃ ŅŅ‚ĐžĐŗĐž Đ°Đ´Ņ€ĐĩŅĐ°
               let hasTokens = assetBalance(address, asset) > 0
               size(t.data) == 1
                     #ŅƒĐąĐĩĐļдаĐĩĐŧŅŅ, Ņ‡Ņ‚Đž ŅŅ‚ĐžŅ‚ Đ°ŅŅĐĩŅ‚ Đĩ҉Đĩ ĐŊĐĩ ĐąŅ‹Đģ дОйавĐģĐĩĐŊ
                     && !isDefined(getInteger(this, toBase58String(asset)))
                     #ŅƒĐąĐĩĐļдаĐĩĐŧŅŅ, Ņ‡Ņ‚Đž ĐŋĐž ĐēĐģŅŽŅ‡Ņƒ-Đ°ŅŅĐĩŅ‚Ņƒ дОйавĐģŅĐĩŅ‚ŅŅ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ Ņ€Đ°Đ˛ĐŊĐžĐĩ 0
                     && extract(getInteger(t.data, toBase58String(asset))) == 0
                     && hasTokens
           )
           else(
               if(height < votingEndHeight)
               then
               (
                   #voting
                   #ŅƒĐˇĐŊаĐĩĐŧ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŗĐžĐģĐžŅĐžĐ˛ Са даĐŊĐŊŅ‹Đš Đ°ŅŅĐĩŅ‚ и СадаваĐĩĐŧĐžĐĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž
                   let currentAmount = extract(getInteger(this, toBase58String(asset)))
                   let newAmount = extract(getInteger(t.data, toBase58String(asset)))
                   let betString = toBase58String(address.bytes) + toBase58String(asset)

                   #ŅƒĐąĐĩĐļдаĐĩĐŧŅŅ, Ņ‡Ņ‚Đž ŅŅ‚ĐžŅ‚ Đ°Đ´Ņ€Đĩҁ Đĩ҉Đĩ ĐŊĐĩ ĐŗĐžĐģĐžŅĐžĐ˛Đ°Đģ Са ŅŅ‚ĐžŅ‚ Đ°ŅŅĐĩŅ‚
                   let noBetBefore = !isDefined(getInteger(this, betString))
                   let isBetCorrect = extract(getInteger(t.data, betString)) > 0
                       && extract(getInteger(t.data, betString)) <= 10
                  
                   #ŅƒĐąĐĩĐļдаĐĩĐŧŅŅ, Ņ‡Ņ‚Đž ҃ ĐŗĐžĐģĐžŅŅƒŅŽŅ‰ĐĩĐŗĐž ĐĩŅŅ‚ŅŒ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧŅ‹Đĩ Ņ‚ĐžĐēĐĩĐŊŅ‹
                   let hasTokens = assetBalance(address, asset) > 0
                   #ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩĐŧ ĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊĐžŅŅ‚ŅŒ СĐŊĐ°Ņ‡ĐĩĐŊиК Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸Đ¸
                   size(t.data) == 2 && isDefined(getInteger(this, toBase58String(asset)))
                       && newAmount == currentAmount + 1
                       && noBetBefore && isBetCorrect && hasTokens
               )
               else false
           ) && sigVerify(tx.bodyBytes, tx.proofs[0], tx.proofs[1])
       )
       else false
   case _ => false
}

āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻĢāĻŋ

āĻāχ āωāĻĻāĻžāĻšāϰāϪ⧇, āφāĻŽāϰāĻž āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŦā§āϝāĻŦāϧāĻžāύ⧇ āĻāĻ•āϟāĻŋ āĻĒāĻŖā§āϝ āĻŦāĻž āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āϜāĻ¨ā§āϝ āύāĻŋāϝāĻŧāĻŽāĻŋāϤ āĻ…āĻ°ā§āĻĨ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāϤ⧇ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϗ⧁āϞāĻŋāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻĻ⧇āĻ–āĻŦ - "āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻĢāĻŋ"⧎
āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϝāĻĻāĻŋ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ (āϞ⧇āύāĻĻ⧇āύ āĻĒā§āϰāĻŽāĻžāϪ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡) āĻāĻ•āϟāĻŋ āĻŸā§āϰāĻžāĻ¨ā§āϏāĻĢāĻžāϰ āĻŸā§āϰāĻžāύāĻœā§āϝāĻžāĻ•āĻļāύ āφāχāĻĄāĻŋ āϏāĻš āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰāĻŋāϤ āϤāĻšāĻŦāĻŋāϞ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āύ, āϤāĻžāĻšāϞ⧇ āϤāĻŋāύāĻŋ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āϰāĻžāĻœā§āϝ⧇ {āϕ⧀: āĻ āĻŋāĻ•āĻžāύāĻž, āĻŽāĻžāύ:) āϞāĻŋāĻ–āϤ⧇ āĻĒāĻžāϰ⧇āύ āϏāĻ¤ā§āϝ}.

āĻāϰ āĻ…āĻ°ā§āĻĨ āĻšāĻŦ⧇ āϝ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻĒāĻŖā§āϝ āĻŦāĻž āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϤ⧇ āϤāĻžāĻĻ⧇āϰ āϏāĻĻāĻ¸ā§āϝāϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧇āϛ⧇āύāĨ¤ āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ⧇āϰ āĻŽā§‡āϝāĻŧāĻžāĻĻ āĻļ⧇āώ āĻšāϞ⧇, āϝ⧇āϕ⧋āύ⧋ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϰāĻžāĻœā§āϝ⧇ āϏāĻ‚āĻļā§āϞāĻŋāĻˇā§āϟ āϕ⧀-āĻāϰ āĻĒāĻžāĻļ⧇ āĻŽāĻžāύ āϏ⧇āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āĻŽāĻŋāĻĨā§āϝāĻž.

let subscriptionPeriod = 44000
let signature = tx.proofs[0]
let pk = tx.proofs[1]
let requiredAmount = 100000

#иСвĐģĐĩĐēаĐĩĐŧ иС Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸Đ¸ Đ°Đ´Ņ€Đĩҁ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ĐĩĐģŅ
let this = extract(tx.sender)
match tx {
   case d: DataTransaction =>
     #иСвĐģĐĩĐēаĐĩĐŧ Đ´Đ°Ņ‚Ņƒ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž ĐŋĐģĐ°Ņ‚ĐĩĐļа
     let lastPaymentHeight = extract(getInteger(this, d.data[0].key + "_lastPayment"))
     size(d.data) == 1 && d.data[0].value == "false" && lastPaymentHeight + subscriptionPeriod < height
     ||
     (
       let address = d.data[0].key

       #иСвĐģĐĩĐēаĐĩĐŧ Ņ‚Ņ€Đ°ĐŊҁ҄ĐĩŅ€-Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸ŅŽ ĐŋĐž ID, ҃ĐēаСаĐŊĐŊĐžĐŧ҃ в ĐŋŅ€ŅƒŅ„Đ°Ņ…
       let ttx = transactionById(d.proofs[0])
       
       size(d.data) == 2
           && d.data[0].value == "true"
           && d.data[1].key == address + "_lastPayment"
           && match ttx {
             case purchase : TransferTransaction =>
               d.data[1].value == transactionHeightById(purchase.id)
               && toBase58String(purchase.sender.bytes) == address
               && purchase.amount == requiredAmount
               && purchase.recipient == this
               #ŅƒĐąĐĩĐļдаĐĩĐŧŅŅ, Ņ‡Ņ‚Đž Đ°ŅŅĐĩŅ‚ waves
               && !isDefined(purchase.assetId)
         case _ => false
       }
     )
   case _ => false
}

āĻ­ā§‹āϟ

āĻŦā§āϞāĻ•āĻšā§‡āχāύ⧇ āĻ­ā§‹āϟ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāϤ⧇ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻšāϞ āĻ…ā§āϝāĻžāĻŽā§āĻŦāĻžāϏ⧇āĻĄāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āĻŽāĻ§ā§āϝ⧇ āϏ⧇āϰāĻž āĻ…ā§āϝāĻžāĻŽā§āĻŦāĻžāϏ⧇āĻĄāϰ āϰāĻŋāĻĒā§‹āĻ°ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻ­ā§‹āϟ āĻĻ⧇āĻ“āϝāĻŧāĻžāĨ¤ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝ āĻ­ā§‹āϟ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧāĨ¤

āĻāχ āωāĻĻāĻžāĻšāϰāϪ⧇, āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϝāĻžāϰāĻž āĻŦāĻŋāĻļ⧇āώ "āĻ­ā§‹āϟāĻŋāĻ‚" āĻŸā§‹āϕ⧇āύ āĻ•āĻŋāύ⧇āϛ⧇āύ āϤāĻžāĻĻ⧇āϰ āĻ­ā§‹āϟ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧāĨ¤ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀ āĻĒ⧇āϝāĻŧāĻžāϰ (āϕ⧀, āĻŽāĻžāύ) = (purchaseTransactionId, buyTransactionId) āϏāĻš āĻ…āĻ—ā§āϰāĻŋāĻŽ āĻāĻ•āϟāĻŋ āĻĄā§‡āϟāĻž āϞ⧇āύāĻĻ⧇āύ āĻĒāĻžāĻ āĻžāϝāĻŧāĨ¤ āĻāχ āϕ⧀āϟāĻŋāϰ āϜāĻ¨ā§āϝ āĻ…āĻ¨ā§āϝ āĻŽāĻžāύ āϏ⧇āϟ āĻ•āϰāĻž āύāĻŋāώāĻŋāĻĻā§āϧāĨ¤ āφāĻĒāύāĻžāϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻāĻŦāĻ‚ āĻ­ā§‹āϟ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āφāĻĒāύāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āĻŦāĻžāϰ DataEntry āϏ⧇āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽāϝāĻŧ⧇āϰ āĻŽāĻ§ā§āϝ⧇āχ āĻ­ā§‹āϟ āĻĻ⧇āĻ“āϝāĻŧāĻž āϏāĻŽā§āĻ­āĻŦāĨ¤

let asset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let address = addressFromPublicKey(tx.proofs[1])
let votingStartHeight = 2000
let votingEndHeight = 3000

#иСвĐģĐĩĐēаĐĩĐŧ иС Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸Đ¸ Đ°Đ´Ņ€Đĩҁ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ĐĩĐģŅ
let this = extract(tx.sender)
 match tx {
   case t: DataTransaction =>
     (height > votingStartHeight && height < votingEndHeight) &&
     #ŅƒĐąĐĩĐļдаĐĩĐŧŅŅ, Ņ‡Ņ‚Đž ҃ Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸Đ¸ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐ°Ņ ĐŋОдĐŋĐ¸ŅŅŒ
     sigVerify(tx.bodyBytes, tx.proofs[0], tx.proofs[1]) &&

     #ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩĐŧ, Ņ‡Ņ‚Đž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ ĐžŅ‚Đ´Đ°ĐĩŅ‚ ŅĐ˛ĐžĐš ĐŗĐžĐģĐžŅ ĐŊаĐŋŅ€ĐžŅ‚Đ¸Đ˛ ŅĐ˛ĐžĐĩĐŗĐž Đ°Đ´Ņ€ĐĩŅĐ°
     if (t.data[0].key == toBase58String(address.bytes))
     then (
       #иСвĐģĐĩĐēаĐĩĐŧ Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸ŅŽ ĐŋĐĩŅ€ĐĩвОд ĐŗĐžĐģĐžŅĐžĐ˛Đ°Ņ‚ĐĩĐģҌĐŊĐžĐŗĐž Ņ‚ĐžĐēĐĩĐŊа иС ĐŋŅ€ŅƒŅ„ĐžĐ˛
       let purchaseTx = transactionById(t.proofs[7])
       
       match purchaseTx {
         case purchase : TransferTransaction =>
           let correctSender = purchase.sender == t.sender
           let correctAsset = purchase.assetId == asset
           let correctPrice = purchase.amount == 1
           let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == t.id
           correctSender && correctAsset && correctPrice && correctProof
         case _ => false
       }
     )
     else
         size(t.data) == 1 && !isDefined(getBinary(this, t.data[0].key))
   case _ => false
}

āĻ•āĻ°ā§āϜāĻĒāĻ¤ā§āϰ

āĻāĻ•āϟāĻŋ āĻĒā§āϰāϤāĻŋāĻļā§āϰ⧁āϤāĻŋ āύ⧋āϟ āĻšāϞ āĻāĻ•āϟāĻŋ āϞāĻŋāĻ–āĻŋāϤ āĻŦāĻžāĻ§ā§āϝāĻŦāĻžāϧāĻ•āϤāĻž āϝāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻĒāĻ•ā§āώāϕ⧇ āĻ…āĻ¨ā§āϝ āĻĒāĻ•ā§āώāϕ⧇ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āϚāĻžāĻšāĻŋāĻĻāĻž āĻŦāĻž āĻĒā§‚āĻ°ā§āĻŦāύāĻŋāĻ°ā§āϧāĻžāϰāĻŋāϤ āϤāĻžāϰāĻŋāϖ⧇ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāϤ⧇ āĻšāϝāĻŧāĨ¤

āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻāĻžāĻšāϰāϪ⧇, āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋ, āϝāĻžāϰ āĻŽā§‡āϝāĻŧāĻžāĻĻ āĻļ⧇āώ āĻšāĻ“āϝāĻŧāĻžāϰ āϤāĻžāϰāĻŋāĻ–āϟāĻŋ āĻŦāĻŋāϞ⧇āϰ āĻ…āĻ°ā§āĻĨāĻĒā§āϰāĻĻāĻžāύ⧇āϰ āϤāĻžāϰāĻŋāϖ⧇āϰ āϏāĻžāĻĨ⧇ āĻŽāĻŋāϞ⧇ āϝāĻžāϝāĻŧāĨ¤

let expiration = 100000
let amount = 10
let asset =  base58'9jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
  
let Bob = Address(base58'3NBVqYXrapgJP9atQccdBPAgJPwHDKkh6A8')
let Alice = Address(base58'3PNX6XwMeEXaaP1rf5MCk8weYeF7z2vJZBg')
  
match tx {
    case t: TransferTransaction =>
        (t.assetId == asset)&&      
        (t.amount == amount)&&       
        (t.sender == Bob)&&
        (t.recipient == Alice)&&
        (sigVerify(t.bodyBytes, t.proofs[0], t.senderPublicKey))&&
        (height >= expiration)
    case _ => false
}

āφāĻŽāĻžāύāϤ

āφāĻŽāĻžāύāϤ āĻšāϞ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻļāĻ°ā§āϤ⧇ (āĻŽā§‡āϝāĻŧāĻžāĻĻ, āϏ⧁āĻĻ) āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻžāĻ™ā§āϕ⧇ āϤāĻšāĻŦāĻŋāϞ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻžāĨ¤
āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻāĻžāĻšāϰāϪ⧇, āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻžāĻ™ā§āϕ⧇āϰ āĻ•āĻžāϜ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻĻā§āĻŦāĻžāϰāĻž āϏāĻžā§āϚāĻžāϞāĻŋāϤ āĻšāϝāĻŧāĨ¤ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻ‚āĻ–ā§āϝāĻ• āĻŦā§āϞāϕ⧇āϰ āĻĒāϰ⧇, āϝāĻž āφāĻŽāĻžāύāϤ⧇āϰ āϏāĻŽāϝāĻŧ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝāĻĒā§‚āĻ°ā§āĻŖ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϤāĻžāĻĻ⧇āϰ āĻ…āĻ°ā§āĻĨ āϏ⧁āĻĻ⧇āϰ āϏāĻžāĻĨ⧇ āĻĢ⧇āϰāϤ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟāϟāĻŋ āĻŦā§āϞāϕ⧇āϰ āωāĻšā§āϚāϤāĻž (āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āωāĻšā§āϚāϤāĻž) āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰ⧇, āϝ⧇āĻ–āĻžāύ⧇ āĻĒ⧌āρāĻ›āĻžāύ⧋āϰ āĻĒāϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻĨ⧇āϕ⧇ āϟāĻžāĻ•āĻž āϤ⧁āϞāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

heightUnit - āϏāĻŽāϝāĻŧ⧇āϰ āĻāĻ• āχāωāύāĻŋāĻŸā§‡ āĻŦā§āϞāϕ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž (āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻŽāĻžāϏ, āĻŦāĻ›āϰ, āχāĻ¤ā§āϝāĻžāĻĻāĻŋ)āĨ¤ āĻĒā§āϰāĻĨāĻŽā§‡ āφāĻŽāϰāĻž āĻĒ⧇āϝāĻŧāĻžāϰ (āϕ⧀, āĻŽāĻžāύ) = (āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āĻŸā§āϰāĻžāĻ¨ā§āϏāĻĢāĻžāϰ āĻŸā§āϰāĻžāύāĻœā§‡āĻ•āĻļāύ, āĻĢāĻŋāωāϚāĻžāϰ āĻĄā§‡āϟāĻž āĻŸā§āϰāĻžāύāĻœā§‡āĻ•āĻļāύ) āĻĻāĻŋāϝāĻŧ⧇ āĻāĻ•āϟāĻŋ āĻāĻ¨ā§āĻŸā§āϰāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻŋāĨ¤ āϤāĻžāϰāĻĒāϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āφāĻŽāĻžāύāϤ⧇āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻāĻŦāĻ‚ āφāĻŽāĻžāύāϤ⧇āϰ āϏāĻŽāϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āĻ…āĻ°ā§āϜāĻŋāϤ āϏ⧁āĻĻ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϏāĻ āĻŋāĻ• āϤāĻĨā§āϝ āϏāĻš āĻāĻ•āϟāĻŋ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰ āϞ⧇āύāĻĻ⧇āύ āϜāĻŽāĻž āĻĻāĻŋāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻāχ āϤāĻĨā§āϝāϟāĻŋ āφāϏāϞ āĻŸā§āϰāĻžāĻ¨ā§āϏāĻĢāĻžāϰ āĻŸā§āϰāĻžāύāĻœā§āϝāĻžāĻ•āĻļāύ⧇āϰ āĻŦāĻŋāϰ⧁āĻĻā§āϧ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āĻšāϝāĻŧ, āϝāĻž āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻŸā§āϰāĻžāĻ¨ā§āϏāĻĢāĻžāϰ āĻŸā§āϰāĻžāύāĻœā§āϝāĻžāĻ•āĻļāύ āĻĒā§āϰāĻŽāĻžāϪ⧇ āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āĻĄāĻŋāĻĒā§‹āϜāĻŋāϟ āĻĄāĻŋāĻ­āĻžāχāϜāĻžāϰ āĻšāϞ āĻĄāĻŋāĻĒā§‹āϜāĻŋāϟ āĻļ⧇āϝāĻŧāĻžāϰ⧇āϰ āĻŦāĻŋāĻĒāϰ⧀āϤ āϏāĻ‚āĻ–ā§āϝāĻž (āϝāĻĻāĻŋ āĻĄāĻŋāĻĒā§‹āϜāĻŋāϟ 10% āĻ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ, āĻĄāĻŋāĻĒā§‹āϜāĻŋāϟ āĻļ⧇āϝāĻŧāĻžāϰ 0,1 āĻāĻŦāĻ‚ āĻĄāĻŋāĻĒā§‹āϜāĻŋāϟ āĻĄāĻŋāĻ­āĻŋāϏāĻžāϰ = 1/0,1 = 10)āĨ¤

let this = extract(tx.sender)
let depositDivisor = 10
let heightUnit = 1000
let finalHeight = 100000
 match tx {
   case e : TransferTransaction =>
     #иСвĐģĐĩĐēаĐĩĐŧ Đ˛Ņ‹ŅĐžŅ‚Ņƒ Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸Đ¸ ĐŋĐž ID Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸Đ¸ в ҁĐĩĐ´ŅŒĐŧĐžĐŧ ĐŋŅ€ŅƒŅ„Đĩ  
     let depositHeight = extract(transactionHeightById(e.proofs[7]))

     #иСвĐģĐĩĐēаĐĩĐŧ Ņ‚Ņ€Đ°ĐŊСаĐēŅ†Đ¸ŅŽ Đ´ĐĩĐŋĐžĐˇĐ¸Ņ‚Đ°
     let purchaseTx = transactionById(e.proofs[7])    
     match purchaseTx {
       case deposit : TransferTransaction =>
         let correctSender = deposit.sender == e.sender
         #ŅƒĐąĐĩĐļдаĐĩĐŧŅŅ, Ņ‡Ņ‚Đž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ ĐŋĐĩŅ€ĐĩĐ˛ĐžĐ´Đ¸Ņ‚ ҁĐĩĐąĐĩ ĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊŅƒŅŽ ҁ҃ĐŧĐŧ҃ Đ´ĐĩĐŋĐžĐˇĐ¸Ņ‚Đ° + ĐŋŅ€ĐžŅ†ĐĩĐŊ҂ҋ
         let correctAmount = deposit.amount + deposit.amount / depositDivisor * (height - depositHeight) / heightUnit == e.amount
         let correctProof = extract(getBinary(this, toBase58String(deposit.id))) == e.id
         correctSender && correctProof && correctAmount
       case _ => false
     }
     && finalHeight <= height 
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

āĻāχ āϏāĻŋāϰāĻŋāĻœā§‡āϰ āϤ⧃āϤ⧀āϝāĻŧ āĻāĻŦāĻ‚ āĻļ⧇āώ āĻĒā§āϰāĻŦāĻ¨ā§āϧ⧇, āφāĻŽāϰāĻž āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ āĻŋāĻ•āĻžāύāĻžāϰ āϜāĻ¨ā§āϝ āĻšāĻŋāĻŽāĻžāϝāĻŧāĻŋāϤ āĻ•āϰāĻž āĻāĻŦāĻ‚ āϞ⧇āύāĻĻ⧇āύ āϏ⧀āĻŽāĻŋāϤ āĻ•āϰāĻž āϏāĻš āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āϏāĻŽā§āĻĒāĻĻ⧇āϰ āφāϰāĻ“ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻĻ⧇āĻ–āĻŦāĨ¤

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster