BlockChain區塊鏈
  • 本書簡介
  • 區塊鏈運作原理
  • Bitcoin介紹
    • 簡介
    • Bitcoin其他知識
  • Bitcoin原理與實作
  • BitcoinJS
    • BTC 地址格式種類
    • 從 Mnemonic 轉為地址
  • Serverless 架構實作
  • Docker常用指令
  • ethereum初探
    • ethereum歷史
    • EVM
  • ethereum PoS 節點架設
  • ethereum(Docker)
  • ethereum(Geth)
    • Parity
  • ethereum(智能合約)
    • 合約測試 Unit Test
    • DAO
    • 可升級合約
    • 使用合約進行 multiswap
    • 合約安全
    • 開發工具
    • Hardhat 教學
      • Hardhat 寫測試
    • ERC-721 範例
      • 白名單機制
    • OpenZeppelin 合約 library
    • Truffle
    • 合約部屬
    • solidity 教學
  • ethereum(Dapp)
    • 相關 SDK
    • Multicall
    • Ethers.js 使用
    • Remix IDE
    • web3.js 使用
    • 在網頁上使用 web3 並操作區塊鏈
      • solidity筆記
  • Hyperledger Fabric
  • blockchainDB
  • 挖礦程式使用教學
    • 門羅幣/Monero (XMR)
  • Bitfinex API 使用
  • FTX API
  • CCXT 通用交易所 API
  • Solana 教學
  • Ethereum BigQuery
  • The Graph
    • yaml 定義
    • mapping 語法
    • Schema 定義
    • Query 範例
    • Unit test
  • DeFi 筆記
    • MEV 相關
    • Dex 聚合
    • Yearn
    • Curve
    • Uniswap
      • Swap 互動
    • AAVE、Compound
      • Compound 原理
      • AAVE 合約開發
Powered by GitBook
On this page
  • 判斷是否存過資料
  • 獲取區塊時間
  • 數字運算
  • 呼叫合約的 function
  • Schema 內含 schema
  • 要用 null 判斷 entity 是否存過,不能用 or

Was this helpful?

  1. The Graph

mapping 語法

語法

Previousyaml 定義NextSchema 定義

Last updated 2 years ago

Was this helpful?

判斷是否存過資料

避免覆蓋原資料

  let user = User.load(userId)
  if (user === null) {
    user = new User(userId)
  }

獲取區塊時間

event.block.timestamp.toI32()

schema

timestamp: Int!

數字運算

userPairBalance.balance.minus(value)
userPairBalance.balance.plus(value)

schema

balance: BigDecimal!

呼叫合約的 function

let tokenContract = TokenContract.bind(event.address);
token.contentURI = tokenContract.tokenURI(event.params.tokenId);

處理相關 revert 情況

  let craftmanAddress = '0x0000000';
  let craftmanContract = Craftman.bind(Address.fromString(craftmanAddress));
  let poolInfo = craftmanContract.try_poolInfo(event.params.pid);
  if (poolInfo.reverted) {
    log.info('poolInfo reverted', [])
  } else {
    log.info('callResult lptoken {}', [poolInfo.value.value0.toHexString()])
  }

Schema 內含 schema

let pair = Pair.load(pairAddress.toHexString())
user.pair = pair.id

schema

type UserPairBalance @entity {
  id: ID!
  pair: Pair!
}

type Pair @entity {
 ...
}

要用 null 判斷 entity 是否存過,不能用 or

以下會出現錯誤:

設定屬性不能用 or 要直接寫在 === null 判斷內。

另外如果變數沒用到還是要註解,不然仍會編譯進去產生錯誤

 let userPairBalance = UserPairBalance.load(userPairBalanceId)
 let userPairBalanceCurrent = userPairBalance.balance || BigDecimal.fromString('0')
 if (userPairBalance !== null) {
    userPairBalance = new UserPairBalance(userPairBalanceId)
    if(type === "fromUser") {
      userPairBalance.balance = userPairBalanceCurrent.minus(value)
    }
    if(type === "toUser") {
      userPairBalance.balance = userPairBalanceCurrent.plus(value)
    }
 }   

正確用法:

 let userPairBalance = UserPairBalance.load(userPairBalanceId)
 if (userPairBalance !== null) {
    if(type === "fromUser") {
      userPairBalance.balance = userPairBalance.balance.minus(value)
    }
    if(type === "toUser") {
      userPairBalance.balance = userPairBalance.balance.plus(value)
    }
  }
if (userPairBalance === null) {
  userPairBalance = new UserPairBalance(userPairBalanceId)
  userPairBalance.balance = value
}

使用 try_ :

https://thegraph.com/docs/en/developer/assemblyscript-api/#access-to-smart-contract-state
https://thegraph.com/docs/en/developer/assemblyscript-api/#handling-reverted-calls
AssemblyScript API - The Graph DocsThe Graph Docs
Logo