{"version":3,"sources":["../../src/contracts/HapiAttestation.ts","../../src/config.ts","../../src/utils/crc32.ts","../../src/types/index.ts","../../src/contracts/UserJetton.ts","../../src/utils/index.ts","../../src/core/HapiSDK.ts"],"sourcesContent":["import {\n  Address,\n  Cell,\n  Contract,\n  ContractProvider,\n  SendMode,\n  Sender,\n  TupleItemSlice,\n  beginCell,\n  address as toAddress,\n} from \"@ton/core\";\n\nimport { config } from \"../config\";\n\nimport { OpCode } from \"../types\";\n\nimport { ContractAdapter } from \"@ton-api/ton-adapter\";\n\nexport class HapiTonAttestation implements Contract {\n  constructor(\n    readonly address: Address,\n    readonly init?: { code: Cell; data: Cell }\n  ) {}\n\n  static createFromAddress(\n    address = config.ton.score,\n    contractAdapter: ContractAdapter\n  ) {\n    return contractAdapter.open(new HapiTonAttestation(toAddress(address)));\n  }\n\n  async getCreateAttestationFee(provider: ContractProvider): Promise<bigint> {\n    const result = await provider.get(\"get_create_attestation_fee\", []);\n    return result.stack.readBigNumber();\n  }\n\n  async getUpdateAttestationFee(provider: ContractProvider): Promise<bigint> {\n    const result = await provider.get(\"get_update_attestation_fee\", []);\n    return result.stack.readBigNumber();\n  }\n\n  async getAttestationData(provider: ContractProvider) {\n    const res = await provider.get(\"get_hapi_attestation_data\", []);\n    const userCount = res.stack.readBigNumber();\n    const contractOwner = res.stack.readAddress();\n    const commissionOwner = res.stack.readAddress();\n    const createAttestatioFee = res.stack.readBigNumber();\n    const updateAttestatioFee = res.stack.readBigNumber();\n    const walletCode = res.stack.readCell();\n\n    return {\n      userCount,\n      contractOwner,\n      commissionOwner,\n      createAttestatioFee,\n      updateAttestatioFee,\n      walletCode,\n    };\n  }\n\n  static async getUserJettonAddress(\n    provider: ContractProvider,\n    address: string\n  ): Promise<Address> {\n    const result = await provider.get(\"get_user_jetton_address\", [\n      {\n        type: \"slice\",\n        cell: beginCell().storeAddress(toAddress(address)).endCell(),\n      } as TupleItemSlice,\n    ]);\n    return result.stack.readAddress();\n  }\n\n  static getStaticUserJettonAddress(address: string): Address {\n    const JETTON_WALLET_CODE = Cell.fromBoc(\n      Buffer.from(\n        \"b5ee9c724102140100013b000114ff00f4a413f4bcf2c80b01020120021302014803070202cb040602dfd0ccc7434c0c05c6c2456f80871c02456f83e900c36cf1b088134c7c860842576e74e6ea497c1b81450b1c17cb87d208433e45309eea3ac40b4cfc0407481f4cffe803e900c208203d0901c3ec08076cf08d04d8572140173c584f2c1f2cfc073c5b3327b55007c057817c12103fcbc212050028c8801001cb0558cf1601fa027001cb6ac973fb000049a2e4400800e58280e78b387d013800e5b541086a993b6d80e58f8080e59fe4c080417d80400201480811020120090e0201480a0b0111ae56ed9e08122f8240120201200c0d0110a9d4db3c10345f0412010aa9bfdb3c30120201580f10000fad97fc13b7911840010dacd2ed9e2f824012010fb9996db3c145f04812001aed44d0fa40d207d33ffa40d430000cf230840ff2f0a35e372c\",\n        \"hex\"\n      )\n    )[0];\n\n    const JETTON_MASTER_ADDRESS = Address.parse(config.ton.score);\n    const USER_ADDRESS = Address.parse(address);\n\n    const USER_ADDRESS_CELL = beginCell().storeAddress(USER_ADDRESS).endCell();\n    const JETTON_MASTER_ADDRESS_CELL = beginCell()\n      .storeAddress(JETTON_MASTER_ADDRESS)\n      .endCell();\n\n    const userJettonWalletData = beginCell()\n      .storeSlice(USER_ADDRESS_CELL.asSlice())\n      .storeUint(0, 8)\n      .storeUint(0, 64)\n      .storeSlice(JETTON_MASTER_ADDRESS_CELL.asSlice())\n      .storeRef(JETTON_WALLET_CODE)\n      .endCell();\n\n    const jettonWalletStateInit = beginCell()\n      .storeUint(0, 2)\n      .storeMaybeRef(JETTON_WALLET_CODE)\n      .storeMaybeRef(userJettonWalletData)\n      .storeUint(0, 1)\n      .endCell();\n\n    return new Address(0, jettonWalletStateInit.hash());\n  }\n\n  prepareCreateAttestation(opts: {\n    queryId: number;\n    trustScore: number;\n    expirationDate: number;\n    signature: Buffer;\n    value: bigint;\n    referralId?: bigint;\n  }) {\n    return {\n      value: opts.value,\n      sendMode: SendMode.PAY_GAS_SEPARATELY,\n      body: beginCell()\n        .storeUint(OpCode.createAttestation, 32)\n        .storeUint(opts.queryId, 64)\n        .storeUint(opts.referralId ?? 0n, 64)\n        .storeUint(opts.trustScore, 8)\n        .storeUint(opts.expirationDate, 64)\n        .storeBuffer(opts.signature)\n        .endCell(),\n    };\n  }\n\n  async sendCreateAttestation(\n    provider: ContractProvider,\n    via: Sender,\n    opts: {\n      queryId: number;\n      trustScore: number;\n      expirationDate: number;\n      signature: Buffer;\n      value: bigint;\n      referralId?: bigint;\n    }\n  ) {\n    await provider.internal(via, this.prepareCreateAttestation(opts));\n  }\n\n  prepareUpdateAttestation(opts: {\n    queryId: number;\n    trustScore: number;\n    expirationDate: number;\n    signature: Buffer;\n    value: bigint;\n    referralId?: bigint;\n  }) {\n    return {\n      value: opts.value,\n      sendMode: SendMode.PAY_GAS_SEPARATELY,\n      body: beginCell()\n        .storeUint(OpCode.updateAttestation, 32)\n        .storeUint(opts.queryId, 64)\n        .storeUint(opts.referralId ?? 0n, 64)\n        .storeUint(opts.trustScore, 8)\n        .storeUint(opts.expirationDate, 64)\n        .storeBuffer(opts.signature)\n        .endCell(),\n    };\n  }\n\n  async sendUpdateAttestation(\n    provider: ContractProvider,\n    via: Sender,\n    opts: {\n      queryId: number;\n      trustScore: number;\n      expirationDate: number;\n      signature: Buffer;\n      value: bigint;\n    }\n  ) {\n    await provider.internal(via, this.prepareUpdateAttestation(opts));\n  }\n}\n","interface Config {\n  apiStaging: string;\n  apiProduction: string;\n  ton: Readonly<{\n    score: string;\n    nodeUrl: string;\n  }>;\n  tonTestnet: Readonly<{\n    score: string;\n    nodeUrl: string;\n  }>;\n  tonApiPath: (hash: string) => string;\n}\n\nexport const config: Readonly<Config> = {\n  apiStaging: \"https://hapi-one.stage.hapi.farm\",\n  apiProduction: \"https://score-be.hapi.mobi\",\n  ton: {\n    score: \"kQC60vGFCtYeQi-S0p6Lhfghd0vYS1YcTiHDWhEmuQ39QpCh\",\n    nodeUrl: \"https://tonapi.io\",\n  },\n  tonTestnet: {\n    score: \"kQC60vGFCtYeQi-S0p6Lhfghd0vYS1YcTiHDWhEmuQ39QpCh\",\n    nodeUrl: \"https://testnet.tonapi.io\",\n  },\n  tonApiPath: (hash: string) => `/v2/blockchain/messages/${hash}/transaction`,\n};\n","export function crc32(str: string): number {\n  const table = new Int32Array(256);\n  for (let i = 0; i < 256; i++) {\n    let c = i;\n    for (let j = 0; j < 8; j++) {\n      c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n    }\n    table[i] = c;\n  }\n\n  let crc = -1;\n  for (let i = 0; i < str.length; i++) {\n    crc = (crc >>> 8) ^ table[(crc ^ str.charCodeAt(i)) & 0xff];\n  }\n  return (crc ^ -1) >>> 0;\n}\n","import { crc32 } from \"../utils/crc32\";\n\nexport interface UserResponse {\n  errorCode: number;\n  scores: [\n    {\n      address: string;\n      expirationDate: number | null;\n      isMinted: boolean;\n      network: string;\n      score: number | null;\n    }\n  ];\n}\n\nexport interface TrustResponseData {\n  errorCode: number;\n  wallet: string;\n  score: number;\n  expiration: number;\n  signature: string;\n  validation?: string;\n  attestationId?: string | null;\n  recovery_id?: string;\n  isRemint?: boolean;\n}\n\nexport interface AttestationParams {\n  signature: string;\n  trust: number;\n  expiration: number;\n  ref_id: number;\n}\n\nexport interface CreateAttestationOptions {\n  queryId: number;\n  trustScore: number;\n  expirationDate: number;\n  signature: Buffer;\n  value: bigint;\n  referralId?: bigint;\n}\n\nexport interface UpdateAttestationOptions {\n  queryId: number;\n  trustScore: number;\n  expirationDate: number;\n  signature: Buffer;\n  value: bigint;\n}\n\nexport interface SDKConfig {\n  hapiEndpoint: string;\n  contractAddress: string;\n  nodeUrl: string;\n  referralId: number;\n  network: number;\n  tonApiKey?: string;\n}\n\nexport interface AttestationChangeEvent {\n  userAddress: string;\n  refId: number;\n}\n\nexport const OpCode = {\n  createAttestation: crc32(\"create_attestation\"),\n  updateAttestation: crc32(\"update_attestation\"),\n} as const;\n","import { Address, Cell, Contract, ContractProvider } from \"@ton/core\";\n\nimport { ContractAdapter } from \"@ton-api/ton-adapter\";\n\nexport class UserTonJetton implements Contract {\n  constructor(\n    readonly address: Address,\n    readonly init?: { code: Cell; data: Cell }\n  ) {}\n\n  static createFromAddress(address: Address, contractAdapter: ContractAdapter) {\n    return contractAdapter.open(new UserTonJetton(address));\n  }\n\n  async getBalance(provider: ContractProvider): Promise<bigint> {\n    const result = await provider.get(\"get_smc_balance\", []);\n    return result.stack.readBigNumber();\n  }\n\n  async getOwner(provider: ContractProvider): Promise<Address> {\n    const result = await provider.get(\"get_owner\", []);\n    return result.stack.readAddress();\n  }\n  async getAttestationAddress(provider: ContractProvider): Promise<Address> {\n    const result = await provider.get(\"get_attestation_address\", []);\n    return result.stack.readAddress();\n  }\n\n  async getTrustScore(provider: ContractProvider): Promise<number> {\n    const result = await provider.get(\"get_trust_score\", []);\n    return result.stack.readNumber();\n  }\n\n  async getExpirationDate(provider: ContractProvider): Promise<number> {\n    const result = await provider.get(\"get_expiration_date\", []);\n    return result.stack.readNumber();\n  }\n\n  async getAttestationData(provider: ContractProvider) {\n    const res = await provider.get(\"get_user_data\", []);\n    const commissionOwner = res.stack.readAddress();\n    const trustScore = res.stack.readBigNumber();\n    const expirationDate = res.stack.readBigNumber();\n    const attestationAddress = res.stack.readAddress();\n    return {\n      commissionOwner,\n      trustScore,\n      expirationDate,\n      attestationAddress,\n    };\n  }\n}\n","import { toNano } from \"@ton/core\";\n\nexport const delay = async (time = 1000): Promise<void> => {\n  return new Promise((res) => setTimeout(res, time));\n};\n\nexport const TON_DEFAULT_GAS = toNano(\"0.05\");\nexport const TON_MIN_COMMISSION = toNano(\"0.01\");\nexport const TON_MIN_JETTON_STORAGE = toNano(\"0.001\");\n","import { Address } from \"@ton/core\";\nimport { ContractAdapter } from \"@ton-api/ton-adapter\";\nimport { SDKConfig, TrustResponseData, UserResponse } from \"../types\";\nimport { HapiTonAttestation } from \"../contracts/HapiAttestation\";\nimport { UserTonJetton } from \"../contracts/UserJetton\";\nimport {\n  delay,\n  TON_DEFAULT_GAS,\n  TON_MIN_COMMISSION,\n  TON_MIN_JETTON_STORAGE,\n} from \"../utils\";\nimport { config } from \"../config\";\nimport axios from \"axios\";\n\nexport class HapiSDK {\n  private config: SDKConfig;\n\n  constructor(args: {\n    referralId: number;\n    staging?: boolean;\n    testnet?: boolean;\n    tonApiKey?: string;\n  }) {\n    this.config = {\n      hapiEndpoint: args.staging ? config.apiStaging : config.apiProduction,\n      contractAddress: config.ton.score,\n      nodeUrl: args.testnet ? config.tonTestnet.nodeUrl : config.ton.nodeUrl,\n      network: args.testnet ? -3 : -239,\n      referralId: args.referralId,\n      tonApiKey: args.tonApiKey,\n    };\n  }\n\n  async getUser(jwt: string): Promise<UserResponse> {\n    try {\n      const response = await axios.get(\n        `${this.config.hapiEndpoint}/ref/v2/get-user`,\n        {\n          headers: {\n            Authorization: `Bearer ${jwt}`,\n          },\n        }\n      );\n      return response.data;\n    } catch (error) {\n      throw new Error(`Failed to get user: ${error}`);\n    }\n  }\n\n  async getTrustScore(\n    address: string,\n    network: number,\n    jwt: string\n  ): Promise<TrustResponseData> {\n    try {\n      const response = await axios.post(\n        `${this.config.hapiEndpoint}/ref/v2/score`,\n        {\n          address,\n          network,\n        },\n        {\n          headers: {\n            Authorization: `Bearer ${jwt}`,\n          },\n        }\n      );\n      return response.data;\n    } catch (error) {\n      throw new Error(`Failed to get trust score: ${error}`);\n    }\n  }\n\n  async getMessage() {\n    try {\n      const response = await axios.get(\n        `${this.config.hapiEndpoint}/ref/v2/ton-payload`\n      );\n      return response.data;\n    } catch (error) {\n      throw new Error(`Failed to get ton payload: ${error}`);\n    }\n  }\n\n  async checkProof({\n    proof,\n    address,\n    network,\n  }: {\n    proof: {\n      state_init: string;\n      timestamp: number;\n      domain: { lengthBytes: number; value: string };\n      payload: string;\n      signature: string;\n    };\n    address: string;\n    network: number;\n  }) {\n    return axios.post(`${this.config.hapiEndpoint}/ref/v2/ton-login`, {\n      proof,\n      address,\n      network,\n    });\n  }\n\n  static async getUserAttestationOnchain(\n    userAddress: string,\n    contractAdapter: ContractAdapter\n  ): Promise<{\n    jettonAddress: Address;\n    attestationData: {\n      commissionOwner: Address;\n      trustScore: bigint;\n      expirationDate: bigint;\n      attestationAddress: Address;\n    };\n  }> {\n    try {\n      const jettonAddress =\n        HapiTonAttestation.getStaticUserJettonAddress(userAddress);\n      const jettonContract = UserTonJetton.createFromAddress(\n        jettonAddress,\n        contractAdapter\n      );\n      const attestationData = await jettonContract.getAttestationData();\n\n      return {\n        jettonAddress,\n        attestationData,\n      };\n    } catch (error) {\n      throw new Error(`Failed to get user attestation data: ${error}`);\n    }\n  }\n\n  async trackAttestationResult(\n    transactionMessageHash: string,\n    timeInterval = 7000,\n    maxRetries = 9\n  ) {\n    let attempt = 0;\n    let status: boolean | null = null;\n    let data;\n\n    while (attempt < maxRetries) {\n      try {\n        await delay(timeInterval);\n        const transactionData = await axios.get(\n          this.config.nodeUrl + config.tonApiPath(transactionMessageHash)\n        );\n\n        if (transactionData.status === 200 && transactionData.data.hash) {\n          status = true;\n          try {\n            await axios.post(\n              `${this.config.hapiEndpoint}/ref/v2/ref_transaction`,\n              {\n                hash: transactionData.data.hash,\n                network: this.config.network,\n              },\n              {\n                headers: {\n                  \"Content-Type\": \"application/json\",\n                  Authorization: `Bearer ${this.config.tonApiKey}`,\n                },\n              }\n            );\n          } catch (error) {\n            console.error(\"Error updating attestation count:\", error);\n          }\n          break;\n        } else {\n          status = false;\n        }\n      } catch (error) {\n        console.error(`Error: while get locating transaction`, error);\n      }\n\n      attempt++;\n    }\n\n    return { status, data };\n  }\n\n  async calculateTransactionFee(\n    isUpdate: boolean,\n    contractAdapter: ContractAdapter\n  ): Promise<bigint> {\n    try {\n      const hapiContract = HapiTonAttestation.createFromAddress(\n        this.config.contractAddress,\n        contractAdapter\n      );\n\n      const fee = isUpdate\n        ? await hapiContract.getUpdateAttestationFee()\n        : await hapiContract.getCreateAttestationFee();\n\n      return isUpdate\n        ? fee + TON_DEFAULT_GAS + TON_MIN_COMMISSION\n        : fee + TON_DEFAULT_GAS + TON_MIN_COMMISSION + TON_MIN_JETTON_STORAGE;\n    } catch (error) {\n      throw new Error(`Failed to calculate transaction fee: ${error}`);\n    }\n  }\n}\n"],"mappings":"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","names":[]}