Kana Labs
  • Getting Started
    • Welcome to Kana Labs
  • CROSS CHAIN SWAPS
    • AMM DEX Aggregator
  • INTEGRATE KANA WIDGET
    • Kana Widget
      • Install Widget
      • Configure Widget
      • Configure Aptos Keyless
  • Web3 Aggregator SDK
    • Web3 Aggregator SDK
      • Installation
      • SameChain
      • Cross Chain Swap
      • Aggregator API's
  • SPOT TRADING PLATFORM
    • Kana Trade
      • API Docs
  • PERPETUAL FUTURES
    • Kana Perps
      • Getting Started
        • Mint Tokens on Testnet
      • Breaking Down Kana Perps
        • Assets Supported
        • Order Types
        • Orderbook
        • Funding Rate
        • Leverage
        • Margin and Liquidation
        • Hedge Mode
          • Hedging a Short-Term 2-3% Price Decline
          • Dual Positioning for Flexible Profit-Taking
        • Trading Fees
      • API Docs
        • Installation Setup
        • Kana Perps Typescript REST API
        • Kana Perps Python Websocket API
        • Kana Perps Python REST API
        • Steps to place an order
        • Perps Contract Error Codes
        • Websocket Connection
        • Supported Markets
  • SPOT & PERP APIs
    • Trading APIs
      • Kana Trade API
      • Kana Perps API
        • Installation Setup
        • Example setup functions
        • Kana Perps Typescript REST API
        • Kana Perps Websocket API
        • Kana Perps Python Websocket API
        • Kana Perps Python REST API
        • Steps to place an order
  • PAYMASTER SERVICE
    • Kana Paymaster For Aptos and Supra
      • How it works?
      • How to Register?
      • Deposit Allowance
      • Manage Users
      • Paymaster SDK Tutorial (Typescript)
      • Paymaster API
      • Module & Function Whitelist
      • Subscription - Coming soon
      • FAQS
  • PERPETUAL OPTIONS
    • OPerps
  • Tokenomics & Governance
    • Kana Labs Tokenomics
  • REWARDS & REFERRAL PROGRAM
    • Rewards Program
      • Reward Program Season 1
      • Reward Program Season 2
      • How to Keep Track of Your Points?
      • Where to find the Missions Dashboard?
  • Referral Program
    • How to Generate Referral Link? (For the Referrer)
    • How to map your wallet to the invite IDs? (For the invited users)
Powered by GitBook
On this page
  • To initialize Aptos account
  • To whitelist an address
  • To disable user
  • To enable user
  • Is whitelisted
  • Sponsor Transaction for Aptos and Supra
  • Paymaster API Example Repo
  1. PAYMASTER SERVICE
  2. Kana Paymaster For Aptos and Supra

Paymaster API

const baseUrl = "https://paymaster.kanalabs.io"
const projectKey = process.env.PROJECT_KEY
const network = Network.MAINNET // mainnet
const chain = chainName.Aptos // aptos 
const headers = {
      'Content-Type': 'application/json',
      'api-key': projectKey,
       network: network ?? Network.MAINNET,
       chain: chain ?? chainName.Aptos,
    }

To initialize Aptos account

Note: The address needs to be whitelisted before initializing it

  async initAccount() {
    const url = `${baseUrl}/initAccount`
    const params = { address: "0x0b4b8ef78fb296f89006f1936f01427a3a7e0eadd11dd4998c6bf438a0c8ce6b" }
    try {
      const response = await axios.get(url, { params, headers })
      return response.data
    } catch (error: any) {
      throw error?.data || error
    }
  }

To whitelist an address

  async addToWhitelist() {
    const url = `${baseUrl}/addToWhitelist`
    const params = { user_address: "0x0b4b8ef78fb296f89006f1936f01427a3a7e0eadd11dd4998c6bf438a0c8ce6b" }
    try {
      const response = await axios.get(url, { params, headers })
      return response.data
    } catch (error: any) {
      throw error?.data || error
    }
  }

To disable user

Note: To stop/pause users from using sponsored txns

  async disableUser() {
    const url = `${baseUrl}/modifyUserState`
    const params = { user_address: "0x0b4b8ef78fb296f89006f1936f01427a3a7e0eadd11dd4998c6bf438a0c8ce6b", status: false }
    try {
      const response = await axios.get(url, { params, headers })
      return response.data
    } catch (error: any) {
      throw error?.data || error
    }
  }

To enable user

Note: To resume sponsored txns for a user

 async enableUser() {
    const url = `${baseUrl}/modifyUserState`
    const params = { user_address: "0x0b4b8ef78fb296f89006f1936f01427a3a7e0eadd11dd4998c6bf438a0c8ce6b", status: true } 
    try {
      const response = await axios.get(url, { params, headers })
      return response.data
    } catch (error: any) {
      throw error?.data || error
    }
  }

Is whitelisted

Note: To check whether an address is already whitelisted or not

  async isWhitelisted() {
    const url = `${baseUrl}/isWhitelisted`
    const params = { address: "0x0b4b8ef78fb296f89006f1936f01427a3a7e0eadd11dd4998c6bf438a0c8ce6b"}
    try {
      const response = await axios.get(url, { params, headers })
      return response.data
    } catch (error: any) {
      throw error?.data || error
    }
  }

Sponsor Transaction for Aptos and Supra

Build txn with feepayer : true and send it to /sponsorGas endpoint with api-key it will return { feePayerAddress, feePayerAuth }

async sponsoredTxn(args: {
    data: TransactionPayload | SupraPayload
    senderAddress?: string
    senderAuth?: TxnBuilderTypes.AccountAuthenticatorEd25519
    transaction?: TxnBuilderTypes.RawTransaction
    options?: TransactionOptions
  }): Promise<PendingTransactionResponse | PendingTransactionResponseForSupra> {
    try {
      if (this.wallet === undefined) {
        throw new Error('No wallet')
      }
      let rawTransactionBytes: Uint8Array
      let committedTxn: TransactionResponse | PendingTransactionResponse
      let senderAuth: AccountAuthenticator | TxnBuilderTypes.AccountAuthenticatorEd25519
      let transaction: SimpleTransaction

      if (this.chain === chainName.Supra) {
        rawTransactionBytes = BCS.bcsToBytes(args.transaction)
      } else {
        transaction = await this.aptosClient.transaction.build.simple({
          sender: this.wallet.accountAddress.toString(),
          data: args.data as TransactionPayload,
          options: args.options,
          withFeePayer: true,
        })

        senderAuth = this.aptosClient.transaction.sign({
          signer: this.wallet,
          transaction,
        })

        rawTransactionBytes = transaction.rawTransaction.bcsToBytes()
      }

      const url = `${this.baseUrl}/sponsorGas`
      const headers = this.getCommonHeaders()
      const response = await fetch(url, {
        method: 'POST',
        headers: headers,
        body: JSON.stringify({ data: rawTransactionBytes }),
      })
      if (response.status >= 400) {
        await response.json().then((data) => {
          throw new Error(data?.error || data?.message || 'Error in sponsoring transaction.')
        })
      }
      const responseData = await response.json()
      const feePayerAddress = responseData.feePayerAddress
      const feepayerSignature = new Uint8Array(Object.values(responseData.feePayerAuth))

      if (this.chain === chainName.Supra) {
        const deserializerFeePayer = new BCS.Deserializer(feepayerSignature)
        const feepayerAuth = TxnBuilderTypes.AccountAuthenticatorEd25519.deserialize(
          deserializerFeePayer,
        ) as TxnBuilderTypes.AccountAuthenticatorEd25519
        committedTxn = await this.SupraClient.sendSponsorTransaction(
          args.senderAddress,
          feePayerAddress,
          [],
          args.transaction,
          args.senderAuth,
          feepayerAuth,
          [],
          {
            enableWaitForTransaction: true,
            enableTransactionSimulation: true,
          },
        )
      } else {
        const deserializerFeePayer: any = new Deserializer(feepayerSignature)
        const feepayerAuth = AccountAuthenticator.deserialize(deserializerFeePayer)
        committedTxn = await this.aptosClient.transaction.submit.simple({
          transaction: {
            rawTransaction: transaction.rawTransaction as any,
            feePayerAddress: AccountAddress.fromString(feePayerAddress),
          } as AnyRawTransaction,
          senderAuthenticator: senderAuth as AccountAuthenticator,
          feePayerAuthenticator: feepayerAuth as AccountAuthenticator,
        })
      }
      return committedTxn
    } catch (error: any) {
      throw error?.response?.data || error
    }
  }

Paymaster API Example Repo

PreviousPaymaster SDK Tutorial (Typescript)NextModule & Function Whitelist

Last updated 2 months ago

https://github.com/kanalabs/aptos-paymaster-api-example