
āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āĻāĻŽāϰāĻž āύāĻŋāϞāĻžāĻŽ āĻāĻŦāĻ āĻāύā§āĻāϤā§āϝ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϏāĻš āĻŦā§āϝāĻŦāϏāĻžāϝāĻŧ āϏā§āĻŽāĻžāϰā§āĻ āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻŦā§āĻļ āĻāϝāĻŧā§āĻāĻāĻŋ āĻā§āώā§āϤā§āϰ⧠āĻĻā§āĻā§āĻāĻŋāĨ¤
āĻāĻ āĻāĻŽāϰāĻž āĻāϞā§āĻāύāĻž āĻāϰāĻŦ āĻā§āĻāĻžāĻŦā§ āϏā§āĻŽāĻžāϰā§āĻ āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻāĻŦāĻ āϏā§āĻŽāĻžāϰā§āĻ āϏāĻŽā§āĻĒāĻĻāĻā§āϞāĻŋ āĻŦāĻŋāĻāϞā§āĻĒ, āĻĢāĻŋāĻāĻāĻžāϰ āĻāĻŦāĻ āĻŦāĻŋāϞā§āϰ āĻŽāϤ⧠āĻāϰā§āĻĨāĻŋāĻ āĻāĻĒāĻāϰāĻŖāĻā§āϞāĻŋāϰ āϏā§āĻŦāĻā§āĻāϤāĻž āĻāĻŦāĻ āύāĻŋāϰā§āĻāϰāϝā§āĻā§āϝāϤāĻž āĻāύā§āύāϤ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻŦāĻŋāĻāϞā§āĻĒ
āĻāĻāĻāĻŋ āĻŦāĻŋāĻāϞā§āĻĒ āĻšāϞ āĻāĻāĻāĻŋ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻā§āĻā§āϤāĻŋ āϝāĻž āĻā§āϰā§āϤāĻžāĻā§ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻŽā§āϞā§āϝ⧠āĻŦāĻž āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϤāĻžāϰāĻŋāĻā§āϰ āĻāĻā§ āĻāĻāĻāĻŋ āϏāĻŽā§āĻĒāĻĻ āĻā§āύāĻžāϰ āĻ āϧāĻŋāĻāĻžāϰ āĻĻā§āϝāĻŧ, āĻāĻŋāύā§āϤ⧠āϤāĻžāĻā§ āϤāĻž āĻāϰāϤ⧠āĻŦāĻžāϧā§āϝ āĻāϰ⧠āύāĻžāĨ¤
āĻŦāĻŋāĻāϞā§āĻĒā§āϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āύāĻŋāĻŽā§āύāϰā§āĻĒ āĻšāϤ⧠āĻĒāĻžāϰā§:
āĻāĻŽāϰāĻž āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϏā§āĻŽāĻžāϰā§āĻ āĻ ā§āϝāĻžāϏā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŋ āĻāĻāĻāĻŋ āĻāĻĒāĻāϰāĻŖ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŦāĻ āĻ āĻāĻļāĻā§āϰāĻšāĻŖāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϏā§āĻŽāĻžāϰā§āĻ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āϝāĻž āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻžāĻ āĻāϰ⧠āĻāĻŦāĻ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋ āĻāϏā§āϝ⧠āĻāϰā§ā§ˇ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻ āĻāĻļāĻā§āϰāĻšāĻŖāĻāĻžāϰ⧠āĻĒā§āϰāϤāĻŋāĻļā§āϰā§āϤāĻŋ āĻĻā§āϝāĻŧ āϝ⧠āϤāĻŋāύāĻŋ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āϏāĻŽā§āĻĒāĻĻā§āϰ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻŦāĻŋāĻā§āϰāϝāĻŧāĻŽā§āϞā§āϝ⧠āĻŽā§āϝāĻŧāĻžāĻĻāĻĒā§āϰā§āϤāĻŋ āĻļā§āϰ⧠āĻāĻŦāĻ āĻŽā§āϝāĻŧāĻžāĻĻ āĻļā§āώā§āϰ āĻŦā§āϞāĻ āĻāĻā§āĻāϤāĻžāϰ āĻŽāϧā§āϝ⧠āĻŦāĻŋāĻā§āϰāĻŋ āĻāϰāĻŦā§āύ)āĨ¤
āϏā§āĻŽāĻžāϰā§āĻ āĻ ā§āϝāĻžāϏā§āĻ āĻā§āĻĄā§, āĻāĻŽāϰāĻž āϏāĻšāĻāĻāĻžāĻŦā§ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻŦ āϝ⧠āĻāĻāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāĻā§āĻāϤāĻžāϰ āĻŽāϧā§āϝ⧠āϞā§āύāĻĻā§āύ āĻšāĻā§āĻā§, āĻāĻŦāĻ āĻ āύā§āϝ āĻāĻŋāĻā§ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻŦ āύāĻž; āĻāĻŽāϰāĻž āύāĻŋāϝāĻŧāĻŽ āĻŽā§āύ⧠āĻāϞāĻžāϰ āĻāύā§āϝ āϏāĻŽāϏā§āϤ āĻĻāĻžāϝāĻŧāĻŋāϤā§āĻŦ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻ āĻāĻļāĻā§āϰāĻšāĻŖāĻāĻžāϰā§āϰ āĻā§āĻĄā§āϰ āĻāĻĒāϰ āĻā§āĻĄāĻŧā§ āĻĻā§āĻŦāĨ¤
āϏā§āĻŽāĻžāϰā§āĻ āϏāĻŽā§āĻĒāĻĻ āĻā§āĻĄ:
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
