diff --git a/contracts/errors.tact b/contracts/errors.tact index 3649206..e30b390 100644 --- a/contracts/errors.tact +++ b/contracts/errors.tact @@ -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; \ No newline at end of file +const ERROR_MAX_SUPPLY_EXCEEDED: Int = 6904; +// Invalid transfer amount (e.g., zero tokens) +const ERROR_CODE_INVALID_AMOUNT: Int = 6905; \ No newline at end of file diff --git a/contracts/jetton/master.tact b/contracts/jetton/master.tact index 6f6d26b..a262a9c 100644 --- a/contracts/jetton/master.tact +++ b/contracts/jetton/master.tact @@ -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); @@ -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); @@ -81,6 +84,7 @@ contract JettonMaster with TEP74JettonMaster, TEP89JettonDiscoverable, Deployabl } bounced(msg: bounced){ + nativeThrowUnless(ERROR_CODE_INVALID_AMOUNT, msg.amount > 0); // Is this needed? Keeping it for consistency self.current_supply -= msg.amount; } diff --git a/contracts/teps/tep74.tact b/contracts/teps/tep74.tact index 07b2b78..a2ecdd0 100644 --- a/contracts/teps/tep74.tact +++ b/contracts/teps/tep74.tact @@ -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); @@ -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; @@ -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); @@ -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, diff --git a/tests/JettonMaster.spec.ts b/tests/JettonMaster.spec.ts index 37db354..b192277 100644 --- a/tests/JettonMaster.spec.ts +++ b/tests/JettonMaster.spec.ts @@ -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('te6cckECIgEAB8QAAQHAAQEFoB1rAgEU/wD0pBP0vPLICwMCAWIEFwN60AHQ0wMBcbCjAfpAASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IhUUFMDbwT4YQL4Yts8VRTbPPLgghwFFgP2AY5XgCDXIXAh10nCH5UwINcLH94gghAXjUUZuo4YMNMfAYIQF41FGbry4IHTP/oAWWwSMaB/4IIQe92X3rqOF9MfAYIQe92X3rry4IHTP/oAWWwSMaB/4DB/4HAh10nCH5UwINcLH94gghAPin6luo8IMNs8bBfbPH/gBgcKAMbTHwGCEA+KfqW68uCB0z/6APpAASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IgB+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiAHSAAGR1JJtAeL6AFFmFhUUQzAEgjL4QW8kEE4QPUy62zwooYEa9SHC//L0VB3LgRr2DNs8qgCCCTEtAKCCCJiWgKAtoFAKuRjy9FIGXjQQOkkY2zxcERINCALWcFnIcAHLAXMBywFwAcsAEszMyfkAyHIBywFwAcsAEsoHy//J0CDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IhQmHCAQH8pTxMBERABDshVUNs8yRBnEFkQShA7QYAQNhA1EDRZ2zwwQ0QJFACqghAXjUUZUAfLHxXLP1AD+gIBINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiM8WASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFgH6AgHPFgPAIIIQF41FGbqPCDDbPGwW2zx/4IIQWV8HvLqOwdMfAYIQWV8HvLry4IHTP/oA+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiAHSAAGR1JJtAeJVMGwU2zx/4DBwCwwQALLTHwGCEBeNRRm68uCB0z/6APpAASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IgB+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiAH6AFFVFRRDMALu+EFvJFPixwWzjtkuBRBOED1MvyjbPHBZyHABywFzAcsBcAHLABLMzMn5AMhyAcsBcAHLABLKB8v/ydAg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIUtDHBfLghBBOED1Mut5RqKCBGvUhwv/y9CGCCJiWgKENDgCSyFJAzHABywBYINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiM8WASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFslSMAP0ggiYloAg+CdvECWhtgihoSbCAI9VJqFQS0Mw2zwYoXFwKEgTUHTIVTCCEHNi0JxQBcsfE8s/AfoCASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFgHPFskqRhRQVRRDMG1t2zwwA5YQe1CJXwjiIcIAkmwx4w0SFA8BOnByBMgBghDVMnbbWMsfyz/JEEVDMBUQNG1t2zwwFANqMPhBbyQQSxA6SYfbPIEa9lQbqYIJMS0ACts8F6AXvBfy9FFhoYEa9SHC//L0cH9UFDeAQAsREhMAEvhCUkDHBfLghABkbDH6QAEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIMPoAMXHXIfoAMfoAMKcDqwABxshVMIIQe92X3lAFyx8Tyz8B+gIBINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiM8WASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFsknBEMTUJkQJBAjbW3bPDBVAxQByshxAcoBUAcBygBwAcoCUAUg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIzxZQA/oCcAHKaCNus5F/kyRus+KXMzMBcAHKAOMNIW6znH8BygABIG7y0IABzJUxcAHKAOLJAfsIFQCYfwHKAMhwAcoAcAHKACRus51/AcoABCBu8tCAUATMljQDcAHKAOIkbrOdfwHKAAQgbvLQgFAEzJY0A3ABygDicAHKAAJ/AcoAAslYzACqyPhDAcx/AcoAVUBQVCDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFlgg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIzxbMEsyBAQHPAMntVAIBIBghAgFYGRsCEbSju2ebZ42KMBwaAAIjAhG3YFtnm2eNipAcIAHG7UTQ1AH4Y9IAAY5L+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiAH6QAEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIAdTUgQEB1wBVQGwV4Pgo1wsKgwm68uCJHQGK+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiAH6QAEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIEgLRAds8HgEacCL4Q1QQQNs80NQwWB8A1gLQ9AQwbQGBDrUBgBD0D2+h8uCHAYEOtSICgBD0F8gByPQAyQHMcAHKAEADWSDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFgEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIzxbJAAhUcDQlABG+FfdqJoaQAAyLkTWM'); +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"; @@ -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, }); }); @@ -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(); @@ -190,7 +192,7 @@ describe('JettonMaster', () => { to: jettonMaster.address, success: false, deploy: false, - op: 0x133701, + op: OP_CODES.JettonInit, exitCode: 6903, }); }); @@ -216,7 +218,7 @@ describe('JettonMaster', () => { to: jettonMaster.address, success: false, deploy: false, - op: 0x133701, + op: OP_CODES.JettonInit, exitCode: 132, }); }); @@ -239,7 +241,7 @@ describe('JettonMaster', () => { to: jettonMaster.address, success: true, deploy: false, - op: 0x133703, + op: OP_CODES.JettonSetParameter, }); // Jetton description @@ -259,7 +261,7 @@ describe('JettonMaster', () => { to: jettonMaster.address, success: true, deploy: false, - op: 0x133703, + op: OP_CODES.JettonSetParameter, }); // Jetton symbol @@ -279,7 +281,7 @@ describe('JettonMaster', () => { to: jettonMaster.address, success: true, deploy: false, - op: 0x133703, + op: OP_CODES.JettonSetParameter, }); // Jetton max_supply @@ -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) @@ -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, @@ -379,7 +383,7 @@ describe('JettonMaster', () => { to: jettonMaster.address, success: false, deploy: false, - op: 0x133704, + op: OP_CODES.JettonMint, exitCode: 132, }); }); @@ -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) @@ -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) @@ -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); }); + }); diff --git a/tests/JettonWallet.spec.ts b/tests/JettonWallet.spec.ts index a2ff84e..407efdc 100644 --- a/tests/JettonWallet.spec.ts +++ b/tests/JettonWallet.spec.ts @@ -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"; @@ -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(); @@ -127,7 +128,7 @@ describe('JettonMaster', () => { to: jettonWallet.address, deploy: false, success: false, - op: 0x0f8a7ea5, + op: OP_CODES.JettonTransfer, exitCode: 132, }); @@ -157,7 +158,7 @@ describe('JettonMaster', () => { to: jettonWallet.address, deploy: false, success: false, - op: 0x0f8a7ea5, + op: OP_CODES.JettonTransfer, exitCode: 6901, }); @@ -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(); @@ -224,7 +225,7 @@ describe('JettonMaster', () => { to: jettonWallet.address, deploy: false, success: false, - op: 0x595f07bc, + op: OP_CODES.JettonBurn, exitCode: 132, }); @@ -251,7 +252,7 @@ describe('JettonMaster', () => { to: jettonWallet.address, deploy: false, success: false, - op: 0x595f07bc, + op: OP_CODES.JettonBurn, exitCode: 6901, }); diff --git a/tests/constants/opCodes.ts b/tests/constants/opCodes.ts new file mode 100644 index 0000000..98cf483 --- /dev/null +++ b/tests/constants/opCodes.ts @@ -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 +};