{"version":3,"sources":["../../src/contracts/HapiAttestation.ts","../../src/config.ts","../../src/utils/crc32.ts","../../src/types/index.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"],"mappings":"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","names":[]}