Истифодаи ҳисобҳои интеллектуалии Waves: аз музоядаҳо то барномаҳои бонус

Истифодаи ҳисобҳои интеллектуалии Waves: аз музоядаҳо то барномаҳои бонус

Blockchain аксар вақт танҳо бо криптовалютҳо алоқаманд аст, аммо соҳаҳои татбиқи технологияи DLT хеле васеътаранд. Яке аз самтҳои умедбахши истифодаи blockchain як шартномаи интеллектуалӣ мебошад, ки ба таври худкор иҷро карда мешавад ва эътимоди байни тарафҳои ба он воридшударо талаб намекунад.

RIDE - забон барои шартномаҳои интеллектуалӣ

Waves забони махсусро барои шартномаҳои интеллектуалӣ таҳия кардааст - RIDE. Ҳуҷҷати пурраи он ҷойгир аст дар ин ҷо. Ва дар ин ҷо - мақола дар ин мавзӯъ дар Хабр.

Шартномаи RIDE предикат аст ва ҳамчун натиҷа "ҳақиқӣ" ё "дурӯғ" -ро бармегардонад. Мувофиқи он, транзаксия ё дар blockchain сабт карда мешавад ё рад карда мешавад. Шартномаи интеллектуалӣ иҷрои шартҳои муайяншударо пурра кафолат медиҳад. Эҷоди транзаксияҳо аз шартнома дар RIDE ҳоло имконнопазир аст.

Имрӯз ду намуди шартномаҳои интеллектуалии Waves мавҷуданд: ҳисобҳои интеллектуалӣ ва дороиҳои интеллектуалӣ. Ҳисоби интеллектуалӣ ҳисоби корбарии муқаррарӣ аст, аммо барои он скрипт муқаррар шудааст, ки тамоми транзаксияҳоро назорат мекунад. Скрипти ҳисоби интеллектуалӣ метавонад чунин бошад, масалан:

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

tx транзаксияест, ки коркард карда мешавад, ки мо ба истифодаи механизми мувофиқати намуна танҳо дар сурате иҷозат медиҳем, ки он транзаксияи интиқол набошад. Мутобиқати намуна дар RIDE барои тафтиши намуди транзаксия истифода мешавад. Ҳама ҳисобҳои мавҷударо дар скрипти ҳисоби интеллектуалӣ коркард кардан мумкин аст намудҳои транзаксия.

Скрипт инчунин метавонад тағирёбандаҳоро эълон кунад, конструксияҳои "if-then-else" ва усулҳои дигарро барои пурра тафтиш кардани шароит истифода барад. Барои таъмини он, ки шартномаҳо пуррагӣ ва мураккабии (арзиш) исботшаванда доранд, ки пеш аз оғози иҷрои шартнома пешгӯи кардан осон аст, RIDE дорои ҳалқаҳо ё изҳороти ҷаҳиш нест.

Дигар хусусиятҳои ҳисобҳои Waves мавҷудияти "давлат", яъне ҳолати ҳисобро дар бар мегиранд. Шумо метавонед бо истифода аз транзаксияҳои маълумот (DataTransaction) шумораи беохири ҷуфтҳоро (калид, арзиш) ба ҳолати ҳисоб нависед. Пас ин маълумот метавонад ҳам тавассути REST API ва ҳам бевосита дар шартномаи интеллектуалӣ коркард карда шавад.

Ҳар як транзаксия метавонад як қатор далелҳоро дар бар гирад, ки ба онҳо имзои иштирокчӣ, ID-и амалиёти зарурӣ ва ғайра ворид карда мешавад.

Кор бо RIDE тавассути ИН ҶО ба шумо имкон медиҳад, ки намуди тартибдодашудаи шартномаро бубинед (агар он тартиб дода шуда бошад), ҳисобҳои нав эҷод кунед ва скриптҳоро барои он муқаррар кунед, инчунин тавассути сатри фармон интиқол фиристед.

Барои як давраи пурра, аз ҷумла эҷод кардани ҳисоб, насб кардани шартномаи оқилона дар он ва фиристодани транзаксия, шумо инчунин метавонед китобхонаро барои ҳамкорӣ бо REST API истифода баред (масалан, C#, C, Java, JavaScript, Python, Rust, Elixir) . Барои оғози кор бо IDE, танҳо тугмаи NEW -ро пахш кунед.

Имкониятҳои истифодаи шартномаҳои интеллектуалӣ васеъанд: аз манъ кардани транзаксияҳо то суроғаҳои муайян («рӯйхати сиёҳ») то dApps мураккаб.

Акнун биёед ба мисолҳои мушаххаси истифодаи шартномаҳои интеллектуалӣ дар тиҷорат назар андозем: ҳангоми гузаронидани музоядаҳо, суғурта ва эҷоди барномаҳои вафодорӣ.

Музоядаҳо

Яке аз шартҳои бомуваффақияти музояда шаффофият аст: иштирокчиён бояд мутмаин бошанд, ки таҳрири тендерҳо ғайриимкон аст. Инро ба шарофати blockchain ба даст овардан мумкин аст, ки дар он маълумоти тағирнопазир дар бораи ҳама шартҳо ва вақти гузоштани онҳо барои ҳама иштирокчиён дастрас хоҳанд буд.

Дар blockchain Waves, дархостҳоро дар ҳолати ҳисоби музояда тавассути DataTransaction сабт кардан мумкин аст.

Шумо инчунин метавонед бо истифода аз рақамҳои блок вақти оғоз ва анҷоми музоядаро таъин кунед: басомади тавлиди блок дар blockchain Waves тақрибан ба баробар аст 60 сония.

1. Музоядаи нархҳои афзояндаи англисӣ

Иштирокчиёни музоядаи англисй бо хамдигар рақобат мекунанд. Ҳар як шарти нав бояд аз пештара зиёд бошад. Музояда вақте ба итмом мерасад, ки дигар иштирокчиёне, ки аз пешниҳоди охирин зиёд нестанд, вуҷуд надоранд. Дар ин ҳолат, довталаби баландтарин бояд маблағи зикршударо пешниҳод кунад.

Инчунин варианти музояда мавҷуд аст, ки дар он фурӯшанда нархи ҳадди ақали лотро муқаррар мекунад ва нархи ниҳоӣ бояд аз он зиёдтар бошад. Дар акси ҳол, лот бефурӯхта мемонад.

Дар ин мисол, мо бо ҳисобе, ки махсус барои музояда сохта шудааст, кор карда истодаем. Давомнокии музояда 3000 блок ва нархи ибтидоии лот 0,001 WAVES мебошад. Иштирокчӣ метавонад тавассути фиристодани транзаксия бо калиди "нарх" ва арзиши дархости худ дархост пешниҳод кунад.

Нархи дархости нав бояд аз нархи ҷории ин калид баландтар бошад ва иштирокчӣ бояд ҳадди аққал дар ҳисоби худ аломатҳои [new_bid + komissiya] дошта бошад. Суроғаи довталаб бояд дар майдони "фиристанда" дар TransTransaction сабт карда шавад ва баландии ҷории блоки дархост бояд дар давоми давраи музояда бошад.

Агар дар охири музояда иштирокчӣ нархи баландтаринро муқаррар карда бошад, ӯ метавонад барои пардохти лотҳои мувофиқ бо нарх ва ҷуфти асъори муайяншуда Мубодила фиристад.

let startHeight = 384120
let finishHeight = startHeight + 3000
let startPrice = 100000
 
#извлекаем из транзакции адрес отправителя
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
match tx {
case d : DataTransaction =>
  #проверяем, задана ли в стейте цена
  let currentPrice = if isDefined(getInteger(this, "price"))
 
                      #извлекаем цену из стейта
                      then extract(getInteger(this, "price"))
                      else startPrice
 
  #извлекаем цену из транзакции
  let newPrice = extract(getInteger(d.data, "price"))
  let priceIsBigger = newPrice > currentPrice
  let fee = 700000
  let hasMoney = wavesBalance(tx.sender) + fee >= newPrice
 
  #убеждаемся, что в текущей транзакции два поля и что отправитель совпадает с указанным в транзакции
  let correctFields = size(d.data) == 2 &&      
      d.sender == addressFromString(extract(getString(d.data,"sender")))
  startHeight <= height && height <= finishHeight && priceIsBigger && hasMoney && correctFields
case e : ExchangeTransaction =>
  let senderIsWinner = e.sender == addressFromString(extract(getString(this, "sender"))) #убеждаемся, что лот обменивает тот, кто его выиграл
  let correctAssetPair = e.sellOrder.assetPair.amountAsset == token && ! isDefined(e.sellOrder.assetPair.priceAsset)
  let correctAmount = e.amount == 1
  let correctPrice = e.price == extract(getInteger(this, "price"))
 
  height > finishHeight && senderIsWinner && correctAssetPair && correctAmount && correctPrice
case _ => false
}

2. Музоядаи Голландия нархи пастшаванда

Дар музоядаи Ҳолланд, дар аввал лот бо нархи баландтар аз он чизе, ки харидор омода аст пардохт кунад, пешниҳод карда мешавад. Нарх зина ба зина паст карда мешавад, то даме ки яке аз иштирокчиён розй шавад, ки лотро бо нархи ҷорӣ харад.

Дар ин мисол мо ҳамон константаҳоеро, ки дар қаблӣ буд, истифода мебарем, инчунин қадами нарх ҳангоми коҳиши дельта. Скрипти ҳисоб тафтиш мекунад, ки оё иштирокчӣ дар ҳақиқат аввалин шуда шартгузорӣ мекунад. Дар акси ҳол, DataTransaction аз ҷониби blockchain қабул карда намешавад.

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. Музояда "ҳама пардохт"

"Ҳама-пардохт" музоядаест, ки дар он ҳамаи иштирокчиён, новобаста аз он, ки кӣ дар лот бурд мекунад, дархостро пардохт мекунанд. Ҳар як иштирокчии нав як тендер месупорад ва иштирокчӣ, ки ҳадди аксар пешниҳод кардааст, ғолиби лот мешавад.

Дар мисоли мо, ҳар як иштирокчии музояда тавассути DataTransaction бо (калид, арзиш)* = (“ғолиб”, суроға), (“нарх”, нарх) дархост пешниҳод мекунад. Чунин транзаксияи маълумот танҳо дар сурате тасдиқ карда мешавад, ки ин иштирокчӣ аллакай транзаксияи интиқолро бо имзои худ дошта бошад ва дархости ӯ аз ҳама пештара баландтар бошад. Музояда то расидан ба endHeight идома меёбад.

let startHeight = 1000
let endHeight = 2000
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
match tx {
 case d: DataTransaction =>
   #извлекаем из поступившей дата-транзакции поле "price"
   let newPrice = extract(getInteger(d.data, "price"))
 
   #извлекаем из пруфов транзакции публичный ключ аккаунта
   let pk = d.proofs[1]
   let address = addressFromPublicKey(pk)
 
   #извлекаем транзакцию доказательство из пруфов поступившей дата транзакции
   let proofTx = extract(transactionById(d.proofs[2]))
   
   height > startHeight && height < endHeight
   && size(d.data) == 2
   #убеждаемся, что адрес победителя, извлеченный из текущей транзакции, совпадает с адресом, извлеченным из пруфов
   && extract(getString(d.data, "winner")) == toBase58String(address.bytes)
   && newPrice > extract(getInteger(this, "price"))
   #проверяем, что транзакция подписана
   && sigVerify(d.bodyBytes, d.proofs[0], d.proofs[1])
   #проверяем корректность транзакции, указанной в пруфах
   && match proofTx {
     case tr : TransferTransaction =>
       tr.sender == address &&
       tr.amount == newPrice
     case _ => false
   }
 case t: TransferTransaction =>
 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
 || (
   height > endHeight
   && extract(getString(this, "winner")) == toBase58String((addressFromRecipient(t.recipient)).bytes)
   && t.assetId == token
   && t.amount == 1
 )
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

Суғурта / Краудфандинг

Биёед вазъиятеро дида бароем, ки шумо бояд дороиҳои корбаронро аз талафоти молиявӣ суғурта кунед. Масалан, корбар мехоҳад кафолат диҳад, ки агар токен беқурб шавад, ӯ метавонад маблағи пурраи барои ин нишонаҳо пардохтшударо баргардонад ва омода аст маблағи мувофиқи суғуртаро пардохт кунад.

Барои татбиқи ин, бояд "жетонҳои суғурта" бароварда шаванд. Пас аз он дар ҳисоби дорандаи полис скрипт насб карда мешавад, ки танҳо он Мубодилаҳои Мубодилаеро, ки ба шартҳои муайян мувофиқат мекунанд, иҷозат медиҳад.

Барои пешгирӣ кардани хароҷоти дукарата, шумо бояд аз корбар дархост кунед, ки ба ҳисоби дорандаи полис пешакӣ бо (калид, арзиш) = (purchaseTransactionId, sellOrderId) интиқоли DataTransaction фиристад ва фиристодани транзаксияҳоро бо калиди аллакай истифодашуда манъ кунед.

Аз ин рӯ, далелҳои корбар бояд ID муомилоти хариди аломати суғуртаро дар бар гиранд. Ҷуфти асъор бояд ҳамон тавре ки дар муомилоти харид бошад. Арзиш инчунин бояд ба он арзише, ки дар вақти харид муқаррар шуда буд, бо назардошти арзиши суғурта баробар бошад.

Маълум мешавад, ки минбаъд ҳисоби суғурта аз корбар токенҳои суғуртаро бо нархи на камтар аз нархе, ки ӯ онҳоро харидааст, мехарад: ҳисоби суғуртавӣ ExchangeTransaction эҷод мекунад, корбар фармоишро имзо мекунад (агар амалиёт дуруст анҷом дода шуда бошад), ҳисоби суғурта фармоиши дуюм ва тамоми транзаксияро имзо мекунад ва онро ба blockchain мефиристад.

Агар ягон харид рӯй надиҳад, корбар метавонад мувофиқи қоидаҳои дар скрипт тавсифшуда ExchangeTransaction эҷод кунад ва транзаксияро ба blockchain фиристад. Бо ин роҳ корбар метавонад маблағеро, ки барои хариди токенҳои суғурта сарф шудааст, баргардонад.

let insuranceToken = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
#извлекаем из транзакции адрес отправителя
let this = extract(tx.sender)
let freezePeriod = 150000
let insurancePrice = 10000
match tx {
 
 #убеждаемся, что, если поступила дата-транзакция, то у нее ровно одно поле и в стейте еще нет такого ключа
 case d : DataTransaction => size(d.data) == 1 && !isDefined(getBinary(this, d.data[0].key))
 case e : ExchangeTransaction =>
 
   #если у транзакции нет седьмого пруфа, проверяем корректность подписи
   if !isDefined(e.proofs[7]) then
     sigVerify(e.bodyBytes, e.proofs[0], e.senderPublicKey)
   else
     #если у транзакции есть седьмой пруф, извлекаем из него транзакцию и узнаём её высоту
     let purchaseTx = transactionById(e.proofs[7])
     let purchaseTxHeight = extract(transactionHeightById(e.proofs[7]))
    
     #обрабатываем транзакцию из пруфа
     match purchaseTx {
       case purchase : ExchangeTransaction =>
         let correctSender = purchase.sender == e.sellOrder.sender
         let correctAssetPair = e.sellOrder.assetPair.amountAsset == insuranceToken &&
                                purchase.sellOrder.assetPair.amountAsset == insuranceToken &&
                                e.sellOrder.assetPair.priceAsset == purchase.sellOrder.assetPair.priceAsset
         let correctPrice = e.price == purchase.price - insurancePrice && e.amount == purchase.amount
         let correctHeight = height > purchaseTxHeight + freezePeriod
 
         #убеждаемся, что в транзакции-пруфе указан верный ID текущей транзакции
         let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == e.sellOrder.id
         correctSender && correctAssetPair && correctPrice && correctHeight && correctProof
     case _ => false
   }
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

Як аломати суғурта метавонад дороии интеллектуалӣ бошад, масалан, барои манъ кардани интиқоли он ба шахсони сеюм.

Ин схема инчунин метавонад барои токенҳои краудфандинг амалӣ карда шавад, ки агар маблағи зарурӣ ҷамъоварӣ карда нашавад, онҳо ба соҳибон баргардонида мешаванд.

Андозҳои муомилот

Шартномаҳои оқилона инчунин дар ҳолатҳое татбиқ мешаванд, ки барои ҳар як амалиёт бо якчанд намуди дороиҳо андоз ситонидан лозим аст. Инро тавассути дороии нав бо насбшуда анҷом додан мумкин аст сарпарастӣ барои муомилот бо дороиҳои интеллектуалӣ:

1. Мо FeeCoin мебарорем, ки он ба корбарон бо нархи муқарраршуда фиристода мешавад: 0,01 WAVES = 0,001 FeeCoin.

2. Сарпарастиро барои FeeCoin ва қурби мубодила муқаррар кунед: 0,001 WAVES = 0,001 FeeCoin.

3. Барои дороии интеллектуалӣ скрипти зеринро таъин кунед:

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

Ҳоло ҳар дафъае, ки касе N дороиҳои интеллектуалиро интиқол медиҳад, онҳо ба шумо FeeCoin-ро ба маблағи N/taxDivisor медиҳанд (ки онро аз шумо дар 10 *N/taxDivisor WAVES харидан мумкин аст) ва шумо ба конкани N/taxDivisor WAVES медиҳед. Дар натиҷа, фоидаи шумо (андоз) 9 * N / taxDivisor WAVES хоҳад буд.

Шумо инчунин метавонед бо истифода аз скрипти дороиҳои интеллектуалӣ ва MassTransferTransaction андозбандӣ кунед:

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

Барномаҳои cashback ва вафодорӣ

Cashback як намуди барномаи вафодорӣ мебошад, ки дар он харидор як қисми маблағи барои маҳсулот ё хидмат сарфшударо бармегардонад.

Ҳангоми татбиқи ин парванда бо истифода аз ҳисоби интеллектуалӣ, мо бояд далелҳоро ҳамон тавре тафтиш кунем, ки мо дар ҳолати суғурта кардаем. Барои пешгирӣ кардани хароҷоти дукарата, корбар бояд пеш аз гирифтани кэшбэк маълумотро бо (калид, арзиш) = (purchaseTransactionId, cashbackTransactionId) фиристад.

Мо инчунин бояд бо истифода аз DataTransaction калидҳои мавҷударо манъ кунем. cashbackDivisor - воҳиди тақсимшуда аз рӯи саҳми cashback. Онхое. агар ҳиссаи cashback 0.1 бошад, пас cashbackDivisor 1 / 0.1 = 10.

let cashbackToken = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
#извлекаем из транзакции адрес отправителя
let this = extract(tx.sender)
let cashbackDivisor = 10
match tx {
 
 #убеждаемся, что, если поступила дата-транзакция, то у нее ровно одно поле и в стейте еще нет такого ключа
 case d : DataTransaction => size(d.data) == 1 && !isDefined(getBinary(this, d.data[0].key))
 case e : TransferTransaction =>
 
   #если у транзакции нет седьмого пруфа, проверяем корректность подписи
   if !isDefined(e.proofs[7]) then
     sigVerify(e.bodyBytes, e.proofs[0], e.senderPublicKey)
   else
 
     #если у транзакции есть седьмой пруф, извлекаем из него транзакцию и узнаём её высоту
     let purchaseTx = transactionById(e.proofs[7])
     let purchaseTxHeight = extract(transactionHeightById(e.proofs[7]))
    
     #обрабатываем транзакцию из пруфа
     match purchaseTx {
       case purchase : TransferTransaction =>
         let correctSender = purchase.sender == e.sender
         let correctAsset = e.assetId == cashbackToken
         let correctPrice = e.amount == purchase.amount / cashbackDivisor
 
         #убеждаемся, что в транзакции-пруфе указан верный ID текущей транзакции
         let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == e.id
         correctSender && correctAsset && correctPrice && correctProof
     case _ => false
   }
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

Мубодилаи атомӣ

Свопи атомӣ ба корбарон имкон медиҳад, ки дороиҳоро бидуни ёрии биржа мубодила кунанд. Бо своп атомӣ, ҳарду иштирокчии муомилот бояд онро дар муддати муайян тасдиқ кунанд.

Агар дар мўњлати барои муомилот људошуда аќаллан яке аз иштирокчиён тасдиќи дурусти муомилотро пешнињод накунад, муомила бекор карда мешавад ва мубодила ба амал намеояд.

Дар мисоли мо, мо скрипти ҳисоби интеллектуалии зеринро истифода мебарем:

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

Дар мақолаи навбатӣ мо ба истифодаи ҳисобҳои интеллектуалӣ дар воситаҳои молиявӣ ба монанди опционҳо, фьючерсҳо ва векселҳо назар хоҳем кард.

Манбаъ: will.com

Илова Эзоҳ