hoodrunio / explorer-backend

Backend app for Cosmos ecosystem explorer.
https://backend.testnet.run/
5 stars 1 forks source link

Feat: WasmContract implement #34

Open Errorist79 opened 1 year ago

Errorist79 commented 1 year ago

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.

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=="
}

Ö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