UNPKG

hapi-ton-sdk

Version:

SDK for managing HAPI attestations on TON network

1 lines 11.5 kB
{"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":[]}