āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻā§āĻ°āĻŋāĻĒā§āĻā§āĻāĻžāĻ°ā§āĻ¨ā§āĻ¸āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻ¯ā§āĻā§āĻ¤ āĻĨāĻžāĻā§, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻĄāĻŋāĻāĻ˛āĻāĻŋ āĻĒā§āĻ°āĻ¯ā§āĻā§āĻ¤āĻŋāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻā§āĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°āĻā§āĻ˛āĻŋ āĻ
āĻ¨ā§āĻ āĻŦāĻŋāĻ¸ā§āĻ¤ā§āĻ¤āĨ¤ āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻĒā§āĻ°āĻ¤āĻŋāĻļā§āĻ°ā§āĻ¤āĻŋāĻļā§āĻ˛ āĻā§āĻˇā§āĻ¤ā§āĻ°āĻā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻāĻāĻŋ āĻšāĻ˛ āĻāĻāĻāĻŋ āĻ¸ā§āĻŽāĻžāĻ°ā§āĻ āĻā§āĻā§āĻ¤āĻŋ āĻ¯āĻž āĻ¸ā§āĻŦāĻ¯āĻŧāĻāĻā§āĻ°āĻŋāĻ¯āĻŧāĻāĻžāĻŦā§ āĻāĻžāĻ°ā§āĻ¯āĻāĻ° āĻšāĻ¯āĻŧ āĻāĻŦāĻ āĻāĻ¤ā§ āĻĒā§āĻ°āĻŦā§āĻļāĻāĻžāĻ°ā§ āĻĒāĻā§āĻˇāĻā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻŦāĻŋāĻļā§āĻŦāĻžāĻ¸ā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻšāĻ¯āĻŧ āĻ¨āĻžāĨ¤
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