āĻ“āĻ¯āĻŧā§‡āĻ­āĻ¸ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ—: āĻ¨āĻŋāĻ˛āĻžāĻŽ āĻĨā§‡āĻ•ā§‡ āĻŦā§‹āĻ¨āĻžāĻ¸ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤

āĻ“āĻ¯āĻŧā§‡āĻ­āĻ¸ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ—: āĻ¨āĻŋāĻ˛āĻžāĻŽ āĻĨā§‡āĻ•ā§‡ āĻŦā§‹āĻ¨āĻžāĻ¸ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤

āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ‡ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‹āĻ•āĻžāĻ°ā§‡āĻ¨ā§āĻ¸āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§āĻ•ā§āĻ¤ āĻĨāĻžāĻ•ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻĄāĻŋāĻāĻ˛āĻŸāĻŋ āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ—ā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋ āĻ…āĻ¨ā§‡āĻ• āĻŦāĻŋāĻ¸ā§āĻ¤ā§ƒāĻ¤āĨ¤ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻļā§āĻ°ā§āĻ¤āĻŋāĻļā§€āĻ˛ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻšāĻ˛ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻšā§āĻ•ā§āĻ¤āĻŋ āĻ¯āĻž āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻāĻ¤ā§‡ āĻĒā§āĻ°āĻŦā§‡āĻļāĻ•āĻžāĻ°ā§€ āĻĒāĻ•ā§āĻˇāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻŦāĻŋāĻļā§āĻŦāĻžāĻ¸ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ¯āĻŧ āĻ¨āĻžāĨ¤

RIDE – āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻšā§āĻ•ā§āĻ¤āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻˇāĻž

āĻ“āĻ¯āĻŧā§‡āĻ­āĻ¸ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻšā§āĻ•ā§āĻ¤āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§‡āĻˇ āĻ­āĻžāĻˇāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĻ›ā§‡ – RIDEāĨ¤ āĻ¤āĻžāĻ° āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĄāĻ•ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨ āĻ…āĻŦāĻ¸ā§āĻĨāĻŋāĻ¤ āĻāĻ–āĻžāĻ¨ā§‡. āĻāĻŦāĻ‚ āĻāĻ–āĻžāĻ¨ā§‡ - āĻāĻ‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ āĻšāĻžāĻŦāĻ°ā§‡āĻ° āĻ‰āĻĒāĻ°āĨ¤

RIDE āĻšā§āĻ•ā§āĻ¤āĻŋ āĻāĻ•āĻŸāĻŋ āĻĒā§‚āĻ°ā§āĻŦāĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻ• āĻāĻŦāĻ‚ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ "āĻ¸āĻ¤ā§āĻ¯" āĻŦāĻž "āĻŽāĻŋāĻĨā§āĻ¯āĻž" āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻ¤āĻĻāĻ¨ā§āĻ¸āĻžāĻ°ā§‡, āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻšāĻ¯āĻŧ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻŦāĻž āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻ–ā§āĻ¯āĻžāĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻšā§āĻ•ā§āĻ¤āĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ°ā§‚āĻĒā§‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻļāĻ°ā§āĻ¤ āĻĒā§‚āĻ°āĻŖā§‡āĻ° āĻ—ā§āĻ¯āĻžāĻ°āĻžāĻ¨ā§āĻŸāĻŋ āĻĻā§‡āĻ¯āĻŧāĨ¤ RIDE-āĻ āĻāĻ•āĻŸāĻŋ āĻšā§āĻ•ā§āĻ¤āĻŋ āĻĨā§‡āĻ•ā§‡ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§‡ āĻ¸āĻŽā§āĻ­āĻŦ āĻ¨āĻ¯āĻŧā§ˇ

āĻ†āĻœ āĻĻā§āĻŸāĻŋ āĻ§āĻ°āĻŖā§‡āĻ° āĻ“āĻ¯āĻŧā§‡āĻ­āĻ¸ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻšā§āĻ•ā§āĻ¤āĻŋ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡: āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻāĻŦāĻ‚ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻ¸āĻŽā§āĻĒāĻĻāĨ¤ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻŋāĻ¤ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻ†āĻ›ā§‡ āĻ¯āĻž āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻ•āĻ°ā§‡āĨ¤ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻāĻ‡ āĻŽāĻ¤ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ:

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

tx āĻāĻ•āĻŸāĻŋ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡ āĻ¯āĻž āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨ āĻŽā§āĻ¯āĻžāĻšāĻŋāĻ‚ āĻŽā§‡āĻ•āĻžāĻ¨āĻŋāĻœāĻŽ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻāĻŋāĻ‡ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¯āĻĻāĻŋ āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ¨āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ°āĻžāĻ‡āĻĄā§‡ āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨ āĻŽā§āĻ¯āĻžāĻšāĻŋāĻ‚ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ā§‡āĻ° āĻ§āĻ°āĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻ—ā§āĻ˛āĻŋ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‡ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ā§‡āĻ° āĻ§āĻ°āĻ¨.

āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻ˜ā§‹āĻˇāĻŖāĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, "āĻ¯āĻĻāĻŋ-āĻ¤āĻžāĻšāĻ˛ā§‡-āĻ…āĻ¨ā§āĻ¯āĻĨāĻžāĻ¯āĻŧ" āĻ—āĻ āĻ¨ āĻāĻŦāĻ‚ āĻļāĻ°ā§āĻ¤āĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ°ā§‚āĻĒā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻšā§āĻ•ā§āĻ¤āĻŋāĻ° āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ¤āĻž āĻāĻŦāĻ‚ āĻœāĻŸāĻŋāĻ˛āĻ¤āĻž (āĻ–āĻ°āĻš) āĻ¯āĻž āĻšā§āĻ•ā§āĻ¤āĻŋ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻļā§āĻ°ā§ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻ†āĻ—ā§‡ āĻ…āĻ¨ā§āĻŽāĻžāĻ¨ āĻ•āĻ°āĻž āĻ¸āĻšāĻœ āĻ¤āĻž āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, RIDE-āĻ āĻ˛ā§āĻĒ āĻŦāĻž āĻœāĻžāĻŽā§āĻĒ āĻ¸ā§āĻŸā§‡āĻŸāĻŽā§‡āĻ¨ā§āĻŸ āĻ¨ā§‡āĻ‡āĨ¤

āĻ“āĻ¯āĻŧā§‡āĻ­āĻ¸ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻ—ā§āĻ˛āĻŋāĻ° āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ "āĻ°āĻžāĻˇā§āĻŸā§āĻ°" āĻ…āĻ°ā§āĻĨāĻžā§Ž āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡āĻ° āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ° āĻ‰āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻĄā§‡āĻŸāĻž āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ (āĻĄā§‡āĻŸāĻž āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨) āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡āĻ° āĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ¤ā§‡ āĻ…āĻ¸ā§€āĻŽ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻ• āĻœā§‹āĻĄāĻŧāĻž (āĻ•ā§€, āĻŽāĻžāĻ¨) āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ āĻāĻ‡ āĻ¤āĻĨā§āĻ¯āĻŸāĻŋ REST API āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻāĻŦāĻ‚ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻšā§āĻ•ā§āĻ¤āĻŋāĻ¤ā§‡ āĻ‰āĻ­āĻ¯āĻŧ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ā§‡ āĻĒā§āĻ°āĻŽāĻžāĻŖā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ°ā§‡ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ¯āĻžāĻ¤ā§‡ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€āĻ° āĻ¸ā§āĻŦāĻžāĻ•ā§āĻˇāĻ°, āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ā§‡āĻ° āĻ†āĻ‡āĻĄāĻŋ, āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

RIDE āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻž āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻšā§āĻ•ā§āĻ¤āĻŋāĻ° āĻ¸āĻ‚āĻ•āĻ˛āĻŋāĻ¤ āĻĻā§ƒāĻļā§āĻ¯ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ (āĻ¯āĻĻāĻŋ āĻāĻŸāĻŋ āĻ¸āĻ‚āĻ•āĻ˛āĻŋāĻ¤ āĻšāĻ¯āĻŧ), āĻ¨āĻ¤ā§āĻ¨ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡, āĻ¸ā§‡āĻ‡āĻ¸āĻžāĻĨā§‡ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻ‡āĻ¨ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻĒāĻžāĻ āĻžāĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤

āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž, āĻāĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻšā§āĻ•ā§āĻ¤āĻŋ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž āĻāĻŦāĻ‚ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻ•ā§āĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻŋ REST API āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ…ā§āĻ¯āĻžāĻ•ā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ“ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, C#, C, Java, JavaScript, Python, Rust, Elixir) . IDE āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻļā§āĻ°ā§ āĻ•āĻ°āĻ¤ā§‡, āĻļā§āĻ§ā§ āĻ¨āĻ¤ā§āĻ¨ āĻŦā§‹āĻ¤āĻžāĻŽā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°ā§āĻ¨āĨ¤

āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻ•āĻ¨ā§āĻŸā§āĻ°āĻžāĻ•ā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽā§āĻ­āĻžāĻŦāĻ¨āĻž āĻŦāĻŋāĻ¸ā§āĻ¤ā§ƒāĻ¤: āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ āĻŋāĻ•āĻžāĻ¨āĻžāĻ¯āĻŧ ("āĻ•āĻžāĻ˛ā§‹ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž") āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ¨āĻŋāĻˇāĻŋāĻĻā§āĻ§ āĻ•āĻ°āĻž āĻĨā§‡āĻ•ā§‡ āĻœāĻŸāĻŋāĻ˛ dApps āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤āĨ¤

āĻāĻ–āĻ¨ āĻ†āĻ¸ā§āĻ¨ āĻŦā§āĻ¯āĻŦāĻ¸āĻžāĻ¯āĻŧ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻšā§āĻ•ā§āĻ¤āĻŋāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻŋ: āĻ¯āĻ–āĻ¨ āĻ¨āĻŋāĻ˛āĻžāĻŽ, āĻŦā§€āĻŽāĻž āĻāĻŦāĻ‚ āĻ†āĻ¨ā§āĻ—āĻ¤ā§āĻ¯ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤

āĻ¨āĻŋāĻ˛āĻžāĻŽ

āĻāĻ•āĻŸāĻŋ āĻ¸āĻĢāĻ˛ āĻ¨āĻŋāĻ˛āĻžāĻŽā§‡āĻ° āĻļāĻ°ā§āĻ¤āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻšāĻ˛ āĻ¸ā§āĻŦāĻšā§āĻ›āĻ¤āĻž: āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ†āĻ¤ā§āĻŽāĻŦāĻŋāĻļā§āĻŦāĻžāĻ¸ā§€ āĻšāĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯ā§‡ āĻŦāĻŋāĻĄāĻ—ā§āĻ˛āĻŋ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°āĻž āĻ…āĻ¸āĻŽā§āĻ­āĻŦāĨ¤ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŸāĻŋ āĻ…āĻ°ā§āĻœāĻ¨ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŦāĻžāĻœāĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ…āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§€āĻ¯āĻŧ āĻĄā§‡āĻŸāĻž āĻāĻŦāĻ‚ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻĨāĻžāĻ•āĻŦā§‡āĨ¤

āĻ“āĻ¯āĻŧā§‡āĻ­āĻ¸ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡, āĻĄā§‡āĻŸāĻž āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ¨āĻŋāĻ˛āĻžāĻŽ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡āĻ° āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¯āĻŧ āĻŦāĻŋāĻĄ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ†āĻĒāĻ¨āĻŋ āĻŦā§āĻ˛āĻ• āĻ¨āĻŽā§āĻŦāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¨āĻŋāĻ˛āĻžāĻŽā§‡āĻ° āĻļā§āĻ°ā§ āĻāĻŦāĻ‚ āĻļā§‡āĻˇ āĻ¸āĻŽāĻ¯āĻŧāĻ“ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨: āĻ“āĻ¯āĻŧā§‡āĻ­āĻ¸ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡ āĻŦā§āĻ˛āĻ• āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻļāĻ¨ā§‡āĻ° āĻĢā§āĻ°āĻŋāĻ•ā§‹āĻ¯āĻŧā§‡āĻ¨ā§āĻ¸āĻŋ āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻ¸āĻŽāĻžāĻ¨ 60 āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄ

1. āĻ‡āĻ‚āĻ°ā§‡āĻœāĻŋ āĻ†āĻ°ā§‹āĻšā§€ āĻŽā§‚āĻ˛ā§āĻ¯ āĻ¨āĻŋāĻ˛āĻžāĻŽ

āĻāĻ•āĻŸāĻŋ āĻ‡āĻ‚āĻ°ā§‡āĻœāĻŋ āĻ¨āĻŋāĻ˛āĻžāĻŽā§‡ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€āĻ°āĻž āĻāĻ•ā§‡ āĻ…āĻĒāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻ¯āĻŧ āĻŦāĻŋāĻĄ āĻ•āĻ°ā§‡āĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻŦāĻžāĻœāĻŋ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§€ āĻāĻ• āĻ…āĻ¤āĻŋāĻ•ā§āĻ°āĻŽ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡. āĻ¨āĻŋāĻ˛āĻžāĻŽ āĻļā§‡āĻˇ āĻšāĻ¯āĻŧ āĻ¯āĻ–āĻ¨ āĻļā§‡āĻˇ āĻŦāĻŋāĻĄ āĻ…āĻ¤āĻŋāĻ•ā§āĻ°āĻŽ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻ° āĻ•ā§‹āĻ¨ āĻŦāĻŋāĻĄāĻžāĻ° āĻĨāĻžāĻ•ā§‡ āĻ¨āĻžāĨ¤ āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ¸āĻ°ā§āĻŦā§‹āĻšā§āĻš āĻĻāĻ°āĻĻāĻžāĻ¤āĻžāĻ•ā§‡ āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–āĻŋāĻ¤ āĻĒāĻ°āĻŋāĻŽāĻžāĻŖ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ˛āĻžāĻŽ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻŦāĻŋāĻ•ā§āĻ°ā§‡āĻ¤āĻž āĻ˛āĻŸā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ°ā§āĻŦāĻ¨āĻŋāĻŽā§āĻ¨ āĻŽā§‚āĻ˛ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻŽā§‚āĻ˛ā§āĻ¯ āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻāĻŸāĻŋ āĻ…āĻ¤āĻŋāĻ•ā§āĻ°āĻŽ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ…āĻ¨ā§āĻ¯āĻĨāĻžāĻ¯āĻŧ, āĻ˛āĻŸ āĻ…āĻŦāĻŋāĻ•ā§āĻ°āĻŋāĻ¤ āĻĨā§‡āĻ•ā§‡ āĻ¯āĻžāĻ¯āĻŧāĨ¤

āĻāĻ‡ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖā§‡, āĻ†āĻŽāĻ°āĻž āĻ¨āĻŋāĻ˛āĻžāĻŽā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻŋāĻļā§‡āĻˇāĻ­āĻžāĻŦā§‡ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻ›āĻŋāĨ¤ āĻ¨āĻŋāĻ˛āĻžāĻŽā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧāĻ•āĻžāĻ˛ 3000 āĻŦā§āĻ˛āĻ•, āĻāĻŦāĻ‚ āĻ˛āĻŸā§‡āĻ° āĻĒā§āĻ°āĻžāĻ°āĻŽā§āĻ­āĻŋāĻ• āĻŽā§‚āĻ˛ā§āĻ¯ āĻšāĻ˛ 0,001 āĻ“āĻ¯āĻŧā§‡āĻ­āĻ¸āĨ¤ āĻāĻ•āĻœāĻ¨ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€ āĻ•ā§€ "āĻŽā§‚āĻ˛ā§āĻ¯" āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻŦāĻŋāĻĄā§‡āĻ° āĻŽā§‚āĻ˛ā§āĻ¯ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻĄā§‡āĻŸāĻž āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻĒāĻžāĻ āĻŋāĻ¯āĻŧā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻĄ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

āĻ¨āĻ¤ā§āĻ¨ āĻŦāĻŋāĻĄā§‡āĻ° āĻŽā§‚āĻ˛ā§āĻ¯ āĻāĻ‡ āĻ•ā§€āĻŸāĻŋāĻ° āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻŽā§‚āĻ˛ā§āĻ¯ā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻŦā§‡āĻļāĻŋ āĻšāĻ¤ā§‡ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€āĻ° āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ¤āĻžāĻ° āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡ āĻ•āĻŽāĻĒāĻ•ā§āĻˇā§‡ [āĻ¨āĻ¤ā§āĻ¨_āĻŦāĻŋāĻĄ + āĻ•āĻŽāĻŋāĻļāĻ¨] āĻŸā§‹āĻ•ā§‡āĻ¨ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻĻāĻ°āĻĻāĻžāĻ¤āĻžāĻ° āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻĄā§‡āĻŸāĻž āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ā§‡āĻ° "āĻĒā§āĻ°ā§‡āĻ°āĻ•" āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ¨āĻĨāĻŋāĻ­ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻŦāĻŋāĻĄ āĻŦā§āĻ˛āĻ•ā§‡āĻ° āĻ‰āĻšā§āĻšāĻ¤āĻž āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ¨āĻŋāĻ˛āĻžāĻŽ āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻšāĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

āĻ¯āĻĻāĻŋ āĻ¨āĻŋāĻ˛āĻžāĻŽā§‡āĻ° āĻļā§‡āĻˇā§‡ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€ āĻ¸āĻ°ā§āĻŦā§‹āĻšā§āĻš āĻŽā§‚āĻ˛ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°ā§‡ āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ¸ā§‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻŽā§‚āĻ˛ā§āĻ¯ āĻāĻŦāĻ‚ āĻŽā§āĻĻā§āĻ°āĻž āĻœā§‹āĻĄāĻŧāĻžāĻ¯āĻŧ āĻ¸āĻ‚āĻļā§āĻ˛āĻŋāĻˇā§āĻŸ āĻ˛āĻŸā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ°ā§āĻĨ āĻĒā§āĻ°āĻĻāĻžāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻāĻ•ā§āĻ¸āĻšā§‡āĻžā§āĻœ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻĒāĻžāĻ āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

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. āĻĻāĻžāĻŽ āĻ•āĻŽāĻžāĻ° āĻĄāĻžāĻš āĻ¨āĻŋāĻ˛āĻžāĻŽ

āĻāĻ•āĻŸāĻŋ āĻĄāĻžāĻš āĻ¨āĻŋāĻ˛āĻžāĻŽā§‡, āĻ•ā§āĻ°ā§‡āĻ¤āĻž āĻ¯āĻž āĻĻāĻŋāĻ¤ā§‡ āĻ‡āĻšā§āĻ›ā§āĻ• āĻ¤āĻžāĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻŦā§‡āĻļāĻŋ āĻĻāĻžāĻŽā§‡ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻ…āĻ¨ā§‡āĻ• āĻ•āĻŋāĻ›ā§ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧāĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—ā§€āĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻœāĻ¨ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻŽā§‚āĻ˛ā§āĻ¯ā§‡ āĻ˛āĻŸ āĻ•āĻŋāĻ¨āĻ¤ā§‡ āĻ¸āĻŽā§āĻŽāĻ¤ āĻ¨āĻž āĻšāĻ“āĻ¯āĻŧāĻž āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻĻāĻžāĻŽ āĻ§āĻžāĻĒā§‡ āĻ§āĻžāĻĒā§‡ āĻ•āĻŽāĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧāĨ¤

āĻāĻ‡ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖā§‡ āĻ†āĻŽāĻ°āĻž āĻ†āĻ—ā§‡āĻ°āĻŸāĻŋāĻ° āĻŽāĻ¤ā§‹ āĻāĻ•āĻ‡ āĻ§ā§āĻ°ā§āĻŦāĻ• āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ, āĻ¸ā§‡āĻ‡āĻ¸āĻžāĻĨā§‡ āĻĄā§‡āĻ˛ā§āĻŸāĻž āĻ•āĻŽā§‡ āĻ—ā§‡āĻ˛ā§‡ āĻĻāĻžāĻŽā§‡āĻ° āĻ§āĻžāĻĒāĨ¤ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻšā§‡āĻ• āĻ•āĻ°ā§‡ āĻ¯ā§‡ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€ āĻ†āĻ¸āĻ˛ā§‡āĻ‡ āĻĒā§āĻ°āĻĨāĻŽ āĻŦāĻžāĻœāĻŋ āĻ°ā§‡āĻ–ā§‡āĻ›ā§‡ āĻ•āĻŋāĻ¨āĻžāĨ¤ āĻ…āĻ¨ā§āĻ¯āĻĨāĻžāĻ¯āĻŧ, āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĄā§‡āĻŸāĻž āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻžāĨ¤

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. āĻ¨āĻŋāĻ˛āĻžāĻŽ "āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŦā§‡āĻ¤āĻ¨"

"āĻ…āĻ˛-āĻĒā§‡" āĻšāĻ˛ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ˛āĻžāĻŽ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ¸āĻ•āĻ˛ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€āĻ°āĻž āĻŦāĻŋāĻĄ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡, āĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻŦāĻŋāĻļā§‡āĻˇā§‡ āĻ¯ā§‡ āĻ˛āĻŸ āĻœāĻŋāĻ¤ā§āĻ•āĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻĄ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ¯ā§‡ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€ āĻ¸āĻ°ā§āĻŦāĻžāĻ§āĻŋāĻ• āĻŦāĻŋāĻĄ āĻ•āĻ°ā§‡ āĻ¸ā§‡ āĻ˛āĻŸ āĻœāĻŋāĻ¤ā§‡āĨ¤

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖā§‡, āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¨āĻŋāĻ˛āĻžāĻŽ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€ (āĻ•ā§€, āĻŽāĻžāĻ¨)* = (“āĻŦāĻŋāĻœāĻ¯āĻŧā§€â€, āĻ āĻŋāĻ•āĻžāĻ¨āĻž), (“āĻŽā§‚āĻ˛ā§āĻ¯â€, āĻŽā§‚āĻ˛ā§āĻ¯) āĻ¸āĻš āĻĄā§‡āĻŸāĻž āĻŸā§āĻ°āĻžāĻ¨āĻœā§āĻ¯āĻžāĻ•āĻļāĻ¨ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻĄ āĻ°āĻžāĻ–ā§‡āĨ¤ āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻĄā§‡āĻŸāĻž āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¯āĻĻāĻŋ āĻāĻ‡ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€āĻ° āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻ¤āĻžāĻ° āĻ¸ā§āĻŦāĻžāĻ•ā§āĻˇāĻ° āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻĨāĻžāĻ•ā§‡ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ° āĻŦāĻŋāĻĄāĻŸāĻŋ āĻ†āĻ—ā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤āĻ—ā§āĻ˛āĻŋāĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻŦā§‡āĻļāĻŋ āĻšāĻ¯āĻŧā§ˇ āĻ¨āĻŋāĻ˛āĻžāĻŽ āĻļā§‡āĻˇ āĻ‰āĻšā§āĻšāĻ¤āĻžāĻ¯āĻŧ āĻĒā§ŒāĻāĻ›āĻžāĻ¨ā§‹ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻšāĻ˛āĻ¤ā§‡ āĻĨāĻžāĻ•ā§‡āĨ¤

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)
}

āĻŦā§€āĻŽāĻž / āĻ•ā§āĻ°āĻžāĻ‰āĻĄāĻĢāĻžāĻ¨ā§āĻĄāĻŋāĻ‚

āĻ†āĻ¸ā§āĻ¨ āĻāĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°āĻŋ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ†āĻ°ā§āĻĨāĻŋāĻ• āĻ•ā§āĻˇāĻ¤āĻŋāĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ¸āĻŽā§āĻĒāĻĻā§‡āĻ° āĻŦā§€āĻŽāĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻāĻ•āĻœāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻāĻ•āĻŸāĻŋ āĻ—ā§āĻ¯āĻžāĻ°āĻžāĻ¨ā§āĻŸāĻŋ āĻšāĻžāĻ¨ āĻ¯ā§‡ āĻ¯āĻĻāĻŋ āĻāĻ•āĻŸāĻŋ āĻŸā§‹āĻ•ā§‡āĻ¨ā§‡āĻ° āĻ…āĻŦāĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨ āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ¤āĻŋāĻ¨āĻŋ āĻāĻ‡ āĻŸā§‹āĻ•ā§‡āĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻĻāĻ¤ā§āĻ¤ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ…āĻ°ā§āĻĨ āĻĢā§‡āĻ°āĻ¤ āĻĒā§‡āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻŦā§‡āĻ¨ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ¸āĻ™ā§āĻ—āĻ¤ āĻĒāĻ°āĻŋāĻŽāĻžāĻŖ āĻŦā§€āĻŽāĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻ‡āĻšā§āĻ›ā§āĻ•āĨ¤

āĻāĻŸāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯, "āĻŦā§€āĻŽāĻž āĻŸā§‹āĻ•ā§‡āĻ¨" āĻœāĻžāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ¤āĻžāĻ°āĻĒāĻ°ā§‡ āĻĒāĻ˛āĻŋāĻ¸āĻŋāĻ§āĻžāĻ°āĻ•ā§‡āĻ° āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¯āĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¸ā§‡āĻ‡ āĻāĻ•ā§āĻ¸āĻšā§‡āĻžā§āĻœ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧ āĻ¯āĻž āĻ•āĻŋāĻ›ā§ āĻļāĻ°ā§āĻ¤ āĻĒā§‚āĻ°āĻŖ āĻ•āĻ°ā§‡āĨ¤

āĻĻā§āĻŦāĻŋāĻ—ā§āĻŖ āĻ–āĻ°āĻš āĻ°ā§‹āĻ§ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ•ā§‡ (āĻ•ā§€, āĻŽāĻžāĻ¨) = (purchaseTransactionId, sellOrderId) āĻĻāĻŋāĻ¯āĻŧā§‡ āĻĒāĻ˛āĻŋāĻ¸āĻŋāĻ§āĻžāĻ°āĻ•ā§‡āĻ° āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡ āĻāĻ•āĻŸāĻŋ āĻĄā§‡āĻŸāĻž āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ†āĻ—ā§‡ āĻĨā§‡āĻ•ā§‡ āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻ•ā§€ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻĄā§‡āĻŸāĻž āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻ¨āĻŋāĻˇāĻŋāĻĻā§āĻ§ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

āĻ…āĻ¤āĻāĻŦ, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻĒā§āĻ°āĻŽāĻžāĻŖāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻŦā§€āĻŽāĻž āĻŸā§‹āĻ•ā§‡āĻ¨ āĻ•ā§āĻ°āĻ¯āĻŧā§‡āĻ° āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ†āĻ‡āĻĄāĻŋ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ•ā§āĻ°āĻ¯āĻŧ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ā§‡āĻ° āĻŽāĻ¤ā§‹ āĻŽā§āĻĻā§āĻ°āĻž āĻœā§‹āĻĄāĻŧāĻž āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻāĻ•āĻ‡ āĻšāĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ–āĻ°āĻšāĻŸāĻŋ āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ•ā§āĻ°āĻ¯āĻŧā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŋāĻ¤ āĻšāĻ“āĻ¯āĻŧāĻž āĻ¸āĻŽāĻžāĻ¨ āĻšāĻ¤ā§‡ āĻšāĻŦā§‡, āĻŦāĻŋāĻŽāĻž āĻŽā§‚āĻ˛ā§āĻ¯ āĻŦāĻŋāĻ¯āĻŧā§‹āĻ— āĻ•āĻ°ā§‡āĨ¤

āĻāĻŸāĻŋ āĻŦā§‹āĻāĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¯ā§‡ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€āĻ¤ā§‡ āĻŦā§€āĻŽāĻž āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻŦā§€āĻŽāĻž āĻŸā§‹āĻ•ā§‡āĻ¨āĻ—ā§āĻ˛āĻŋ āĻ•āĻŋāĻ¨ā§‡ āĻ¨ā§‡āĻ¯āĻŧ āĻ¯ā§‡ āĻĻāĻžāĻŽā§‡ āĻ¸ā§‡ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻ•āĻŋāĻ¨ā§‡āĻ›āĻŋāĻ˛ āĻ¤āĻžāĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻ•āĻŽ āĻ¨āĻ¯āĻŧ: āĻŦā§€āĻŽāĻž āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻāĻ•āĻŸāĻŋ āĻāĻ•ā§āĻ¸āĻšā§‡āĻžā§āĻœ āĻŸā§āĻ°āĻžāĻ¨āĻœā§‡āĻ•āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ…āĻ°ā§āĻĄāĻžāĻ°ā§‡ āĻ¸ā§āĻŦāĻžāĻ•ā§āĻˇāĻ° āĻ•āĻ°ā§‡ (āĻ¯āĻĻāĻŋ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨āĻŸāĻŋ āĻ¸āĻ āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšāĻ¯āĻŧ), āĻŦā§€āĻŽāĻž āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻ…āĻ°ā§āĻĄāĻžāĻ° āĻāĻŦāĻ‚ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ¸ā§āĻŦāĻžāĻ•ā§āĻˇāĻ° āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡ āĻĒāĻžāĻ āĻžāĻ¯āĻŧāĨ¤

āĻ¯āĻĻāĻŋ āĻ•ā§‹āĻ¨ āĻ•ā§āĻ°āĻ¯āĻŧ āĻ¨āĻž āĻšāĻ¯āĻŧ, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‡ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§€ āĻāĻ•āĻŸāĻŋ āĻāĻ•ā§āĻ¸āĻšā§‡āĻžā§āĻœ āĻŸā§āĻ°āĻžāĻ¨āĻœā§‡āĻ•āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻāĻŦāĻ‚ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻĒāĻžāĻ āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻāĻ‡āĻ­āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻŦā§€āĻŽāĻžāĻ•ā§ƒāĻ¤ āĻŸā§‹āĻ•ā§‡āĻ¨ āĻ•ā§‡āĻ¨āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻ¯āĻŧ āĻ•āĻ°āĻž āĻ…āĻ°ā§āĻĨ āĻĢā§‡āĻ°āĻ¤ āĻĻāĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

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 āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻ¸āĻŽā§āĻĒāĻĻ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻŦā§‡, āĻ¤āĻžāĻ°āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ N/taxDivisor āĻĒāĻ°āĻŋāĻŽāĻžāĻŖā§‡ FeeCoin āĻĻā§‡āĻŦā§‡ (āĻ¯āĻž āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ 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
}

āĻ•ā§āĻ¯āĻžāĻļāĻŦā§āĻ¯āĻžāĻ• āĻāĻŦāĻ‚ āĻ†āĻ¨ā§āĻ—āĻ¤ā§āĻ¯ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ

āĻ•ā§āĻ¯āĻžāĻļāĻŦā§āĻ¯āĻžāĻ• āĻšāĻ˛ āĻāĻ• āĻ§āĻ°āĻ¨ā§‡āĻ° āĻ†āĻ¨ā§āĻ—āĻ¤ā§āĻ¯ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ°ā§‡āĻ¤āĻž āĻāĻ•āĻŸāĻŋ āĻĒāĻŖā§āĻ¯ āĻŦāĻž āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ¤ā§‡ āĻŦā§āĻ¯āĻ¯āĻŧ āĻ•āĻ°āĻž āĻĒāĻ°āĻŋāĻŽāĻžāĻŖā§‡āĻ° āĻ…āĻ‚āĻļ āĻĢā§‡āĻ°āĻ¤ āĻĒāĻžāĻ¯āĻŧāĨ¤

āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻ‡ āĻ•ā§‡āĻ¸āĻŸāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻĒā§āĻ°āĻŽāĻžāĻŖāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻāĻ•āĻ‡āĻ­āĻžāĻŦā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯ā§‡āĻŽāĻ¨āĻŸāĻŋ āĻ†āĻŽāĻ°āĻž āĻŦā§€āĻŽāĻž āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ•āĻ°ā§‡āĻ›āĻŋā§ˇ āĻĻā§āĻŦāĻŋāĻ—ā§āĻŖ āĻ–āĻ°āĻš āĻ°ā§‹āĻ§ āĻ•āĻ°āĻ¤ā§‡, āĻ•ā§āĻ¯āĻžāĻļāĻŦā§āĻ¯āĻžāĻ• āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻ†āĻ—ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ•ā§‡ āĻ…āĻŦāĻļā§āĻ¯āĻ‡ (āĻ•ā§€, āĻŽāĻžāĻ¨) = (purchaseTransactionId, cashbackTransactionId) āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻĄā§‡āĻŸāĻž āĻŸā§āĻ°āĻžāĻ¨āĻœā§‡āĻ•āĻļāĻ¨ āĻĒāĻžāĻ āĻžāĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

āĻĄā§‡āĻŸāĻž āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻ•ā§€āĻ—ā§āĻ˛āĻŋāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻˇā§‡āĻ§āĻžāĻœā§āĻžāĻžāĻ“ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ cashbackDivisor - āĻ•ā§āĻ¯āĻžāĻļāĻŦā§āĻ¯āĻžāĻ• āĻļā§‡āĻ¯āĻŧāĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦāĻŋāĻ­āĻ•ā§āĻ¤ āĻ‡āĻ‰āĻ¨āĻŋāĻŸāĨ¤ āĻ¸ā§‡āĻ—ā§āĻ˛ā§‹. āĻ¯āĻĻāĻŋ āĻ•ā§āĻ¯āĻžāĻļāĻŦā§āĻ¯āĻžāĻ• āĻļā§‡āĻ¯āĻŧāĻžāĻ° 0.1 āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ•ā§āĻ¯āĻžāĻļāĻŦā§āĻ¯āĻžāĻ• āĻĄāĻŋāĻ­āĻžāĻ‡āĻœāĻžāĻ° 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

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨