Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: WasmContract implement #34

Open
Errorist79 opened this issue Feb 6, 2023 · 1 comment
Open

Feat: WasmContract implement #34

Errorist79 opened this issue Feb 6, 2023 · 1 comment

Comments

@Errorist79
Copy link
Member

No description provided.

@Errorist79
Copy link
Member Author

Errorist79 commented Feb 6, 2023

Wasm contracts entegrasyonu

https://github.com/CosmWasm/wasmd/blob/main/proto/cosmwasm/wasm/v1/query.proto

Wasm contract entegrasyonu ile, on chain contractları listeleyeceğiz, ve contractlara dair bazı bilgileri UI üzerinde göstermiş olacağız.

  • Contractlar'ı ve code'ları listeleyin.
  • Contractların ve code'ların gerekli bilgilerini parse edin.
  • Gereken DB collection'ları oluşturun. Tüm gerekli veriler database'de tutulacak.
  • UI için ilgili route'ları oluşturun.

UI'da label'lerimiz olacak;

Codes

ID - HASH - CREATOR - VERSION

Contracts

ID - CONTRACT - NAME - ADDRESS - CREATOR - ADMIN

Contract list

Rest API ile bir çok veriyi çekebiliyoruz.

Base URL olarak bunu kullanabiliriz: https://lcd.osmosis.zone (yani örnek queryler için bu resti kullanabiliriz.)

Öncelikle, kontratları query ile alabilmek için code_id değerlerine ihtiyacımız var.

Contract query: Bir code_id ile ilişik kontratları alabilmek için bu endpoint'i kullanıyoruz:

/cosmwasm/wasm/v1/code/{{code_id}}/contracts

Ağ üzerinde ki code_id'leri nasıl alacağız?

ID query:

/cosmwasm/wasm/v1/code

Yukarıda ki endpoint ile, tüm code_id değerlerini alabiliyoruz.
code_id değerlerini aldıktan sonra, her code_id için contract query endpointine istek atacağız. İstek sonucunda elimize contract adresleri gelmiş olacak.

Örnek:

https://lcd.osmosis.zone/cosmwasm/wasm/v1/code/1/contracts

Response:

{
  "contracts": [
    "osmo14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sq2r9g9",
    "osmo1suhgf5svhu4usrurvxzlgn54ksxmn8gljarjtxqnapv8kjnp4nrsll0sqv",
    "osmo1yyca08xqdgvjz0psg56z67ejh9xms6l436u8y58m82npdqqhmmtqjmm4zk",
    "osmo1yw4xvtc43me9scqfr2jr2gzvcxd3a9y4eq7gaukreugw2yd2f8tsn6cnq9",
    .
    .
    .
    .
 ]

Sonrasında her kontratın spesifik bilgilerini alacağız.

Code details

ID query başlığı altında ki endpointi kullanıyoruz.

Labellarımız:

ID - HASH - CREATOR - VERSION

ID: code_id değeri.

HASH: data_hash değeri.

VERSION: doğrudan sorgulamanın bir yolunu bulamadım. Şu şekilde yapabileceğimizi düşünüyorum, her code_id bir ya da daha fazla kontrat içerir genelde. içerdiği kontratlardan herhangi birine query yapacağız ve versiyon değerini alacağız. Versionu nasıl aldığımız bilgisini Contract Details başlığı altında değindim. Eğer ki bir code ile ilişik kontrat yoksa, versiyon değerini null olarak döndürebiliriz.

Contract details

Endpoint: /cosmwasm/wasm/v1/contract/{{contract_address}}

Örnek request:
https://lcd.osmosis.zone/cosmwasm/wasm/v1/contract/osmo1wl59k23zngj34l7d42y9yltask7rjlnxgccawc7ltrknp6n52fps94qsjd

Örnek response:

{
  "address": "osmo1wl59k23zngj34l7d42y9yltask7rjlnxgccawc7ltrknp6n52fps94qsjd",
  "contract_info": {
    "code_id": "1",
    "creator": "osmo1jxdhfvhedn3gv8fnmn4crzkevqfkm29me0pnht",
    "admin": "",
    "label": "Apollo Dev Multisig",
    "created": {
      "block_height": "5696107",
      "tx_index": "530689"
    },
    "ibc_port_id": "",
    "extension": null
  }
}

Labellarımız:

ID - CONTRACT - NAME - ADDRESS - CREATOR - ADMIN

ID: code_id değeri.

CONTRACT: versiyon bilgisini aldığımız query'de ki contract değeri. (aşağıda nasıl alınacağına dair bilgi verildi.)

NAME: label değeri.

ADDRESS: address değeri.

CREATOR: creator değeri.

ADMIN: admin değeri. (bir değer yoksa null döndürebiliriz.)

Contract version, ve contract detayını alacağımız endpoint aşağıda:

Contract version & contract:
/cosmwasm/wasm/v1/contract/{{contract_address}}/raw/Y29udHJhY3RfaW5mbw==

data, base64 formatında gelir.

Örnek query:

https://lcd.osmosis.zone/cosmwasm/wasm/v1/contract/osmo1wl59k23zngj34l7d42y9yltask7rjlnxgccawc7ltrknp6n52fps94qsjd/raw/Y29udHJhY3RfaW5mbw==

Örnek response:

{
  "data": "eyJjb250cmFjdCI6ImNyYXRlcy5pbzpjdzMtZml4ZWQtbXVsdGlzaWciLCJ2ZXJzaW9uIjoiMC4xMy4yIn0="
}

base64 decoding yaptığımızda:

{"contract":"crates.io:cw3-fixed-multisig","version":"0.13.2"}

Biraz daha detaya ineceğiz.

Contractlara özel sayfalarımız olacak, Contract details başlığı altında ki verilere ek olarak burada contractlara dair daha faza bilgiye yer vereceğiz.

Başlıklar:

Instantiate message & TxHash:

Aşağıda ki endpoint'i kullanıyoruz. Bu endpoint ile contract oluşturulduğunda elde edilen msg değerine (yani Instantiate message) ve txhash değerine ulaşabiliyoruz.

/cosmos/tx/v1beta1/txs?events=message.action='/cosmwasm.wasm.v1.MsgInstantiateContract'&events=instantiate._contract_address='{{contract_address}}'

aslında msg değerini şu endpoint ile de alabiliyoruz, /cosmwasm/wasm/v1/contract/{{contract_address}}/history
ancak buradan txhash'ı almak mümkün olmadığı için üstte ki endpoint daha kullanışlı diye düşünüyorum. Tabii ki üstte ki endpoint'in doğru veriyi bize verebilmesi için bir archive node'a ihtiyacımız olabilir. Çünkü bir contract çok uzun bir süre önce oluşturulmuş olabilir.

msg:

image

TxHASH:

image

Contract states:

Endpoint: /cosmwasm/wasm/v1/contract/{{contract_address}}/state`

Gelen veri şekli encodelidir. key ve value olarak data gelir. Örnek:

{
      "key": "0005766F746573000800000000000000016F736D6F31367535366E7736726864743577633633616D6D67646E3536357136743832356D646366666170",
      "value": "eyJ3ZWlnaHQiOjEsInZvdGUiOiJ5ZXMifQ=="
}
  • key datası, hex biçiminde gelir. hex to ASCII text vari bir dönüştürme yapılmalı okunabilir olması için.

  • value datası, base64 formatında gelir, aynı şekilde bunun da decode edilmesi gerekir.

Önemli olan bir diğer nokta, çok fazla state olabileceği, burada pagination kullanmamız gerekebilir.
Swagger üzerinden kontrol edebilirsiniz bu endpointi: https://kujira-api.polkachu.com/#/Query/CosmwasmWasmV1AllContractState

Contract executions (transactions)

2 endpointimiz var.

  1. Endpoint:
    /cosmos/tx/v1beta1/txs?events=execute._contract_address='{{contract_address}}'&events=coin_spent.spender='{{contract_address}}'

  2. Endpoint:

/cosmos/tx/v1beta1/txs?events=execute._contract_address='{{contract_address}}'&events=coin_received.receiver='{{contract_address}}'

Bu endpointler ile, bir contract'ın yürütmelerini, yani o kontrat ile ilişik transferleri çekeceğiz.

Çekeceğimiz transaction'ları, belirli bir formatta çekmeliyiz. Hangi detayları alacağız bakalım:

Örnek query:

https://osmosis-api.polkachu.com/cosmos/tx/v1beta1/txs?events=execute._contract_address='osmo1nkahswfr8shg8rlxqwup0vgahp0dk4x8w6tkv3rra8rratnut36sk22vrm'&events=coin_spent.spender='osmo1nkahswfr8shg8rlxqwup0vgahp0dk4x8w6tkv3rra8rratnut36sk22vrm'

Alacağımız veriler.

Message type: msg labelinde bulunan text. aşağıda ki örnekte mesela bu değer, repay.

image

TxHash: txhash değerimiz.

image

Height: üstte ki örnekte de görünen height değeri.

Time: timestamp değeri.

Result: data labeli boş ise, fail, data labeli değer döndürmüşse success. Örnek fail tx:

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant