import chai, {assert, expect} from "chai"; import chaiBN from "chai-bn"; import BN from "bn.js"; chai.use(chaiBN(BN)); import {Address, Builder, Cell, contractAddress, Slice} from "ton"; import {runContract, SmartContract} from "ton-contract-executor"; import * as main from "../contracts/main"; import {internalMessage, randomAddress} from "./helpers"; import {hex} from "../build/nft-collection.compiled.json"; import {hex as item_code} from "../build/nft-item.compiled.json"; import {makeSnakeCell} from "../contracts/utils"; import {keyPairFromSeed, KeyPair, sign, keyPairFromSecretKey} from "ton-crypto"; import {signBuy} from "../contracts/main"; let ownerKeys = keyPairFromSeed(Buffer.from("0000000000000000000000000000000000000000000000000000000000000000", "hex")); let ownerPubNum = new BN(ownerKeys.publicKey); let data = main.collectionData({ ownerAddress: randomAddress("owner"), code: Cell.fromBoc(item_code)[0], ownerKey: ownerPubNum, }); describe("Signing tests", () => { let contract: SmartContract; let debug: boolean = true; beforeEach(async () => { contract = await SmartContract.fromCell( Cell.fromBoc(hex)[0], data, {debug: debug} ); contract.setC7Config({ myself: randomAddress("collection") }) }); it("allows to buy an item with a valid signature", async () => { main.setContractBalance(contract, 10 * main.TON(), randomAddress("collection")); let ownerAddr = randomAddress("dude"); let signature = signBuy("test", randomAddress("collection"), ownerAddr, ownerKeys.secretKey); const sendToSelfMessage = internalMessage({ from: ownerAddr, body: main.createItem({domain: "test", signature: signature}), value: new BN(100 * main.TON()), }); const res = await contract.sendInternalMessage(sendToSelfMessage); // console.log(res); // let fs = require('fs'); // fs.writeFile('logs.txt', res.logs, (_: any) => {}); expect(res.type).to.equal("success"); expect(res.exit_code).to.equal(0); }); it("does not allow to buy an item if the signature is for another user", async () => { main.setContractBalance(contract, 10 * main.TON(), randomAddress("collection")); let signature = signBuy("test", randomAddress("collection"), randomAddress("dude"), ownerKeys.secretKey); const sendToSelfMessage = internalMessage({ from: randomAddress("dude2"), body: main.createItem({domain: "test", signature: signature}), value: new BN(100 * main.TON()), }); const res = await contract.sendInternalMessage(sendToSelfMessage); expect(res.type).to.equal("failed"); expect(res.exit_code).to.equal(205); }); });