Skip to content

Commit

Permalink
feat: add validation for zero amount in Jetton operations (#14)
Browse files Browse the repository at this point in the history
  • Loading branch information
iamIcarus authored and ya7on committed Dec 18, 2024
1 parent 7755620 commit ba73820
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 33 deletions.
4 changes: 3 additions & 1 deletion contracts/errors.tact
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@ const ERROR_CODE_NEED_FEE: Int = 6902;
// Jetton already initialized
const ERROR_JETTON_INITIALIZED: Int = 6903;
// Jetton max supply exceeded
const ERROR_MAX_SUPPLY_EXCEEDED: Int = 6904;
const ERROR_MAX_SUPPLY_EXCEEDED: Int = 6904;
// Invalid transfer amount (e.g., zero tokens)
const ERROR_CODE_INVALID_AMOUNT: Int = 6905;
4 changes: 4 additions & 0 deletions contracts/jetton/master.tact
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ contract JettonMaster with TEP74JettonMaster, TEP89JettonDiscoverable, Deployabl
receive(msg: JettonInit){
self.requireOwner();
nativeThrowIf(ERROR_JETTON_INITIALIZED, self.deployed);

self.metadata.set("name", msg.jetton_name);
self.metadata.set("description", msg.jetton_description);
self.metadata.set("symbol", msg.jetton_symbol);
Expand All @@ -56,7 +57,9 @@ contract JettonMaster with TEP74JettonMaster, TEP89JettonDiscoverable, Deployabl
}

receive(msg: JettonMint){
nativeThrowUnless(ERROR_CODE_INVALID_AMOUNT, msg.amount > 0); // Reject mint with amount <= 0
self.requireOwner();

nativeThrowIf(ERROR_MAX_SUPPLY_EXCEEDED, (self.current_supply + msg.amount) > self.max_supply);
let init = self.discover_wallet_state_init(myAddress(), msg.destination);
let to = contractAddress(init);
Expand All @@ -81,6 +84,7 @@ contract JettonMaster with TEP74JettonMaster, TEP89JettonDiscoverable, Deployabl
}

bounced(msg: bounced<JettonTransferInternal>){
nativeThrowUnless(ERROR_CODE_INVALID_AMOUNT, msg.amount > 0); // Is this needed? Keeping it for consistency
self.current_supply -= msg.amount;
}

Expand Down
8 changes: 8 additions & 0 deletions contracts/teps/tep74.tact
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ trait TEP74JettonMaster with TEP64Metadata, DiscoverWalletAddress {
metadata: OnchainMetadata;

receive(msg: JettonBurnInternal){
nativeThrowUnless(ERROR_CODE_INVALID_AMOUNT, msg.amount > 0); // Reject burn with amount <= 0

let ctx = context();
let init = self.discover_wallet_state_init(myAddress(), msg.sender);
let wallet_address = contractAddress(init);
Expand Down Expand Up @@ -75,6 +77,8 @@ trait TEP74JettonWallet with Ownable, DiscoverWalletAddress {
balance: Int;

receive(msg: JettonTransfer){
nativeThrowUnless(ERROR_CODE_INVALID_AMOUNT, msg.amount > 0); // Reject transfers with amount <= 0

let ctx = context();
self.requireOwner();
self.balance = self.balance - msg.amount;
Expand Down Expand Up @@ -105,6 +109,8 @@ trait TEP74JettonWallet with Ownable, DiscoverWalletAddress {
}

receive(msg: JettonTransferInternal){
nativeThrowUnless(ERROR_CODE_INVALID_AMOUNT, msg.amount > 0); // Reject transfers with amount <= 0

let ctx = context();
if (ctx.sender != self.master) {
let init = self.discover_wallet_state_init(self.master, msg.from);
Expand Down Expand Up @@ -148,6 +154,8 @@ trait TEP74JettonWallet with Ownable, DiscoverWalletAddress {
}

receive(msg: JettonBurn){
nativeThrowUnless(ERROR_CODE_INVALID_AMOUNT, msg.amount > 0); // Reject burn with amount <= 0

let ctx = context();
self.requireOwner();
nativeThrowUnless(ERROR_CODE_NEED_FEE,
Expand Down
47 changes: 26 additions & 21 deletions tests/JettonMaster.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ import { Blockchain, SandboxContract, TreasuryContract } from '@ton/sandbox';
import { beginCell, Builder, Cell, Dictionary, toNano } from '@ton/core';
import { JettonWallet } from '../build/Jetton/tact_JettonWallet';
import { JettonMaster } from '../build/Jetton/tact_JettonMaster';
import { OP_CODES } from './constants/opCodes';

import '@ton/test-utils';

const SYSTEM_CELL = Cell.fromBase64('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');
const SYSTEM_CELL = Cell.fromBase64('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');

const JETTON_NAME = "Test jetton";
const JETTON_DESCRIPTION = "Test jetton description. Test jetton description. Test jetton description";
Expand Down Expand Up @@ -53,14 +55,14 @@ describe('JettonMaster', () => {
to: jettonMaster.address,
success: true,
deploy: true,
op: 0x133701,
op: OP_CODES.JettonInit,
});
expect(deployResult.transactions).toHaveTransaction({
from: jettonMaster.address,
to: deployer.address,
success: true,
deploy: false,
op: 0x133702,
op: OP_CODES.JettonInitOk,
});
});

Expand Down Expand Up @@ -102,14 +104,14 @@ describe('JettonMaster', () => {
from: other.address,
to: otherJettonMaster.address,
success: true,
op: 0x133701,
op: OP_CODES.JettonInit,
});
expect(deployResult.transactions).toHaveTransaction({
from: otherJettonMaster.address,
to: other.address,
success: true,
deploy: false,
op: 0x133702,
op: OP_CODES.JettonInitOk,
});
let metadataResult = await otherJettonMaster.getGetJettonData();
let jettonContent = metadataResult.jetton_content.beginParse();
Expand Down Expand Up @@ -190,7 +192,7 @@ describe('JettonMaster', () => {
to: jettonMaster.address,
success: false,
deploy: false,
op: 0x133701,
op: OP_CODES.JettonInit,
exitCode: 6903,
});
});
Expand All @@ -216,7 +218,7 @@ describe('JettonMaster', () => {
to: jettonMaster.address,
success: false,
deploy: false,
op: 0x133701,
op: OP_CODES.JettonInit,
exitCode: 132,
});
});
Expand All @@ -239,7 +241,7 @@ describe('JettonMaster', () => {
to: jettonMaster.address,
success: true,
deploy: false,
op: 0x133703,
op: OP_CODES.JettonSetParameter,
});

// Jetton description
Expand All @@ -259,7 +261,7 @@ describe('JettonMaster', () => {
to: jettonMaster.address,
success: true,
deploy: false,
op: 0x133703,
op: OP_CODES.JettonSetParameter,
});

// Jetton symbol
Expand All @@ -279,7 +281,7 @@ describe('JettonMaster', () => {
to: jettonMaster.address,
success: true,
deploy: false,
op: 0x133703,
op: OP_CODES.JettonSetParameter,
});

// Jetton max_supply
Expand All @@ -299,14 +301,16 @@ describe('JettonMaster', () => {
to: jettonMaster.address,
success: true,
deploy: false,
op: 0x133703,
op: OP_CODES.JettonSetParameter,
});

// Checks
let jettonMasterMetadata = await jettonMaster.getGetJettonData();
expect(jettonMasterMetadata.mintable).toEqual(false);
expect(jettonMasterMetadata.mintable).toEqual(false);

let jettonContent = jettonMasterMetadata.jetton_content.beginParse();
expect(jettonContent.loadUint(8)).toEqual(0);

let metadataDict = jettonContent.loadDict(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell());
expect(
metadataDict.get(59089242681608890680090686026688704441792375738894456860693970539822503415433n)
Expand Down Expand Up @@ -344,7 +348,7 @@ describe('JettonMaster', () => {
to: jettonMaster.address,
success: true,
deploy: false,
op: 0x133704,
op: OP_CODES.JettonMint,
});
expect(mintResult.transactions).toHaveTransaction({
from: jettonMaster.address,
Expand Down Expand Up @@ -379,7 +383,7 @@ describe('JettonMaster', () => {
to: jettonMaster.address,
success: false,
deploy: false,
op: 0x133704,
op: OP_CODES.JettonMint,
exitCode: 132,
});
});
Expand All @@ -402,16 +406,16 @@ describe('JettonMaster', () => {
to: jettonMaster.address,
success: true,
deploy: false,
op: 0x2c76b973,
op: OP_CODES.ProvideWalletAddress,
});
expect(discoverResult.transactions).toHaveTransaction({
from: jettonMaster.address,
to: deployer.address,
success: true,
deploy: false,
op: 0xd1735400,
op: OP_CODES.TakeWalletAddress,
body: beginCell()
.storeUint(0xd1735400, 32)
.storeUint(OP_CODES.TakeWalletAddress, 32)
.storeUint(0, 64)
.storeAddress(otherJettonWallet.address)
.storeAddress(null)
Expand All @@ -437,16 +441,16 @@ describe('JettonMaster', () => {
to: jettonMaster.address,
success: true,
deploy: false,
op: 0x2c76b973,
op: OP_CODES.ProvideWalletAddress,
});
expect(discoverResult.transactions).toHaveTransaction({
from: jettonMaster.address,
to: deployer.address,
success: true,
deploy: false,
op: 0xd1735400,
op: OP_CODES.TakeWalletAddress,
body: beginCell()
.storeUint(0xd1735400, 32)
.storeUint(OP_CODES.TakeWalletAddress, 32)
.storeUint(0, 64)
.storeAddress(otherJettonWallet.address)
.storeAddress(other.address)
Expand All @@ -455,7 +459,8 @@ describe('JettonMaster', () => {
});

it('should return system cell', async () => {
let systemCell = await jettonMaster.getGetTactSystemCell();
let systemCell = await jettonMaster.getGetTactSystemCell();
expect(systemCell).toEqualCell(SYSTEM_CELL);
});

});
23 changes: 12 additions & 11 deletions tests/JettonWallet.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Blockchain, SandboxContract, TreasuryContract } from '@ton/sandbox';
import { beginCell, Builder, toNano } from '@ton/core';
import { JettonWallet } from '../build/Jetton/tact_JettonWallet';
import { JettonMaster } from '../build/Jetton/tact_JettonMaster';
import { OP_CODES } from './constants/opCodes';
import '@ton/test-utils';

const JETTON_NAME = "Test jetton";
Expand Down Expand Up @@ -77,25 +78,25 @@ describe('JettonMaster', () => {
to: jettonWallet.address,
deploy: false,
success: true,
op: 0x0f8a7ea5,
op: OP_CODES.JettonTransfer,
});
expect(transferResult.transactions).toHaveTransaction({
from: jettonWallet.address,
to: otherJettonWallet.address,
deploy: true,
success: true,
op: 0x178d4519,
op: OP_CODES.JettonTransferInternal,
});
expect(transferResult.transactions).toHaveTransaction({
from: otherJettonWallet.address,
to: other.address,
op: 0x7362d09c,
op: OP_CODES.JettonTransferNotification,
});
expect(transferResult.transactions).toHaveTransaction({
from: otherJettonWallet.address,
to: other.address,
success: true,
op: 0xd53276db,
op: OP_CODES.Excesses,
});

let jettonWalletData = await jettonWallet.getGetWalletData();
Expand Down Expand Up @@ -127,7 +128,7 @@ describe('JettonMaster', () => {
to: jettonWallet.address,
deploy: false,
success: false,
op: 0x0f8a7ea5,
op: OP_CODES.JettonTransfer,
exitCode: 132,
});

Expand Down Expand Up @@ -157,7 +158,7 @@ describe('JettonMaster', () => {
to: jettonWallet.address,
deploy: false,
success: false,
op: 0x0f8a7ea5,
op: OP_CODES.JettonTransfer,
exitCode: 6901,
});

Expand All @@ -184,21 +185,21 @@ describe('JettonMaster', () => {
to: jettonWallet.address,
deploy: false,
success: true,
op: 0x595f07bc,
op: OP_CODES.JettonBurn,
});
expect(transferResult.transactions).toHaveTransaction({
from: jettonWallet.address,
to: jettonMaster.address,
deploy: false,
success: true,
op: 0x7bdd97de,
op: OP_CODES.JettonBurnInternal,
});
expect(transferResult.transactions).toHaveTransaction({
from: jettonMaster.address,
to: deployer.address,
deploy: false,
success: true,
op: 0x7bdd97de,
op: OP_CODES.JettonBurnInternal,
});

let jettonWalletData = await jettonWallet.getGetWalletData();
Expand All @@ -224,7 +225,7 @@ describe('JettonMaster', () => {
to: jettonWallet.address,
deploy: false,
success: false,
op: 0x595f07bc,
op: OP_CODES.JettonBurn,
exitCode: 132,
});

Expand All @@ -251,7 +252,7 @@ describe('JettonMaster', () => {
to: jettonWallet.address,
deploy: false,
success: false,
op: 0x595f07bc,
op: OP_CODES.JettonBurn,
exitCode: 6901,
});

Expand Down
15 changes: 15 additions & 0 deletions tests/constants/opCodes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@

export const OP_CODES = {
JettonTransfer: 0x0f8a7ea5, // Message for transferring Jettons
JettonTransferInternal: 0x178d4519, // Internal Jetton transfer
JettonTransferNotification: 0x7362d09c,// Notification for a completed transfer
JettonBurn: 0x595f07bc, // Burn Jettons
JettonBurnInternal: 0x7bdd97de, // Internal Jetton burn
Excesses: 0xd53276db, // Handle excess balances
ProvideWalletAddress: 0x2c76b973, // Request a Jetton wallet address
TakeWalletAddress: 0xd1735400, // Respond with a Jetton wallet address
JettonInit: 0x133701, // Initialize the Jetton
JettonInitOk: 0x133702, // Confirm Jetton initialization
JettonSetParameter: 0x133703, // Set Jetton parameters
JettonMint: 0x133704, // Mint new Jettons
};

0 comments on commit ba73820

Please sign in to comment.