Skip to main content

    Usage Examples

    Single Return Value

    import { Function } from 'tevm'
    
    const totalSupplyFn = new Function({
      type: "function",
      name: "totalSupply",
      inputs: [],
      outputs: [{ type: "uint256", name: "supply" }]
    })
    
    // Call contract and decode
    const result = await provider.call({
      to: tokenAddress,
      data: totalSupplyFn.encodeParams([])
    })
    
    const [totalSupply] = totalSupplyFn.decodeResult(result)
    console.log(totalSupply)  // 1000000n
    

    Multiple Return Values

    import { Function } from 'tevm'
    
    const getReservesFn = new Function({
      type: "function",
      name: "getReserves",
      outputs: [
        { type: "uint112", name: "reserve0" },
        { type: "uint112", name: "reserve1" },
        { type: "uint32", name: "blockTimestampLast" }
      ]
    })
    
    const result = await provider.call({
      to: pairAddress,
      data: getReservesFn.encodeParams([])
    })
    
    const [reserve0, reserve1, timestamp] = getReservesFn.decodeResult(result)
    console.log({ reserve0, reserve1, timestamp })
    

    Boolean Return

    import { Function } from 'tevm'
    
    const transferFn = new Function({
      type: "function",
      name: "transfer",
      inputs: [
        { type: "address", name: "to" },
        { type: "uint256", name: "amount" }
      ],
      outputs: [{ type: "bool", name: "success" }]
    })
    
    const result = await provider.call({
      to: tokenAddress,
      data: transferFn.encodeParams([recipient, amount])
    })
    
    const [success] = transferFn.decodeResult(result)
    console.log(success)  // true or false
    

    Dynamic Return Types

    import { Function } from 'tevm'
    
    const getNameFn = new Function({
      type: "function",
      name: "name",
      outputs: [{ type: "string", name: "name" }]
    })
    
    const result = await provider.call({
      to: tokenAddress,
      data: getNameFn.encodeParams([])
    })
    
    const [name] = getNameFn.decodeResult(result)
    console.log(name)  // "MyToken"
    

    Array Returns

    import { Function } from 'tevm'
    
    const getHoldersFn = new Function({
      type: "function",
      name: "getHolders",
      outputs: [{ type: "address[]", name: "holders" }]
    })
    
    const result = await provider.call({
      to: tokenAddress,
      data: getHoldersFn.encodeParams([])
    })
    
    const [holders] = getHoldersFn.decodeResult(result)
    console.log(holders)  // ["0x...", "0x...", ...]
    

    Struct/Tuple Returns

    import { Function } from 'tevm'
    
    const getOrderFn = new Function({
      type: "function",
      name: "getOrder",
      inputs: [{ type: "uint256", name: "orderId" }],
      outputs: [
        {
          type: "tuple",
          name: "order",
          components: [
            { type: "address", name: "maker" },
            { type: "uint256", name: "amount" },
            { type: "uint256", name: "price" }
          ]
        }
      ]
    })
    
    const result = await provider.call({
      to: exchangeAddress,
      data: getOrderFn.encodeParams([1n])
    })
    
    const [order] = getOrderFn.decodeResult(result)
    console.log(order.maker)   // "0x..."
    console.log(order.amount)  // 1000n
    console.log(order.price)   // 5n
    

    Error Handling

    import { Function } from 'tevm'
    import { AbiDecodingError } from 'tevm'
    
    const balanceOfFn = new Function({
      type: "function",
      name: "balanceOf",
      inputs: [{ type: "address", name: "owner" }],
      outputs: [{ type: "uint256", name: "balance" }]
    })
    
    try {
      const result = await provider.call({
        to: tokenAddress,
        data: balanceOfFn.encodeParams([address])
      })
    
      const [balance] = balanceOfFn.decodeResult(result)
      console.log(balance)
    } catch (error) {
      if (error instanceof AbiDecodingError) {
        console.error("Failed to decode return data:", error.message)
      }
    }
    

    See Also