// import "@stdlib/jetton"; import "@stdlib/ownable"; import "./messages"; import "./wallet"; import "./linker"; message Mint { amount: Int; } @interface("org.ton.jetton.master") trait Jetton with Ownable { // // Storage // totalSupply: Int; mintable: Bool; owner: Address; content: Cell?; // // Receivers // receive(msg: TokenUpdateContent) { // Allow changing content only by owner self.requireOwner(); // Update content self.content = msg.content; } receive(msg: TokenBurnNotification) { // Check wallet self.requireWallet(msg.owner); // Update supply self.totalSupply = self.totalSupply - msg.amount; // Cashback if (msg.responseAddress != null) { send(SendParameters{ to: msg.responseAddress!!, value: 0, bounce: false, mode: SendRemainingValue + SendIgnoreErrors, body: TokenExcesses{ queryId: msg.queryId }.toCell() }); } } // // Get Methods // get fun get_wallet_address(owner: Address): Address { let winit: StateInit = self.getJettonWalletInit(owner); return contractAddress(winit); } get fun get_jetton_data(): JettonData { let code: Cell = self.getJettonWalletInit(myAddress()).code; return JettonData{ totalSupply: self.totalSupply, mintable: self.mintable, owner: self.owner, content: self.content, walletCode: code }; } // // Private Methods // fun mint(to: Address, amount: Int, responseAddress: Address?) { // Update total supply self.totalSupply = self.totalSupply + amount; // Create message let winit: StateInit = self.getJettonWalletInit(to); let walletAddress: Address = contractAddress(winit); send(SendParameters{ to: walletAddress, value: 0, bounce: false, mode: SendRemainingValue, body: TokenTransferInternal{ amount: amount, queryId: 0, from: myAddress(), responseAddress: responseAddress, forwardTonAmount: 0, forwardPayload: emptySlice() }.toCell(), code: winit.code, data: winit.data }); } fun requireWallet(owner: Address) { let ctx: Context = context(); let winit: StateInit = self.getJettonWalletInit(owner); require(contractAddress(winit) == ctx.sender, "Invalid sender"); } virtual fun getJettonWalletInit(address: Address): StateInit { return initOf TONBWallet(myAddress(), address); } } contract TONB with Jetton { totalSupply: Int as coins; owner: Address; content: Cell?; mintable: Bool; init(owner: Address, content: Cell?) { self.totalSupply = 0; self.owner = owner; self.mintable = true; self.content = content; } receive(msg: Mint) { let ctx: Context = context(); self.mint(ctx.sender, msg.amount, ctx.sender); } receive("Mint!") { let ctx: Context = context(); self.mint(ctx.sender, 1000000000, ctx.sender); } }