├── .gitignore ├── .prettierrc.json ├── LICENSE ├── README.md ├── jest.config.js ├── jest.setup.js ├── jest.teardown.js ├── package.json ├── sources ├── contract-deposits.spec.ts ├── contract-payouts.spec.ts ├── contract-storage.spec.ts ├── contract.deploy.ts ├── contract.events.ts ├── contract.tact ├── contract.tickets.ts └── output │ ├── payouts_PayoutBeacon.abi │ ├── payouts_PayoutBeacon.code.boc │ ├── payouts_PayoutBeacon.code.boc.html │ ├── payouts_PayoutBeacon.code.fc │ ├── payouts_PayoutBeacon.code.fif │ ├── payouts_PayoutBeacon.code.rev.fif │ ├── payouts_PayoutBeacon.constants.fc │ ├── payouts_PayoutBeacon.headers.fc │ ├── payouts_PayoutBeacon.md │ ├── payouts_PayoutBeacon.pkg │ ├── payouts_PayoutBeacon.stdlib.fc │ ├── payouts_PayoutBeacon.storage.fc │ ├── payouts_PayoutBeacon.ts │ ├── payouts_PayoutsMaster.abi │ ├── payouts_PayoutsMaster.code.boc │ ├── payouts_PayoutsMaster.code.boc.html │ ├── payouts_PayoutsMaster.code.fc │ ├── payouts_PayoutsMaster.code.fif │ ├── payouts_PayoutsMaster.code.rev.fif │ ├── payouts_PayoutsMaster.constants.fc │ ├── payouts_PayoutsMaster.headers.fc │ ├── payouts_PayoutsMaster.md │ ├── payouts_PayoutsMaster.pkg │ ├── payouts_PayoutsMaster.stdlib.fc │ ├── payouts_PayoutsMaster.storage.fc │ └── payouts_PayoutsMaster.ts ├── tact.config.json ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "tabWidth": 4, 4 | "useTabs": false 5 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Business Source License 1.1 2 | 3 | Parameters 4 | 5 | Licensor: Tact Software Foundation 6 | Licensed Work: Tact Payouts Contract 7 | The Licensed Work is (c) 2023 Tact Software Foundation 8 | Additional Use Grant: You may make use of the Licensed Work, provided that 9 | you may not use the Licensed Work for a deploying 10 | smart contract to a TON's mainnet. 11 | 12 | Change Date: 2025-01-01 13 | 14 | Change License: MIT License 15 | 16 | Notice 17 | 18 | The Business Source License (this document, or the “License”) is not an Open 19 | Source license. However, the Licensed Work will eventually be made available 20 | under an Open Source License, as stated in this License. 21 | 22 | License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved. 23 | “Business Source License” is a trademark of MariaDB Corporation Ab. 24 | 25 | ----------------------------------------------------------------------------- 26 | 27 | Business Source License 1.1 28 | 29 | Terms 30 | 31 | The Licensor hereby grants you the right to copy, modify, create derivative 32 | works, redistribute, and make non-production use of the Licensed Work. The 33 | Licensor may make an Additional Use Grant, above, permitting limited 34 | production use. 35 | 36 | Effective on the Change Date, or the fourth anniversary of the first publicly 37 | available distribution of a specific version of the Licensed Work under this 38 | License, whichever comes first, the Licensor hereby grants you rights under 39 | the terms of the Change License, and the rights granted in the paragraph 40 | above terminate. 41 | 42 | If your use of the Licensed Work does not comply with the requirements 43 | currently in effect as described in this License, you must purchase a 44 | commercial license from the Licensor, its affiliated entities, or authorized 45 | resellers, or you must refrain from using the Licensed Work. 46 | 47 | All copies of the original and modified Licensed Work, and derivative works 48 | of the Licensed Work, are subject to this License. This License applies 49 | separately for each version of the Licensed Work and the Change Date may vary 50 | for each version of the Licensed Work released by Licensor. 51 | 52 | You must conspicuously display this License on each original or modified copy 53 | of the Licensed Work. If you receive the Licensed Work in original or 54 | modified form from a third party, the terms and conditions set forth in this 55 | License apply to your use of that work. 56 | 57 | Any use of the Licensed Work in violation of this License will automatically 58 | terminate your rights under this License for the current and all other 59 | versions of the Licensed Work. 60 | 61 | This License does not grant you any right in any trademark or logo of 62 | Licensor or its affiliates (provided that you may use a trademark or logo of 63 | Licensor as expressly required by this License). 64 | 65 | TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON 66 | AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, 67 | EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF 68 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND 69 | TITLE. 70 | 71 | MariaDB hereby grants you permission to use this License’s text to license 72 | your works, and to refer to it using the trademark “Business Source License”, 73 | as long as you comply with the Covenants of Licensor below. 74 | 75 | Covenants of Licensor 76 | 77 | In consideration of the right to use this License’s text and the “Business 78 | Source License” name and trademark, Licensor covenants to MariaDB, and to all 79 | other recipients of the licensed work to be provided by Licensor: 80 | 81 | 1. To specify as the Change License the GPL Version 2.0 or any later version, 82 | or a license that is compatible with GPL Version 2.0 or a later version, 83 | where “compatible” means that software provided under the Change License can 84 | be included in a program with software provided under GPL Version 2.0 or a 85 | later version. Licensor may specify additional Change Licenses without 86 | limitation. 87 | 88 | 2. To either: (a) specify an additional grant of rights to use that does not 89 | impose any additional restriction on the right granted in this License, as 90 | the Additional Use Grant; or (b) insert the text “None”. 91 | 92 | 3. To specify a Change Date. 93 | 94 | 4. Not to modify this License in any other way. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TACT Payouts Contract 2 | 3 | This contract is a perfect solution to perform on-chain payouts after your project failed. This contracts works by generating an list of text tickets for each address that is entitled for a payout. Tickets are essentially a signed transactions serialized to a comment to be parsed by smart contract. Tickets are best to be generated using offline machine and secret key to be discarded after the generation. You MUST use a new key for each contract to avoid replay attacks. 4 | 5 | ## Features 6 | 7 | * 🔐 Secure. No need to have hot wallets with funds. Key can be discarded after the ticket generation. 8 | * 📝 Easy to use and commercially feasible. 9 | * ⛽️ Minimal gas usage. Most of the gas fees are paid by the payee (~0.1 TON) 10 | * ⏯️ Start, stop and abort payouts at any time. 11 | * 🔥 Ability to slowly burn balances if no one claims the payout. 12 | 13 | ## License 14 | 15 | Business Source License 1.1 -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: 'ts-jest', 3 | testEnvironment: 'node', 4 | testPathIgnorePatterns: ["/node_modules/", "/dist/"], 5 | snapshotSerializers: ["ton-jest/serializers"], 6 | maxWorkers: 1, 7 | globalSetup: './jest.setup.js', 8 | globalTeardown: './jest.teardown.js', 9 | }; -------------------------------------------------------------------------------- /jest.setup.js: -------------------------------------------------------------------------------- 1 | const coverage = require('@tact-lang/coverage'); 2 | 3 | module.exports = async () => { 4 | coverage.beginCoverage(); 5 | }; -------------------------------------------------------------------------------- /jest.teardown.js: -------------------------------------------------------------------------------- 1 | const coverage = require('@tact-lang/coverage'); 2 | const exportCoverageLogs = require('@tact-lang/coverage/dist/integration/integrate').exportCoverageLogs; 3 | const path = require('path'); 4 | 5 | module.exports = async () => { 6 | // let logs = exportCoverageLogs(); 7 | // console.warn(logs); 8 | coverage.completeCoverage([ 9 | path.resolve(__dirname, 'sources', 'output', '*.boc') 10 | ]); 11 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "build": "tact --config ./tact.config.json", 5 | "test": "jest", 6 | "deploy": "ts-node ./sources/contract.deploy.ts", 7 | "events": "ts-node ./sources/contract.events.ts" 8 | }, 9 | "dependencies": { 10 | "@orbs-network/ton-access": "^2.3.3", 11 | "@tact-lang/compiler": "^1.1.2", 12 | "@tact-lang/coverage": "^0.0.7", 13 | "@tact-lang/deployer": "^0.2.0", 14 | "@tact-lang/emulator": "^4.2.1", 15 | "@types/jest": "^29.2.4", 16 | "@types/node": "^18.11.14", 17 | "@types/qs": "^6.9.7", 18 | "base64url": "^3.0.1", 19 | "enquirer": "^2.3.6", 20 | "jest": "^29.3.1", 21 | "open": "^8.4.0", 22 | "prando": "^6.0.1", 23 | "prettier": "^2.5.1", 24 | "qs": "^6.11.0", 25 | "ton": "^13.1.0", 26 | "ton-abi": "^0.0.2", 27 | "ton-core": ">=0.49.0", 28 | "ton-crypto": "^3.2.0", 29 | "ton-jest": "^0.0.3", 30 | "ts-jest": "^29.0.3", 31 | "ts-node": "^10.9.1", 32 | "typescript": "^4.9.4" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /sources/contract-deposits.spec.ts: -------------------------------------------------------------------------------- 1 | import { beginCell, fromNano, toNano } from "ton"; 2 | import { ContractSystem, testKey } from "@tact-lang/emulator"; 3 | import { PayoutsMaster } from "./output/payouts_PayoutsMaster"; 4 | 5 | describe("contract-deposits", () => { 6 | it("should deploy correctly and deposit", async () => { 7 | // Create keyparis 8 | let keypair = testKey("keypair-test"); 9 | let publicKey = beginCell().storeBuffer(keypair.publicKey).endCell().beginParse().loadUintBig(256); 10 | 11 | // Create contract system 12 | let system = await ContractSystem.create(); 13 | let owner = system.treasure("owner"); 14 | expect(owner.address).toMatchInlineSnapshot(`kQAI-3FJVc_ywSuY4vq0bYrzR7S4Och4y7bTU_i5yLOB3A6P`); 15 | let nonOwner = system.treasure("non-owner"); 16 | let contract = system.open(await PayoutsMaster.fromInit(owner.address, publicKey, null)); 17 | system.name(contract, "master"); 18 | let track = system.track(contract.address); 19 | await contract.send(owner, { value: toNano(1) }, { $$type: "Deploy", queryId: 0n }); 20 | await contract.send(owner, { value: toNano(100000) }, "Deposit"); 21 | await contract.send(nonOwner, { value: toNano(100000) }, "Deposit"); 22 | await system.run(); 23 | 24 | // Check balances 25 | expect(await contract.getOwner()).toMatchInlineSnapshot(`kQAI-3FJVc_ywSuY4vq0bYrzR7S4Och4y7bTU_i5yLOB3A6P`); 26 | expect(await contract.getStopped()).toMatchInlineSnapshot(`false`); 27 | expect(system.contract(contract).balance).toMatchInlineSnapshot(`199999883128000n`); 28 | expect(track.collect()).toMatchInlineSnapshot(` 29 | [ 30 | { 31 | "$seq": 0, 32 | "events": [ 33 | { 34 | "$type": "deploy", 35 | }, 36 | { 37 | "$type": "received", 38 | "message": { 39 | "body": { 40 | "type": "known", 41 | "value": { 42 | "$$type": "Deploy", 43 | "queryId": 0n, 44 | }, 45 | }, 46 | "bounce": true, 47 | "from": "@treasure(owner)", 48 | "to": "@master", 49 | "type": "internal", 50 | "value": "1", 51 | }, 52 | }, 53 | { 54 | "$type": "processed", 55 | "gasUsed": 9934n, 56 | }, 57 | { 58 | "$type": "sent", 59 | "messages": [ 60 | { 61 | "body": { 62 | "type": "known", 63 | "value": { 64 | "$$type": "DeployOk", 65 | "queryId": 0n, 66 | }, 67 | }, 68 | "bounce": false, 69 | "from": "@master", 70 | "to": "@treasure(owner)", 71 | "type": "internal", 72 | "value": "0.88887", 73 | }, 74 | ], 75 | }, 76 | ], 77 | }, 78 | { 79 | "$seq": 1, 80 | "events": [ 81 | { 82 | "$type": "received", 83 | "message": { 84 | "body": { 85 | "text": "Deposit", 86 | "type": "text", 87 | }, 88 | "bounce": true, 89 | "from": "@treasure(owner)", 90 | "to": "@master", 91 | "type": "internal", 92 | "value": "100000", 93 | }, 94 | }, 95 | { 96 | "$type": "processed", 97 | "gasUsed": 8436n, 98 | }, 99 | { 100 | "$type": "sent", 101 | "messages": [ 102 | { 103 | "body": { 104 | "text": "Deposit received", 105 | "type": "text", 106 | }, 107 | "bounce": false, 108 | "from": "@master", 109 | "to": "@treasure(owner)", 110 | "type": "internal", 111 | "value": "0.09874", 112 | }, 113 | ], 114 | }, 115 | ], 116 | }, 117 | { 118 | "$seq": 2, 119 | "events": [ 120 | { 121 | "$type": "received", 122 | "message": { 123 | "body": { 124 | "text": "Deposit", 125 | "type": "text", 126 | }, 127 | "bounce": true, 128 | "from": "@treasure(non-owner)", 129 | "to": "@master", 130 | "type": "internal", 131 | "value": "100000", 132 | }, 133 | }, 134 | { 135 | "$type": "processed", 136 | "gasUsed": 8436n, 137 | }, 138 | { 139 | "$type": "sent", 140 | "messages": [ 141 | { 142 | "body": { 143 | "text": "Deposit received", 144 | "type": "text", 145 | }, 146 | "bounce": false, 147 | "from": "@master", 148 | "to": "@treasure(non-owner)", 149 | "type": "internal", 150 | "value": "0.09874", 151 | }, 152 | ], 153 | }, 154 | ], 155 | }, 156 | ] 157 | `); 158 | 159 | // Should fail because of low value 160 | await contract.send(nonOwner, { value: toNano("0.5") }, "Deposit"); 161 | await system.run(); 162 | expect(track.collect()).toMatchInlineSnapshot(` 163 | [ 164 | { 165 | "$seq": 3, 166 | "events": [ 167 | { 168 | "$type": "storage-charged", 169 | "amount": "0.000000018", 170 | }, 171 | { 172 | "$type": "received", 173 | "message": { 174 | "body": { 175 | "text": "Deposit", 176 | "type": "text", 177 | }, 178 | "bounce": true, 179 | "from": "@treasure(non-owner)", 180 | "to": "@master", 181 | "type": "internal", 182 | "value": "0.5", 183 | }, 184 | }, 185 | { 186 | "$type": "failed", 187 | "errorCode": 16059, 188 | "errorMessage": "Invalid value", 189 | }, 190 | { 191 | "$type": "sent-bounced", 192 | "message": { 193 | "body": { 194 | "cell": "x{FFFFFFFF000000004465706F736974}", 195 | "type": "cell", 196 | }, 197 | "bounce": false, 198 | "from": "@master", 199 | "to": "@treasure(non-owner)", 200 | "type": "internal", 201 | "value": "0.494863", 202 | }, 203 | }, 204 | ], 205 | }, 206 | ] 207 | `); 208 | }); 209 | 210 | it("should allow withdraw for owner", async () => { 211 | // Create keyparis 212 | let keypair = testKey("keypair-test"); 213 | let publicKey = beginCell().storeBuffer(keypair.publicKey).endCell().beginParse().loadUintBig(256); 214 | 215 | // Create contract system 216 | let system = await ContractSystem.create(); 217 | let owner = system.treasure("owner"); 218 | expect(owner.address).toMatchInlineSnapshot(`kQAI-3FJVc_ywSuY4vq0bYrzR7S4Och4y7bTU_i5yLOB3A6P`); 219 | let nonOwner = system.treasure("non-owner"); 220 | let contract = system.open(await PayoutsMaster.fromInit(owner.address, publicKey, null)); 221 | system.name(contract, "master"); 222 | await contract.send(owner, { value: toNano(1) }, { $$type: "Deploy", queryId: 0n }); 223 | await contract.send(owner, { value: toNano(100000) }, "Deposit"); 224 | await system.run(); 225 | 226 | // Withdraw by non-owner must fail 227 | let track = system.track(contract.address); 228 | await contract.send(nonOwner, { value: toNano("0.5") }, "Withdraw"); 229 | await system.run(); 230 | expect(track.collect()).toMatchInlineSnapshot(` 231 | [ 232 | { 233 | "$seq": 2, 234 | "events": [ 235 | { 236 | "$type": "storage-charged", 237 | "amount": "0.000000018", 238 | }, 239 | { 240 | "$type": "received", 241 | "message": { 242 | "body": { 243 | "text": "Withdraw", 244 | "type": "text", 245 | }, 246 | "bounce": true, 247 | "from": "@treasure(non-owner)", 248 | "to": "@master", 249 | "type": "internal", 250 | "value": "0.5", 251 | }, 252 | }, 253 | { 254 | "$type": "failed", 255 | "errorCode": 132, 256 | "errorMessage": "Access denied", 257 | }, 258 | { 259 | "$type": "sent-bounced", 260 | "message": { 261 | "body": { 262 | "cell": "x{FFFFFFFF000000005769746864726177}", 263 | "type": "cell", 264 | }, 265 | "bounce": false, 266 | "from": "@master", 267 | "to": "@treasure(non-owner)", 268 | "type": "internal", 269 | "value": "0.494651", 270 | }, 271 | }, 272 | ], 273 | }, 274 | ] 275 | `); 276 | 277 | // Withdraw by owner must succeed 278 | await contract.send(owner, { value: toNano("0.5") }, "Withdraw"); 279 | await system.run(); 280 | expect(track.collect()).toMatchInlineSnapshot(` 281 | [ 282 | { 283 | "$seq": 3, 284 | "events": [ 285 | { 286 | "$type": "storage-charged", 287 | "amount": "0.000000018", 288 | }, 289 | { 290 | "$type": "received", 291 | "message": { 292 | "body": { 293 | "text": "Withdraw", 294 | "type": "text", 295 | }, 296 | "bounce": true, 297 | "from": "@treasure(owner)", 298 | "to": "@master", 299 | "type": "internal", 300 | "value": "0.5", 301 | }, 302 | }, 303 | { 304 | "$type": "processed", 305 | "gasUsed": 9207n, 306 | }, 307 | { 308 | "$type": "sent", 309 | "messages": [ 310 | { 311 | "body": { 312 | "text": "Withdraw completed", 313 | "type": "text", 314 | }, 315 | "bounce": false, 316 | "from": "@master", 317 | "to": "@treasure(owner)", 318 | "type": "internal", 319 | "value": "100000.381080964", 320 | }, 321 | ], 322 | }, 323 | ], 324 | }, 325 | ] 326 | `); 327 | 328 | // Check balance 329 | expect(system.contract(contract).state.state.type).toMatchInlineSnapshot(`"active"`); 330 | expect(fromNano(system.contract(contract).balance)).toMatchInlineSnapshot(`"0.1"`); 331 | }); 332 | 333 | it("should allow destroy for owner", async () => { 334 | // Create keyparis 335 | let keypair = testKey("keypair-test"); 336 | let publicKey = beginCell().storeBuffer(keypair.publicKey).endCell().beginParse().loadUintBig(256); 337 | 338 | // Create contract system 339 | let system = await ContractSystem.create(); 340 | let owner = system.treasure("owner"); 341 | expect(owner.address).toMatchInlineSnapshot(`kQAI-3FJVc_ywSuY4vq0bYrzR7S4Och4y7bTU_i5yLOB3A6P`); 342 | let nonOwner = system.treasure("non-owner"); 343 | let contract = system.open(await PayoutsMaster.fromInit(owner.address, publicKey, null)); 344 | system.name(contract, "master"); 345 | await contract.send(owner, { value: toNano(1) }, { $$type: "Deploy", queryId: 0n }); 346 | await contract.send(owner, { value: toNano(100000) }, "Deposit"); 347 | await system.run(); 348 | 349 | // Destroy by non-owner must fail 350 | let track = system.track(contract.address); 351 | await contract.send(nonOwner, { value: toNano("0.5") }, "Destroy"); 352 | await system.run(); 353 | expect(track.collect()).toMatchInlineSnapshot(` 354 | [ 355 | { 356 | "$seq": 2, 357 | "events": [ 358 | { 359 | "$type": "storage-charged", 360 | "amount": "0.000000018", 361 | }, 362 | { 363 | "$type": "received", 364 | "message": { 365 | "body": { 366 | "text": "Destroy", 367 | "type": "text", 368 | }, 369 | "bounce": true, 370 | "from": "@treasure(non-owner)", 371 | "to": "@master", 372 | "type": "internal", 373 | "value": "0.5", 374 | }, 375 | }, 376 | { 377 | "$type": "failed", 378 | "errorCode": 132, 379 | "errorMessage": "Access denied", 380 | }, 381 | { 382 | "$type": "sent-bounced", 383 | "message": { 384 | "body": { 385 | "cell": "x{FFFFFFFF0000000044657374726F79}", 386 | "type": "cell", 387 | }, 388 | "bounce": false, 389 | "from": "@master", 390 | "to": "@treasure(non-owner)", 391 | "type": "internal", 392 | "value": "0.494538", 393 | }, 394 | }, 395 | ], 396 | }, 397 | ] 398 | `); 399 | 400 | // Destroy by owner must succeed 401 | await contract.send(owner, { value: toNano("0.5") }, "Destroy"); 402 | await system.run(); 403 | expect(track.collect()).toMatchInlineSnapshot(` 404 | [ 405 | { 406 | "$seq": 3, 407 | "events": [ 408 | { 409 | "$type": "storage-charged", 410 | "amount": "0.000000018", 411 | }, 412 | { 413 | "$type": "received", 414 | "message": { 415 | "body": { 416 | "text": "Destroy", 417 | "type": "text", 418 | }, 419 | "bounce": true, 420 | "from": "@treasure(owner)", 421 | "to": "@master", 422 | "type": "internal", 423 | "value": "0.5", 424 | }, 425 | }, 426 | { 427 | "$type": "processed", 428 | "gasUsed": 8761n, 429 | }, 430 | { 431 | "$type": "sent", 432 | "messages": [ 433 | { 434 | "body": { 435 | "text": "Contract destroyed", 436 | "type": "text", 437 | }, 438 | "bounce": false, 439 | "from": "@master", 440 | "to": "@treasure(owner)", 441 | "type": "internal", 442 | "value": "100000.481526964", 443 | }, 444 | ], 445 | }, 446 | ], 447 | }, 448 | ] 449 | `); 450 | }); 451 | }); 452 | -------------------------------------------------------------------------------- /sources/contract-payouts.spec.ts: -------------------------------------------------------------------------------- 1 | import { beginCell, toNano } from "ton"; 2 | import { ContractSystem, testKey } from "@tact-lang/emulator"; 3 | import { BurnParameters, PayoutsMaster } from "./output/payouts_PayoutsMaster"; 4 | import { PayoutBeacon } from "./output/payouts_PayoutBeacon"; 5 | import { createTicket } from "./contract.tickets"; 6 | 7 | describe("contract-payouts", () => { 8 | it("should payout correctly", async () => { 9 | // Create keyparis 10 | let keypair = testKey("keypair-test"); 11 | let publicKey = beginCell().storeBuffer(keypair.publicKey).endCell().beginParse().loadUintBig(256); 12 | 13 | // Create contract system 14 | let system = await ContractSystem.create(); 15 | let owner = system.treasure("owner"); 16 | expect(owner.address).toMatchInlineSnapshot(`kQAI-3FJVc_ywSuY4vq0bYrzR7S4Och4y7bTU_i5yLOB3A6P`); 17 | let nonOwner = system.treasure("non-owner"); 18 | let nonOwner2 = system.treasure("non-owner-2"); 19 | let contract = system.open(await PayoutsMaster.fromInit(owner.address, publicKey, null)); 20 | let payeeBeaconContract = system.open(await PayoutBeacon.fromInit(nonOwner.address, contract.address)); 21 | system.name(contract, "master"); 22 | let track = system.track(contract.address); 23 | await contract.send(owner, { value: toNano(1) }, { $$type: "Deploy", queryId: 0n }); 24 | await contract.send(owner, { value: toNano(100000) }, "Deposit"); 25 | await system.run(); 26 | 27 | // Try to withdraw with a ticket for incorrect user 28 | track.reset(); 29 | let ticket = createTicket(nonOwner.address, toNano(100), keypair.secretKey); 30 | await contract.send(nonOwner2, { value: toNano(1) }, ticket); 31 | await system.run(); 32 | expect(track.collect()).toMatchInlineSnapshot(` 33 | [ 34 | { 35 | "$seq": 2, 36 | "events": [ 37 | { 38 | "$type": "storage-charged", 39 | "amount": "0.000000018", 40 | }, 41 | { 42 | "$type": "received", 43 | "message": { 44 | "body": { 45 | "text": "ykxDM8uSVnETzVCi8-mWYFMiCPLAKkVUn4qj2Bki4zzxYmawJq8rMPQ7jD6h69tsJlJpWDdFpCACzyBTb3osCVF0h26AAA", 46 | "type": "text", 47 | }, 48 | "bounce": true, 49 | "from": "@treasure(non-owner-2)", 50 | "to": "@master", 51 | "type": "internal", 52 | "value": "1", 53 | }, 54 | }, 55 | { 56 | "$type": "failed", 57 | "errorCode": 48401, 58 | "errorMessage": "Invalid signature", 59 | }, 60 | { 61 | "$type": "sent-bounced", 62 | "message": { 63 | "body": { 64 | "cell": "x{FFFFFFFF00000000796B78444D387553566E45547A564369382D6D5759464D6943504C41}", 65 | "type": "cell", 66 | }, 67 | "bounce": false, 68 | "from": "@master", 69 | "to": "@treasure(non-owner-2)", 70 | "type": "internal", 71 | "value": "0.861542", 72 | }, 73 | }, 74 | ], 75 | }, 76 | ] 77 | `); 78 | 79 | // Try to withdraw with a ticket for correct user 80 | await contract.send(nonOwner, { value: toNano(1) }, " \n" + ticket + "\t\t\t\n\n"); 81 | await system.run(); 82 | expect((await payeeBeaconContract.getOwner()).toString({ testOnly: true })).toBe( 83 | nonOwner.address.toString({ testOnly: true }) 84 | ); 85 | expect(await payeeBeaconContract.getCompleted()).toBe(true); 86 | expect((await payeeBeaconContract.getMaster()).toString({ testOnly: true })).toBe( 87 | contract.address.toString({ testOnly: true }) 88 | ); 89 | expect(track.collect()).toMatchInlineSnapshot(` 90 | [ 91 | { 92 | "$seq": 3, 93 | "events": [ 94 | { 95 | "$type": "storage-charged", 96 | "amount": "0.000000018", 97 | }, 98 | { 99 | "$type": "received", 100 | "message": { 101 | "body": { 102 | "text": " 103 | ykxDM8uSVnETzVCi8-mWYFMiCPLAKkVUn4qj2Bki4zzxYmawJq8rMPQ7jD6h69tsJlJpWDdFpCACzyBTb3osCVF0h26AAA 104 | 105 | ", 106 | "type": "text", 107 | }, 108 | "bounce": true, 109 | "from": "@treasure(non-owner)", 110 | "to": "@master", 111 | "type": "internal", 112 | "value": "1", 113 | }, 114 | }, 115 | { 116 | "$type": "processed", 117 | "gasUsed": 168249n, 118 | }, 119 | { 120 | "$type": "sent", 121 | "messages": [ 122 | { 123 | "body": { 124 | "type": "known", 125 | "value": { 126 | "$$type": "TryPayout", 127 | "address": kQCVnZ1On-Ja4xfAfMbsq--jatb5sNnOUN421AHaXbebcCWH, 128 | "value": 100000000000n, 129 | }, 130 | }, 131 | "bounce": true, 132 | "from": "@master", 133 | "to": "kQBjSixX6u3OU4qdZI4DifcPcA_BlznSU6PxLO3o7aci5rw-", 134 | "type": "internal", 135 | "value": "0.817638", 136 | }, 137 | ], 138 | }, 139 | ], 140 | }, 141 | { 142 | "$seq": 4, 143 | "events": [ 144 | { 145 | "$type": "received", 146 | "message": { 147 | "body": { 148 | "type": "known", 149 | "value": { 150 | "$$type": "PayoutOk", 151 | "address": kQCVnZ1On-Ja4xfAfMbsq--jatb5sNnOUN421AHaXbebcCWH, 152 | "value": 100000000000n, 153 | }, 154 | }, 155 | "bounce": true, 156 | "from": "kQBjSixX6u3OU4qdZI4DifcPcA_BlznSU6PxLO3o7aci5rw-", 157 | "to": "@master", 158 | "type": "internal", 159 | "value": "0.704803", 160 | }, 161 | }, 162 | { 163 | "$type": "processed", 164 | "gasUsed": 16432n, 165 | }, 166 | { 167 | "$type": "sent", 168 | "messages": [ 169 | { 170 | "body": { 171 | "type": "known", 172 | "value": { 173 | "$$type": "EventPayoutCompleted", 174 | "address": kQCVnZ1On-Ja4xfAfMbsq--jatb5sNnOUN421AHaXbebcCWH, 175 | "value": 100000000000n, 176 | }, 177 | }, 178 | "to": null, 179 | "type": "external-out", 180 | }, 181 | ], 182 | }, 183 | { 184 | "$type": "sent", 185 | "messages": [ 186 | { 187 | "body": { 188 | "text": "Payout сompleted", 189 | "type": "text", 190 | }, 191 | "bounce": true, 192 | "from": "@master", 193 | "to": "@treasure(non-owner)", 194 | "type": "internal", 195 | "value": "100.687103", 196 | }, 197 | ], 198 | }, 199 | ], 200 | }, 201 | ] 202 | `); 203 | 204 | // Try to withdraw second time 205 | await contract.send(nonOwner, { value: toNano(1) }, ticket); 206 | await system.run(); 207 | expect(track.collect()).toMatchInlineSnapshot(` 208 | [ 209 | { 210 | "$seq": 5, 211 | "events": [ 212 | { 213 | "$type": "storage-charged", 214 | "amount": "0.000000018", 215 | }, 216 | { 217 | "$type": "received", 218 | "message": { 219 | "body": { 220 | "text": "ykxDM8uSVnETzVCi8-mWYFMiCPLAKkVUn4qj2Bki4zzxYmawJq8rMPQ7jD6h69tsJlJpWDdFpCACzyBTb3osCVF0h26AAA", 221 | "type": "text", 222 | }, 223 | "bounce": true, 224 | "from": "@treasure(non-owner)", 225 | "to": "@master", 226 | "type": "internal", 227 | "value": "1", 228 | }, 229 | }, 230 | { 231 | "$type": "processed", 232 | "gasUsed": 151449n, 233 | }, 234 | { 235 | "$type": "sent", 236 | "messages": [ 237 | { 238 | "body": { 239 | "type": "known", 240 | "value": { 241 | "$$type": "TryPayout", 242 | "address": kQCVnZ1On-Ja4xfAfMbsq--jatb5sNnOUN421AHaXbebcCWH, 243 | "value": 100000000000n, 244 | }, 245 | }, 246 | "bounce": true, 247 | "from": "@master", 248 | "to": "kQBjSixX6u3OU4qdZI4DifcPcA_BlznSU6PxLO3o7aci5rw-", 249 | "type": "internal", 250 | "value": "0.834438", 251 | }, 252 | ], 253 | }, 254 | ], 255 | }, 256 | { 257 | "$seq": 6, 258 | "events": [ 259 | { 260 | "$type": "received", 261 | "message": { 262 | "body": { 263 | "type": "known", 264 | "value": { 265 | "$$type": "PayoutFailed", 266 | "address": kQCVnZ1On-Ja4xfAfMbsq--jatb5sNnOUN421AHaXbebcCWH, 267 | "value": 100000000000n, 268 | }, 269 | }, 270 | "bounce": false, 271 | "from": "kQBjSixX6u3OU4qdZI4DifcPcA_BlznSU6PxLO3o7aci5rw-", 272 | "to": "@master", 273 | "type": "internal", 274 | "value": "0.822129993", 275 | }, 276 | }, 277 | { 278 | "$type": "processed", 279 | "gasUsed": 7910n, 280 | }, 281 | { 282 | "$type": "sent", 283 | "messages": [ 284 | { 285 | "body": { 286 | "text": "Already paid", 287 | "type": "text", 288 | }, 289 | "bounce": true, 290 | "from": "@master", 291 | "to": "@treasure(non-owner)", 292 | "type": "internal", 293 | "value": "0.812991993", 294 | }, 295 | ], 296 | }, 297 | ], 298 | }, 299 | ] 300 | `); 301 | }); 302 | 303 | it("should burn correctly", async () => { 304 | // Create keyparis 305 | let keypair = testKey("keypair-test"); 306 | let publicKey = beginCell().storeBuffer(keypair.publicKey).endCell().beginParse().loadUintBig(256); 307 | 308 | // Create contract system 309 | let system = await ContractSystem.create(); 310 | let owner = system.treasure("owner"); 311 | let time = 1000000; 312 | system.update({ now: time }); 313 | expect(owner.address).toMatchInlineSnapshot(`kQAI-3FJVc_ywSuY4vq0bYrzR7S4Och4y7bTU_i5yLOB3A6P`); 314 | let nonOwner = system.treasure("non-owner"); 315 | let nonOwner2 = system.treasure("non-owner-2"); 316 | let nonOwner3 = system.treasure("non-owner-3"); 317 | let parameters: BurnParameters = { 318 | $$type: "BurnParameters", 319 | startAt: BigInt(time + 1000000), 320 | endAt: BigInt(time + 2000000), 321 | }; 322 | let contract = system.open(await PayoutsMaster.fromInit(owner.address, publicKey, parameters)); 323 | let payeeBeaconContract = system.open(await PayoutBeacon.fromInit(nonOwner.address, contract.address)); 324 | system.name(contract, "master"); 325 | await contract.send(owner, { value: toNano(1) }, { $$type: "Deploy", queryId: 0n }); 326 | await contract.send(owner, { value: toNano(100000) }, "Deposit"); 327 | await system.run(); 328 | 329 | // Create tickets 330 | let ticket1 = createTicket(nonOwner.address, toNano(100), keypair.secretKey); 331 | let ticket2 = createTicket(nonOwner2.address, toNano(100), keypair.secretKey); 332 | let ticket3 = createTicket(nonOwner3.address, toNano(100), keypair.secretKey); 333 | 334 | // Withdraw before burn start 335 | let track = system.track(contract.address); 336 | system.update({ now: time + 100000 }); // Should not be burned 337 | await contract.send(nonOwner, { value: toNano(1) }, ticket1); 338 | await system.run(); 339 | expect(track.collect()).toMatchInlineSnapshot(` 340 | [ 341 | { 342 | "$seq": 2, 343 | "events": [ 344 | { 345 | "$type": "storage-charged", 346 | "amount": "0.000108486", 347 | }, 348 | { 349 | "$type": "received", 350 | "message": { 351 | "body": { 352 | "text": "ykxDM8uSVnETzVCi8-mWYFMiCPLAKkVUn4qj2Bki4zzxYmawJq8rMPQ7jD6h69tsJlJpWDdFpCACzyBTb3osCVF0h26AAA", 353 | "type": "text", 354 | }, 355 | "bounce": true, 356 | "from": "@treasure(non-owner)", 357 | "to": "@master", 358 | "type": "internal", 359 | "value": "1", 360 | }, 361 | }, 362 | { 363 | "$type": "processed", 364 | "gasUsed": 152071n, 365 | }, 366 | { 367 | "$type": "sent", 368 | "messages": [ 369 | { 370 | "body": { 371 | "type": "known", 372 | "value": { 373 | "$$type": "TryPayout", 374 | "address": kQCVnZ1On-Ja4xfAfMbsq--jatb5sNnOUN421AHaXbebcCWH, 375 | "value": 100000000000n, 376 | }, 377 | }, 378 | "bounce": true, 379 | "from": "@master", 380 | "to": "kQArP0qfWz7ok3HNhd8lVvjXFPb5bExMNRW8ZtLyJ3llw8VX", 381 | "type": "internal", 382 | "value": "0.833816", 383 | }, 384 | ], 385 | }, 386 | ], 387 | }, 388 | { 389 | "$seq": 3, 390 | "events": [ 391 | { 392 | "$type": "received", 393 | "message": { 394 | "body": { 395 | "type": "known", 396 | "value": { 397 | "$$type": "PayoutOk", 398 | "address": kQCVnZ1On-Ja4xfAfMbsq--jatb5sNnOUN421AHaXbebcCWH, 399 | "value": 100000000000n, 400 | }, 401 | }, 402 | "bounce": true, 403 | "from": "kQArP0qfWz7ok3HNhd8lVvjXFPb5bExMNRW8ZtLyJ3llw8VX", 404 | "to": "@master", 405 | "type": "internal", 406 | "value": "0.720981", 407 | }, 408 | }, 409 | { 410 | "$type": "processed", 411 | "gasUsed": 16698n, 412 | }, 413 | { 414 | "$type": "sent", 415 | "messages": [ 416 | { 417 | "body": { 418 | "type": "known", 419 | "value": { 420 | "$$type": "EventPayoutCompleted", 421 | "address": kQCVnZ1On-Ja4xfAfMbsq--jatb5sNnOUN421AHaXbebcCWH, 422 | "value": 100000000000n, 423 | }, 424 | }, 425 | "to": null, 426 | "type": "external-out", 427 | }, 428 | ], 429 | }, 430 | { 431 | "$type": "sent", 432 | "messages": [ 433 | { 434 | "body": { 435 | "text": "Payout сompleted", 436 | "type": "text", 437 | }, 438 | "bounce": true, 439 | "from": "@master", 440 | "to": "@treasure(non-owner)", 441 | "type": "internal", 442 | "value": "100.703015", 443 | }, 444 | ], 445 | }, 446 | ], 447 | }, 448 | ] 449 | `); 450 | 451 | // Withdraw after burn start but before burn end 452 | system.update({ now: time + 1500000 }); // Should be 50% burned 453 | await contract.send(nonOwner2, { value: toNano(1) }, ticket2); 454 | await system.run(); 455 | expect(track.collect()).toMatchInlineSnapshot(` 456 | [ 457 | { 458 | "$seq": 4, 459 | "events": [ 460 | { 461 | "$type": "storage-charged", 462 | "amount": "0.001518796", 463 | }, 464 | { 465 | "$type": "received", 466 | "message": { 467 | "body": { 468 | "text": "rT5KDaSaihJd8KPZa3BV-lpX_nF5UPhmjFtlK0AJEl50LgkoFSjIocBLwRigugTXen_oh-TB0GxYzXagFckGDlF0h26AAA", 469 | "type": "text", 470 | }, 471 | "bounce": true, 472 | "from": "@treasure(non-owner-2)", 473 | "to": "@master", 474 | "type": "internal", 475 | "value": "1", 476 | }, 477 | }, 478 | { 479 | "$type": "processed", 480 | "gasUsed": 153617n, 481 | }, 482 | { 483 | "$type": "sent", 484 | "messages": [ 485 | { 486 | "body": { 487 | "type": "known", 488 | "value": { 489 | "$$type": "TryPayout", 490 | "address": kQDVWm0ti1fdMhzNYlzx6DPkpoQtNGw_YKv41uETVNgZJ5TO, 491 | "value": 50000000000n, 492 | }, 493 | }, 494 | "bounce": true, 495 | "from": "@master", 496 | "to": "kQDnS0uxniAkkVrSRfIniAoc1HsXdkqX5KFTb5QOveeFSzeF", 497 | "type": "internal", 498 | "value": "0.83227", 499 | }, 500 | ], 501 | }, 502 | ], 503 | }, 504 | { 505 | "$seq": 5, 506 | "events": [ 507 | { 508 | "$type": "received", 509 | "message": { 510 | "body": { 511 | "type": "known", 512 | "value": { 513 | "$$type": "PayoutOk", 514 | "address": kQDVWm0ti1fdMhzNYlzx6DPkpoQtNGw_YKv41uETVNgZJ5TO, 515 | "value": 50000000000n, 516 | }, 517 | }, 518 | "bounce": true, 519 | "from": "kQDnS0uxniAkkVrSRfIniAoc1HsXdkqX5KFTb5QOveeFSzeF", 520 | "to": "@master", 521 | "type": "internal", 522 | "value": "0.719435", 523 | }, 524 | }, 525 | { 526 | "$type": "processed", 527 | "gasUsed": 16698n, 528 | }, 529 | { 530 | "$type": "sent", 531 | "messages": [ 532 | { 533 | "body": { 534 | "type": "known", 535 | "value": { 536 | "$$type": "EventPayoutCompleted", 537 | "address": kQDVWm0ti1fdMhzNYlzx6DPkpoQtNGw_YKv41uETVNgZJ5TO, 538 | "value": 50000000000n, 539 | }, 540 | }, 541 | "to": null, 542 | "type": "external-out", 543 | }, 544 | ], 545 | }, 546 | { 547 | "$type": "sent", 548 | "messages": [ 549 | { 550 | "body": { 551 | "text": "Payout сompleted", 552 | "type": "text", 553 | }, 554 | "bounce": true, 555 | "from": "@master", 556 | "to": "@treasure(non-owner-2)", 557 | "type": "internal", 558 | "value": "50.701469", 559 | }, 560 | ], 561 | }, 562 | ], 563 | }, 564 | ] 565 | `); 566 | 567 | // Withdraw after burn end 568 | system.update({ now: time + 2500000 }); // Should be 100% burned 569 | await contract.send(nonOwner3, { value: toNano(1) }, ticket3); 570 | await system.run(); 571 | expect(track.collect()).toMatchInlineSnapshot(` 572 | [ 573 | { 574 | "$seq": 6, 575 | "events": [ 576 | { 577 | "$type": "storage-charged", 578 | "amount": "0.001084855", 579 | }, 580 | { 581 | "$type": "received", 582 | "message": { 583 | "body": { 584 | "text": "Xe2gsVc2lhXQqPr4Gi6X079PGuOneUuK7rbaGKKm_zY4rsNOJmXBuOOrMcSgfgpV_PeFC7IM2vboFumWwLOtC1F0h26AAA", 585 | "type": "text", 586 | }, 587 | "bounce": true, 588 | "from": "@treasure(non-owner-3)", 589 | "to": "@master", 590 | "type": "internal", 591 | "value": "1", 592 | }, 593 | }, 594 | { 595 | "$type": "processed", 596 | "gasUsed": 144597n, 597 | }, 598 | { 599 | "$type": "sent", 600 | "messages": [ 601 | { 602 | "body": { 603 | "text": "Payout already ended", 604 | "type": "text", 605 | }, 606 | "bounce": true, 607 | "from": "@master", 608 | "to": "@treasure(non-owner-3)", 609 | "type": "internal", 610 | "value": "0.854111", 611 | }, 612 | ], 613 | }, 614 | ], 615 | }, 616 | ] 617 | `); 618 | }); 619 | }); 620 | -------------------------------------------------------------------------------- /sources/contract-storage.spec.ts: -------------------------------------------------------------------------------- 1 | import { beginCell, toNano } from "ton"; 2 | import { ContractSystem, testKey } from "@tact-lang/emulator"; 3 | import { PayoutsMaster } from "./output/payouts_PayoutsMaster"; 4 | import { PayoutBeacon } from "./output/payouts_PayoutBeacon"; 5 | 6 | describe("contract-storage", () => { 7 | it("should keep enough for storage for master", async () => { 8 | let keypair = testKey("keypair-test"); 9 | let publicKey = beginCell().storeBuffer(keypair.publicKey).endCell().beginParse().loadUintBig(256); 10 | let system = await ContractSystem.create(); 11 | let owner = system.treasure("owner"); 12 | let contract = system.open(await PayoutsMaster.fromInit(owner.address, publicKey, null)); 13 | system.update({ now: 1000 }); 14 | await contract.send(owner, { value: toNano(1) }, { $$type: "Deploy", queryId: 0n }); 15 | await system.run(); 16 | 17 | // Check balances 18 | system.update({ now: 1000 + 5 * 365 * 24 * 60 * 60 }); // 5 years 19 | let track = system.track(contract.address); 20 | await contract.send(owner, { value: toNano(1) }, { $$type: "Deploy", queryId: 0n }); 21 | await system.run(); 22 | expect(track.collect()).toMatchInlineSnapshot(` 23 | [ 24 | { 25 | "$seq": 1, 26 | "events": [ 27 | { 28 | "$type": "storage-charged", 29 | "amount": "0.1", 30 | }, 31 | { 32 | "$type": "received", 33 | "message": { 34 | "body": { 35 | "type": "known", 36 | "value": { 37 | "$$type": "Deploy", 38 | "queryId": 0n, 39 | }, 40 | }, 41 | "bounce": true, 42 | "from": "@treasure(owner)", 43 | "to": "kQAzhQL5W3Bo924of371qGgGlNji_MuWdZ0VBcC35qWTiccW", 44 | "type": "internal", 45 | "value": "1", 46 | }, 47 | }, 48 | { 49 | "$type": "processed", 50 | "gasUsed": 9354n, 51 | }, 52 | { 53 | "$type": "sent", 54 | "messages": [ 55 | { 56 | "body": { 57 | "type": "known", 58 | "value": { 59 | "$$type": "DeployOk", 60 | "queryId": 0n, 61 | }, 62 | }, 63 | "bounce": false, 64 | "from": "kQAzhQL5W3Bo924of371qGgGlNji_MuWdZ0VBcC35qWTiccW", 65 | "to": "@treasure(owner)", 66 | "type": "internal", 67 | "value": "0.88945", 68 | }, 69 | ], 70 | }, 71 | ], 72 | }, 73 | ] 74 | `); 75 | }); 76 | 77 | it("should keep enough for storage for beacon", async () => { 78 | let keypair = testKey("keypair-test"); 79 | let publicKey = beginCell().storeBuffer(keypair.publicKey).endCell().beginParse().loadUintBig(256); 80 | let system = await ContractSystem.create(); 81 | let owner = system.treasure("owner"); 82 | let master = system.treasure("master"); 83 | let contract = system.open(await PayoutBeacon.fromInit(owner.address, master.address)); 84 | system.update({ now: 1000 }); 85 | await contract.send(owner, { value: toNano(1) }, { $$type: "Deploy", queryId: 0n }); 86 | await system.run(); 87 | 88 | // Check balances 89 | system.update({ now: 1000 + 5 * 365 * 24 * 60 * 60 }); // 5 years 90 | let track = system.track(contract.address); 91 | await contract.send(owner, { value: toNano(1) }, { $$type: "Deploy", queryId: 0n }); 92 | await system.run(); 93 | expect(track.collect()).toMatchInlineSnapshot(` 94 | [ 95 | { 96 | "$seq": 1, 97 | "events": [ 98 | { 99 | "$type": "storage-charged", 100 | "amount": "0.063453593", 101 | }, 102 | { 103 | "$type": "received", 104 | "message": { 105 | "body": { 106 | "type": "known", 107 | "value": { 108 | "$$type": "Deploy", 109 | "queryId": 0n, 110 | }, 111 | }, 112 | "bounce": true, 113 | "from": "@treasure(owner)", 114 | "to": "kQBN-W5smMfpppReemDA_kXucTURfFQ10lkNwm7jerjn0-DC", 115 | "type": "internal", 116 | "value": "1", 117 | }, 118 | }, 119 | { 120 | "$type": "processed", 121 | "gasUsed": 9633n, 122 | }, 123 | { 124 | "$type": "sent", 125 | "messages": [ 126 | { 127 | "body": { 128 | "type": "known", 129 | "value": { 130 | "$$type": "DeployOk", 131 | "queryId": 0n, 132 | }, 133 | }, 134 | "bounce": false, 135 | "from": "kQBN-W5smMfpppReemDA_kXucTURfFQ10lkNwm7jerjn0-DC", 136 | "to": "@treasure(owner)", 137 | "type": "internal", 138 | "value": "0.925717407", 139 | }, 140 | ], 141 | }, 142 | ], 143 | }, 144 | ] 145 | `); 146 | }); 147 | }); 148 | -------------------------------------------------------------------------------- /sources/contract.deploy.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as path from 'path'; 3 | import { Address, beginCell, contractAddress, fromNano, toNano } from "ton"; 4 | import { BurnParameters, PayoutsMaster } from "./output/payouts_PayoutsMaster"; 5 | import { prepareTactDeployment } from "@tact-lang/deployer"; 6 | import { generateList } from './contract.tickets'; 7 | 8 | (async () => { 9 | 10 | // Create tickets 11 | const tickets = generateList([{ 12 | address: 'kQAp8i3_3zwdIrK7-bx4iDkTD6ep3v1JV4NtCLaVvyq5dHUA', 13 | amount: toNano('10') 14 | }]); 15 | 16 | // Parameters 17 | let testnet = true; 18 | let packageName = 'payouts_PayoutsMaster.pkg'; 19 | let owner = Address.parse('kQAp8i3_3zwdIrK7-bx4iDkTD6ep3v1JV4NtCLaVvyq5dHUA'); 20 | let publicKey = beginCell().storeBuffer(tickets.publicKey).endCell().beginParse().loadUintBig(256); // Convert to uint256 21 | let burnParameters: BurnParameters | null = null; 22 | let init = await PayoutsMaster.init(owner, publicKey, burnParameters); 23 | 24 | // Load required data 25 | let address = contractAddress(0, init); 26 | let data = init.data.toBoc(); 27 | let pkg = fs.readFileSync(path.resolve(__dirname, 'output', packageName)); 28 | 29 | // Prepareing 30 | console.log('Uploading package...'); 31 | let prepare = await prepareTactDeployment({ pkg, data, testnet }); 32 | 33 | // Deploying 34 | console.log("============================================================================================"); 35 | console.log('Contract Address') 36 | console.log("============================================================================================"); 37 | console.log(); 38 | console.log(address.toString({ testOnly: testnet })); 39 | console.log(); 40 | console.log("============================================================================================"); 41 | console.log('Please, follow deployment link') 42 | console.log("============================================================================================"); 43 | console.log(); 44 | console.log(prepare); 45 | console.log(); 46 | console.log("============================================================================================"); 47 | console.log('Tickets') 48 | console.log("============================================================================================"); 49 | console.log(); 50 | for (let t of tickets.list) { 51 | console.log(t.address, t.ticket, fromNano(t.amount)); 52 | } 53 | console.log(); 54 | })(); -------------------------------------------------------------------------------- /sources/contract.events.ts: -------------------------------------------------------------------------------- 1 | import { getHttpV4Endpoint } from "@orbs-network/ton-access"; 2 | import { Address, TonClient4, fromNano } from "ton"; 3 | import { EventPayoutCompleted, loadEventPayoutCompleted } from "./output/payouts_PayoutsMaster"; 4 | 5 | (async () => { 6 | 7 | // Parameters 8 | const address = Address.parse('kQDfvuCEv6p_yZNsNs34rUEgADb94X8_cGp8twFaV5Vi_uZC'); 9 | 10 | // Load client 11 | const endpoint = await getHttpV4Endpoint({ network: 'testnet' }); 12 | const client = new TonClient4({ endpoint }) 13 | 14 | // Load transactions 15 | let block = (await client.getLastBlock()).last.seqno; 16 | let account = await client.getAccount(block, address) 17 | if (account.account.state.type !== 'active') { 18 | throw new Error('Account is not active'); 19 | } 20 | let tx = (await client.getAccountTransactions(address, BigInt(account.account.last!.lt), Buffer.from(account.account.last!.hash, 'base64'))).map((v) => v.tx); 21 | // while (tx.length > 0 && tx[tx.length - 1].prevTransactionLt !== 0n && tx[tx.length - 1].prevTransactionHash !== 0n) { 22 | // let last = tx[tx.length - 1]; 23 | // // let prev = (await client.getAccountTransactions(address, last.prevTransactionLt, last.prevTransactionHash)).map((v) => v.tx); 24 | // // tx = tx.concat(prev); 25 | // break; 26 | // } 27 | 28 | // Load events 29 | let ev: EventPayoutCompleted[] = []; 30 | for (let t of tx) { 31 | for (let msg of t.outMessages.values()) { 32 | if (msg.info.type === 'external-out') { 33 | let event = loadEventPayoutCompleted(msg.body.beginParse()); 34 | ev.push(event); 35 | } 36 | } 37 | } 38 | 39 | // Print events 40 | if (ev.length > 0) { 41 | console.log('Payouts:'); 42 | for (let e of ev) { 43 | console.log(e.address.toString({ testOnly: true }) + ': ' + fromNano(e.value)); 44 | } 45 | } 46 | })(); 47 | -------------------------------------------------------------------------------- /sources/contract.tact: -------------------------------------------------------------------------------- 1 | import "@stdlib/deploy"; 2 | import "@stdlib/ownable"; 3 | import "@stdlib/stoppable"; 4 | 5 | message TryPayout { 6 | address: Address; 7 | value: Int as coins; 8 | } 9 | 10 | message PayoutOk { 11 | address: Address; 12 | value: Int as coins; 13 | } 14 | 15 | message PayoutFailed { 16 | address: Address; 17 | value: Int as coins; 18 | } 19 | 20 | struct BurnParameters { 21 | startAt: Int as uint32; 22 | endAt: Int as uint32; 23 | } 24 | 25 | message EventPayoutCompleted { 26 | address: Address; 27 | value: Int as coins; 28 | } 29 | 30 | contract PayoutBeacon with Ownable, Deployable { 31 | override const storageReserve: Int = ton("0.1"); 32 | 33 | owner: Address; 34 | master: Address; 35 | completed: Bool; 36 | 37 | init(owner: Address, master: Address) { 38 | self.owner = owner; 39 | self.master = master; 40 | self.completed = false; 41 | } 42 | 43 | receive(msg: TryPayout) { 44 | 45 | // Check context 46 | let ctx: Context = context(); 47 | require(ctx.sender == self.master, "Invalid sender"); 48 | 49 | // Send response 50 | if (!self.completed) { 51 | self.completed = true; 52 | self.forward(ctx.sender, PayoutOk{ value: msg.value, address: self.owner }.toCell(), true, null); 53 | } else { 54 | self.forward(ctx.sender, PayoutFailed{ value: msg.value, address: self.owner }.toCell(), false, null); 55 | } 56 | } 57 | 58 | bounced(msg: bounced) { 59 | 60 | // Reset completed flag is our message bounced 61 | self.completed = false; 62 | 63 | // Send notification 64 | self.forward(self.owner, "Payout failed".asComment(), false, null); 65 | } 66 | 67 | get fun master(): Address { 68 | return self.master; 69 | } 70 | 71 | get fun completed(): Bool { 72 | return self.completed; 73 | } 74 | } 75 | 76 | contract PayoutsMaster with Deployable, Ownable, Resumable { 77 | override const storageReserve: Int = ton("0.1"); 78 | 79 | owner: Address; 80 | publicKey: Int as uint256; 81 | stopped: Bool; 82 | burn: BurnParameters?; 83 | 84 | init(owner: Address, publicKey: Int, burn: BurnParameters?) { 85 | self.owner = owner; 86 | self.publicKey = publicKey; 87 | self.stopped = false; 88 | self.burn = burn; 89 | if (burn != null) { 90 | let b: BurnParameters = burn!!; 91 | require(b.startAt < b.endAt, "Invalid burn parameters"); 92 | } 93 | } 94 | 95 | // 96 | // Payout operations 97 | // 98 | 99 | receive(withdraw: String) { 100 | 101 | // Normalize 102 | withdraw = normalizeKey(withdraw); 103 | 104 | // Check that the contract is not stopped 105 | self.requireNotStopped(); 106 | 107 | // Get the current context 108 | let ctx: Context = context(); 109 | require(ctx.value >= ton("1.0"), "Invalid value"); 110 | 111 | // Parse the withdraw message 112 | let msg: Slice = withdraw.fromBase64(); 113 | let signature: Slice = msg.loadBits(512); 114 | let value: Int = msg.loadCoins(); 115 | 116 | // Verify the signature 117 | let sigCell: Cell = beginCell() 118 | .storeAddress(ctx.sender) 119 | .storeCoins(value) 120 | .endCell(); 121 | let hash: Int = sigCell.hash(); 122 | require(checkSignature(hash, signature, self.publicKey), "Invalid signature"); 123 | 124 | // Adjust value if burn is set 125 | if (self.burn != null) { 126 | let burn: BurnParameters = self.burn!!; 127 | let now: Int = now(); 128 | if (burn.endAt <= now) { 129 | self.reply("Payout already ended".asComment()); 130 | return; 131 | } 132 | if (now >= burn.startAt) { 133 | value = (value * (burn.endAt - now)) / (burn.endAt - burn.startAt); 134 | } 135 | } 136 | 137 | // Check min value 138 | require(value >= ton("1.0"), "Check withdraw min value"); 139 | 140 | // Check balance before sending forward to save some gas on depletion 141 | require(myBalance() > ton("1.0") + self.storageReserve + value, "Insufficient balance on master"); 142 | 143 | // Send message to bacon 144 | let init: StateInit = initOf PayoutBeacon(ctx.sender, myAddress()); 145 | let address: Address = contractAddress(init); 146 | self.forward(address, TryPayout{ address: ctx.sender, value: value }.toCell(), true, init); 147 | } 148 | 149 | receive(ok: PayoutOk) { 150 | // Check that the contract is not stopped 151 | self.requireNotStopped(); 152 | 153 | // Get the current context 154 | let ctx: Context = context(); 155 | let init: StateInit = initOf PayoutBeacon(ok.address, myAddress()); 156 | let beaconAddress: Address = contractAddress(init); 157 | require(ctx.sender == beaconAddress, "Invalid sender"); 158 | 159 | // Require required balance 160 | require(myBalance() > ton("1.0") + self.storageReserve + ok.value, "Insufficient balance on master"); 161 | 162 | // Emit event 163 | emit(EventPayoutCompleted{ address: ok.address, value: ok.value }.toCell()); 164 | 165 | // Send the payout 166 | send(SendParameters{ 167 | value: ok.value, 168 | mode: SendRemainingValue, 169 | to: ok.address, 170 | body: "Payout сompleted".asComment() 171 | }); 172 | } 173 | 174 | receive(failed: PayoutFailed) { 175 | send(SendParameters{ 176 | value: 0, 177 | mode: SendRemainingValue, 178 | to: failed.address, 179 | body: "Already paid".asComment() 180 | }); 181 | } 182 | 183 | // 184 | // Admin operations 185 | // 186 | 187 | receive("Deposit") { 188 | // NOTE: This method is allowed for anyone 189 | let ctx: Context = context(); 190 | require(ctx.value >= ton("1.0"), "Invalid value"); 191 | send(SendParameters{ 192 | value: ton("0.1"), 193 | mode: SendIgnoreErrors, 194 | to: ctx.sender, 195 | bounce: false, 196 | body: "Deposit received".asComment() 197 | }); 198 | } 199 | 200 | receive("Withdraw") { 201 | self.requireOwner(); 202 | nativeReserve(self.storageReserve, 0); 203 | send(SendParameters{ 204 | value: 0, 205 | mode: SendRemainingBalance, 206 | to: self.owner, 207 | bounce: false, 208 | body: "Withdraw completed".asComment() 209 | }); 210 | } 211 | 212 | receive("Destroy") { 213 | self.requireOwner(); 214 | send(SendParameters{ 215 | value: 0, 216 | mode: SendRemainingBalance + SendDestroyIfZero, 217 | to: self.owner, 218 | bounce: false, 219 | body: "Contract destroyed".asComment() 220 | }); 221 | } 222 | 223 | // Getters 224 | 225 | get fun publicKey(): Int { 226 | return self.publicKey; 227 | } 228 | 229 | get fun burn(): BurnParameters? { 230 | return self.burn; 231 | } 232 | } 233 | 234 | fun normalizeKey(src: String): String { 235 | let out: Builder = beginCell(); 236 | let slice: Slice = src.asSlice(); 237 | while(slice.bits() > 0 || slice.refs() > 0) { 238 | require(slice.bits() % 8 == 0 && slice.refs() <= 1, "Invalid string"); 239 | if (slice.bits() > 0) { 240 | let ch: Int = slice.loadUint(8); 241 | if (ch >= 33 && ch <= 126) { 242 | out = out.storeUint(ch, 8); 243 | } 244 | } else { 245 | slice = slice.loadRef().beginParse(); 246 | } 247 | } 248 | return out.asSlice().asString(); 249 | } -------------------------------------------------------------------------------- /sources/contract.tickets.ts: -------------------------------------------------------------------------------- 1 | import base64url from "base64url"; 2 | import { randomBytes } from "crypto"; 3 | import { Address, beginCell } from "ton-core"; 4 | import { keyPairFromSeed, sign } from "ton-crypto"; 5 | 6 | export function createTicket(address: Address, amount: bigint, secretKey: Buffer) { 7 | let msgHash = beginCell().storeAddress(address).storeCoins(amount).endCell().hash(); 8 | let signature = sign(msgHash, secretKey); 9 | let builder = beginCell().storeBuffer(signature).storeCoins(amount); 10 | while ((1023 - builder.availableBits) % 8 !== 0) { 11 | builder.storeBit(0); 12 | } 13 | let c = builder.endCell(); 14 | let signatureWithPadding = c.beginParse().loadBuffer(c.bits.length / 8); 15 | return base64url(signatureWithPadding); 16 | } 17 | 18 | export function generateList(addresses: { address: string, amount: bigint }[]) { 19 | let keypair = keyPairFromSeed(randomBytes(32)); 20 | let list = addresses.map(({ address, amount }) => { 21 | return { 22 | address, 23 | amount, 24 | ticket: createTicket(Address.parse(address), amount, keypair.secretKey) 25 | }; 26 | }); 27 | 28 | return { 29 | publicKey: keypair.publicKey, 30 | list 31 | }; 32 | } -------------------------------------------------------------------------------- /sources/output/payouts_PayoutBeacon.abi: -------------------------------------------------------------------------------- 1 | {"name":"PayoutBeacon","types":[{"name":"StateInit","header":null,"fields":[{"name":"code","type":{"kind":"simple","type":"cell","optional":false}},{"name":"data","type":{"kind":"simple","type":"cell","optional":false}}]},{"name":"Context","header":null,"fields":[{"name":"bounced","type":{"kind":"simple","type":"bool","optional":false}},{"name":"sender","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"raw","type":{"kind":"simple","type":"slice","optional":false}}]},{"name":"SendParameters","header":null,"fields":[{"name":"bounce","type":{"kind":"simple","type":"bool","optional":false}},{"name":"to","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"mode","type":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"body","type":{"kind":"simple","type":"cell","optional":true}},{"name":"code","type":{"kind":"simple","type":"cell","optional":true}},{"name":"data","type":{"kind":"simple","type":"cell","optional":true}}]},{"name":"Deploy","header":2490013878,"fields":[{"name":"queryId","type":{"kind":"simple","type":"uint","optional":false,"format":64}}]},{"name":"DeployOk","header":2952335191,"fields":[{"name":"queryId","type":{"kind":"simple","type":"uint","optional":false,"format":64}}]},{"name":"FactoryDeploy","header":1829761339,"fields":[{"name":"queryId","type":{"kind":"simple","type":"uint","optional":false,"format":64}},{"name":"cashback","type":{"kind":"simple","type":"address","optional":false}}]},{"name":"ChangeOwner","header":2174598809,"fields":[{"name":"queryId","type":{"kind":"simple","type":"uint","optional":false,"format":64}},{"name":"newOwner","type":{"kind":"simple","type":"address","optional":false}}]},{"name":"ChangeOwnerOk","header":846932810,"fields":[{"name":"queryId","type":{"kind":"simple","type":"uint","optional":false,"format":64}},{"name":"newOwner","type":{"kind":"simple","type":"address","optional":false}}]},{"name":"TryPayout","header":1620127519,"fields":[{"name":"address","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"uint","optional":false,"format":"coins"}}]},{"name":"PayoutOk","header":3641354770,"fields":[{"name":"address","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"uint","optional":false,"format":"coins"}}]},{"name":"PayoutFailed","header":633161870,"fields":[{"name":"address","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"uint","optional":false,"format":"coins"}}]},{"name":"BurnParameters","header":null,"fields":[{"name":"startAt","type":{"kind":"simple","type":"uint","optional":false,"format":32}},{"name":"endAt","type":{"kind":"simple","type":"uint","optional":false,"format":32}}]},{"name":"EventPayoutCompleted","header":989312214,"fields":[{"name":"address","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"uint","optional":false,"format":"coins"}}]}],"receivers":[{"receiver":"internal","message":{"kind":"typed","type":"TryPayout"}},{"receiver":"internal","message":{"kind":"typed","type":"Deploy"}}],"getters":[{"name":"master","arguments":[],"returnType":{"kind":"simple","type":"address","optional":false}},{"name":"completed","arguments":[],"returnType":{"kind":"simple","type":"bool","optional":false}},{"name":"owner","arguments":[],"returnType":{"kind":"simple","type":"address","optional":false}}],"errors":{"2":{"message":"Stack undeflow"},"3":{"message":"Stack overflow"},"4":{"message":"Integer overflow"},"5":{"message":"Integer out of expected range"},"6":{"message":"Invalid opcode"},"7":{"message":"Type check error"},"8":{"message":"Cell overflow"},"9":{"message":"Cell underflow"},"10":{"message":"Dictionary error"},"13":{"message":"Out of gas error"},"32":{"message":"Method ID not found"},"34":{"message":"Action is invalid or not supported"},"37":{"message":"Not enough TON"},"38":{"message":"Not enough extra-currencies"},"128":{"message":"Null reference exception"},"129":{"message":"Invalid serialization prefix"},"130":{"message":"Invalid incoming message"},"131":{"message":"Constraints error"},"132":{"message":"Access denied"},"133":{"message":"Contract stopped"},"134":{"message":"Invalid argument"},"135":{"message":"Code of a contract was not found"},"136":{"message":"Invalid address"},"137":{"message":"Masterchain support is not enabled for this contract"},"4429":{"message":"Invalid sender"},"12724":{"message":"Invalid burn parameters"},"16059":{"message":"Invalid value"},"19204":{"message":"Insufficient balance on master"},"40368":{"message":"Contract stopped"},"46762":{"message":"Invalid string"},"48401":{"message":"Invalid signature"},"53296":{"message":"Contract not stopped"},"57826":{"message":"Check withdraw min value"}},"interfaces":["org.ton.introspection.v0","org.ton.abi.ipfs.v0","org.ton.deploy.lazy.v0","org.ton.chain.workchain.v0","org.ton.ownable"]} -------------------------------------------------------------------------------- /sources/output/payouts_PayoutBeacon.code.boc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tact-lang/contract-payouts/287b768ea3f2617b814cb6258f12910d4943dedf/sources/output/payouts_PayoutBeacon.code.boc -------------------------------------------------------------------------------- /sources/output/payouts_PayoutBeacon.code.fc: -------------------------------------------------------------------------------- 1 | #pragma version =0.4.3; 2 | #pragma allow-post-modification; 3 | #pragma compute-asm-ltr; 4 | 5 | #include "payouts_PayoutBeacon.headers.fc"; 6 | #include "payouts_PayoutBeacon.stdlib.fc"; 7 | #include "payouts_PayoutBeacon.constants.fc"; 8 | #include "payouts_PayoutBeacon.storage.fc"; 9 | 10 | ;; 11 | ;; Contract PayoutBeacon functions 12 | ;; 13 | 14 | (slice, slice, int) $PayoutBeacon$_contract_init(slice $owner, slice $master) impure inline_ref { 15 | var (($self'owner, $self'master, $self'completed)) = (null(), null(), null()); 16 | $self'owner = $owner; 17 | $self'master = $master; 18 | $self'completed = false; 19 | return ($self'owner, $self'master, $self'completed); 20 | } 21 | 22 | ((slice, slice, int), slice) $PayoutBeacon$_fun_master((slice, slice, int) $self) impure inline_ref { 23 | var (($self'owner, $self'master, $self'completed)) = $self; 24 | return (($self'owner, $self'master, $self'completed), $self'master); 25 | } 26 | 27 | ((slice, slice, int), int) $PayoutBeacon$_fun_completed((slice, slice, int) $self) impure inline_ref { 28 | var (($self'owner, $self'master, $self'completed)) = $self; 29 | return (($self'owner, $self'master, $self'completed), $self'completed); 30 | } 31 | 32 | ((slice, slice, int), slice) $PayoutBeacon$_fun_owner((slice, slice, int) $self) impure inline_ref { 33 | var (($self'owner, $self'master, $self'completed)) = $self; 34 | return (($self'owner, $self'master, $self'completed), $self'owner); 35 | } 36 | 37 | ;; 38 | ;; Receivers of a Contract PayoutBeacon 39 | ;; 40 | 41 | (((slice, slice, int)), ()) $PayoutBeacon$_internal_binary_TryPayout((slice, slice, int) $self, (slice, int) $msg) impure inline { 42 | var ($self'owner, $self'master, $self'completed) = $self; 43 | var ($msg'address, $msg'value) = $msg; 44 | var ($ctx'bounced, $ctx'sender, $ctx'value, $ctx'raw) = __tact_context_get(); 45 | throw_unless(4429, ( __tact_slice_eq_bits($self'master, $ctx'sender) )); 46 | if ((~ $self'completed)) { 47 | $self'completed = true; 48 | ($self'owner, $self'master, $self'completed)~$PayoutBeacon$_fun_forward($ctx'sender, $PayoutOk$_store_cell($PayoutOk$_constructor_value_address($msg'value, $self'owner)), true, null()); 49 | } else { 50 | ($self'owner, $self'master, $self'completed)~$PayoutBeacon$_fun_forward($ctx'sender, $PayoutFailed$_store_cell($PayoutFailed$_constructor_value_address($msg'value, $self'owner)), false, null()); 51 | } 52 | return (($self'owner, $self'master, $self'completed), ()); 53 | } 54 | 55 | (((slice, slice, int)), ()) $PayoutBeacon$_receive_binary_bounce_PayoutOk((slice, slice, int) $self, tuple $msg) impure inline { 56 | var ($self'owner, $self'master, $self'completed) = $self; 57 | var $msg = $msg; 58 | $self'completed = false; 59 | ($self'owner, $self'master, $self'completed)~$PayoutBeacon$_fun_forward($self'owner, __gen_cell_comment_78b0aaadc117be03d1b8403b36288b7cdcb49676035c923368c2baf21da6ea04(), false, null()); 60 | return (($self'owner, $self'master, $self'completed), ()); 61 | } 62 | 63 | (((slice, slice, int)), ()) $PayoutBeacon$_internal_binary_Deploy((slice, slice, int) $self, (int) $deploy) impure inline { 64 | var ($self'owner, $self'master, $self'completed) = $self; 65 | var ($deploy'queryId) = $deploy; 66 | ($self'owner, $self'master, $self'completed)~$PayoutBeacon$_fun_notify($DeployOk$_store_cell($DeployOk$_constructor_queryId($deploy'queryId))); 67 | return (($self'owner, $self'master, $self'completed), ()); 68 | } 69 | 70 | ;; 71 | ;; Get methods of a Contract PayoutBeacon 72 | ;; 73 | 74 | _ %master() method_id(120253) { 75 | var self = $PayoutBeacon$_contract_load(); 76 | var res = self~$PayoutBeacon$_fun_master(); 77 | return res; 78 | } 79 | 80 | _ %completed() method_id(79554) { 81 | var self = $PayoutBeacon$_contract_load(); 82 | var res = self~$PayoutBeacon$_fun_completed(); 83 | return res; 84 | } 85 | 86 | _ %owner() method_id(83229) { 87 | var self = $PayoutBeacon$_contract_load(); 88 | var res = self~$PayoutBeacon$_fun_owner(); 89 | return res; 90 | } 91 | 92 | _ supported_interfaces() method_id { 93 | return ( 94 | "org.ton.introspection.v0"H >> 128, 95 | "org.ton.abi.ipfs.v0"H >> 128, 96 | "org.ton.deploy.lazy.v0"H >> 128, 97 | "org.ton.chain.workchain.v0"H >> 128, 98 | "org.ton.ownable"H >> 128 99 | ); 100 | } 101 | 102 | _ get_abi_ipfs() method_id { 103 | return "ipfs://QmTqKzaFv6GqqzSbRP2HKGQ8pynjEn9XPCkscDDBPiqKcf"; 104 | } 105 | 106 | _ lazy_deployment_completed() method_id { 107 | return get_data().begin_parse().load_int(1); 108 | } 109 | 110 | ;; 111 | ;; Routing of a Contract PayoutBeacon 112 | ;; 113 | 114 | ((slice, slice, int), int) $PayoutBeacon$_contract_router_internal((slice, slice, int) self, int msg_bounced, slice in_msg) impure inline_ref { 115 | ;; Handle bounced messages 116 | if (msg_bounced) { 117 | 118 | ;; Skip 0xFFFFFFFF 119 | in_msg~skip_bits(32); 120 | 121 | ;; Parse op 122 | int op = 0; 123 | if (slice_bits(in_msg) >= 32) { 124 | op = in_msg.preload_uint(32); 125 | } 126 | 127 | ;; Bounced handler for PayoutOk message 128 | if (op == 3641354770) { 129 | var msg = in_msg~$PayoutOk$_load_bounced(); 130 | self~$PayoutBeacon$_receive_binary_bounce_PayoutOk(msg); 131 | return (self, true); 132 | } 133 | 134 | return (self, true); 135 | } 136 | 137 | ;; Parse incoming message 138 | int op = 0; 139 | if (slice_bits(in_msg) >= 32) { 140 | op = in_msg.preload_uint(32); 141 | } 142 | 143 | 144 | ;; Receive TryPayout message 145 | if (op == 1620127519) { 146 | var msg = in_msg~$TryPayout$_load(); 147 | self~$PayoutBeacon$_internal_binary_TryPayout(msg); 148 | return (self, true); 149 | } 150 | 151 | ;; Receive Deploy message 152 | if (op == 2490013878) { 153 | var msg = in_msg~$Deploy$_load(); 154 | self~$PayoutBeacon$_internal_binary_Deploy(msg); 155 | return (self, true); 156 | } 157 | 158 | return (self, false); 159 | } 160 | 161 | () recv_internal(int msg_value, cell in_msg_cell, slice in_msg) impure { 162 | 163 | ;; Context 164 | var cs = in_msg_cell.begin_parse(); 165 | var msg_flags = cs~load_uint(4); 166 | var msg_bounced = -(msg_flags & 1); 167 | slice msg_sender_addr = __tact_verify_address(cs~load_msg_addr()); 168 | __tact_context = (msg_bounced, msg_sender_addr, msg_value, cs); 169 | __tact_context_sender = msg_sender_addr; 170 | 171 | ;; Load contract data 172 | var self = $PayoutBeacon$_contract_load(); 173 | 174 | ;; Handle operation 175 | int handled = self~$PayoutBeacon$_contract_router_internal(msg_bounced, in_msg); 176 | 177 | ;; Throw if not handled 178 | throw_unless(130, handled); 179 | 180 | ;; Persist state 181 | $PayoutBeacon$_contract_store(self); 182 | } 183 | -------------------------------------------------------------------------------- /sources/output/payouts_PayoutBeacon.code.fif: -------------------------------------------------------------------------------- 1 | PROGRAM{ 2 | DECLPROC __tact_verify_address 3 | DECLPROC __tact_load_address 4 | DECLPROC __tact_store_address 5 | DECLPROC __tact_my_balance 6 | DECLPROC __tact_not_null 7 | DECLPROC __tact_context_get 8 | DECLPROC __tact_context_get_sender 9 | DECLPROC __tact_store_bool 10 | DECLPROC __tact_slice_eq_bits 11 | DECLPROC $Deploy$_load 12 | DECLPROC $DeployOk$_store 13 | DECLPROC $DeployOk$_store_cell 14 | DECLPROC $TryPayout$_load 15 | DECLPROC $PayoutOk$_store 16 | DECLPROC $PayoutOk$_store_cell 17 | DECLPROC $PayoutOk$_load_bounced 18 | DECLPROC $PayoutFailed$_store 19 | DECLPROC $PayoutFailed$_store_cell 20 | DECLPROC $PayoutBeacon$_store 21 | DECLPROC $PayoutBeacon$_load 22 | DECLPROC $StateInit$_not_null 23 | DECLPROC $PayoutBeacon$init$_load 24 | DECLPROC $PayoutBeacon$_contract_init 25 | DECLPROC $PayoutBeacon$_contract_load 26 | DECLPROC $PayoutBeacon$_contract_store 27 | DECLPROC $global_send 28 | DECLPROC $PayoutBeacon$_fun_master 29 | DECLPROC $PayoutBeacon$_fun_completed 30 | DECLPROC $SendParameters$_constructor_bounce_to_value_mode_body_code_data 31 | DECLPROC $PayoutBeacon$_fun_forward 32 | DECLPROC $PayoutBeacon$_fun_notify 33 | DECLPROC $PayoutBeacon$_fun_owner 34 | DECLPROC $PayoutOk$_constructor_value_address 35 | DECLPROC $PayoutFailed$_constructor_value_address 36 | DECLPROC $DeployOk$_constructor_queryId 37 | DECLPROC $PayoutBeacon$_internal_binary_TryPayout 38 | DECLPROC $PayoutBeacon$_receive_binary_bounce_PayoutOk 39 | DECLPROC $PayoutBeacon$_internal_binary_Deploy 40 | 120253 DECLMETHOD %master 41 | 79554 DECLMETHOD %completed 42 | 83229 DECLMETHOD %owner 43 | 113617 DECLMETHOD supported_interfaces 44 | 121275 DECLMETHOD get_abi_ipfs 45 | 115390 DECLMETHOD lazy_deployment_completed 46 | DECLPROC $PayoutBeacon$_contract_router_internal 47 | DECLPROC recv_internal 48 | DECLGLOBVAR __tact_context 49 | DECLGLOBVAR __tact_context_sender 50 | DECLGLOBVAR __tact_context_sys 51 | DECLGLOBVAR __tact_randomized 52 | __tact_verify_address PROCINLINE:<{ 53 | DUP 54 | SBITS 55 | 267 PUSHINT 56 | EQUAL 57 | 136 THROWIFNOT 58 | DUP 59 | 11 PLDU 60 | DUP 61 | 1279 PUSHINT 62 | EQUAL 63 | 137 THROWIF 64 | 10 PUSHPOW2 65 | EQUAL 66 | 136 THROWIFNOT 67 | }> 68 | __tact_load_address PROCINLINE:<{ 69 | LDMSGADDR 70 | SWAP 71 | __tact_verify_address INLINECALLDICT 72 | }> 73 | __tact_store_address PROCINLINE:<{ 74 | __tact_verify_address INLINECALLDICT 75 | STSLICER 76 | }> 77 | __tact_my_balance PROCINLINE:<{ 78 | BALANCE 79 | FIRST 80 | }> 81 | __tact_not_null PROCINLINE:<{ 82 | DUP 83 | ISNULL 84 | 128 THROWIF 85 | }> 86 | __tact_context_get PROCINLINE:<{ 87 | __tact_context GETGLOB 88 | 4 UNTUPLE 89 | }> 90 | __tact_context_get_sender PROCINLINE:<{ 91 | __tact_context_sender GETGLOB 92 | }> 93 | __tact_store_bool PROCINLINE:<{ 94 | SWAP 95 | 1 STI 96 | }> 97 | __tact_slice_eq_bits PROCINLINE:<{ 98 | SDEQ 99 | }> 100 | $Deploy$_load PROCINLINE:<{ 101 | 32 LDU 102 | SWAP 103 | 2490013878 PUSHINT 104 | EQUAL 105 | 129 THROWIFNOT 106 | 64 LDU 107 | SWAP 108 | }> 109 | $DeployOk$_store PROCINLINE:<{ 110 | 2952335191 PUSHINT 111 | ROT 112 | 32 STU 113 | 64 STU 114 | }> 115 | $DeployOk$_store_cell PROCINLINE:<{ 116 | NEWC 117 | SWAP 118 | $DeployOk$_store INLINECALLDICT 119 | ENDC 120 | }> 121 | $TryPayout$_load PROCINLINE:<{ 122 | 32 LDU 123 | SWAP 124 | 1620127519 PUSHINT 125 | EQUAL 126 | 129 THROWIFNOT 127 | __tact_load_address INLINECALLDICT 128 | SWAP 129 | LDGRAMS 130 | -ROT 131 | }> 132 | $PayoutOk$_store PROCINLINE:<{ 133 | 3641354770 PUSHINT 134 | s0 s3 XCHG2 135 | 32 STU 136 | SWAP 137 | __tact_store_address INLINECALLDICT 138 | SWAP 139 | STGRAMS 140 | }> 141 | $PayoutOk$_store_cell PROCINLINE:<{ 142 | NEWC 143 | -ROT 144 | $PayoutOk$_store INLINECALLDICT 145 | ENDC 146 | }> 147 | $PayoutOk$_load_bounced PROCINLINE:<{ 148 | 32 LDU 149 | SWAP 150 | 3641354770 PUSHINT 151 | EQUAL 152 | 129 THROWIFNOT 153 | PUSHNULL 154 | }> 155 | $PayoutFailed$_store PROCINLINE:<{ 156 | 633161870 PUSHINT 157 | s0 s3 XCHG2 158 | 32 STU 159 | SWAP 160 | __tact_store_address INLINECALLDICT 161 | SWAP 162 | STGRAMS 163 | }> 164 | $PayoutFailed$_store_cell PROCINLINE:<{ 165 | NEWC 166 | -ROT 167 | $PayoutFailed$_store INLINECALLDICT 168 | ENDC 169 | }> 170 | $PayoutBeacon$_store PROCINLINE:<{ 171 | 2SWAP 172 | __tact_store_address INLINECALLDICT 173 | ROT 174 | __tact_store_address INLINECALLDICT 175 | 1 STI 176 | }> 177 | $PayoutBeacon$_load PROCINLINE:<{ 178 | __tact_load_address INLINECALLDICT 179 | SWAP 180 | __tact_load_address INLINECALLDICT 181 | SWAP 182 | 1 LDI 183 | 3 -ROLL 184 | }> 185 | $StateInit$_not_null PROCINLINE:<{ 186 | DUP 187 | ISNULL 188 | 128 THROWIF 189 | 2 UNTUPLE 190 | }> 191 | $PayoutBeacon$init$_load PROCINLINE:<{ 192 | __tact_load_address INLINECALLDICT 193 | SWAP 194 | __tact_load_address INLINECALLDICT 195 | s1 s2 XCHG 196 | }> 197 | $PayoutBeacon$_contract_init PROCREF:<{ 198 | FALSE 199 | }> 200 | $PayoutBeacon$_contract_load PROCREF:<{ 201 | c4 PUSH 202 | CTOS 203 | LDREF 204 | SWAP 205 | __tact_context_sys SETGLOB 206 | 1 LDI 207 | SWAP 208 | IFJMP:<{ 209 | $PayoutBeacon$_load INLINECALLDICT 210 | 1 3 BLKDROP2 211 | }> 212 | MYADDR 213 | 11 PLDU 214 | 10 PUSHPOW2 215 | EQUAL 216 | 137 THROWIFNOT 217 | $PayoutBeacon$init$_load INLINECALLDICT 218 | s0 s2 XCHG 219 | ENDS 220 | SWAP 221 | $PayoutBeacon$_contract_init INLINECALLDICT 222 | }> 223 | $PayoutBeacon$_contract_store PROCINLINE:<{ 224 | NEWC 225 | __tact_context_sys GETGLOB 226 | SWAP 227 | STREF 228 | TRUE 229 | SWAP 230 | 1 STI 231 | 3 -ROLL 232 | $PayoutBeacon$_store INLINECALLDICT 233 | ENDC 234 | c4 POP 235 | }> 236 | $global_send PROCREF:<{ 237 | NEWC 238 | 1 PUSHINT 239 | SWAP 240 | 2 STI 241 | s0 s7 XCHG2 242 | __tact_store_bool INLINECALLDICT 243 | 0 PUSHINT 244 | SWAP 245 | 3 STI 246 | s0 s5 XCHG2 247 | __tact_store_address INLINECALLDICT 248 | s0 s3 XCHG2 249 | STGRAMS 250 | 0 PUSHINT 251 | SWAP 252 | 105 STI 253 | s3 PUSH 254 | ISNULL 255 | NOT 256 | IF:<{ 257 | TRUE 258 | }>ELSE<{ 259 | s4 PUSH 260 | ISNULL 261 | NOT 262 | }> 263 | IF:<{ 264 | TRUE 265 | __tact_store_bool INLINECALLDICT 266 | NEWC 267 | FALSE 268 | __tact_store_bool INLINECALLDICT 269 | FALSE 270 | __tact_store_bool INLINECALLDICT 271 | s4 PUSH 272 | ISNULL 273 | NOT 274 | IF:<{ 275 | TRUE 276 | __tact_store_bool INLINECALLDICT 277 | s0 s4 XCHG 278 | __tact_not_null INLINECALLDICT 279 | s0 s4 XCHG2 280 | STREF 281 | }>ELSE<{ 282 | s4 POP 283 | s0 s3 XCHG 284 | FALSE 285 | __tact_store_bool INLINECALLDICT 286 | }> 287 | s4 PUSH 288 | ISNULL 289 | NOT 290 | IF:<{ 291 | TRUE 292 | __tact_store_bool INLINECALLDICT 293 | s0 s4 XCHG 294 | __tact_not_null INLINECALLDICT 295 | s0 s4 XCHG2 296 | STREF 297 | }>ELSE<{ 298 | s4 POP 299 | s0 s3 XCHG 300 | FALSE 301 | __tact_store_bool INLINECALLDICT 302 | }> 303 | FALSE 304 | __tact_store_bool INLINECALLDICT 305 | s0 s2 XCHG 306 | TRUE 307 | __tact_store_bool INLINECALLDICT 308 | s0 s2 XCHG 309 | ENDC 310 | ROT 311 | STREF 312 | }>ELSE<{ 313 | s3 POP 314 | s3 POP 315 | SWAP 316 | FALSE 317 | __tact_store_bool INLINECALLDICT 318 | }> 319 | OVER 320 | ISNULL 321 | NOT 322 | IF:<{ 323 | TRUE 324 | __tact_store_bool INLINECALLDICT 325 | SWAP 326 | __tact_not_null INLINECALLDICT 327 | SWAP 328 | STREF 329 | }>ELSE<{ 330 | NIP 331 | FALSE 332 | __tact_store_bool INLINECALLDICT 333 | }> 334 | ENDC 335 | SWAP 336 | SENDRAWMSG 337 | }> 338 | $PayoutBeacon$_fun_master PROCREF:<{ 339 | OVER 340 | }> 341 | $PayoutBeacon$_fun_completed PROCREF:<{ 342 | DUP 343 | }> 344 | $SendParameters$_constructor_bounce_to_value_mode_body_code_data PROCINLINE:<{ 345 | }> 346 | $PayoutBeacon$_fun_forward PROCREF:<{ 347 | PUSHNULL 348 | PUSHNULL 349 | s2 PUSH 350 | ISNULL 351 | NOT 352 | IF:<{ 353 | 2DROP 354 | $StateInit$_not_null INLINECALLDICT 355 | SWAP 356 | }>ELSE<{ 357 | s2 POP 358 | }> 359 | __tact_context_get INLINECALLDICT 360 | s1 s3 XCHG 361 | 3 BLKDROP 362 | __tact_my_balance INLINECALLDICT 363 | SWAP 364 | SUB 365 | 100000000 PUSHINT 366 | LESS 367 | IFJMP:<{ 368 | 100000000 PUSHINT 369 | 0 PUSHINT 370 | RAWRESERVE 371 | s2 s4 XCHG 372 | 0 PUSHINT 373 | s0 s3 XCHG 374 | s0 s4 XCHG 375 | 130 PUSHINT 376 | s2 s3 XCHG2 377 | $SendParameters$_constructor_bounce_to_value_mode_body_code_data INLINECALLDICT 378 | $global_send INLINECALLDICT 379 | }> 380 | s2 s4 XCHG 381 | 0 PUSHINT 382 | s0 s3 XCHG 383 | s0 s4 XCHG 384 | 66 PUSHINT 385 | s2 s3 XCHG2 386 | $SendParameters$_constructor_bounce_to_value_mode_body_code_data INLINECALLDICT 387 | $global_send INLINECALLDICT 388 | }> 389 | $PayoutBeacon$_fun_notify PROCINLINE:<{ 390 | __tact_context_get_sender INLINECALLDICT 391 | SWAP 392 | FALSE 393 | PUSHNULL 394 | $PayoutBeacon$_fun_forward INLINECALLDICT 395 | }> 396 | $PayoutBeacon$_fun_owner PROCREF:<{ 397 | s2 PUSH 398 | }> 399 | $PayoutOk$_constructor_value_address PROCINLINE:<{ 400 | SWAP 401 | }> 402 | $PayoutFailed$_constructor_value_address PROCINLINE:<{ 403 | SWAP 404 | }> 405 | $DeployOk$_constructor_queryId PROCINLINE:<{ 406 | }> 407 | $PayoutBeacon$_internal_binary_TryPayout PROCINLINE:<{ 408 | NIP 409 | __tact_context_get INLINECALLDICT 410 | s2 s3 XCHG 411 | 3 BLKDROP 412 | 4429 PUSHINT 413 | s4 s1 PUSH2 414 | __tact_slice_eq_bits INLINECALLDICT 415 | THROWANYIFNOT 416 | s2 PUSH 417 | NOT 418 | IF:<{ 419 | s2 POP 420 | TRUE 421 | s1 s4 XCPU 422 | $PayoutOk$_constructor_value_address INLINECALLDICT 423 | $PayoutOk$_store_cell INLINECALLDICT 424 | s1 s2 XCHG 425 | TRUE 426 | PUSHNULL 427 | $PayoutBeacon$_fun_forward INLINECALLDICT 428 | }>ELSE<{ 429 | s1 s4 XCPU 430 | $PayoutFailed$_constructor_value_address INLINECALLDICT 431 | $PayoutFailed$_store_cell INLINECALLDICT 432 | FALSE 433 | PUSHNULL 434 | $PayoutBeacon$_fun_forward INLINECALLDICT 435 | }> 436 | }> 437 | $PayoutBeacon$_receive_binary_bounce_PayoutOk PROCINLINE:<{ 438 | 2DROP 439 | FALSE 440 | B{b5ee9c72410101010013000022000000005061796f7574206661696c6564ad44bad5} B>boc PUSHREF 441 | s3 s(-1) PUXC 442 | FALSE 443 | PUSHNULL 444 | $PayoutBeacon$_fun_forward INLINECALLDICT 445 | }> 446 | $PayoutBeacon$_internal_binary_Deploy PROCINLINE:<{ 447 | $DeployOk$_constructor_queryId INLINECALLDICT 448 | $DeployOk$_store_cell INLINECALLDICT 449 | $PayoutBeacon$_fun_notify INLINECALLDICT 450 | }> 451 | %master PROC:<{ 452 | $PayoutBeacon$_contract_load INLINECALLDICT 453 | $PayoutBeacon$_fun_master INLINECALLDICT 454 | 3 1 BLKDROP2 455 | }> 456 | %completed PROC:<{ 457 | $PayoutBeacon$_contract_load INLINECALLDICT 458 | $PayoutBeacon$_fun_completed INLINECALLDICT 459 | 3 1 BLKDROP2 460 | }> 461 | %owner PROC:<{ 462 | $PayoutBeacon$_contract_load INLINECALLDICT 463 | $PayoutBeacon$_fun_owner INLINECALLDICT 464 | 3 1 BLKDROP2 465 | }> 466 | supported_interfaces PROC:<{ 467 | 123515602279859691144772641439386770278 PUSHINT 468 | 209801025412363888721030803524359905849 PUSHINT 469 | 42980537499636128163026532310500881091 PUSHINT 470 | 209474421377847335869795010607481022628 PUSHINT 471 | 86142586315491086060343270784266291122 PUSHINT 472 | }> 473 | get_abi_ipfs PROC:<{ 474 | x{697066733a2f2f516d54714b7a614676364771717a5362525032484b47513870796e6a456e395850436b73634444425069714b6366} PUSHSLICE 475 | }> 476 | lazy_deployment_completed PROC:<{ 477 | c4 PUSH 478 | CTOS 479 | 1 LDI 480 | SWAP 481 | }> 482 | $PayoutBeacon$_contract_router_internal PROCREF:<{ 483 | SWAP 484 | IFJMP:<{ 485 | 32 PUSHINT 486 | SDSKIPFIRST 487 | 0 PUSHINT 488 | OVER 489 | SBITS 490 | 31 GTINT 491 | IF:<{ 492 | DROP 493 | DUP 494 | 32 PLDU 495 | }> 496 | 3641354770 PUSHINT 497 | EQUAL 498 | IFJMP:<{ 499 | $PayoutOk$_load_bounced INLINECALLDICT 500 | NIP 501 | $PayoutBeacon$_receive_binary_bounce_PayoutOk INLINECALLDICT 502 | TRUE 503 | }> 504 | DROP 505 | TRUE 506 | }> 507 | 0 PUSHINT 508 | OVER 509 | SBITS 510 | 31 GTINT 511 | IF:<{ 512 | DROP 513 | DUP 514 | 32 PLDU 515 | }> 516 | DUP 517 | 1620127519 PUSHINT 518 | EQUAL 519 | IFJMP:<{ 520 | DROP 521 | $TryPayout$_load INLINECALLDICT 522 | 1 2 BLKDROP2 523 | $PayoutBeacon$_internal_binary_TryPayout INLINECALLDICT 524 | TRUE 525 | }> 526 | 2490013878 PUSHINT 527 | EQUAL 528 | IFJMP:<{ 529 | $Deploy$_load INLINECALLDICT 530 | NIP 531 | $PayoutBeacon$_internal_binary_Deploy INLINECALLDICT 532 | TRUE 533 | }> 534 | DROP 535 | FALSE 536 | }> 537 | recv_internal PROC:<{ 538 | SWAP 539 | CTOS 540 | 4 LDU 541 | SWAP 542 | 1 PUSHINT 543 | AND 544 | NEGATE 545 | SWAP 546 | LDMSGADDR 547 | SWAP 548 | __tact_verify_address INLINECALLDICT 549 | s0 s4 s2 PUXCPU 550 | s0 s3 XCHG 551 | 4 TUPLE 552 | __tact_context SETGLOB 553 | s0 s2 XCHG 554 | __tact_context_sender SETGLOB 555 | $PayoutBeacon$_contract_load INLINECALLDICT 556 | 2 3 BLKSWAP 557 | $PayoutBeacon$_contract_router_internal INLINECALLDICT 558 | 130 THROWIFNOT 559 | $PayoutBeacon$_contract_store INLINECALLDICT 560 | }> 561 | }END>c 562 | -------------------------------------------------------------------------------- /sources/output/payouts_PayoutBeacon.code.rev.fif: -------------------------------------------------------------------------------- 1 | PROGRAM{ 2 | DECLPROC recv_internal; 3 | DECLPROC ?fun_79554; 4 | DECLPROC owner; 5 | DECLPROC supported_interfaces; 6 | DECLPROC lazy_deployment_completed; 7 | DECLPROC ?fun_120253; 8 | DECLPROC get_abi_ipfs; 9 | DECLPROC ?fun_ref_0e447c6ae95ddfd1; 10 | DECLPROC ?fun_ref_40d98146a47dbe3b; 11 | DECLPROC ?fun_ref_44086a5ce86162fe; 12 | DECLPROC ?fun_ref_644ef5250652bdfa; 13 | DECLPROC ?fun_ref_b2f99ae1a1dd4dfb; 14 | DECLPROC ?fun_ref_b93b9862cda1783c; 15 | DECLPROC ?fun_ref_cdb3a674bf3744f7; 16 | DECLPROC ?fun_ref_ed6d0b29af79c1a8; 17 | recv_internal PROC:<{ 18 | s0 s1 XCHG 19 | CTOS 20 | 4 LDU 21 | s0 s1 XCHG 22 | 1 PUSHINT 23 | AND 24 | -1 MULCONST 25 | s0 s1 XCHG 26 | LDMSGADDR 27 | s0 s1 XCHG 28 | s0 PUSH 29 | SBITS 30 | 267 PUSHINT 31 | EQUAL 32 | 136 THROWIFNOT 33 | s0 PUSH 34 | 11 PLDU 35 | s0 PUSH 36 | 1279 PUSHINT 37 | EQUAL 38 | 137 THROWIF 39 | 10 PUSHPOW2 40 | EQUAL 41 | 136 THROWIFNOT 42 | s0 s6 s4 PUXCPU 43 | s0 s3 XCHG 44 | 4 TUPLE 45 | 1 SETGLOBVAR 46 | s0 s2 XCHG 47 | 2 SETGLOBVAR 48 | ?fun_ref_ed6d0b29af79c1a8 INLINECALLDICT 49 | 2 3 BLKSWAP 50 | ?fun_ref_cdb3a674bf3744f7 INLINECALLDICT 51 | 130 THROWIFNOT 52 | NEWC 53 | 3 GETGLOBVAR 54 | s0 s1 XCHG 55 | STREF 56 | -1 PUSHINT 57 | s0 s1 XCHG 58 | 1 STI 59 | 3 1 BLKSWAP 60 | SWAP2 61 | s0 PUSH 62 | SBITS 63 | 267 PUSHINT 64 | EQUAL 65 | 136 THROWIFNOT 66 | s0 PUSH 67 | 11 PLDU 68 | s0 PUSH 69 | 1279 PUSHINT 70 | EQUAL 71 | 137 THROWIF 72 | 10 PUSHPOW2 73 | EQUAL 74 | 136 THROWIFNOT 75 | STSLICER 76 | ROT 77 | s0 PUSH 78 | SBITS 79 | 267 PUSHINT 80 | EQUAL 81 | 136 THROWIFNOT 82 | s0 PUSH 83 | 11 PLDU 84 | s0 PUSH 85 | 1279 PUSHINT 86 | EQUAL 87 | 137 THROWIF 88 | 10 PUSHPOW2 89 | EQUAL 90 | 136 THROWIFNOT 91 | STSLICER 92 | 1 STI 93 | ENDC 94 | c4 POP 95 | }> 96 | ?fun_79554 PROC:<{ 97 | ?fun_ref_ed6d0b29af79c1a8 INLINECALLDICT 98 | ?fun_ref_40d98146a47dbe3b INLINECALLDICT 99 | 3 1 BLKDROP2 100 | }> 101 | owner PROC:<{ 102 | ?fun_ref_ed6d0b29af79c1a8 INLINECALLDICT 103 | ?fun_ref_b2f99ae1a1dd4dfb INLINECALLDICT 104 | 3 1 BLKDROP2 105 | }> 106 | supported_interfaces PROC:<{ 107 | 123515602279859691144772641439386770278 PUSHINT 108 | 209801025412363888721030803524359905849 PUSHINT 109 | 42980537499636128163026532310500881091 PUSHINT 110 | 209474421377847335869795010607481022628 PUSHINT 111 | 86142586315491086060343270784266291122 PUSHINT 112 | }> 113 | lazy_deployment_completed PROC:<{ 114 | c4 PUSH 115 | CTOS 116 | 1 LDI 117 | s0 s1 XCHG 118 | }> 119 | ?fun_120253 PROC:<{ 120 | ?fun_ref_ed6d0b29af79c1a8 INLINECALLDICT 121 | ?fun_ref_44086a5ce86162fe INLINECALLDICT 122 | 3 1 BLKDROP2 123 | }> 124 | get_abi_ipfs PROC:<{ 125 | x{697066733A2F2F516D54714B7A614676364771717A5362525032484B47513870796E6A456E395850436B73634444425069714B636682_} PUSHSLICE 126 | }> 127 | ?fun_ref_0e447c6ae95ddfd1 PROCREF:<{ 128 | NULL 129 | NULL 130 | s2 PUSH 131 | ISNULL 132 | NOT 133 | <{ 134 | DROP2 135 | s0 PUSH 136 | ISNULL 137 | 128 THROWIF 138 | 2 UNTUPLE 139 | s0 s1 XCHG 140 | }> PUSHCONT 141 | <{ 142 | s2 POP 143 | }> PUSHCONT 144 | IFELSE 145 | 1 GETGLOBVAR 146 | 4 UNTUPLE 147 | s1 s3 XCHG 148 | 3 BLKDROP 149 | BALANCE 150 | 0 INDEX 151 | s0 s1 XCHG 152 | SUB 153 | 100000000 PUSHINT 154 | LESS 155 | <{ 156 | 100000000 PUSHINT 157 | 0 PUSHINT 158 | RAWRESERVE 159 | s2 s4 XCHG 160 | 0 PUSHINT 161 | s0 s3 XCHG 162 | s0 s4 XCHG 163 | 130 PUSHINT 164 | s2 s3 XCHG2 165 | ?fun_ref_b93b9862cda1783c INLINECALLDICT 166 | }> PUSHCONT 167 | IFJMP 168 | s2 s4 XCHG 169 | 0 PUSHINT 170 | s0 s3 XCHG 171 | s0 s4 XCHG 172 | 66 PUSHINT 173 | s2 s3 XCHG2 174 | ?fun_ref_b93b9862cda1783c INLINECALLDICT 175 | }> 176 | ?fun_ref_40d98146a47dbe3b PROCREF:<{ 177 | s0 PUSH 178 | }> 179 | ?fun_ref_44086a5ce86162fe PROCREF:<{ 180 | s1 PUSH 181 | }> 182 | ?fun_ref_644ef5250652bdfa PROCREF:<{ 183 | 0 PUSHINT 184 | }> 185 | ?fun_ref_b2f99ae1a1dd4dfb PROCREF:<{ 186 | s2 PUSH 187 | }> 188 | ?fun_ref_b93b9862cda1783c PROCREF:<{ 189 | NEWC 190 | 1 PUSHINT 191 | s0 s1 XCHG 192 | 2 STI 193 | s0 s7 XCHG2 194 | s0 s1 XCHG 195 | 1 STI 196 | 0 PUSHINT 197 | s0 s1 XCHG 198 | 3 STI 199 | s0 s5 XCHG2 200 | s0 PUSH 201 | SBITS 202 | 267 PUSHINT 203 | EQUAL 204 | 136 THROWIFNOT 205 | s0 PUSH 206 | 11 PLDU 207 | s0 PUSH 208 | 1279 PUSHINT 209 | EQUAL 210 | 137 THROWIF 211 | 10 PUSHPOW2 212 | EQUAL 213 | 136 THROWIFNOT 214 | STSLICER 215 | s0 s3 XCHG2 216 | STGRAMS 217 | 0 PUSHINT 218 | s0 s1 XCHG 219 | 105 STI 220 | s3 PUSH 221 | ISNULL 222 | NOT 223 | <{ 224 | -1 PUSHINT 225 | }> PUSHCONT 226 | <{ 227 | s4 PUSH 228 | ISNULL 229 | NOT 230 | }> PUSHCONT 231 | IFELSE 232 | <{ 233 | s3 POP 234 | s3 POP 235 | s0 s1 XCHG 236 | 0 PUSHINT 237 | s0 s1 XCHG 238 | 1 STI 239 | }> PUSHCONT 240 | <{ 241 | -1 PUSHINT 242 | s0 s1 XCHG 243 | 1 STI 244 | NEWC 245 | 0 PUSHINT 246 | s0 s1 XCHG 247 | 1 STI 248 | 0 PUSHINT 249 | s0 s1 XCHG 250 | 1 STI 251 | s4 PUSH 252 | ISNULL 253 | NOT 254 | <{ 255 | -1 PUSHINT 256 | s0 s1 XCHG 257 | 1 STI 258 | s0 s4 XCHG 259 | s0 PUSH 260 | ISNULL 261 | 128 THROWIF 262 | s0 s4 XCHG2 263 | STREF 264 | }> PUSHCONT 265 | <{ 266 | s4 POP 267 | s0 s3 XCHG 268 | 0 PUSHINT 269 | s0 s1 XCHG 270 | 1 STI 271 | }> PUSHCONT 272 | IFELSE 273 | s4 PUSH 274 | ISNULL 275 | NOT 276 | <{ 277 | -1 PUSHINT 278 | s0 s1 XCHG 279 | 1 STI 280 | s0 s4 XCHG 281 | s0 PUSH 282 | ISNULL 283 | 128 THROWIF 284 | s0 s4 XCHG2 285 | STREF 286 | }> PUSHCONT 287 | <{ 288 | s4 POP 289 | s0 s3 XCHG 290 | 0 PUSHINT 291 | s0 s1 XCHG 292 | 1 STI 293 | }> PUSHCONT 294 | IFELSE 295 | 0 PUSHINT 296 | s0 s1 XCHG 297 | 1 STI 298 | s0 s2 XCHG 299 | -1 PUSHINT 300 | s0 s1 XCHG 301 | 1 STI 302 | s0 s2 XCHG 303 | ENDC 304 | ROT 305 | STREF 306 | }> IFREFELSE 307 | s1 PUSH 308 | ISNULL 309 | NOT 310 | <{ 311 | -1 PUSHINT 312 | s0 s1 XCHG 313 | 1 STI 314 | s0 s1 XCHG 315 | s0 PUSH 316 | ISNULL 317 | 128 THROWIF 318 | s0 s1 XCHG 319 | STREF 320 | }> PUSHCONT 321 | <{ 322 | s1 POP 323 | 0 PUSHINT 324 | s0 s1 XCHG 325 | 1 STI 326 | }> PUSHCONT 327 | IFELSE 328 | ENDC 329 | s0 s1 XCHG 330 | SENDRAWMSG 331 | }> 332 | ?fun_ref_cdb3a674bf3744f7 PROCREF:<{ 333 | s0 s1 XCHG 334 | <{ 335 | 32 PUSHINT 336 | SDSKIPFIRST 337 | 0 PUSHINT 338 | s1 PUSH 339 | SBITS 340 | 31 GTINT 341 | <{ 342 | s0 POP 343 | s0 PUSH 344 | 32 PLDU 345 | }> PUSHCONT 346 | IF 347 | 3641354770 PUSHINT 348 | EQUAL 349 | <{ 350 | 32 LDU 351 | s0 s1 XCHG 352 | 3641354770 PUSHINT 353 | EQUAL 354 | 129 THROWIFNOT 355 | NULL 356 | s1 POP 357 | DROP2 358 | 0 PUSHINT 359 | x{000000005061796F7574206661696C6564} PUSHREF 360 | s3 s1 PUXC 361 | 0 PUSHINT 362 | NULL 363 | ?fun_ref_0e447c6ae95ddfd1 INLINECALLDICT 364 | -1 PUSHINT 365 | }> PUSHCONT 366 | IFJMP 367 | s0 POP 368 | -1 PUSHINT 369 | }> PUSHCONT 370 | IFJMP 371 | 0 PUSHINT 372 | s1 PUSH 373 | SBITS 374 | 31 GTINT 375 | <{ 376 | s0 POP 377 | s0 PUSH 378 | 32 PLDU 379 | }> PUSHCONT 380 | IF 381 | s0 PUSH 382 | 1620127519 PUSHINT 383 | EQUAL 384 | <{ 385 | s0 POP 386 | 32 LDU 387 | s0 s1 XCHG 388 | 1620127519 PUSHINT 389 | EQUAL 390 | 129 THROWIFNOT 391 | LDMSGADDR 392 | s0 s1 XCHG 393 | s0 PUSH 394 | SBITS 395 | 267 PUSHINT 396 | EQUAL 397 | 136 THROWIFNOT 398 | s0 PUSH 399 | 11 PLDU 400 | s0 PUSH 401 | 1279 PUSHINT 402 | EQUAL 403 | 137 THROWIF 404 | 10 PUSHPOW2 405 | EQUAL 406 | 136 THROWIFNOT 407 | s0 s1 XCHG 408 | LDGRAMS 409 | ROTREV 410 | 1 2 BLKDROP2 411 | s1 POP 412 | 1 GETGLOBVAR 413 | 4 UNTUPLE 414 | s2 s3 XCHG 415 | 3 BLKDROP 416 | 4429 PUSHINT 417 | s4 s1 PUSH2 418 | SDEQ 419 | THROWANYIFNOT 420 | s2 PUSH 421 | NOT 422 | <{ 423 | s1 s4 XCPU 424 | s0 s1 XCHG 425 | NEWC 426 | ROTREV 427 | 633161870 PUSHINT 428 | s0 s3 XCHG2 429 | 32 STU 430 | s0 s1 XCHG 431 | s0 PUSH 432 | SBITS 433 | 267 PUSHINT 434 | EQUAL 435 | 136 THROWIFNOT 436 | s0 PUSH 437 | 11 PLDU 438 | s0 PUSH 439 | 1279 PUSHINT 440 | EQUAL 441 | 137 THROWIF 442 | 10 PUSHPOW2 443 | EQUAL 444 | 136 THROWIFNOT 445 | STSLICER 446 | s0 s1 XCHG 447 | STGRAMS 448 | ENDC 449 | 0 PUSHINT 450 | NULL 451 | ?fun_ref_0e447c6ae95ddfd1 INLINECALLDICT 452 | }> PUSHCONT 453 | <{ 454 | s2 POP 455 | -1 PUSHINT 456 | s1 s4 XCPU 457 | s0 s1 XCHG 458 | NEWC 459 | ROTREV 460 | 3641354770 PUSHINT 461 | s0 s3 XCHG2 462 | 32 STU 463 | s0 s1 XCHG 464 | s0 PUSH 465 | SBITS 466 | 267 PUSHINT 467 | EQUAL 468 | 136 THROWIFNOT 469 | s0 PUSH 470 | 11 PLDU 471 | s0 PUSH 472 | 1279 PUSHINT 473 | EQUAL 474 | 137 THROWIF 475 | 10 PUSHPOW2 476 | EQUAL 477 | 136 THROWIFNOT 478 | STSLICER 479 | s0 s1 XCHG 480 | STGRAMS 481 | ENDC 482 | s1 s2 XCHG 483 | -1 PUSHINT 484 | NULL 485 | ?fun_ref_0e447c6ae95ddfd1 INLINECALLDICT 486 | }> IFREFELSE 487 | -1 PUSHINT 488 | }> IFJMPREF 489 | 2490013878 PUSHINT 490 | EQUAL 491 | <{ 492 | 32 LDU 493 | s0 s1 XCHG 494 | 2490013878 PUSHINT 495 | EQUAL 496 | 129 THROWIFNOT 497 | 64 LDU 498 | s0 s1 XCHG 499 | s1 POP 500 | NEWC 501 | s0 s1 XCHG 502 | 2952335191 PUSHINT 503 | ROT 504 | 32 STU 505 | 64 STU 506 | ENDC 507 | 2 GETGLOBVAR 508 | s0 s1 XCHG 509 | 0 PUSHINT 510 | NULL 511 | ?fun_ref_0e447c6ae95ddfd1 INLINECALLDICT 512 | -1 PUSHINT 513 | }> PUSHCONT 514 | IFJMP 515 | s0 POP 516 | 0 PUSHINT 517 | }> 518 | ?fun_ref_ed6d0b29af79c1a8 PROCREF:<{ 519 | c4 PUSH 520 | CTOS 521 | LDREF 522 | s0 s1 XCHG 523 | 3 SETGLOBVAR 524 | 1 LDI 525 | s0 s1 XCHG 526 | <{ 527 | LDMSGADDR 528 | s0 s1 XCHG 529 | s0 PUSH 530 | SBITS 531 | 267 PUSHINT 532 | EQUAL 533 | 136 THROWIFNOT 534 | s0 PUSH 535 | 11 PLDU 536 | s0 PUSH 537 | 1279 PUSHINT 538 | EQUAL 539 | 137 THROWIF 540 | 10 PUSHPOW2 541 | EQUAL 542 | 136 THROWIFNOT 543 | s0 s1 XCHG 544 | LDMSGADDR 545 | s0 s1 XCHG 546 | s0 PUSH 547 | SBITS 548 | 267 PUSHINT 549 | EQUAL 550 | 136 THROWIFNOT 551 | s0 PUSH 552 | 11 PLDU 553 | s0 PUSH 554 | 1279 PUSHINT 555 | EQUAL 556 | 137 THROWIF 557 | 10 PUSHPOW2 558 | EQUAL 559 | 136 THROWIFNOT 560 | s0 s1 XCHG 561 | 1 LDI 562 | 3 1 BLKSWAP 563 | 1 3 BLKDROP2 564 | }> PUSHCONT 565 | IFJMP 566 | MYADDR 567 | 11 PLDU 568 | 10 PUSHPOW2 569 | EQUAL 570 | 137 THROWIFNOT 571 | LDMSGADDR 572 | s0 s1 XCHG 573 | s0 PUSH 574 | SBITS 575 | 267 PUSHINT 576 | EQUAL 577 | 136 THROWIFNOT 578 | s0 PUSH 579 | 11 PLDU 580 | s0 PUSH 581 | 1279 PUSHINT 582 | EQUAL 583 | 137 THROWIF 584 | 10 PUSHPOW2 585 | EQUAL 586 | 136 THROWIFNOT 587 | s0 s1 XCHG 588 | LDMSGADDR 589 | s0 s1 XCHG 590 | s0 PUSH 591 | SBITS 592 | 267 PUSHINT 593 | EQUAL 594 | 136 THROWIFNOT 595 | s0 PUSH 596 | 11 PLDU 597 | s0 PUSH 598 | 1279 PUSHINT 599 | EQUAL 600 | 137 THROWIF 601 | 10 PUSHPOW2 602 | EQUAL 603 | 136 THROWIFNOT 604 | s1 s2 XCHG 605 | s0 s2 XCHG 606 | ENDS 607 | s0 s1 XCHG 608 | ?fun_ref_644ef5250652bdfa INLINECALLDICT 609 | }> 610 | }END>c -------------------------------------------------------------------------------- /sources/output/payouts_PayoutBeacon.constants.fc: -------------------------------------------------------------------------------- 1 | ;; Comment "Payout failed" 2 | cell __gen_cell_comment_78b0aaadc117be03d1b8403b36288b7cdcb49676035c923368c2baf21da6ea04() asm "B{b5ee9c72410101010013000022000000005061796f7574206661696c6564ad44bad5} B>boc PUSHREF"; -------------------------------------------------------------------------------- /sources/output/payouts_PayoutBeacon.headers.fc: -------------------------------------------------------------------------------- 1 | ;; 2 | ;; Header files for PayoutBeacon 3 | ;; NOTE: declarations are sorted for optimal order 4 | ;; 5 | 6 | ;; __tact_verify_address 7 | slice __tact_verify_address(slice address) inline; 8 | 9 | ;; __tact_load_address 10 | (slice, slice) __tact_load_address(slice cs) inline; 11 | 12 | ;; __tact_store_address 13 | builder __tact_store_address(builder b, slice address) inline; 14 | 15 | ;; __tact_my_balance 16 | int __tact_my_balance() inline; 17 | 18 | ;; __tact_not_null 19 | forall X -> X __tact_not_null(X x) inline; 20 | 21 | ;; __tact_context_get 22 | (int, slice, int, slice) __tact_context_get() inline; 23 | 24 | ;; __tact_context_get_sender 25 | slice __tact_context_get_sender() inline; 26 | 27 | ;; __tact_store_bool 28 | builder __tact_store_bool(builder b, int v) inline; 29 | 30 | ;; __tact_slice_eq_bits 31 | int __tact_slice_eq_bits(slice a, slice b) inline; 32 | 33 | ;; $Deploy$_load 34 | (slice, ((int))) $Deploy$_load(slice sc_0) inline; 35 | 36 | ;; $DeployOk$_store 37 | builder $DeployOk$_store(builder build_0, (int) v) inline; 38 | 39 | ;; $DeployOk$_store_cell 40 | cell $DeployOk$_store_cell((int) v) inline; 41 | 42 | ;; $TryPayout$_load 43 | (slice, ((slice, int))) $TryPayout$_load(slice sc_0) inline; 44 | 45 | ;; $PayoutOk$_store 46 | builder $PayoutOk$_store(builder build_0, (slice, int) v) inline; 47 | 48 | ;; $PayoutOk$_store_cell 49 | cell $PayoutOk$_store_cell((slice, int) v) inline; 50 | 51 | ;; $PayoutOk$_load_bounced 52 | (slice, (tuple)) $PayoutOk$_load_bounced(slice sc_0) inline; 53 | 54 | ;; $PayoutFailed$_store 55 | builder $PayoutFailed$_store(builder build_0, (slice, int) v) inline; 56 | 57 | ;; $PayoutFailed$_store_cell 58 | cell $PayoutFailed$_store_cell((slice, int) v) inline; 59 | 60 | ;; $PayoutBeacon$_store 61 | builder $PayoutBeacon$_store(builder build_0, (slice, slice, int) v) inline; 62 | 63 | ;; $PayoutBeacon$_load 64 | (slice, ((slice, slice, int))) $PayoutBeacon$_load(slice sc_0) inline; 65 | 66 | ;; $StateInit$_not_null 67 | ((cell, cell)) $StateInit$_not_null(tuple v) inline; 68 | 69 | ;; $PayoutBeacon$init$_load 70 | (slice, ((slice, slice))) $PayoutBeacon$init$_load(slice sc_0) inline; 71 | 72 | ;; $PayoutBeacon$_contract_init 73 | (slice, slice, int) $PayoutBeacon$_contract_init(slice $owner, slice $master) impure inline_ref; 74 | 75 | ;; $PayoutBeacon$_contract_load 76 | (slice, slice, int) $PayoutBeacon$_contract_load() impure inline_ref; 77 | 78 | ;; $PayoutBeacon$_contract_store 79 | () $PayoutBeacon$_contract_store((slice, slice, int) v) impure inline; 80 | 81 | ;; $global_send 82 | () $global_send((int, slice, int, int, cell, cell, cell) $params) impure inline_ref; 83 | 84 | ;; $PayoutBeacon$_fun_master 85 | ((slice, slice, int), slice) $PayoutBeacon$_fun_master((slice, slice, int) $self) impure inline_ref; 86 | 87 | ;; $PayoutBeacon$_fun_completed 88 | ((slice, slice, int), int) $PayoutBeacon$_fun_completed((slice, slice, int) $self) impure inline_ref; 89 | 90 | ;; $SendParameters$_constructor_bounce_to_value_mode_body_code_data 91 | ((int, slice, int, int, cell, cell, cell)) $SendParameters$_constructor_bounce_to_value_mode_body_code_data(int bounce, slice to, int value, int mode, cell body, cell code, cell data) inline; 92 | 93 | ;; $PayoutBeacon$_fun_forward 94 | ((slice, slice, int), ()) $PayoutBeacon$_fun_forward((slice, slice, int) $self, slice $to, cell $body, int $bounce, tuple $init) impure inline_ref; 95 | 96 | ;; $PayoutBeacon$_fun_notify 97 | ((slice, slice, int), ()) $PayoutBeacon$_fun_notify((slice, slice, int) $self, cell $body) impure inline; 98 | 99 | ;; $PayoutBeacon$_fun_owner 100 | ((slice, slice, int), slice) $PayoutBeacon$_fun_owner((slice, slice, int) $self) impure inline_ref; 101 | 102 | ;; $PayoutOk$_constructor_value_address 103 | ((slice, int)) $PayoutOk$_constructor_value_address(int value, slice address) inline; 104 | 105 | ;; $PayoutFailed$_constructor_value_address 106 | ((slice, int)) $PayoutFailed$_constructor_value_address(int value, slice address) inline; 107 | 108 | ;; $DeployOk$_constructor_queryId 109 | ((int)) $DeployOk$_constructor_queryId(int queryId) inline; 110 | -------------------------------------------------------------------------------- /sources/output/payouts_PayoutBeacon.md: -------------------------------------------------------------------------------- 1 | # TACT Compilation Report 2 | Contract: PayoutBeacon 3 | BOC Size: 1204 bytes 4 | 5 | # Types 6 | Total Types: 13 7 | 8 | ## StateInit 9 | TLB: `_ code:^cell data:^cell = StateInit` 10 | Signature: `StateInit{code:^cell,data:^cell}` 11 | 12 | ## Context 13 | TLB: `_ bounced:bool sender:address value:int257 raw:^slice = Context` 14 | Signature: `Context{bounced:bool,sender:address,value:int257,raw:^slice}` 15 | 16 | ## SendParameters 17 | TLB: `_ bounce:bool to:address value:int257 mode:int257 body:Maybe ^cell code:Maybe ^cell data:Maybe ^cell = SendParameters` 18 | Signature: `SendParameters{bounce:bool,to:address,value:int257,mode:int257,body:Maybe ^cell,code:Maybe ^cell,data:Maybe ^cell}` 19 | 20 | ## Deploy 21 | TLB: `deploy#946a98b6 queryId:uint64 = Deploy` 22 | Signature: `Deploy{queryId:uint64}` 23 | 24 | ## DeployOk 25 | TLB: `deploy_ok#aff90f57 queryId:uint64 = DeployOk` 26 | Signature: `DeployOk{queryId:uint64}` 27 | 28 | ## FactoryDeploy 29 | TLB: `factory_deploy#6d0ff13b queryId:uint64 cashback:address = FactoryDeploy` 30 | Signature: `FactoryDeploy{queryId:uint64,cashback:address}` 31 | 32 | ## ChangeOwner 33 | TLB: `change_owner#819dbe99 queryId:uint64 newOwner:address = ChangeOwner` 34 | Signature: `ChangeOwner{queryId:uint64,newOwner:address}` 35 | 36 | ## ChangeOwnerOk 37 | TLB: `change_owner_ok#327b2b4a queryId:uint64 newOwner:address = ChangeOwnerOk` 38 | Signature: `ChangeOwnerOk{queryId:uint64,newOwner:address}` 39 | 40 | ## TryPayout 41 | TLB: `try_payout#60912f1f address:address value:coins = TryPayout` 42 | Signature: `TryPayout{address:address,value:coins}` 43 | 44 | ## PayoutOk 45 | TLB: `payout_ok#d90aaa12 address:address value:coins = PayoutOk` 46 | Signature: `PayoutOk{address:address,value:coins}` 47 | 48 | ## PayoutFailed 49 | TLB: `payout_failed#25bd488e address:address value:coins = PayoutFailed` 50 | Signature: `PayoutFailed{address:address,value:coins}` 51 | 52 | ## BurnParameters 53 | TLB: `_ startAt:uint32 endAt:uint32 = BurnParameters` 54 | Signature: `BurnParameters{startAt:uint32,endAt:uint32}` 55 | 56 | ## EventPayoutCompleted 57 | TLB: `event_payout_completed#3af7b4d6 address:address value:coins = EventPayoutCompleted` 58 | Signature: `EventPayoutCompleted{address:address,value:coins}` 59 | 60 | # Get Methods 61 | Total Get Methods: 3 62 | 63 | ## master 64 | 65 | ## completed 66 | 67 | ## owner 68 | 69 | # Error Codes 70 | 2: Stack undeflow 71 | 3: Stack overflow 72 | 4: Integer overflow 73 | 5: Integer out of expected range 74 | 6: Invalid opcode 75 | 7: Type check error 76 | 8: Cell overflow 77 | 9: Cell underflow 78 | 10: Dictionary error 79 | 13: Out of gas error 80 | 32: Method ID not found 81 | 34: Action is invalid or not supported 82 | 37: Not enough TON 83 | 38: Not enough extra-currencies 84 | 128: Null reference exception 85 | 129: Invalid serialization prefix 86 | 130: Invalid incoming message 87 | 131: Constraints error 88 | 132: Access denied 89 | 133: Contract stopped 90 | 134: Invalid argument 91 | 135: Code of a contract was not found 92 | 136: Invalid address 93 | 137: Masterchain support is not enabled for this contract 94 | 4429: Invalid sender 95 | 12724: Invalid burn parameters 96 | 16059: Invalid value 97 | 19204: Insufficient balance on master 98 | 40368: Contract stopped 99 | 46762: Invalid string 100 | 48401: Invalid signature 101 | 53296: Contract not stopped 102 | 57826: Check withdraw min value -------------------------------------------------------------------------------- /sources/output/payouts_PayoutBeacon.pkg: -------------------------------------------------------------------------------- 1 | {"name":"PayoutBeacon","code":"te6ccgECHgEABKgAART/APSkE/S88sgLAQIBYgIDA3rQAdDTAwFxsKMB+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiFRQUwNvBPhhAvhi2zxVEts88uCCGgQFAgEgDg8EsAGPNoAg1yFwIddJwh+VMCDXCx/eghDZCqoSuo8Z0x8BghDZCqoSuvLggW0xW3CIUjBwbds8f+Awf+BwIddJwh+VMCDXCx/eIIIQYJEvH7rjAoIQlGqYtroGCwcIAJzI+EMBzH8BygBVIFog10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIzxZYINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiM8WygDJ7VQAIgAAAABQYXlvdXQgZmFpbGVkAWYw0x8BghBgkS8fuvLggfpAASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IgB+gBZbBIJAViOp9MfAYIQlGqYtrry4IHTPwExyAGCEK/5D1dYyx/LP8n4QgFwbds8f+AwcAsCnjH4QW8kECNfA4ERTVNBxwXy9CKzjrZRFAHIWYIQJb1IjlADyx8BINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiM8WAfoCyXBt2zzjDX8LCgFyMn9RFAHIWYIQ2QqqElADyx8BINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiM8WAfoCyRJ/bds8CwKSbW0ibrOZWyBu8tCAbyIBkTLi+EFvJBNfA/gnbxABoYIQBfXhALmOlYIQBfXhAHD7AhAkcAMEgQCCUCPbPOAQJHADBIBCUCPbPAwMAcrIcQHKAVAHAcoAcAHKAlAFINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiM8WUAP6AnABymgjbrORf5MkbrPilzMzAXABygDjDSFus5x/AcoAASBu8tCAAcyVMXABygDiyQH7AA0AmH8BygDIcAHKAHABygAkbrOdfwHKAAQgbvLQgFAEzJY0A3ABygDiJG6znX8BygAEIG7y0IBQBMyWNANwAcoA4nABygACfwHKAALJWMwCASAQEQIBIBQVAhG7bC2zzbPGwxgaEgIRuFHds82zxsMYGhMAAiAAAiIAubu9GCcFzsPV0srnsehOw51kqFG2aCcJ3WNS0rZHyzItOvLf3xYjmCcCBVwBuAZ2OUzlg6rkclssOCcJ2XTlqzTstzOg6WbZRm6KSCcEDOdWnnFfnSULAdYW4mR7KAIBSBYXABGwr7tRNDSAAGACASAYGQIRrt7tnm2eNhjAGhsAdazdxoatLgzOZ0Xl6i2qjilvTCjOxsjuLi9KbEpKBkkJaOonDg8tzUitxysKCG1ubGiIiEoNLilsbNBAAbztRNDUAfhj0gABjkb6QAEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIAfpAASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IgB0gBVIGwT4Pgo1wsKgwm68uCJHAACIQGK+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiAH6QAEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIEgLRAds8HQACcA==","abi":"{\"name\":\"PayoutBeacon\",\"types\":[{\"name\":\"StateInit\",\"header\":null,\"fields\":[{\"name\":\"code\",\"type\":{\"kind\":\"simple\",\"type\":\"cell\",\"optional\":false}},{\"name\":\"data\",\"type\":{\"kind\":\"simple\",\"type\":\"cell\",\"optional\":false}}]},{\"name\":\"Context\",\"header\":null,\"fields\":[{\"name\":\"bounced\",\"type\":{\"kind\":\"simple\",\"type\":\"bool\",\"optional\":false}},{\"name\":\"sender\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"value\",\"type\":{\"kind\":\"simple\",\"type\":\"int\",\"optional\":false,\"format\":257}},{\"name\":\"raw\",\"type\":{\"kind\":\"simple\",\"type\":\"slice\",\"optional\":false}}]},{\"name\":\"SendParameters\",\"header\":null,\"fields\":[{\"name\":\"bounce\",\"type\":{\"kind\":\"simple\",\"type\":\"bool\",\"optional\":false}},{\"name\":\"to\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"value\",\"type\":{\"kind\":\"simple\",\"type\":\"int\",\"optional\":false,\"format\":257}},{\"name\":\"mode\",\"type\":{\"kind\":\"simple\",\"type\":\"int\",\"optional\":false,\"format\":257}},{\"name\":\"body\",\"type\":{\"kind\":\"simple\",\"type\":\"cell\",\"optional\":true}},{\"name\":\"code\",\"type\":{\"kind\":\"simple\",\"type\":\"cell\",\"optional\":true}},{\"name\":\"data\",\"type\":{\"kind\":\"simple\",\"type\":\"cell\",\"optional\":true}}]},{\"name\":\"Deploy\",\"header\":2490013878,\"fields\":[{\"name\":\"queryId\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":64}}]},{\"name\":\"DeployOk\",\"header\":2952335191,\"fields\":[{\"name\":\"queryId\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":64}}]},{\"name\":\"FactoryDeploy\",\"header\":1829761339,\"fields\":[{\"name\":\"queryId\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":64}},{\"name\":\"cashback\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}}]},{\"name\":\"ChangeOwner\",\"header\":2174598809,\"fields\":[{\"name\":\"queryId\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":64}},{\"name\":\"newOwner\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}}]},{\"name\":\"ChangeOwnerOk\",\"header\":846932810,\"fields\":[{\"name\":\"queryId\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":64}},{\"name\":\"newOwner\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}}]},{\"name\":\"TryPayout\",\"header\":1620127519,\"fields\":[{\"name\":\"address\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"value\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":\"coins\"}}]},{\"name\":\"PayoutOk\",\"header\":3641354770,\"fields\":[{\"name\":\"address\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"value\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":\"coins\"}}]},{\"name\":\"PayoutFailed\",\"header\":633161870,\"fields\":[{\"name\":\"address\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"value\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":\"coins\"}}]},{\"name\":\"BurnParameters\",\"header\":null,\"fields\":[{\"name\":\"startAt\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":32}},{\"name\":\"endAt\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":32}}]},{\"name\":\"EventPayoutCompleted\",\"header\":989312214,\"fields\":[{\"name\":\"address\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"value\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":\"coins\"}}]}],\"receivers\":[{\"receiver\":\"internal\",\"message\":{\"kind\":\"typed\",\"type\":\"TryPayout\"}},{\"receiver\":\"internal\",\"message\":{\"kind\":\"typed\",\"type\":\"Deploy\"}}],\"getters\":[{\"name\":\"master\",\"arguments\":[],\"returnType\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"completed\",\"arguments\":[],\"returnType\":{\"kind\":\"simple\",\"type\":\"bool\",\"optional\":false}},{\"name\":\"owner\",\"arguments\":[],\"returnType\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}}],\"errors\":{\"2\":{\"message\":\"Stack undeflow\"},\"3\":{\"message\":\"Stack overflow\"},\"4\":{\"message\":\"Integer overflow\"},\"5\":{\"message\":\"Integer out of expected range\"},\"6\":{\"message\":\"Invalid opcode\"},\"7\":{\"message\":\"Type check error\"},\"8\":{\"message\":\"Cell overflow\"},\"9\":{\"message\":\"Cell underflow\"},\"10\":{\"message\":\"Dictionary error\"},\"13\":{\"message\":\"Out of gas error\"},\"32\":{\"message\":\"Method ID not found\"},\"34\":{\"message\":\"Action is invalid or not supported\"},\"37\":{\"message\":\"Not enough TON\"},\"38\":{\"message\":\"Not enough extra-currencies\"},\"128\":{\"message\":\"Null reference exception\"},\"129\":{\"message\":\"Invalid serialization prefix\"},\"130\":{\"message\":\"Invalid incoming message\"},\"131\":{\"message\":\"Constraints error\"},\"132\":{\"message\":\"Access denied\"},\"133\":{\"message\":\"Contract stopped\"},\"134\":{\"message\":\"Invalid argument\"},\"135\":{\"message\":\"Code of a contract was not found\"},\"136\":{\"message\":\"Invalid address\"},\"137\":{\"message\":\"Masterchain support is not enabled for this contract\"},\"4429\":{\"message\":\"Invalid sender\"},\"12724\":{\"message\":\"Invalid burn parameters\"},\"16059\":{\"message\":\"Invalid value\"},\"19204\":{\"message\":\"Insufficient balance on master\"},\"40368\":{\"message\":\"Contract stopped\"},\"46762\":{\"message\":\"Invalid string\"},\"48401\":{\"message\":\"Invalid signature\"},\"53296\":{\"message\":\"Contract not stopped\"},\"57826\":{\"message\":\"Check withdraw min value\"}},\"interfaces\":[\"org.ton.introspection.v0\",\"org.ton.abi.ipfs.v0\",\"org.ton.deploy.lazy.v0\",\"org.ton.chain.workchain.v0\",\"org.ton.ownable\"]}","init":{"kind":"direct","args":[{"name":"owner","type":{"kind":"simple","type":"address","optional":false}},{"name":"master","type":{"kind":"simple","type":"address","optional":false}}],"prefix":{"bits":1,"value":0},"deployment":{"kind":"system-cell","system":"te6cckECIAEABLIAAQHAAQEFoLfPAgEU/wD0pBP0vPLICwMCAWISBAIBIA0FAgEgDAYCAUgLBwIBIAkIAHWs3caGrS4MzmdF5eotqo4pb0wozsbI7i4vSmxKSgZJCWjqJw4PLc1IrccrCghtbmxoiIhKDS4pbGzQQAIRrt7tnm2eNhjAHQoAAiEAEbCvu1E0NIAAYAC5u70YJwXOw9XSyuex6E7DnWSoUbZoJwndY1LStkfLMi068t/fFiOYJwIFXAG4BnY5TOWDquRyWyw4JwnZdOWrNOy3M6DpZtlGbopIJwQM51aecV+dJQsB1hbiZHsoAgEgEA4CEbhR3bPNs8bDGB0PAAIiAhG7bC2zzbPGwxgdEQACIAN60AHQ0wMBcbCjAfpAASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IhUUFMDbwT4YQL4Yts8VRLbPPLggh0UEwCcyPhDAcx/AcoAVSBaINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiM8WWCDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFsoAye1UBLABjzaAINchcCHXScIflTAg1wsf3oIQ2QqqErqPGdMfAYIQ2QqqErry4IFtMVtwiFIwcG3bPH/gMH/gcCHXScIflTAg1wsf3iCCEGCRLx+64wKCEJRqmLa6HBkWFQFYjqfTHwGCEJRqmLa68uCB0z8BMcgBghCv+Q9XWMsfyz/J+EIBcG3bPH/gMHAZAWYw0x8BghBgkS8fuvLggfpAASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IgB+gBZbBIXAp4x+EFvJBAjXwOBEU1TQccF8vQis462URQByFmCECW9SI5QA8sfASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFgH6Aslwbds84w1/GRgBcjJ/URQByFmCENkKqhJQA8sfASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFgH6AskSf23bPBkCkm1tIm6zmVsgbvLQgG8iAZEy4vhBbyQTXwP4J28QAaGCEAX14QC5jpWCEAX14QBw+wIQJHADBIEAglAj2zzgECRwAwSAQlAj2zwaGgHKyHEBygFQBwHKAHABygJQBSDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFlAD+gJwAcpoI26zkX+TJG6z4pczMwFwAcoA4w0hbrOcfwHKAAEgbvLQgAHMlTFwAcoA4skB+wAbAJh/AcoAyHABygBwAcoAJG6znX8BygAEIG7y0IBQBMyWNANwAcoA4iRus51/AcoABCBu8tCAUATMljQDcAHKAOJwAcoAAn8BygACyVjMACIAAAAAUGF5b3V0IGZhaWxlZAG87UTQ1AH4Y9IAAY5G+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiAH6QAEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIAdIAVSBsE+D4KNcLCoMJuvLgiR4BivpAASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IgB+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiBIC0QHbPB8AAnBCRWvx"}},"sources":{"sources/contract.tact":"aW1wb3J0ICJAc3RkbGliL2RlcGxveSI7CmltcG9ydCAiQHN0ZGxpYi9vd25hYmxlIjsKaW1wb3J0ICJAc3RkbGliL3N0b3BwYWJsZSI7CgptZXNzYWdlIFRyeVBheW91dCB7CiAgICBhZGRyZXNzOiBBZGRyZXNzOwogICAgdmFsdWU6IEludCBhcyBjb2luczsKfQoKbWVzc2FnZSBQYXlvdXRPayB7CiAgICBhZGRyZXNzOiBBZGRyZXNzOwogICAgdmFsdWU6IEludCBhcyBjb2luczsKfQoKbWVzc2FnZSBQYXlvdXRGYWlsZWQgewogICAgYWRkcmVzczogQWRkcmVzczsKICAgIHZhbHVlOiBJbnQgYXMgY29pbnM7Cn0KCnN0cnVjdCBCdXJuUGFyYW1ldGVycyB7CiAgICBzdGFydEF0OiBJbnQgYXMgdWludDMyOwogICAgZW5kQXQ6IEludCBhcyB1aW50MzI7Cn0KCm1lc3NhZ2UgRXZlbnRQYXlvdXRDb21wbGV0ZWQgewogICAgYWRkcmVzczogQWRkcmVzczsKICAgIHZhbHVlOiBJbnQgYXMgY29pbnM7Cn0KCmNvbnRyYWN0IFBheW91dEJlYWNvbiB3aXRoIE93bmFibGUsIERlcGxveWFibGUgewogICAgb3ZlcnJpZGUgY29uc3Qgc3RvcmFnZVJlc2VydmU6IEludCA9IHRvbigiMC4xIik7CgogICAgb3duZXI6IEFkZHJlc3M7CiAgICBtYXN0ZXI6IEFkZHJlc3M7CiAgICBjb21wbGV0ZWQ6IEJvb2w7CgogICAgaW5pdChvd25lcjogQWRkcmVzcywgbWFzdGVyOiBBZGRyZXNzKSB7CiAgICAgICAgc2VsZi5vd25lciA9IG93bmVyOwogICAgICAgIHNlbGYubWFzdGVyID0gbWFzdGVyOwogICAgICAgIHNlbGYuY29tcGxldGVkID0gZmFsc2U7CiAgICB9CgogICAgcmVjZWl2ZShtc2c6IFRyeVBheW91dCkgewoKICAgICAgICAvLyBDaGVjayBjb250ZXh0CiAgICAgICAgbGV0IGN0eDogQ29udGV4dCA9IGNvbnRleHQoKTsKICAgICAgICByZXF1aXJlKGN0eC5zZW5kZXIgPT0gc2VsZi5tYXN0ZXIsICJJbnZhbGlkIHNlbmRlciIpOwoKICAgICAgICAvLyBTZW5kIHJlc3BvbnNlCiAgICAgICAgaWYgKCFzZWxmLmNvbXBsZXRlZCkgewogICAgICAgICAgICBzZWxmLmNvbXBsZXRlZCA9IHRydWU7CiAgICAgICAgICAgIHNlbGYuZm9yd2FyZChjdHguc2VuZGVyLCBQYXlvdXRPa3sgdmFsdWU6IG1zZy52YWx1ZSwgYWRkcmVzczogc2VsZi5vd25lciB9LnRvQ2VsbCgpLCB0cnVlLCBudWxsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWxmLmZvcndhcmQoY3R4LnNlbmRlciwgUGF5b3V0RmFpbGVkeyB2YWx1ZTogbXNnLnZhbHVlLCBhZGRyZXNzOiBzZWxmLm93bmVyIH0udG9DZWxsKCksIGZhbHNlLCBudWxsKTsKICAgICAgICB9CiAgICB9CgogICAgYm91bmNlZChtc2c6IGJvdW5jZWQ8UGF5b3V0T2s+KSB7CgogICAgICAgIC8vIFJlc2V0IGNvbXBsZXRlZCBmbGFnIGlzIG91ciBtZXNzYWdlIGJvdW5jZWQKICAgICAgICBzZWxmLmNvbXBsZXRlZCA9IGZhbHNlOwoKICAgICAgICAvLyBTZW5kIG5vdGlmaWNhdGlvbgogICAgICAgIHNlbGYuZm9yd2FyZChzZWxmLm93bmVyLCAiUGF5b3V0IGZhaWxlZCIuYXNDb21tZW50KCksIGZhbHNlLCBudWxsKTsKICAgIH0KCiAgICBnZXQgZnVuIG1hc3RlcigpOiBBZGRyZXNzIHsKICAgICAgICByZXR1cm4gc2VsZi5tYXN0ZXI7CiAgICB9CgogICAgZ2V0IGZ1biBjb21wbGV0ZWQoKTogQm9vbCB7CiAgICAgICAgcmV0dXJuIHNlbGYuY29tcGxldGVkOwogICAgfQp9Cgpjb250cmFjdCBQYXlvdXRzTWFzdGVyIHdpdGggRGVwbG95YWJsZSwgT3duYWJsZSwgUmVzdW1hYmxlIHsKICAgIG92ZXJyaWRlIGNvbnN0IHN0b3JhZ2VSZXNlcnZlOiBJbnQgPSB0b24oIjAuMSIpOwoKICAgIG93bmVyOiBBZGRyZXNzOwogICAgcHVibGljS2V5OiBJbnQgYXMgdWludDI1NjsKICAgIHN0b3BwZWQ6IEJvb2w7CiAgICBidXJuOiBCdXJuUGFyYW1ldGVycz87CgogICAgaW5pdChvd25lcjogQWRkcmVzcywgcHVibGljS2V5OiBJbnQsIGJ1cm46IEJ1cm5QYXJhbWV0ZXJzPykgewogICAgICAgIHNlbGYub3duZXIgPSBvd25lcjsKICAgICAgICBzZWxmLnB1YmxpY0tleSA9IHB1YmxpY0tleTsKICAgICAgICBzZWxmLnN0b3BwZWQgPSBmYWxzZTsKICAgICAgICBzZWxmLmJ1cm4gPSBidXJuOwogICAgICAgIGlmIChidXJuICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGI6IEJ1cm5QYXJhbWV0ZXJzID0gYnVybiEhOwogICAgICAgICAgICByZXF1aXJlKGIuc3RhcnRBdCA8IGIuZW5kQXQsICJJbnZhbGlkIGJ1cm4gcGFyYW1ldGVycyIpOwogICAgICAgIH0KICAgIH0KCiAgICAvLwogICAgLy8gUGF5b3V0IG9wZXJhdGlvbnMKICAgIC8vCgogICAgcmVjZWl2ZSh3aXRoZHJhdzogU3RyaW5nKSB7CgogICAgICAgIC8vIE5vcm1hbGl6ZQogICAgICAgIHdpdGhkcmF3ID0gbm9ybWFsaXplS2V5KHdpdGhkcmF3KTsKCiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgY29udHJhY3QgaXMgbm90IHN0b3BwZWQKICAgICAgICBzZWxmLnJlcXVpcmVOb3RTdG9wcGVkKCk7CgogICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBjb250ZXh0CiAgICAgICAgbGV0IGN0eDogQ29udGV4dCA9IGNvbnRleHQoKTsKICAgICAgICByZXF1aXJlKGN0eC52YWx1ZSA+PSB0b24oIjEuMCIpLCAiSW52YWxpZCB2YWx1ZSIpOwoKICAgICAgICAvLyBQYXJzZSB0aGUgd2l0aGRyYXcgbWVzc2FnZQogICAgICAgIGxldCBtc2c6IFNsaWNlID0gd2l0aGRyYXcuZnJvbUJhc2U2NCgpOwogICAgICAgIGxldCBzaWduYXR1cmU6IFNsaWNlID0gbXNnLmxvYWRCaXRzKDUxMik7CiAgICAgICAgbGV0IHZhbHVlOiBJbnQgPSBtc2cubG9hZENvaW5zKCk7CgogICAgICAgIC8vIFZlcmlmeSB0aGUgc2lnbmF0dXJlCiAgICAgICAgbGV0IHNpZ0NlbGw6IENlbGwgPSBiZWdpbkNlbGwoKQogICAgICAgICAgICAuc3RvcmVBZGRyZXNzKGN0eC5zZW5kZXIpCiAgICAgICAgICAgIC5zdG9yZUNvaW5zKHZhbHVlKQogICAgICAgICAgICAuZW5kQ2VsbCgpOwogICAgICAgIGxldCBoYXNoOiBJbnQgPSBzaWdDZWxsLmhhc2goKTsKICAgICAgICByZXF1aXJlKGNoZWNrU2lnbmF0dXJlKGhhc2gsIHNpZ25hdHVyZSwgc2VsZi5wdWJsaWNLZXkpLCAiSW52YWxpZCBzaWduYXR1cmUiKTsKCiAgICAgICAgLy8gQWRqdXN0IHZhbHVlIGlmIGJ1cm4gaXMgc2V0CiAgICAgICAgaWYgKHNlbGYuYnVybiAhPSBudWxsKSB7CiAgICAgICAgICAgIGxldCBidXJuOiBCdXJuUGFyYW1ldGVycyA9IHNlbGYuYnVybiEhOwogICAgICAgICAgICBsZXQgbm93OiBJbnQgPSBub3coKTsKICAgICAgICAgICAgaWYgKGJ1cm4uZW5kQXQgPD0gbm93KSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlcGx5KCJQYXlvdXQgYWxyZWFkeSBlbmRlZCIuYXNDb21tZW50KCkpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChub3cgPj0gYnVybi5zdGFydEF0KSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSAqIChidXJuLmVuZEF0IC0gbm93KSkgLyAoYnVybi5lbmRBdCAtIGJ1cm4uc3RhcnRBdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIG1pbiB2YWx1ZQogICAgICAgIHJlcXVpcmUodmFsdWUgPj0gdG9uKCIxLjAiKSwgIkNoZWNrIHdpdGhkcmF3IG1pbiB2YWx1ZSIpOwoKICAgICAgICAvLyBDaGVjayBiYWxhbmNlIGJlZm9yZSBzZW5kaW5nIGZvcndhcmQgdG8gc2F2ZSBzb21lIGdhcyBvbiBkZXBsZXRpb24KICAgICAgICByZXF1aXJlKG15QmFsYW5jZSgpID4gdG9uKCIxLjAiKSArIHNlbGYuc3RvcmFnZVJlc2VydmUgKyB2YWx1ZSwgIkluc3VmZmljaWVudCBiYWxhbmNlIG9uIG1hc3RlciIpOwoKICAgICAgICAvLyBTZW5kIG1lc3NhZ2UgdG8gYmFjb24KICAgICAgICBsZXQgaW5pdDogU3RhdGVJbml0ID0gaW5pdE9mIFBheW91dEJlYWNvbihjdHguc2VuZGVyLCBteUFkZHJlc3MoKSk7CiAgICAgICAgbGV0IGFkZHJlc3M6IEFkZHJlc3MgPSBjb250cmFjdEFkZHJlc3MoaW5pdCk7CiAgICAgICAgc2VsZi5mb3J3YXJkKGFkZHJlc3MsIFRyeVBheW91dHsgYWRkcmVzczogY3R4LnNlbmRlciwgdmFsdWU6IHZhbHVlIH0udG9DZWxsKCksIHRydWUsIGluaXQpOwogICAgfQoKICAgIHJlY2VpdmUob2s6IFBheW91dE9rKSB7CiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgY29udHJhY3QgaXMgbm90IHN0b3BwZWQKICAgICAgICBzZWxmLnJlcXVpcmVOb3RTdG9wcGVkKCk7CgogICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBjb250ZXh0CiAgICAgICAgbGV0IGN0eDogQ29udGV4dCA9IGNvbnRleHQoKTsKICAgICAgICBsZXQgaW5pdDogU3RhdGVJbml0ID0gaW5pdE9mIFBheW91dEJlYWNvbihvay5hZGRyZXNzLCBteUFkZHJlc3MoKSk7CiAgICAgICAgbGV0IGJlYWNvbkFkZHJlc3M6IEFkZHJlc3MgPSBjb250cmFjdEFkZHJlc3MoaW5pdCk7CiAgICAgICAgcmVxdWlyZShjdHguc2VuZGVyID09IGJlYWNvbkFkZHJlc3MsICJJbnZhbGlkIHNlbmRlciIpOwoKICAgICAgICAvLyBSZXF1aXJlIHJlcXVpcmVkIGJhbGFuY2UKICAgICAgICByZXF1aXJlKG15QmFsYW5jZSgpID4gdG9uKCIxLjAiKSArIHNlbGYuc3RvcmFnZVJlc2VydmUgKyBvay52YWx1ZSwgIkluc3VmZmljaWVudCBiYWxhbmNlIG9uIG1hc3RlciIpOwoKICAgICAgICAvLyBFbWl0IGV2ZW50CiAgICAgICAgZW1pdChFdmVudFBheW91dENvbXBsZXRlZHsgYWRkcmVzczogb2suYWRkcmVzcywgdmFsdWU6IG9rLnZhbHVlIH0udG9DZWxsKCkpOwoKICAgICAgICAvLyBTZW5kIHRoZSBwYXlvdXQKICAgICAgICBzZW5kKFNlbmRQYXJhbWV0ZXJzewogICAgICAgICAgICB2YWx1ZTogb2sudmFsdWUsIAogICAgICAgICAgICBtb2RlOiBTZW5kUmVtYWluaW5nVmFsdWUsCiAgICAgICAgICAgIHRvOiBvay5hZGRyZXNzLCAKICAgICAgICAgICAgYm9keTogIlBheW91dCDRgW9tcGxldGVkIi5hc0NvbW1lbnQoKQogICAgICAgIH0pOwogICAgfQoKICAgIHJlY2VpdmUoZmFpbGVkOiBQYXlvdXRGYWlsZWQpIHsKICAgICAgICBzZW5kKFNlbmRQYXJhbWV0ZXJzewogICAgICAgICAgICB2YWx1ZTogMCwgCiAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSwKICAgICAgICAgICAgdG86IGZhaWxlZC5hZGRyZXNzLCAKICAgICAgICAgICAgYm9keTogIkFscmVhZHkgcGFpZCIuYXNDb21tZW50KCkKICAgICAgICB9KTsKICAgIH0KCiAgICAvLwogICAgLy8gQWRtaW4gb3BlcmF0aW9ucwogICAgLy8KCiAgICByZWNlaXZlKCJEZXBvc2l0IikgewogICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIGlzIGFsbG93ZWQgZm9yIGFueW9uZQogICAgICAgIGxldCBjdHg6IENvbnRleHQgPSBjb250ZXh0KCk7CiAgICAgICAgcmVxdWlyZShjdHgudmFsdWUgPj0gdG9uKCIxLjAiKSwgIkludmFsaWQgdmFsdWUiKTsKICAgICAgICBzZW5kKFNlbmRQYXJhbWV0ZXJzewogICAgICAgICAgICB2YWx1ZTogdG9uKCIwLjEiKSwgCiAgICAgICAgICAgIG1vZGU6IFNlbmRJZ25vcmVFcnJvcnMsCiAgICAgICAgICAgIHRvOiBjdHguc2VuZGVyLCAKICAgICAgICAgICAgYm91bmNlOiBmYWxzZSwKICAgICAgICAgICAgYm9keTogIkRlcG9zaXQgcmVjZWl2ZWQiLmFzQ29tbWVudCgpCiAgICAgICAgfSk7CiAgICB9CgogICAgcmVjZWl2ZSgiV2l0aGRyYXciKSB7CiAgICAgICAgc2VsZi5yZXF1aXJlT3duZXIoKTsKICAgICAgICBuYXRpdmVSZXNlcnZlKHNlbGYuc3RvcmFnZVJlc2VydmUsIDApOwogICAgICAgIHNlbmQoU2VuZFBhcmFtZXRlcnN7CiAgICAgICAgICAgIHZhbHVlOiAwLCAKICAgICAgICAgICAgbW9kZTogU2VuZFJlbWFpbmluZ0JhbGFuY2UsCiAgICAgICAgICAgIHRvOiBzZWxmLm93bmVyLCAKICAgICAgICAgICAgYm91bmNlOiBmYWxzZSwKICAgICAgICAgICAgYm9keTogIldpdGhkcmF3IGNvbXBsZXRlZCIuYXNDb21tZW50KCkKICAgICAgICB9KTsKICAgIH0KCiAgICByZWNlaXZlKCJEZXN0cm95IikgewogICAgICAgIHNlbGYucmVxdWlyZU93bmVyKCk7CiAgICAgICAgc2VuZChTZW5kUGFyYW1ldGVyc3sKICAgICAgICAgICAgdmFsdWU6IDAsIAogICAgICAgICAgICBtb2RlOiBTZW5kUmVtYWluaW5nQmFsYW5jZSArIFNlbmREZXN0cm95SWZaZXJvLAogICAgICAgICAgICB0bzogc2VsZi5vd25lciwgCiAgICAgICAgICAgIGJvdW5jZTogZmFsc2UsCiAgICAgICAgICAgIGJvZHk6ICJDb250cmFjdCBkZXN0cm95ZWQiLmFzQ29tbWVudCgpCiAgICAgICAgfSk7CiAgICB9CgogICAgLy8gR2V0dGVycwoKICAgIGdldCBmdW4gcHVibGljS2V5KCk6IEludCB7CiAgICAgICAgcmV0dXJuIHNlbGYucHVibGljS2V5OwogICAgfQoKICAgIGdldCBmdW4gYnVybigpOiBCdXJuUGFyYW1ldGVycz8gewogICAgICAgIHJldHVybiBzZWxmLmJ1cm47CiAgICB9IAp9CgpmdW4gbm9ybWFsaXplS2V5KHNyYzogU3RyaW5nKTogU3RyaW5nIHsKICAgIGxldCBvdXQ6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKTsKICAgIGxldCBzbGljZTogU2xpY2UgPSBzcmMuYXNTbGljZSgpOwogICAgd2hpbGUoc2xpY2UuYml0cygpID4gMCB8fCBzbGljZS5yZWZzKCkgPiAwKSB7CiAgICAgICAgcmVxdWlyZShzbGljZS5iaXRzKCkgJSA4ID09IDAgJiYgc2xpY2UucmVmcygpIDw9IDEsICJJbnZhbGlkIHN0cmluZyIpOwogICAgICAgIGlmIChzbGljZS5iaXRzKCkgPiAwKSB7CiAgICAgICAgICAgIGxldCBjaDogSW50ID0gc2xpY2UubG9hZFVpbnQoOCk7CiAgICAgICAgICAgIGlmIChjaCA+PSAzMyAmJiBjaCA8PSAxMjYpIHsKICAgICAgICAgICAgICAgIG91dCA9IG91dC5zdG9yZVVpbnQoY2gsIDgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2xpY2UgPSBzbGljZS5sb2FkUmVmKCkuYmVnaW5QYXJzZSgpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBvdXQuYXNTbGljZSgpLmFzU3RyaW5nKCk7Cn0="},"compiler":{"name":"tact","version":"1.1.2","parameters":"{\"entrypoint\":\"./sources/contract.tact\",\"options\":{}}"}} -------------------------------------------------------------------------------- /sources/output/payouts_PayoutBeacon.stdlib.fc: -------------------------------------------------------------------------------- 1 | global (int, slice, int, slice) __tact_context; 2 | global slice __tact_context_sender; 3 | global cell __tact_context_sys; 4 | global int __tact_randomized; 5 | 6 | slice __tact_verify_address(slice address) inline { 7 | throw_unless(136, address.slice_bits() == 267); 8 | var h = address.preload_uint(11); 9 | throw_if(137, h == 1279); 10 | throw_unless(136, h == 1024); 11 | return address; 12 | } 13 | 14 | (slice, slice) __tact_load_address(slice cs) inline { 15 | slice raw = cs~load_msg_addr(); 16 | return (cs, __tact_verify_address(raw)); 17 | } 18 | 19 | builder __tact_store_address(builder b, slice address) inline { 20 | return b.store_slice(__tact_verify_address(address)); 21 | } 22 | 23 | int __tact_my_balance() inline { 24 | return pair_first(get_balance()); 25 | } 26 | 27 | forall X -> X __tact_not_null(X x) inline { 28 | throw_if(128, null?(x)); return x; 29 | } 30 | 31 | (int, slice, int, slice) __tact_context_get() inline { 32 | return __tact_context; 33 | } 34 | 35 | slice __tact_context_get_sender() inline { 36 | return __tact_context_sender; 37 | } 38 | 39 | builder __tact_store_bool(builder b, int v) inline { 40 | return b.store_int(v, 1); 41 | } 42 | 43 | int __tact_slice_eq_bits(slice a, slice b) inline { 44 | return equal_slice_bits(a, b); 45 | } 46 | 47 | forall X0, X1 -> (X0, X1) __tact_tuple_destroy_2(tuple v) asm "2 UNTUPLE"; 48 | 49 | () $global_send((int, slice, int, int, cell, cell, cell) $params) impure inline_ref { 50 | var (($params'bounce, $params'to, $params'value, $params'mode, $params'body, $params'code, $params'data)) = $params; 51 | builder $b = begin_cell(); 52 | $b = store_int($b, 1, 2); 53 | $b = __tact_store_bool($b, $params'bounce); 54 | $b = store_int($b, 0, 3); 55 | $b = __tact_store_address($b, $params'to); 56 | $b = store_coins($b, $params'value); 57 | $b = store_int($b, 0, ((((1 + 4) + 4) + 64) + 32)); 58 | if (( ((~ null?($params'code))) ? (true) : ((~ null?($params'data))) )) { 59 | $b = __tact_store_bool($b, true); 60 | builder $bc = begin_cell(); 61 | $bc = __tact_store_bool($bc, false); 62 | $bc = __tact_store_bool($bc, false); 63 | if ((~ null?($params'code))) { 64 | $bc = __tact_store_bool($bc, true); 65 | $bc = store_ref($bc, __tact_not_null($params'code)); 66 | } else { 67 | $bc = __tact_store_bool($bc, false); 68 | } 69 | if ((~ null?($params'data))) { 70 | $bc = __tact_store_bool($bc, true); 71 | $bc = store_ref($bc, __tact_not_null($params'data)); 72 | } else { 73 | $bc = __tact_store_bool($bc, false); 74 | } 75 | $bc = __tact_store_bool($bc, false); 76 | $b = __tact_store_bool($b, true); 77 | $b = store_ref($b, end_cell($bc)); 78 | } else { 79 | $b = __tact_store_bool($b, false); 80 | } 81 | cell $body = $params'body; 82 | if ((~ null?($body))) { 83 | $b = __tact_store_bool($b, true); 84 | $b = store_ref($b, __tact_not_null($body)); 85 | } else { 86 | $b = __tact_store_bool($b, false); 87 | } 88 | cell $c = end_cell($b); 89 | send_raw_message($c, $params'mode); 90 | } 91 | 92 | ((slice, slice, int), ()) $PayoutBeacon$_fun_forward((slice, slice, int) $self, slice $to, cell $body, int $bounce, tuple $init) impure inline_ref { 93 | var (($self'owner, $self'master, $self'completed)) = $self; 94 | var ($init) = $init; 95 | cell $code = null(); 96 | cell $data = null(); 97 | if ((~ null?($init))) { 98 | var ($init2'code, $init2'data) = $StateInit$_not_null($init); 99 | $code = $init2'code; 100 | $data = $init2'data; 101 | } 102 | if ((100000000 > 0)) { 103 | var ($ctx'bounced, $ctx'sender, $ctx'value, $ctx'raw) = __tact_context_get(); 104 | int $balance = __tact_my_balance(); 105 | int $balanceBeforeMessage = ($balance - $ctx'value); 106 | if (($balanceBeforeMessage < 100000000)) { 107 | raw_reserve(100000000, 0); 108 | $global_send($SendParameters$_constructor_bounce_to_value_mode_body_code_data($bounce, $to, 0, (128 + 2), $body, $code, $data)); 109 | return (($self'owner, $self'master, $self'completed), ()); 110 | } 111 | } 112 | $global_send($SendParameters$_constructor_bounce_to_value_mode_body_code_data($bounce, $to, 0, (64 + 2), $body, $code, $data)); 113 | return (($self'owner, $self'master, $self'completed), ()); 114 | } 115 | 116 | ((slice, slice, int), ()) $PayoutBeacon$_fun_notify((slice, slice, int) $self, cell $body) impure inline { 117 | var (($self'owner, $self'master, $self'completed)) = $self; 118 | ($self'owner, $self'master, $self'completed)~$PayoutBeacon$_fun_forward(__tact_context_get_sender(), $body, false, null()); 119 | return (($self'owner, $self'master, $self'completed), ()); 120 | } -------------------------------------------------------------------------------- /sources/output/payouts_PayoutBeacon.storage.fc: -------------------------------------------------------------------------------- 1 | ;; 2 | ;; Type: StateInit 3 | ;; TLB: _ code:^cell data:^cell = StateInit 4 | ;; 5 | 6 | ((cell, cell)) $StateInit$_not_null(tuple v) inline { 7 | throw_if(128, null?(v)); 8 | var (cell vvv'code, cell vvv'data) = __tact_tuple_destroy_2(v); 9 | return (vvv'code, vvv'data); 10 | } 11 | 12 | ;; 13 | ;; Type: SendParameters 14 | ;; TLB: _ bounce:bool to:address value:int257 mode:int257 body:Maybe ^cell code:Maybe ^cell data:Maybe ^cell = SendParameters 15 | ;; 16 | 17 | ((int, slice, int, int, cell, cell, cell)) $SendParameters$_constructor_bounce_to_value_mode_body_code_data(int bounce, slice to, int value, int mode, cell body, cell code, cell data) inline { 18 | return (bounce, to, value, mode, body, code, data); 19 | } 20 | 21 | ;; 22 | ;; Type: Deploy 23 | ;; Header: 0x946a98b6 24 | ;; TLB: deploy#946a98b6 queryId:uint64 = Deploy 25 | ;; 26 | 27 | (slice, ((int))) $Deploy$_load(slice sc_0) inline { 28 | throw_unless(129, sc_0~load_uint(32) == 2490013878); 29 | var v'queryId = sc_0~load_uint(64); 30 | return (sc_0, (v'queryId)); 31 | } 32 | 33 | ;; 34 | ;; Type: DeployOk 35 | ;; Header: 0xaff90f57 36 | ;; TLB: deploy_ok#aff90f57 queryId:uint64 = DeployOk 37 | ;; 38 | 39 | builder $DeployOk$_store(builder build_0, (int) v) inline { 40 | var (v'queryId) = v; 41 | build_0 = store_uint(build_0, 2952335191, 32); 42 | build_0 = build_0.store_uint(v'queryId, 64); 43 | return build_0; 44 | } 45 | 46 | cell $DeployOk$_store_cell((int) v) inline { 47 | return $DeployOk$_store(begin_cell(), v).end_cell(); 48 | } 49 | 50 | ((int)) $DeployOk$_constructor_queryId(int queryId) inline { 51 | return (queryId); 52 | } 53 | 54 | ;; 55 | ;; Type: TryPayout 56 | ;; Header: 0x60912f1f 57 | ;; TLB: try_payout#60912f1f address:address value:coins = TryPayout 58 | ;; 59 | 60 | (slice, ((slice, int))) $TryPayout$_load(slice sc_0) inline { 61 | throw_unless(129, sc_0~load_uint(32) == 1620127519); 62 | var v'address = sc_0~__tact_load_address(); 63 | var v'value = sc_0~load_coins(); 64 | return (sc_0, (v'address, v'value)); 65 | } 66 | 67 | ;; 68 | ;; Type: PayoutOk 69 | ;; Header: 0xd90aaa12 70 | ;; TLB: payout_ok#d90aaa12 address:address value:coins = PayoutOk 71 | ;; 72 | 73 | builder $PayoutOk$_store(builder build_0, (slice, int) v) inline { 74 | var (v'address, v'value) = v; 75 | build_0 = store_uint(build_0, 3641354770, 32); 76 | build_0 = __tact_store_address(build_0, v'address); 77 | build_0 = build_0.store_coins(v'value); 78 | return build_0; 79 | } 80 | 81 | cell $PayoutOk$_store_cell((slice, int) v) inline { 82 | return $PayoutOk$_store(begin_cell(), v).end_cell(); 83 | } 84 | 85 | (slice, (tuple)) $PayoutOk$_load_bounced(slice sc_0) inline { 86 | throw_unless(129, sc_0~load_uint(32) == 3641354770); 87 | return (sc_0, null()); 88 | } 89 | 90 | ((slice, int)) $PayoutOk$_constructor_value_address(int value, slice address) inline { 91 | return (address, value); 92 | } 93 | 94 | ;; 95 | ;; Type: PayoutFailed 96 | ;; Header: 0x25bd488e 97 | ;; TLB: payout_failed#25bd488e address:address value:coins = PayoutFailed 98 | ;; 99 | 100 | builder $PayoutFailed$_store(builder build_0, (slice, int) v) inline { 101 | var (v'address, v'value) = v; 102 | build_0 = store_uint(build_0, 633161870, 32); 103 | build_0 = __tact_store_address(build_0, v'address); 104 | build_0 = build_0.store_coins(v'value); 105 | return build_0; 106 | } 107 | 108 | cell $PayoutFailed$_store_cell((slice, int) v) inline { 109 | return $PayoutFailed$_store(begin_cell(), v).end_cell(); 110 | } 111 | 112 | ((slice, int)) $PayoutFailed$_constructor_value_address(int value, slice address) inline { 113 | return (address, value); 114 | } 115 | 116 | ;; 117 | ;; Type: PayoutBeacon 118 | ;; 119 | 120 | builder $PayoutBeacon$_store(builder build_0, (slice, slice, int) v) inline { 121 | var (v'owner, v'master, v'completed) = v; 122 | build_0 = __tact_store_address(build_0, v'owner); 123 | build_0 = __tact_store_address(build_0, v'master); 124 | build_0 = build_0.store_int(v'completed, 1); 125 | return build_0; 126 | } 127 | 128 | (slice, ((slice, slice, int))) $PayoutBeacon$_load(slice sc_0) inline { 129 | var v'owner = sc_0~__tact_load_address(); 130 | var v'master = sc_0~__tact_load_address(); 131 | var v'completed = sc_0~load_int(1); 132 | return (sc_0, (v'owner, v'master, v'completed)); 133 | } 134 | 135 | (slice, ((slice, slice))) $PayoutBeacon$init$_load(slice sc_0) inline { 136 | var v'owner = sc_0~__tact_load_address(); 137 | var v'master = sc_0~__tact_load_address(); 138 | return (sc_0, (v'owner, v'master)); 139 | } 140 | 141 | (slice, slice, int) $PayoutBeacon$_contract_load() impure inline_ref { 142 | slice $sc = get_data().begin_parse(); 143 | __tact_context_sys = $sc~load_ref(); 144 | int $loaded = $sc~load_int(1); 145 | if ($loaded) { 146 | return $sc~$PayoutBeacon$_load(); 147 | } else { 148 | ;; Allow only workchain deployments 149 | throw_unless(137, my_address().preload_uint(11) == 1024); 150 | (slice owner, slice master) = $sc~$PayoutBeacon$init$_load(); 151 | $sc.end_parse(); 152 | return $PayoutBeacon$_contract_init(owner, master); 153 | } 154 | } 155 | 156 | () $PayoutBeacon$_contract_store((slice, slice, int) v) impure inline { 157 | builder b = begin_cell(); 158 | b = b.store_ref(__tact_context_sys); 159 | b = b.store_int(true, 1); 160 | b = $PayoutBeacon$_store(b, v); 161 | set_data(b.end_cell()); 162 | } -------------------------------------------------------------------------------- /sources/output/payouts_PayoutsMaster.abi: -------------------------------------------------------------------------------- 1 | {"name":"PayoutsMaster","types":[{"name":"StateInit","header":null,"fields":[{"name":"code","type":{"kind":"simple","type":"cell","optional":false}},{"name":"data","type":{"kind":"simple","type":"cell","optional":false}}]},{"name":"Context","header":null,"fields":[{"name":"bounced","type":{"kind":"simple","type":"bool","optional":false}},{"name":"sender","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"raw","type":{"kind":"simple","type":"slice","optional":false}}]},{"name":"SendParameters","header":null,"fields":[{"name":"bounce","type":{"kind":"simple","type":"bool","optional":false}},{"name":"to","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"mode","type":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"body","type":{"kind":"simple","type":"cell","optional":true}},{"name":"code","type":{"kind":"simple","type":"cell","optional":true}},{"name":"data","type":{"kind":"simple","type":"cell","optional":true}}]},{"name":"Deploy","header":2490013878,"fields":[{"name":"queryId","type":{"kind":"simple","type":"uint","optional":false,"format":64}}]},{"name":"DeployOk","header":2952335191,"fields":[{"name":"queryId","type":{"kind":"simple","type":"uint","optional":false,"format":64}}]},{"name":"FactoryDeploy","header":1829761339,"fields":[{"name":"queryId","type":{"kind":"simple","type":"uint","optional":false,"format":64}},{"name":"cashback","type":{"kind":"simple","type":"address","optional":false}}]},{"name":"ChangeOwner","header":2174598809,"fields":[{"name":"queryId","type":{"kind":"simple","type":"uint","optional":false,"format":64}},{"name":"newOwner","type":{"kind":"simple","type":"address","optional":false}}]},{"name":"ChangeOwnerOk","header":846932810,"fields":[{"name":"queryId","type":{"kind":"simple","type":"uint","optional":false,"format":64}},{"name":"newOwner","type":{"kind":"simple","type":"address","optional":false}}]},{"name":"TryPayout","header":1620127519,"fields":[{"name":"address","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"uint","optional":false,"format":"coins"}}]},{"name":"PayoutOk","header":3641354770,"fields":[{"name":"address","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"uint","optional":false,"format":"coins"}}]},{"name":"PayoutFailed","header":633161870,"fields":[{"name":"address","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"uint","optional":false,"format":"coins"}}]},{"name":"BurnParameters","header":null,"fields":[{"name":"startAt","type":{"kind":"simple","type":"uint","optional":false,"format":32}},{"name":"endAt","type":{"kind":"simple","type":"uint","optional":false,"format":32}}]},{"name":"EventPayoutCompleted","header":989312214,"fields":[{"name":"address","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"uint","optional":false,"format":"coins"}}]}],"receivers":[{"receiver":"internal","message":{"kind":"text"}},{"receiver":"internal","message":{"kind":"typed","type":"PayoutOk"}},{"receiver":"internal","message":{"kind":"typed","type":"PayoutFailed"}},{"receiver":"internal","message":{"kind":"text","text":"Deposit"}},{"receiver":"internal","message":{"kind":"text","text":"Withdraw"}},{"receiver":"internal","message":{"kind":"text","text":"Destroy"}},{"receiver":"internal","message":{"kind":"typed","type":"Deploy"}},{"receiver":"internal","message":{"kind":"text","text":"Resume"}},{"receiver":"internal","message":{"kind":"text","text":"Stop"}}],"getters":[{"name":"publicKey","arguments":[],"returnType":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"burn","arguments":[],"returnType":{"kind":"simple","type":"BurnParameters","optional":true}},{"name":"owner","arguments":[],"returnType":{"kind":"simple","type":"address","optional":false}},{"name":"stopped","arguments":[],"returnType":{"kind":"simple","type":"bool","optional":false}}],"errors":{"2":{"message":"Stack undeflow"},"3":{"message":"Stack overflow"},"4":{"message":"Integer overflow"},"5":{"message":"Integer out of expected range"},"6":{"message":"Invalid opcode"},"7":{"message":"Type check error"},"8":{"message":"Cell overflow"},"9":{"message":"Cell underflow"},"10":{"message":"Dictionary error"},"13":{"message":"Out of gas error"},"32":{"message":"Method ID not found"},"34":{"message":"Action is invalid or not supported"},"37":{"message":"Not enough TON"},"38":{"message":"Not enough extra-currencies"},"128":{"message":"Null reference exception"},"129":{"message":"Invalid serialization prefix"},"130":{"message":"Invalid incoming message"},"131":{"message":"Constraints error"},"132":{"message":"Access denied"},"133":{"message":"Contract stopped"},"134":{"message":"Invalid argument"},"135":{"message":"Code of a contract was not found"},"136":{"message":"Invalid address"},"137":{"message":"Masterchain support is not enabled for this contract"},"4429":{"message":"Invalid sender"},"12724":{"message":"Invalid burn parameters"},"16059":{"message":"Invalid value"},"19204":{"message":"Insufficient balance on master"},"40368":{"message":"Contract stopped"},"46762":{"message":"Invalid string"},"48401":{"message":"Invalid signature"},"53296":{"message":"Contract not stopped"},"57826":{"message":"Check withdraw min value"}},"interfaces":["org.ton.introspection.v0","org.ton.abi.ipfs.v0","org.ton.deploy.lazy.v0","org.ton.chain.workchain.v0","org.ton.ownable","org.ton.resumable","org.ton.stoppable"]} -------------------------------------------------------------------------------- /sources/output/payouts_PayoutsMaster.code.boc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tact-lang/contract-payouts/287b768ea3f2617b814cb6258f12910d4943dedf/sources/output/payouts_PayoutsMaster.code.boc -------------------------------------------------------------------------------- /sources/output/payouts_PayoutsMaster.code.fc: -------------------------------------------------------------------------------- 1 | #pragma version =0.4.3; 2 | #pragma allow-post-modification; 3 | #pragma compute-asm-ltr; 4 | 5 | #include "payouts_PayoutsMaster.headers.fc"; 6 | #include "payouts_PayoutsMaster.stdlib.fc"; 7 | #include "payouts_PayoutsMaster.constants.fc"; 8 | #include "payouts_PayoutsMaster.storage.fc"; 9 | 10 | ;; 11 | ;; Contract PayoutsMaster functions 12 | ;; 13 | 14 | (slice, int, int, tuple) $PayoutsMaster$_contract_init(slice $owner, int $publicKey, tuple $burn) impure inline_ref { 15 | var ($burn) = $burn; 16 | var (($self'owner, $self'publicKey, $self'stopped, $self'burn)) = (null(), null(), null(), null()); 17 | $self'owner = $owner; 18 | $self'publicKey = $publicKey; 19 | $self'stopped = false; 20 | $self'burn = $burn; 21 | if ((~ null?($burn))) { 22 | var ($b'startAt, $b'endAt) = $BurnParameters$_not_null($burn); 23 | throw_unless(12724, ($b'startAt < $b'endAt)); 24 | } 25 | return ($self'owner, $self'publicKey, $self'stopped, $self'burn); 26 | } 27 | 28 | slice $global_normalizeKey(slice $src) impure inline_ref { 29 | builder $out = begin_cell(); 30 | slice $slice = __tact_str_to_slice($src); 31 | while (( ((slice_bits($slice) > 0)) ? (true) : ((slice_refs($slice) > 0)) )) { 32 | throw_unless(46762, ( (((slice_bits($slice) % 8) == 0)) ? ((slice_refs($slice) <= 1)) : (false) )); 33 | if ((slice_bits($slice) > 0)) { 34 | int $ch = $slice~load_uint(8); 35 | if (( (($ch >= 33)) ? (($ch <= 126)) : (false) )) { 36 | $out = store_uint($out, $ch, 8); 37 | } 38 | } else { 39 | $slice = begin_parse($slice~load_ref()); 40 | } 41 | } 42 | return __tact_slice_to_str($Builder$_fun_asSlice($out)); 43 | } 44 | 45 | ((slice, int, int, tuple), int) $PayoutsMaster$_fun_publicKey((slice, int, int, tuple) $self) impure inline_ref { 46 | var (($self'owner, $self'publicKey, $self'stopped, $self'burn)) = $self; 47 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), $self'publicKey); 48 | } 49 | 50 | ((slice, int, int, tuple), tuple) $PayoutsMaster$_fun_burn((slice, int, int, tuple) $self) impure inline_ref { 51 | var (($self'owner, $self'publicKey, $self'stopped, $self'burn)) = $self; 52 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), $self'burn); 53 | } 54 | 55 | ((slice, int, int, tuple), ()) $PayoutsMaster$_fun_requireOwner((slice, int, int, tuple) $self) impure inline_ref { 56 | var (($self'owner, $self'publicKey, $self'stopped, $self'burn)) = $self; 57 | throw_unless(132, ( __tact_slice_eq_bits($self'owner, __tact_context_get_sender()) )); 58 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 59 | } 60 | 61 | ((slice, int, int, tuple), slice) $PayoutsMaster$_fun_owner((slice, int, int, tuple) $self) impure inline_ref { 62 | var (($self'owner, $self'publicKey, $self'stopped, $self'burn)) = $self; 63 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), $self'owner); 64 | } 65 | 66 | ((slice, int, int, tuple), ()) $PayoutsMaster$_fun_requireNotStopped((slice, int, int, tuple) $self) impure inline_ref { 67 | var (($self'owner, $self'publicKey, $self'stopped, $self'burn)) = $self; 68 | throw_unless(40368, (~ $self'stopped)); 69 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 70 | } 71 | 72 | ((slice, int, int, tuple), ()) $PayoutsMaster$_fun_requireStopped((slice, int, int, tuple) $self) impure inline_ref { 73 | var (($self'owner, $self'publicKey, $self'stopped, $self'burn)) = $self; 74 | throw_unless(53296, $self'stopped); 75 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 76 | } 77 | 78 | ((slice, int, int, tuple), int) $PayoutsMaster$_fun_stopped((slice, int, int, tuple) $self) impure inline_ref { 79 | var (($self'owner, $self'publicKey, $self'stopped, $self'burn)) = $self; 80 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), $self'stopped); 81 | } 82 | 83 | ;; 84 | ;; Receivers of a Contract PayoutsMaster 85 | ;; 86 | 87 | ((slice, int, int, tuple), ()) $PayoutsMaster$_internal_any_text((slice, int, int, tuple) $self, slice $withdraw) impure inline { 88 | var ($self'owner, $self'publicKey, $self'stopped, $self'burn) = $self; 89 | $withdraw = $global_normalizeKey($withdraw); 90 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_requireNotStopped(); 91 | var ($ctx'bounced, $ctx'sender, $ctx'value, $ctx'raw) = __tact_context_get(); 92 | throw_unless(16059, ($ctx'value >= 1000000000)); 93 | slice $msg = $String$_fun_fromBase64($withdraw); 94 | slice $signature = $msg~load_bits(512); 95 | int $value = $msg~load_coins(); 96 | cell $sigCell = end_cell(store_coins(__tact_store_address(begin_cell(), $ctx'sender), $value)); 97 | int $hash = cell_hash($sigCell); 98 | throw_unless(48401, check_signature($hash, $signature, $self'publicKey)); 99 | if ((~ null?($self'burn))) { 100 | var ($burn'startAt, $burn'endAt) = $BurnParameters$_not_null($self'burn); 101 | int $now = now(); 102 | if (($burn'endAt <= $now)) { 103 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_reply(__gen_cell_comment_d1fc74c13be089b6bea8cf835da140f1b590ac5f89c5040f9ddfc30f5dd5e70d()); 104 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 105 | } 106 | if (($now >= $burn'startAt)) { 107 | $value = (($value * ($burn'endAt - $now)) / ($burn'endAt - $burn'startAt)); 108 | } 109 | } 110 | throw_unless(57826, ($value >= 1000000000)); 111 | throw_unless(19204, (__tact_my_balance() > ((1000000000 + 100000000) + $value))); 112 | var ($init'code, $init'data) = $PayoutBeacon$_init_child(__tact_context_sys, $ctx'sender, my_address()); 113 | slice $address = $global_contractAddress(($init'code, $init'data)); 114 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_forward($address, $TryPayout$_store_cell($TryPayout$_constructor_address_value($ctx'sender, $value)), true, $StateInit$_as_optional(($init'code, $init'data))); 115 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 116 | } 117 | 118 | (((slice, int, int, tuple)), ()) $PayoutsMaster$_internal_binary_PayoutOk((slice, int, int, tuple) $self, (slice, int) $ok) impure inline { 119 | var ($self'owner, $self'publicKey, $self'stopped, $self'burn) = $self; 120 | var ($ok'address, $ok'value) = $ok; 121 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_requireNotStopped(); 122 | var ($ctx'bounced, $ctx'sender, $ctx'value, $ctx'raw) = __tact_context_get(); 123 | var ($init'code, $init'data) = $PayoutBeacon$_init_child(__tact_context_sys, $ok'address, my_address()); 124 | slice $beaconAddress = $global_contractAddress(($init'code, $init'data)); 125 | throw_unless(4429, ( __tact_slice_eq_bits($beaconAddress, $ctx'sender) )); 126 | throw_unless(19204, (__tact_my_balance() > ((1000000000 + 100000000) + $ok'value))); 127 | $global_emit($EventPayoutCompleted$_store_cell($EventPayoutCompleted$_constructor_address_value($ok'address, $ok'value))); 128 | $global_send($SendParameters$_constructor_value_mode_to_body($ok'value, 64, $ok'address, __gen_cell_comment_09ca5c59d7594cc794635e7b267be70795937c6d0366ed0164c412595b6eec6e())); 129 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 130 | } 131 | 132 | (((slice, int, int, tuple)), ()) $PayoutsMaster$_internal_binary_PayoutFailed((slice, int, int, tuple) $self, (slice, int) $failed) impure inline { 133 | var ($self'owner, $self'publicKey, $self'stopped, $self'burn) = $self; 134 | var ($failed'address, $failed'value) = $failed; 135 | $global_send($SendParameters$_constructor_value_mode_to_body(0, 64, $failed'address, __gen_cell_comment_51a60a895442bd331fe75161305b2afbe04d33f1cd6cf8a1649e028f992eb33c())); 136 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 137 | } 138 | 139 | ((slice, int, int, tuple), ()) $PayoutsMaster$_internal_text_2dcb19a5b89db9d3377fc651c6f9b6b92db9be624060c62a50572cdc97968638((slice, int, int, tuple) $self) impure inline { 140 | var ($self'owner, $self'publicKey, $self'stopped, $self'burn) = $self; 141 | var ($ctx'bounced, $ctx'sender, $ctx'value, $ctx'raw) = __tact_context_get(); 142 | throw_unless(16059, ($ctx'value >= 1000000000)); 143 | $global_send($SendParameters$_constructor_value_mode_to_bounce_body(100000000, 2, $ctx'sender, false, __gen_cell_comment_13c8d1a083e5ccb8cf7681be11c1ed303c4a19cb0110663a87e8c3fc525c2879())); 144 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 145 | } 146 | 147 | ((slice, int, int, tuple), ()) $PayoutsMaster$_internal_text_250b76e2b9576fc6b4c45129483006b0003a0c39b6f7ae413d177f4e3479dbca((slice, int, int, tuple) $self) impure inline { 148 | var ($self'owner, $self'publicKey, $self'stopped, $self'burn) = $self; 149 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_requireOwner(); 150 | raw_reserve(100000000, 0); 151 | $global_send($SendParameters$_constructor_value_mode_to_bounce_body(0, 128, $self'owner, false, __gen_cell_comment_f7b1ab6077945b37370a1550574675180cf87df4cb047c869746812a83667d4c())); 152 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 153 | } 154 | 155 | ((slice, int, int, tuple), ()) $PayoutsMaster$_internal_text_986c2ba124bb9287eb4a0bd8d3104e1c0067a3c93952d889c74d08185bd30d4d((slice, int, int, tuple) $self) impure inline { 156 | var ($self'owner, $self'publicKey, $self'stopped, $self'burn) = $self; 157 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_requireOwner(); 158 | $global_send($SendParameters$_constructor_value_mode_to_bounce_body(0, (128 + 32), $self'owner, false, __gen_cell_comment_d0eb08c41bdebaa57d4264bc1d1a8ce09adbf409ec16ee54951457d71e3e04e9())); 159 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 160 | } 161 | 162 | (((slice, int, int, tuple)), ()) $PayoutsMaster$_internal_binary_Deploy((slice, int, int, tuple) $self, (int) $deploy) impure inline { 163 | var ($self'owner, $self'publicKey, $self'stopped, $self'burn) = $self; 164 | var ($deploy'queryId) = $deploy; 165 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_notify($DeployOk$_store_cell($DeployOk$_constructor_queryId($deploy'queryId))); 166 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 167 | } 168 | 169 | ((slice, int, int, tuple), ()) $PayoutsMaster$_internal_text_6c8f44f45fedb4cdfed4de8db14aa5b13ad55d430f759d0669210b74c48fe3df((slice, int, int, tuple) $self) impure inline { 170 | var ($self'owner, $self'publicKey, $self'stopped, $self'burn) = $self; 171 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_requireOwner(); 172 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_requireStopped(); 173 | $self'stopped = false; 174 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_reply(__gen_cell_comment_514f593ead485926515219a03034c6b162f1c29390f83f2f1bd70b8b77731ec3()); 175 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 176 | } 177 | 178 | ((slice, int, int, tuple), ()) $PayoutsMaster$_internal_text_bcfaf776907c719cc8d379d8f194aaaa27e8ca2871cd591781721f215a454501((slice, int, int, tuple) $self) impure inline { 179 | var ($self'owner, $self'publicKey, $self'stopped, $self'burn) = $self; 180 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_requireOwner(); 181 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_requireNotStopped(); 182 | $self'stopped = true; 183 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_reply(__gen_cell_comment_8f4b6a166554b4f282855d0333c627d5b58d281ea4ba11e4def91a1053193b2d()); 184 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 185 | } 186 | 187 | ;; 188 | ;; Get methods of a Contract PayoutsMaster 189 | ;; 190 | 191 | _ %publicKey() method_id(86520) { 192 | var self = $PayoutsMaster$_contract_load(); 193 | var res = self~$PayoutsMaster$_fun_publicKey(); 194 | return res; 195 | } 196 | 197 | _ %burn() method_id(91153) { 198 | var self = $PayoutsMaster$_contract_load(); 199 | var res = self~$PayoutsMaster$_fun_burn(); 200 | return $BurnParameters$_to_opt_external(res); 201 | } 202 | 203 | _ %owner() method_id(83229) { 204 | var self = $PayoutsMaster$_contract_load(); 205 | var res = self~$PayoutsMaster$_fun_owner(); 206 | return res; 207 | } 208 | 209 | _ %stopped() method_id(74107) { 210 | var self = $PayoutsMaster$_contract_load(); 211 | var res = self~$PayoutsMaster$_fun_stopped(); 212 | return res; 213 | } 214 | 215 | _ supported_interfaces() method_id { 216 | return ( 217 | "org.ton.introspection.v0"H >> 128, 218 | "org.ton.abi.ipfs.v0"H >> 128, 219 | "org.ton.deploy.lazy.v0"H >> 128, 220 | "org.ton.chain.workchain.v0"H >> 128, 221 | "org.ton.ownable"H >> 128, 222 | "org.ton.resumable"H >> 128, 223 | "org.ton.stoppable"H >> 128 224 | ); 225 | } 226 | 227 | _ get_abi_ipfs() method_id { 228 | return "ipfs://QmTpdSCxnbEbMJstNpifneBtT89FXHMdoEwBJ2S19qzdPb"; 229 | } 230 | 231 | _ lazy_deployment_completed() method_id { 232 | return get_data().begin_parse().load_int(1); 233 | } 234 | 235 | ;; 236 | ;; Routing of a Contract PayoutsMaster 237 | ;; 238 | 239 | ((slice, int, int, tuple), int) $PayoutsMaster$_contract_router_internal((slice, int, int, tuple) self, int msg_bounced, slice in_msg) impure inline_ref { 240 | ;; Handle bounced messages 241 | if (msg_bounced) { 242 | return (self, true); 243 | } 244 | 245 | ;; Parse incoming message 246 | int op = 0; 247 | if (slice_bits(in_msg) >= 32) { 248 | op = in_msg.preload_uint(32); 249 | } 250 | 251 | 252 | ;; Receive PayoutOk message 253 | if (op == 3641354770) { 254 | var msg = in_msg~$PayoutOk$_load(); 255 | self~$PayoutsMaster$_internal_binary_PayoutOk(msg); 256 | return (self, true); 257 | } 258 | 259 | ;; Receive PayoutFailed message 260 | if (op == 633161870) { 261 | var msg = in_msg~$PayoutFailed$_load(); 262 | self~$PayoutsMaster$_internal_binary_PayoutFailed(msg); 263 | return (self, true); 264 | } 265 | 266 | ;; Receive Deploy message 267 | if (op == 2490013878) { 268 | var msg = in_msg~$Deploy$_load(); 269 | self~$PayoutsMaster$_internal_binary_Deploy(msg); 270 | return (self, true); 271 | } 272 | 273 | ;; Text Receivers 274 | if (op == 0) { 275 | var text_op = slice_hash(in_msg); 276 | 277 | ;; Receive "Deposit" message 278 | if (text_op == 0x2dcb19a5b89db9d3377fc651c6f9b6b92db9be624060c62a50572cdc97968638) { 279 | self~$PayoutsMaster$_internal_text_2dcb19a5b89db9d3377fc651c6f9b6b92db9be624060c62a50572cdc97968638(); 280 | return (self, true); 281 | } 282 | 283 | ;; Receive "Withdraw" message 284 | if (text_op == 0x250b76e2b9576fc6b4c45129483006b0003a0c39b6f7ae413d177f4e3479dbca) { 285 | self~$PayoutsMaster$_internal_text_250b76e2b9576fc6b4c45129483006b0003a0c39b6f7ae413d177f4e3479dbca(); 286 | return (self, true); 287 | } 288 | 289 | ;; Receive "Destroy" message 290 | if (text_op == 0x986c2ba124bb9287eb4a0bd8d3104e1c0067a3c93952d889c74d08185bd30d4d) { 291 | self~$PayoutsMaster$_internal_text_986c2ba124bb9287eb4a0bd8d3104e1c0067a3c93952d889c74d08185bd30d4d(); 292 | return (self, true); 293 | } 294 | 295 | ;; Receive "Resume" message 296 | if (text_op == 0x6c8f44f45fedb4cdfed4de8db14aa5b13ad55d430f759d0669210b74c48fe3df) { 297 | self~$PayoutsMaster$_internal_text_6c8f44f45fedb4cdfed4de8db14aa5b13ad55d430f759d0669210b74c48fe3df(); 298 | return (self, true); 299 | } 300 | 301 | ;; Receive "Stop" message 302 | if (text_op == 0xbcfaf776907c719cc8d379d8f194aaaa27e8ca2871cd591781721f215a454501) { 303 | self~$PayoutsMaster$_internal_text_bcfaf776907c719cc8d379d8f194aaaa27e8ca2871cd591781721f215a454501(); 304 | return (self, true); 305 | } 306 | if (slice_bits(in_msg) >= 32) { 307 | self~$PayoutsMaster$_internal_any_text(in_msg.skip_bits(32)); 308 | return (self, true); 309 | } 310 | } 311 | 312 | return (self, false); 313 | } 314 | 315 | () recv_internal(int msg_value, cell in_msg_cell, slice in_msg) impure { 316 | 317 | ;; Context 318 | var cs = in_msg_cell.begin_parse(); 319 | var msg_flags = cs~load_uint(4); 320 | var msg_bounced = -(msg_flags & 1); 321 | slice msg_sender_addr = __tact_verify_address(cs~load_msg_addr()); 322 | __tact_context = (msg_bounced, msg_sender_addr, msg_value, cs); 323 | __tact_context_sender = msg_sender_addr; 324 | 325 | ;; Load contract data 326 | var self = $PayoutsMaster$_contract_load(); 327 | 328 | ;; Handle operation 329 | int handled = self~$PayoutsMaster$_contract_router_internal(msg_bounced, in_msg); 330 | 331 | ;; Throw if not handled 332 | throw_unless(130, handled); 333 | 334 | ;; Persist state 335 | $PayoutsMaster$_contract_store(self); 336 | } 337 | -------------------------------------------------------------------------------- /sources/output/payouts_PayoutsMaster.constants.fc: -------------------------------------------------------------------------------- 1 | ;; Comment "Payout already ended" 2 | cell __gen_cell_comment_d1fc74c13be089b6bea8cf835da140f1b590ac5f89c5040f9ddfc30f5dd5e70d() asm "B{b5ee9c7241010101001a000030000000005061796f757420616c726561647920656e646564bcde6956} B>boc PUSHREF"; 3 | 4 | ;; Comment "Payout сompleted" 5 | cell __gen_cell_comment_09ca5c59d7594cc794635e7b267be70795937c6d0366ed0164c412595b6eec6e() asm "B{b5ee9c7241010101001700002a000000005061796f757420d1816f6d706c6574656480785295} B>boc PUSHREF"; 6 | 7 | ;; Comment "Already paid" 8 | cell __gen_cell_comment_51a60a895442bd331fe75161305b2afbe04d33f1cd6cf8a1649e028f992eb33c() asm "B{b5ee9c7241010101001200002000000000416c72656164792070616964feced6d9} B>boc PUSHREF"; 9 | 10 | ;; Comment "Deposit received" 11 | cell __gen_cell_comment_13c8d1a083e5ccb8cf7681be11c1ed303c4a19cb0110663a87e8c3fc525c2879() asm "B{b5ee9c72410101010016000028000000004465706f73697420726563656976656497afbae7} B>boc PUSHREF"; 12 | 13 | ;; Comment "Withdraw completed" 14 | cell __gen_cell_comment_f7b1ab6077945b37370a1550574675180cf87df4cb047c869746812a83667d4c() asm "B{b5ee9c7241010101001800002c00000000576974686472617720636f6d706c65746564190fd038} B>boc PUSHREF"; 15 | 16 | ;; Comment "Contract destroyed" 17 | cell __gen_cell_comment_d0eb08c41bdebaa57d4264bc1d1a8ce09adbf409ec16ee54951457d71e3e04e9() asm "B{b5ee9c7241010101001800002c00000000436f6e74726163742064657374726f79656454dbd534} B>boc PUSHREF"; 18 | 19 | ;; Comment "Resumed" 20 | cell __gen_cell_comment_514f593ead485926515219a03034c6b162f1c29390f83f2f1bd70b8b77731ec3() asm "B{b5ee9c7241010101000d00001600000000526573756d656412d9e98a} B>boc PUSHREF"; 21 | 22 | ;; Comment "Stopped" 23 | cell __gen_cell_comment_8f4b6a166554b4f282855d0333c627d5b58d281ea4ba11e4def91a1053193b2d() asm "B{b5ee9c7241010101000d0000160000000053746f707065646f94ddb2} B>boc PUSHREF"; -------------------------------------------------------------------------------- /sources/output/payouts_PayoutsMaster.headers.fc: -------------------------------------------------------------------------------- 1 | ;; 2 | ;; Header files for PayoutsMaster 3 | ;; NOTE: declarations are sorted for optimal order 4 | ;; 5 | 6 | ;; __tact_verify_address 7 | slice __tact_verify_address(slice address) inline; 8 | 9 | ;; __tact_load_address 10 | (slice, slice) __tact_load_address(slice cs) inline; 11 | 12 | ;; __tact_store_address 13 | builder __tact_store_address(builder b, slice address) inline; 14 | 15 | ;; __tact_create_address 16 | slice __tact_create_address(int chain, int hash) inline; 17 | 18 | ;; __tact_compute_contract_address 19 | slice __tact_compute_contract_address(int chain, cell code, cell data) inline; 20 | 21 | ;; __tact_my_balance 22 | int __tact_my_balance() inline; 23 | 24 | ;; __tact_not_null 25 | forall X -> X __tact_not_null(X x) inline; 26 | 27 | ;; __tact_context_get 28 | (int, slice, int, slice) __tact_context_get() inline; 29 | 30 | ;; __tact_context_get_sender 31 | slice __tact_context_get_sender() inline; 32 | 33 | ;; __tact_store_bool 34 | builder __tact_store_bool(builder b, int v) inline; 35 | 36 | ;; __tact_slice_eq_bits 37 | int __tact_slice_eq_bits(slice a, slice b) inline; 38 | 39 | ;; __tact_dict_set_code 40 | cell __tact_dict_set_code(cell dict, int id, cell code) inline; 41 | 42 | ;; __tact_dict_get_code 43 | cell __tact_dict_get_code(cell dict, int id) inline; 44 | 45 | ;; $Deploy$_load 46 | (slice, ((int))) $Deploy$_load(slice sc_0) inline; 47 | 48 | ;; $DeployOk$_store 49 | builder $DeployOk$_store(builder build_0, (int) v) inline; 50 | 51 | ;; $DeployOk$_store_cell 52 | cell $DeployOk$_store_cell((int) v) inline; 53 | 54 | ;; $TryPayout$_store 55 | builder $TryPayout$_store(builder build_0, (slice, int) v) inline; 56 | 57 | ;; $TryPayout$_store_cell 58 | cell $TryPayout$_store_cell((slice, int) v) inline; 59 | 60 | ;; $PayoutOk$_load 61 | (slice, ((slice, int))) $PayoutOk$_load(slice sc_0) inline; 62 | 63 | ;; $PayoutFailed$_load 64 | (slice, ((slice, int))) $PayoutFailed$_load(slice sc_0) inline; 65 | 66 | ;; $BurnParameters$_store 67 | builder $BurnParameters$_store(builder build_0, (int, int) v) inline; 68 | 69 | ;; $BurnParameters$_load 70 | (slice, ((int, int))) $BurnParameters$_load(slice sc_0) inline; 71 | 72 | ;; $EventPayoutCompleted$_store 73 | builder $EventPayoutCompleted$_store(builder build_0, (slice, int) v) inline; 74 | 75 | ;; $EventPayoutCompleted$_store_cell 76 | cell $EventPayoutCompleted$_store_cell((slice, int) v) inline; 77 | 78 | ;; $BurnParameters$_not_null 79 | ((int, int)) $BurnParameters$_not_null(tuple v) inline; 80 | 81 | ;; $PayoutsMaster$_store 82 | builder $PayoutsMaster$_store(builder build_0, (slice, int, int, tuple) v) inline; 83 | 84 | ;; $BurnParameters$_as_optional 85 | tuple $BurnParameters$_as_optional((int, int) v) inline; 86 | 87 | ;; $PayoutsMaster$_load 88 | (slice, ((slice, int, int, tuple))) $PayoutsMaster$_load(slice sc_0) inline; 89 | 90 | ;; $StateInit$_not_null 91 | ((cell, cell)) $StateInit$_not_null(tuple v) inline; 92 | 93 | ;; $StateInit$_as_optional 94 | tuple $StateInit$_as_optional((cell, cell) v) inline; 95 | 96 | ;; $BurnParameters$_to_tuple 97 | tuple $BurnParameters$_to_tuple(((int, int)) v) inline; 98 | 99 | ;; $BurnParameters$_to_opt_tuple 100 | tuple $BurnParameters$_to_opt_tuple(tuple v) inline; 101 | 102 | ;; $BurnParameters$_to_opt_external 103 | tuple $BurnParameters$_to_opt_external(tuple v) inline; 104 | 105 | ;; $PayoutBeacon$init$_store 106 | builder $PayoutBeacon$init$_store(builder build_0, (slice, slice) v) inline; 107 | 108 | ;; $PayoutsMaster$init$_load 109 | (slice, ((slice, int, tuple))) $PayoutsMaster$init$_load(slice sc_0) inline; 110 | 111 | ;; $PayoutsMaster$_contract_init 112 | (slice, int, int, tuple) $PayoutsMaster$_contract_init(slice $owner, int $publicKey, tuple $burn) impure inline_ref; 113 | 114 | ;; $PayoutsMaster$_contract_load 115 | (slice, int, int, tuple) $PayoutsMaster$_contract_load() impure inline_ref; 116 | 117 | ;; $PayoutsMaster$_contract_store 118 | () $PayoutsMaster$_contract_store((slice, int, int, tuple) v) impure inline; 119 | 120 | ;; $global_contractAddress 121 | slice $global_contractAddress((cell, cell) $s) impure inline; 122 | 123 | ;; $global_send 124 | () $global_send((int, slice, int, int, cell, cell, cell) $params) impure inline_ref; 125 | 126 | ;; $global_emit 127 | () $global_emit(cell $body) impure inline; 128 | 129 | ;; $Builder$_fun_asSlice 130 | slice $Builder$_fun_asSlice(builder $self) impure inline; 131 | 132 | ;; $global_normalizeKey 133 | slice $global_normalizeKey(slice $src) impure inline_ref; 134 | 135 | ;; $Slice$_fun_fromBase64 136 | slice $Slice$_fun_fromBase64(slice $self) impure inline_ref; 137 | 138 | ;; $String$_fun_fromBase64 139 | slice $String$_fun_fromBase64(slice $self) impure inline; 140 | 141 | ;; $PayoutBeacon$_init_child 142 | (cell, cell) $PayoutBeacon$_init_child(cell sys', slice $owner, slice $master) inline_ref; 143 | 144 | ;; $SendParameters$_constructor_bounce_to_value_mode_body_code_data 145 | ((int, slice, int, int, cell, cell, cell)) $SendParameters$_constructor_bounce_to_value_mode_body_code_data(int bounce, slice to, int value, int mode, cell body, cell code, cell data) inline; 146 | 147 | ;; $PayoutsMaster$_fun_publicKey 148 | ((slice, int, int, tuple), int) $PayoutsMaster$_fun_publicKey((slice, int, int, tuple) $self) impure inline_ref; 149 | 150 | ;; $PayoutsMaster$_fun_burn 151 | ((slice, int, int, tuple), tuple) $PayoutsMaster$_fun_burn((slice, int, int, tuple) $self) impure inline_ref; 152 | 153 | ;; $PayoutsMaster$_fun_forward 154 | ((slice, int, int, tuple), ()) $PayoutsMaster$_fun_forward((slice, int, int, tuple) $self, slice $to, cell $body, int $bounce, tuple $init) impure inline_ref; 155 | 156 | ;; $PayoutsMaster$_fun_reply 157 | ((slice, int, int, tuple), ()) $PayoutsMaster$_fun_reply((slice, int, int, tuple) $self, cell $body) impure inline; 158 | 159 | ;; $PayoutsMaster$_fun_notify 160 | ((slice, int, int, tuple), ()) $PayoutsMaster$_fun_notify((slice, int, int, tuple) $self, cell $body) impure inline; 161 | 162 | ;; $PayoutsMaster$_fun_requireOwner 163 | ((slice, int, int, tuple), ()) $PayoutsMaster$_fun_requireOwner((slice, int, int, tuple) $self) impure inline_ref; 164 | 165 | ;; $PayoutsMaster$_fun_owner 166 | ((slice, int, int, tuple), slice) $PayoutsMaster$_fun_owner((slice, int, int, tuple) $self) impure inline_ref; 167 | 168 | ;; $PayoutsMaster$_fun_requireNotStopped 169 | ((slice, int, int, tuple), ()) $PayoutsMaster$_fun_requireNotStopped((slice, int, int, tuple) $self) impure inline_ref; 170 | 171 | ;; $PayoutsMaster$_fun_requireStopped 172 | ((slice, int, int, tuple), ()) $PayoutsMaster$_fun_requireStopped((slice, int, int, tuple) $self) impure inline_ref; 173 | 174 | ;; $PayoutsMaster$_fun_stopped 175 | ((slice, int, int, tuple), int) $PayoutsMaster$_fun_stopped((slice, int, int, tuple) $self) impure inline_ref; 176 | 177 | ;; $TryPayout$_constructor_address_value 178 | ((slice, int)) $TryPayout$_constructor_address_value(slice address, int value) inline; 179 | 180 | ;; $EventPayoutCompleted$_constructor_address_value 181 | ((slice, int)) $EventPayoutCompleted$_constructor_address_value(slice address, int value) inline; 182 | 183 | ;; $SendParameters$_constructor_value_mode_to_body 184 | ((int, slice, int, int, cell, cell, cell)) $SendParameters$_constructor_value_mode_to_body(int value, int mode, slice to, cell body) inline; 185 | 186 | ;; $SendParameters$_constructor_value_mode_to_bounce_body 187 | ((int, slice, int, int, cell, cell, cell)) $SendParameters$_constructor_value_mode_to_bounce_body(int value, int mode, slice to, int bounce, cell body) inline; 188 | 189 | ;; $DeployOk$_constructor_queryId 190 | ((int)) $DeployOk$_constructor_queryId(int queryId) inline; 191 | -------------------------------------------------------------------------------- /sources/output/payouts_PayoutsMaster.md: -------------------------------------------------------------------------------- 1 | # TACT Compilation Report 2 | Contract: PayoutsMaster 3 | BOC Size: 2623 bytes 4 | 5 | # Types 6 | Total Types: 13 7 | 8 | ## StateInit 9 | TLB: `_ code:^cell data:^cell = StateInit` 10 | Signature: `StateInit{code:^cell,data:^cell}` 11 | 12 | ## Context 13 | TLB: `_ bounced:bool sender:address value:int257 raw:^slice = Context` 14 | Signature: `Context{bounced:bool,sender:address,value:int257,raw:^slice}` 15 | 16 | ## SendParameters 17 | TLB: `_ bounce:bool to:address value:int257 mode:int257 body:Maybe ^cell code:Maybe ^cell data:Maybe ^cell = SendParameters` 18 | Signature: `SendParameters{bounce:bool,to:address,value:int257,mode:int257,body:Maybe ^cell,code:Maybe ^cell,data:Maybe ^cell}` 19 | 20 | ## Deploy 21 | TLB: `deploy#946a98b6 queryId:uint64 = Deploy` 22 | Signature: `Deploy{queryId:uint64}` 23 | 24 | ## DeployOk 25 | TLB: `deploy_ok#aff90f57 queryId:uint64 = DeployOk` 26 | Signature: `DeployOk{queryId:uint64}` 27 | 28 | ## FactoryDeploy 29 | TLB: `factory_deploy#6d0ff13b queryId:uint64 cashback:address = FactoryDeploy` 30 | Signature: `FactoryDeploy{queryId:uint64,cashback:address}` 31 | 32 | ## ChangeOwner 33 | TLB: `change_owner#819dbe99 queryId:uint64 newOwner:address = ChangeOwner` 34 | Signature: `ChangeOwner{queryId:uint64,newOwner:address}` 35 | 36 | ## ChangeOwnerOk 37 | TLB: `change_owner_ok#327b2b4a queryId:uint64 newOwner:address = ChangeOwnerOk` 38 | Signature: `ChangeOwnerOk{queryId:uint64,newOwner:address}` 39 | 40 | ## TryPayout 41 | TLB: `try_payout#60912f1f address:address value:coins = TryPayout` 42 | Signature: `TryPayout{address:address,value:coins}` 43 | 44 | ## PayoutOk 45 | TLB: `payout_ok#d90aaa12 address:address value:coins = PayoutOk` 46 | Signature: `PayoutOk{address:address,value:coins}` 47 | 48 | ## PayoutFailed 49 | TLB: `payout_failed#25bd488e address:address value:coins = PayoutFailed` 50 | Signature: `PayoutFailed{address:address,value:coins}` 51 | 52 | ## BurnParameters 53 | TLB: `_ startAt:uint32 endAt:uint32 = BurnParameters` 54 | Signature: `BurnParameters{startAt:uint32,endAt:uint32}` 55 | 56 | ## EventPayoutCompleted 57 | TLB: `event_payout_completed#3af7b4d6 address:address value:coins = EventPayoutCompleted` 58 | Signature: `EventPayoutCompleted{address:address,value:coins}` 59 | 60 | # Get Methods 61 | Total Get Methods: 4 62 | 63 | ## publicKey 64 | 65 | ## burn 66 | 67 | ## owner 68 | 69 | ## stopped 70 | 71 | # Error Codes 72 | 2: Stack undeflow 73 | 3: Stack overflow 74 | 4: Integer overflow 75 | 5: Integer out of expected range 76 | 6: Invalid opcode 77 | 7: Type check error 78 | 8: Cell overflow 79 | 9: Cell underflow 80 | 10: Dictionary error 81 | 13: Out of gas error 82 | 32: Method ID not found 83 | 34: Action is invalid or not supported 84 | 37: Not enough TON 85 | 38: Not enough extra-currencies 86 | 128: Null reference exception 87 | 129: Invalid serialization prefix 88 | 130: Invalid incoming message 89 | 131: Constraints error 90 | 132: Access denied 91 | 133: Contract stopped 92 | 134: Invalid argument 93 | 135: Code of a contract was not found 94 | 136: Invalid address 95 | 137: Masterchain support is not enabled for this contract 96 | 4429: Invalid sender 97 | 12724: Invalid burn parameters 98 | 16059: Invalid value 99 | 19204: Insufficient balance on master 100 | 40368: Contract stopped 101 | 46762: Invalid string 102 | 48401: Invalid signature 103 | 53296: Contract not stopped 104 | 57826: Check withdraw min value -------------------------------------------------------------------------------- /sources/output/payouts_PayoutsMaster.pkg: -------------------------------------------------------------------------------- 1 | {"name":"PayoutsMaster","code":"te6ccgECPAEACjMAART/APSkE/S88sgLAQIBYgIDA3rQAdDTAwFxsKMB+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiFRQUwNvBPhhAvhi2zxVE9s88uCCGAQFAgEgDQ4E2u2i7fsBkjB/4HAh10nCH5UwINcLH94gghDZCqoSuo62MNMfAYIQ2QqqErry4IH6QAEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIAfoAWWwS2zx/4CCCECW9SI664wIgghCUapi2uuMCwAAGBwgJAJ7I+EMBzH8BygBVMFBDINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiM8Wy/8SygAhbrOOEX8BygABIG7y0IBvIgLLH8sflHAyygDiye1UA+JVMds8+EFvJBAjXwP4Q/goUoDbPHBZyHABywFzAcsBcAHLABLMzMn5AMhyAcsBcAHLABLKB8v/ydAg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIgRFNAscF8vSBSwT4J28QghBBkKsAJ6C88vRTVDE2CgKIMNMfAYIQJb1Ijrry4IH6QAEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIAfoAWWwSMHCAQIhBMH9EFFAzbW3bPH8MOgFQMNMfAYIQlGqYtrry4IHTPwExyAGCEK/5D1dYyx/LP8n4QgFwbds8fzkBCpEw4w1wIQKyyFmCEDr3tNZQA8sfASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFgH6AsnIgljAAAAAAAAAAAAAAAABActnzMlw+wCAQIgQNkFwf0QUUDNtbds8QAMLOgAqAAAAAFBheW91dCDRgW9tcGxldGVkACAAAAAAQWxyZWFkeSBwYWlkAgEgDxACASAcHQIRuhe9s82zxsQYGBECASASEwACIQIBIBQVAj20gjtnm2eNiCQN0kYNsyQN3loQDeRN4FxEDdJGDbvQGBkCEbFHds82zxsQYBgWAhGwfjbPNs8bEGAYFwACIwACIgGe7UTQ1AH4Y9IAAY43+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiAHT/9IA0gABl9Mf0x9ZbwKRbeIUQzBsFOD4KNcLCoMJuvLgiRoAAiABdPpAASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IgBgQEB1wDSAAGX0x/TH1lvApFt4kMwA9FY2zwbADZwUxFus44QAiBu8tCAbyIBgTG0Arny9JEy4gEB3bu9GCcFzsPV0srnsehOw51kqFG2aCcJ3WNS0rZHyzItOvLf3xYjmCcCBVwBuAZ2OUzlg6rkclssOCcJ2XTlqzTstzOg6WbZRm6KSCcEDOdWnnFfnSULAdYW4mR7KCcKPpAvltgVQjou8Eds5r0cuB4CAUgfIAAkgnCRMGhmpuikNn7gR74FUY+JABGwr7tRNDSAAGAAdbJu40NWlwZnM6Ly9RbVRwZFNDeG5iRWJNSnN0TnBpZm5lQnRUODlGWEhNZG9Fd0JKMlMxOXF6ZFBiggBPgg+QEggvAtyxmluJ250zd/xlHG+ba5Lbm+YkBgxipQVyzcl5aGOLqPK1v4QW8kMIE+uzOCEDuaygC+EvL0ghAF9eEAcnCIEDQQI0RAE21t2zx/2zHgIILwJQt24rlXb8a0xFEpSDAGsAA6DDm2965BPRd/TjR528q64wIgIjojJAAoAAAAAERlcG9zaXQgcmVjZWl2ZWQDOlvbPIIQBfXhAHD7AnCDBnCIJ1lEQBNtbds8f9sxLSU6BL6C8JhsK6Eku5KH60oL2NMQThwAZ6PJOVLYicdNCBhb0w1Nuo+VW9s8cIEAoHCIJ1lEQBNtbds8f9sx4CCC8GyPRPRf7bTN/tTejbFKpbE61V1DD3WdBmkhC3TEj+Pfui0mOicALAAAAABXaXRoZHJhdyBjb21wbGV0ZWQALAAAAABDb250cmFjdCBkZXN0cm95ZWQDjo6GW9s8f9sx4ILwvPr3dpB8cZzI03nY8ZSqqifoyihxzVkXgXIfIVpFRQG6joYw2zx/2zHgINdJwh+OiYAg1yGK2H/bMeAwKCkqBBDbPNs8MXCIEi0rLC8EENs82zwxf4gSLTEuLwS27aLt+9s8VTDbPPhBbyQwgT67M4IQO5rKAL4S8vQF2zyDCNcY+gAwyCcg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIzxYh+gLJ+QCCAL0RUTb5EBLy9CFuszAxMjMADoIA0DAi8vQAFgAAAABSZXN1bWVkABL4QlJAxwXy4IQAFgAAAABTdG9wcGVkAQ74QgF/bds8OQCcyAGeINdJwgCRf5Ug10rCAOKON4IAtqoh10mpOALAAJUh10rBApFw4vL0INdJwgCOFNMHIcIgkyHBf5Fw4pQCywcBkTHik9Qw0OLoMMnQABCCAJ2wIrPy9AH2INdJqwLIAY5vAdMHIcJAkyHBW5Fw4pYBpr9YywWOWCHCYJMhwXuRcOKWAaa5WMsFjkQhwi+TIcE6kXDilgGmBFjLBY4wIcAtkX+TIcAr4paAPjICywWOHCHAX5F/kyHAL+KWgD8yAssFmQHAPZPywIbfAeLi4uLi5DEgNAS6jzEhIG7y0IBvIvgjXLuPEV8ENIgQNEEw+EIBf23bPNsx4FMCvplSEKETqFmhqQSSXwPi3oIA4eIhghA7msoAvvL0gUsE+CdvEIIQQZCrACOgvPL0+EP4KFJw2zxcNTk2NwAszzEgqTgCIMMAmALJ0AKh1xgw4FvJ0AAwAAAAAFBheW91dCBhbHJlYWR5IGVuZGVkANYC0PQEMG0BgVvnAYAQ9A9vofLghwGBW+ciAoAQ9BfIAcj0AMkBzHABygBAA1kg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIzxYBINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiM8WyQH+cFnIcAHLAXMBywFwAcsAEszMyfkAyHIBywFwAcsAEsoHy//J0CDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IhQg8hZghBgkS8fUAPLHwEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIzxYB+gLJAX8IbwIQZxBWEEUQNDgBCEEw2zw5ApJtbSJus5lbIG7y0IBvIgGRMuL4QW8kE18D+CdvEAGhghAF9eEAuY6VghAF9eEAcPsCECRwAwSBAIJQI9s84BAkcAMEgEJQI9s8OjoByshxAcoBUAcBygBwAcoCUAUg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIzxZQA/oCcAHKaCNus5F/kyRus+KXMzMBcAHKAOMNIW6znH8BygABIG7y0IABzJUxcAHKAOLJAfsAOwCYfwHKAMhwAcoAcAHKACRus51/AcoABCBu8tCAUATMljQDcAHKAOIkbrOdfwHKAAQgbvLQgFAEzJY0A3ABygDicAHKAAJ/AcoAAslYzA==","abi":"{\"name\":\"PayoutsMaster\",\"types\":[{\"name\":\"StateInit\",\"header\":null,\"fields\":[{\"name\":\"code\",\"type\":{\"kind\":\"simple\",\"type\":\"cell\",\"optional\":false}},{\"name\":\"data\",\"type\":{\"kind\":\"simple\",\"type\":\"cell\",\"optional\":false}}]},{\"name\":\"Context\",\"header\":null,\"fields\":[{\"name\":\"bounced\",\"type\":{\"kind\":\"simple\",\"type\":\"bool\",\"optional\":false}},{\"name\":\"sender\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"value\",\"type\":{\"kind\":\"simple\",\"type\":\"int\",\"optional\":false,\"format\":257}},{\"name\":\"raw\",\"type\":{\"kind\":\"simple\",\"type\":\"slice\",\"optional\":false}}]},{\"name\":\"SendParameters\",\"header\":null,\"fields\":[{\"name\":\"bounce\",\"type\":{\"kind\":\"simple\",\"type\":\"bool\",\"optional\":false}},{\"name\":\"to\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"value\",\"type\":{\"kind\":\"simple\",\"type\":\"int\",\"optional\":false,\"format\":257}},{\"name\":\"mode\",\"type\":{\"kind\":\"simple\",\"type\":\"int\",\"optional\":false,\"format\":257}},{\"name\":\"body\",\"type\":{\"kind\":\"simple\",\"type\":\"cell\",\"optional\":true}},{\"name\":\"code\",\"type\":{\"kind\":\"simple\",\"type\":\"cell\",\"optional\":true}},{\"name\":\"data\",\"type\":{\"kind\":\"simple\",\"type\":\"cell\",\"optional\":true}}]},{\"name\":\"Deploy\",\"header\":2490013878,\"fields\":[{\"name\":\"queryId\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":64}}]},{\"name\":\"DeployOk\",\"header\":2952335191,\"fields\":[{\"name\":\"queryId\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":64}}]},{\"name\":\"FactoryDeploy\",\"header\":1829761339,\"fields\":[{\"name\":\"queryId\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":64}},{\"name\":\"cashback\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}}]},{\"name\":\"ChangeOwner\",\"header\":2174598809,\"fields\":[{\"name\":\"queryId\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":64}},{\"name\":\"newOwner\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}}]},{\"name\":\"ChangeOwnerOk\",\"header\":846932810,\"fields\":[{\"name\":\"queryId\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":64}},{\"name\":\"newOwner\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}}]},{\"name\":\"TryPayout\",\"header\":1620127519,\"fields\":[{\"name\":\"address\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"value\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":\"coins\"}}]},{\"name\":\"PayoutOk\",\"header\":3641354770,\"fields\":[{\"name\":\"address\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"value\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":\"coins\"}}]},{\"name\":\"PayoutFailed\",\"header\":633161870,\"fields\":[{\"name\":\"address\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"value\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":\"coins\"}}]},{\"name\":\"BurnParameters\",\"header\":null,\"fields\":[{\"name\":\"startAt\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":32}},{\"name\":\"endAt\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":32}}]},{\"name\":\"EventPayoutCompleted\",\"header\":989312214,\"fields\":[{\"name\":\"address\",\"type\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"value\",\"type\":{\"kind\":\"simple\",\"type\":\"uint\",\"optional\":false,\"format\":\"coins\"}}]}],\"receivers\":[{\"receiver\":\"internal\",\"message\":{\"kind\":\"text\"}},{\"receiver\":\"internal\",\"message\":{\"kind\":\"typed\",\"type\":\"PayoutOk\"}},{\"receiver\":\"internal\",\"message\":{\"kind\":\"typed\",\"type\":\"PayoutFailed\"}},{\"receiver\":\"internal\",\"message\":{\"kind\":\"text\",\"text\":\"Deposit\"}},{\"receiver\":\"internal\",\"message\":{\"kind\":\"text\",\"text\":\"Withdraw\"}},{\"receiver\":\"internal\",\"message\":{\"kind\":\"text\",\"text\":\"Destroy\"}},{\"receiver\":\"internal\",\"message\":{\"kind\":\"typed\",\"type\":\"Deploy\"}},{\"receiver\":\"internal\",\"message\":{\"kind\":\"text\",\"text\":\"Resume\"}},{\"receiver\":\"internal\",\"message\":{\"kind\":\"text\",\"text\":\"Stop\"}}],\"getters\":[{\"name\":\"publicKey\",\"arguments\":[],\"returnType\":{\"kind\":\"simple\",\"type\":\"int\",\"optional\":false,\"format\":257}},{\"name\":\"burn\",\"arguments\":[],\"returnType\":{\"kind\":\"simple\",\"type\":\"BurnParameters\",\"optional\":true}},{\"name\":\"owner\",\"arguments\":[],\"returnType\":{\"kind\":\"simple\",\"type\":\"address\",\"optional\":false}},{\"name\":\"stopped\",\"arguments\":[],\"returnType\":{\"kind\":\"simple\",\"type\":\"bool\",\"optional\":false}}],\"errors\":{\"2\":{\"message\":\"Stack undeflow\"},\"3\":{\"message\":\"Stack overflow\"},\"4\":{\"message\":\"Integer overflow\"},\"5\":{\"message\":\"Integer out of expected range\"},\"6\":{\"message\":\"Invalid opcode\"},\"7\":{\"message\":\"Type check error\"},\"8\":{\"message\":\"Cell overflow\"},\"9\":{\"message\":\"Cell underflow\"},\"10\":{\"message\":\"Dictionary error\"},\"13\":{\"message\":\"Out of gas error\"},\"32\":{\"message\":\"Method ID not found\"},\"34\":{\"message\":\"Action is invalid or not supported\"},\"37\":{\"message\":\"Not enough TON\"},\"38\":{\"message\":\"Not enough extra-currencies\"},\"128\":{\"message\":\"Null reference exception\"},\"129\":{\"message\":\"Invalid serialization prefix\"},\"130\":{\"message\":\"Invalid incoming message\"},\"131\":{\"message\":\"Constraints error\"},\"132\":{\"message\":\"Access denied\"},\"133\":{\"message\":\"Contract stopped\"},\"134\":{\"message\":\"Invalid argument\"},\"135\":{\"message\":\"Code of a contract was not found\"},\"136\":{\"message\":\"Invalid address\"},\"137\":{\"message\":\"Masterchain support is not enabled for this contract\"},\"4429\":{\"message\":\"Invalid sender\"},\"12724\":{\"message\":\"Invalid burn parameters\"},\"16059\":{\"message\":\"Invalid value\"},\"19204\":{\"message\":\"Insufficient balance on master\"},\"40368\":{\"message\":\"Contract stopped\"},\"46762\":{\"message\":\"Invalid string\"},\"48401\":{\"message\":\"Invalid signature\"},\"53296\":{\"message\":\"Contract not stopped\"},\"57826\":{\"message\":\"Check withdraw min value\"}},\"interfaces\":[\"org.ton.introspection.v0\",\"org.ton.abi.ipfs.v0\",\"org.ton.deploy.lazy.v0\",\"org.ton.chain.workchain.v0\",\"org.ton.ownable\",\"org.ton.resumable\",\"org.ton.stoppable\"]}","init":{"kind":"direct","args":[{"name":"owner","type":{"kind":"simple","type":"address","optional":false}},{"name":"publicKey","type":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"burn","type":{"kind":"simple","type":"BurnParameters","optional":true}}],"prefix":{"bits":1,"value":0},"deployment":{"kind":"system-cell","system":"te6cckECVwEADdkAAQHAAQIBIDgCAQW/+RQDART/APSkE/S88sgLBAIBYhMFAgEgCwYCASAJBwIBSEIIAHWybuNDVpcGZzOi8vUW1UcGRTQ3huYkViTUpzdE5waWZuZUJ0VDg5RlhITWRvRXdCSjJTMTlxemRQYoIAHdu70YJwXOw9XSyuex6E7DnWSoUbZoJwndY1LStkfLMi068t/fFiOYJwIFXAG4BnY5TOWDquRyWyw4JwnZdOWrNOy3M6DpZtlGbopIJwQM51aecV+dJQsB1hbiZHsoJwo+kC+W2BVCOi7wR2zmvRy4CgAkgnCRMGhmpuikNn7gR74FUY+JAgEgEgwCASAODQI9tII7Z5tnjYgkDdJGDbMkDd5aEA3kTeBcRA3SRg270DVIAgEgEA8CEbB+Ns82zxsQYDVGAhGxR3bPNs8bEGA1EQACIwIRuhe9s82zxsQYNUEDetAB0NMDAXGwowH6QAEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIVFBTA28E+GEC+GLbPFUT2zzy4II1FRQAnsj4QwHMfwHKAFUwUEMg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIzxbL/xLKACFus44RfwHKAAEgbvLQgG8iAssfyx+UcDLKAOLJ7VQE2u2i7fsBkjB/4HAh10nCH5UwINcLH94gghDZCqoSuo62MNMfAYIQ2QqqErry4IH6QAEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIAfoAWWwS2zx/4CCCECW9SI664wIgghCUapi2uuMCwAAwLi0WAQqRMOMNcBcE+CD5ASCC8C3LGaW4nbnTN3/GUcb5trktub5iQGDGKlBXLNyXloY4uo8rW/hBbyQwgT67M4IQO5rKAL4S8vSCEAX14QBycIgQNBAjREATbW3bPH/bMeAggvAlC3biuVdvxrTEUSlIMAawADoMObb3rkE9F39ONHnbyrrjAiAsUSkYBL6C8JhsK6Eku5KH60oL2NMQThwAZ6PJOVLYicdNCBhb0w1Nuo+VW9s8cIEAoHCIJ1lEQBNtbds8f9sx4CCC8GyPRPRf7bTN/tTejbFKpbE61V1DD3WdBmkhC3TEj+PfuisoURkDjo6GW9s8f9sx4ILwvPr3dpB8cZzI03nY8ZSqqifoyihxzVkXgXIfIVpFRQG6joYw2zx/2zHgINdJwh+OiYAg1yGK2H/bMeAwJCIaBLbtou372zxVMNs8+EFvJDCBPrszghA7msoAvhLy9AXbPIMI1xj6ADDIJyDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFiH6Asn5AIIAvRFRNvkQEvL0IW6zITQfGwS6jzEhIG7y0IBvIvgjXLuPEV8ENIgQNEEw+EIBf23bPNsx4FMCvplSEKETqFmhqQSSXwPi3oIA4eIhghA7msoAvvL0gUsE+CdvEIIQQZCrACOgvPL0+EP4KFJw2zxcHlAzHAH+cFnIcAHLAXMBywFwAcsAEszMyfkAyHIBywFwAcsAEsoHy//J0CDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IhQg8hZghBgkS8fUAPLHwEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIzxYB+gLJAX8IbwIQZxBWEEUQNB0BCEEw2zxQADAAAAAAUGF5b3V0IGFscmVhZHkgZW5kZWQB9iDXSasCyAGObwHTByHCQJMhwVuRcOKWAaa/WMsFjlghwmCTIcF7kXDilgGmuVjLBY5EIcIvkyHBOpFw4pYBpgRYywWOMCHALZF/kyHAK+KWgD4yAssFjhwhwF+Rf5MhwC/iloA/MgLLBZkBwD2T8sCG3wHi4uLi4uQxICAALM8xIKk4AiDDAJgCydACodcYMOBbydAAnMgBniDXScIAkX+VINdKwgDijjeCALaqIddJqTgCwACVIddKwQKRcOLy9CDXScIAjhTTByHCIJMhwX+RcOKUAssHAZEx4pPUMNDi6DDJ0AQQ2zzbPDF/iBIrNCMlABYAAAAAU3RvcHBlZAQQ2zzbPDFwiBIrJyYlAQ74QgF/bds8UAAWAAAAAFJlc3VtZWQADoIA0DAi8vQALAAAAABDb250cmFjdCBkZXN0cm95ZWQDOlvbPIIQBfXhAHD7AnCDBnCIJ1lEQBNtbds8f9sxKypRACwAAAAAV2l0aGRyYXcgY29tcGxldGVkABL4QlJAxwXy4IQAKAAAAABEZXBvc2l0IHJlY2VpdmVkAVAw0x8BghCUapi2uvLggdM/ATHIAYIQr/kPV1jLH8s/yfhCAXBt2zx/UAKIMNMfAYIQJb1Ijrry4IH6QAEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIAfoAWWwSMHCAQIhBMH9EFFAzbW3bPH8vUQAgAAAAAEFscmVhZHkgcGFpZAPiVTHbPPhBbyQQI18D+EP4KFKA2zxwWchwAcsBcwHLAXABywASzMzJ+QDIcgHLAXABywASygfL/8nQINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiIERTQLHBfL0gUsE+CdvEIIQQZCrACegvPL0U1Q0MzECsshZghA697TWUAPLHwEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIzxYB+gLJyIJYwAAAAAAAAAAAAAAAAQHLZ8zJcPsAgECIEDZBcH9EFFAzbW3bPEADMlEAKgAAAABQYXlvdXQg0YFvbXBsZXRlZADWAtD0BDBtAYFb5wGAEPQPb6Hy4IcBgVvnIgKAEPQXyAHI9ADJAcxwAcoAQANZINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiM8WASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFskAEIIAnbAis/L0AZ7tRNDUAfhj0gABjjf6QAEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIAdP/0gDSAAGX0x/TH1lvApFt4hRDMGwU4Pgo1wsKgwm68uCJNgF0+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiAGBAQHXANIAAZfTH9MfWW8CkW3iQzAD0VjbPDcANnBTEW6zjhACIG7y0IBvIgGBMbQCufL0kTLiAQEFvt88OQEU/wD0pBP0vPLICzoCAWJJOwIBIEQ8AgEgQz0CAUhCPgIBIEA/AHWs3caGrS4MzmdF5eotqo4pb0wozsbI7i4vSmxKSgZJCWjqJw4PLc1IrccrCghtbmxoiIhKDS4pbGzQQAIRrt7tnm2eNhjAVEEAAiEAEbCvu1E0NIAAYAC5u70YJwXOw9XSyuex6E7DnWSoUbZoJwndY1LStkfLMi068t/fFiOYJwIFXAG4BnY5TOWDquRyWyw4JwnZdOWrNOy3M6DpZtlGbopIJwQM51aecV+dJQsB1hbiZHsoAgEgR0UCEbhR3bPNs8bDGFRGAAIiAhG7bC2zzbPGwxhUSAACIAN60AHQ0wMBcbCjAfpAASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IhUUFMDbwT4YQL4Yts8VRLbPPLgglRLSgCcyPhDAcx/AcoAVSBaINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiM8WWCDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFsoAye1UBLABjzaAINchcCHXScIflTAg1wsf3oIQ2QqqErqPGdMfAYIQ2QqqErry4IFtMVtwiFIwcG3bPH/gMH/gcCHXScIflTAg1wsf3iCCEGCRLx+64wKCEJRqmLa6U1BNTAFYjqfTHwGCEJRqmLa68uCB0z8BMcgBghCv+Q9XWMsfyz/J+EIBcG3bPH/gMHBQAWYw0x8BghBgkS8fuvLggfpAASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IgB+gBZbBJOAp4x+EFvJBAjXwOBEU1TQccF8vQis462URQByFmCECW9SI5QA8sfASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFgH6Aslwbds84w1/UE8BcjJ/URQByFmCENkKqhJQA8sfASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFgH6AskSf23bPFACkm1tIm6zmVsgbvLQgG8iAZEy4vhBbyQTXwP4J28QAaGCEAX14QC5jpWCEAX14QBw+wIQJHADBIEAglAj2zzgECRwAwSAQlAj2zxRUQHKyHEBygFQBwHKAHABygJQBSDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IjPFlAD+gJwAcpoI26zkX+TJG6z4pczMwFwAcoA4w0hbrOcfwHKAAEgbvLQgAHMlTFwAcoA4skB+wBSAJh/AcoAyHABygBwAcoAJG6znX8BygAEIG7y0IBQBMyWNANwAcoA4iRus51/AcoABCBu8tCAUATMljQDcAHKAOJwAcoAAn8BygACyVjMACIAAAAAUGF5b3V0IGZhaWxlZAG87UTQ1AH4Y9IAAY5G+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiAH6QAEg10mBAQu68uCIINcLCiCBBP+68tCJgwm68uCIAdIAVSBsE+D4KNcLCoMJuvLgiVUBivpAASDXSYEBC7ry4Igg1wsKIIEE/7ry0ImDCbry4IgB+kABINdJgQELuvLgiCDXCwoggQT/uvLQiYMJuvLgiBIC0QHbPFYAAnBm5SJR"}},"sources":{"sources/contract.tact":"aW1wb3J0ICJAc3RkbGliL2RlcGxveSI7CmltcG9ydCAiQHN0ZGxpYi9vd25hYmxlIjsKaW1wb3J0ICJAc3RkbGliL3N0b3BwYWJsZSI7CgptZXNzYWdlIFRyeVBheW91dCB7CiAgICBhZGRyZXNzOiBBZGRyZXNzOwogICAgdmFsdWU6IEludCBhcyBjb2luczsKfQoKbWVzc2FnZSBQYXlvdXRPayB7CiAgICBhZGRyZXNzOiBBZGRyZXNzOwogICAgdmFsdWU6IEludCBhcyBjb2luczsKfQoKbWVzc2FnZSBQYXlvdXRGYWlsZWQgewogICAgYWRkcmVzczogQWRkcmVzczsKICAgIHZhbHVlOiBJbnQgYXMgY29pbnM7Cn0KCnN0cnVjdCBCdXJuUGFyYW1ldGVycyB7CiAgICBzdGFydEF0OiBJbnQgYXMgdWludDMyOwogICAgZW5kQXQ6IEludCBhcyB1aW50MzI7Cn0KCm1lc3NhZ2UgRXZlbnRQYXlvdXRDb21wbGV0ZWQgewogICAgYWRkcmVzczogQWRkcmVzczsKICAgIHZhbHVlOiBJbnQgYXMgY29pbnM7Cn0KCmNvbnRyYWN0IFBheW91dEJlYWNvbiB3aXRoIE93bmFibGUsIERlcGxveWFibGUgewogICAgb3ZlcnJpZGUgY29uc3Qgc3RvcmFnZVJlc2VydmU6IEludCA9IHRvbigiMC4xIik7CgogICAgb3duZXI6IEFkZHJlc3M7CiAgICBtYXN0ZXI6IEFkZHJlc3M7CiAgICBjb21wbGV0ZWQ6IEJvb2w7CgogICAgaW5pdChvd25lcjogQWRkcmVzcywgbWFzdGVyOiBBZGRyZXNzKSB7CiAgICAgICAgc2VsZi5vd25lciA9IG93bmVyOwogICAgICAgIHNlbGYubWFzdGVyID0gbWFzdGVyOwogICAgICAgIHNlbGYuY29tcGxldGVkID0gZmFsc2U7CiAgICB9CgogICAgcmVjZWl2ZShtc2c6IFRyeVBheW91dCkgewoKICAgICAgICAvLyBDaGVjayBjb250ZXh0CiAgICAgICAgbGV0IGN0eDogQ29udGV4dCA9IGNvbnRleHQoKTsKICAgICAgICByZXF1aXJlKGN0eC5zZW5kZXIgPT0gc2VsZi5tYXN0ZXIsICJJbnZhbGlkIHNlbmRlciIpOwoKICAgICAgICAvLyBTZW5kIHJlc3BvbnNlCiAgICAgICAgaWYgKCFzZWxmLmNvbXBsZXRlZCkgewogICAgICAgICAgICBzZWxmLmNvbXBsZXRlZCA9IHRydWU7CiAgICAgICAgICAgIHNlbGYuZm9yd2FyZChjdHguc2VuZGVyLCBQYXlvdXRPa3sgdmFsdWU6IG1zZy52YWx1ZSwgYWRkcmVzczogc2VsZi5vd25lciB9LnRvQ2VsbCgpLCB0cnVlLCBudWxsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWxmLmZvcndhcmQoY3R4LnNlbmRlciwgUGF5b3V0RmFpbGVkeyB2YWx1ZTogbXNnLnZhbHVlLCBhZGRyZXNzOiBzZWxmLm93bmVyIH0udG9DZWxsKCksIGZhbHNlLCBudWxsKTsKICAgICAgICB9CiAgICB9CgogICAgYm91bmNlZChtc2c6IGJvdW5jZWQ8UGF5b3V0T2s+KSB7CgogICAgICAgIC8vIFJlc2V0IGNvbXBsZXRlZCBmbGFnIGlzIG91ciBtZXNzYWdlIGJvdW5jZWQKICAgICAgICBzZWxmLmNvbXBsZXRlZCA9IGZhbHNlOwoKICAgICAgICAvLyBTZW5kIG5vdGlmaWNhdGlvbgogICAgICAgIHNlbGYuZm9yd2FyZChzZWxmLm93bmVyLCAiUGF5b3V0IGZhaWxlZCIuYXNDb21tZW50KCksIGZhbHNlLCBudWxsKTsKICAgIH0KCiAgICBnZXQgZnVuIG1hc3RlcigpOiBBZGRyZXNzIHsKICAgICAgICByZXR1cm4gc2VsZi5tYXN0ZXI7CiAgICB9CgogICAgZ2V0IGZ1biBjb21wbGV0ZWQoKTogQm9vbCB7CiAgICAgICAgcmV0dXJuIHNlbGYuY29tcGxldGVkOwogICAgfQp9Cgpjb250cmFjdCBQYXlvdXRzTWFzdGVyIHdpdGggRGVwbG95YWJsZSwgT3duYWJsZSwgUmVzdW1hYmxlIHsKICAgIG92ZXJyaWRlIGNvbnN0IHN0b3JhZ2VSZXNlcnZlOiBJbnQgPSB0b24oIjAuMSIpOwoKICAgIG93bmVyOiBBZGRyZXNzOwogICAgcHVibGljS2V5OiBJbnQgYXMgdWludDI1NjsKICAgIHN0b3BwZWQ6IEJvb2w7CiAgICBidXJuOiBCdXJuUGFyYW1ldGVycz87CgogICAgaW5pdChvd25lcjogQWRkcmVzcywgcHVibGljS2V5OiBJbnQsIGJ1cm46IEJ1cm5QYXJhbWV0ZXJzPykgewogICAgICAgIHNlbGYub3duZXIgPSBvd25lcjsKICAgICAgICBzZWxmLnB1YmxpY0tleSA9IHB1YmxpY0tleTsKICAgICAgICBzZWxmLnN0b3BwZWQgPSBmYWxzZTsKICAgICAgICBzZWxmLmJ1cm4gPSBidXJuOwogICAgICAgIGlmIChidXJuICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGI6IEJ1cm5QYXJhbWV0ZXJzID0gYnVybiEhOwogICAgICAgICAgICByZXF1aXJlKGIuc3RhcnRBdCA8IGIuZW5kQXQsICJJbnZhbGlkIGJ1cm4gcGFyYW1ldGVycyIpOwogICAgICAgIH0KICAgIH0KCiAgICAvLwogICAgLy8gUGF5b3V0IG9wZXJhdGlvbnMKICAgIC8vCgogICAgcmVjZWl2ZSh3aXRoZHJhdzogU3RyaW5nKSB7CgogICAgICAgIC8vIE5vcm1hbGl6ZQogICAgICAgIHdpdGhkcmF3ID0gbm9ybWFsaXplS2V5KHdpdGhkcmF3KTsKCiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgY29udHJhY3QgaXMgbm90IHN0b3BwZWQKICAgICAgICBzZWxmLnJlcXVpcmVOb3RTdG9wcGVkKCk7CgogICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBjb250ZXh0CiAgICAgICAgbGV0IGN0eDogQ29udGV4dCA9IGNvbnRleHQoKTsKICAgICAgICByZXF1aXJlKGN0eC52YWx1ZSA+PSB0b24oIjEuMCIpLCAiSW52YWxpZCB2YWx1ZSIpOwoKICAgICAgICAvLyBQYXJzZSB0aGUgd2l0aGRyYXcgbWVzc2FnZQogICAgICAgIGxldCBtc2c6IFNsaWNlID0gd2l0aGRyYXcuZnJvbUJhc2U2NCgpOwogICAgICAgIGxldCBzaWduYXR1cmU6IFNsaWNlID0gbXNnLmxvYWRCaXRzKDUxMik7CiAgICAgICAgbGV0IHZhbHVlOiBJbnQgPSBtc2cubG9hZENvaW5zKCk7CgogICAgICAgIC8vIFZlcmlmeSB0aGUgc2lnbmF0dXJlCiAgICAgICAgbGV0IHNpZ0NlbGw6IENlbGwgPSBiZWdpbkNlbGwoKQogICAgICAgICAgICAuc3RvcmVBZGRyZXNzKGN0eC5zZW5kZXIpCiAgICAgICAgICAgIC5zdG9yZUNvaW5zKHZhbHVlKQogICAgICAgICAgICAuZW5kQ2VsbCgpOwogICAgICAgIGxldCBoYXNoOiBJbnQgPSBzaWdDZWxsLmhhc2goKTsKICAgICAgICByZXF1aXJlKGNoZWNrU2lnbmF0dXJlKGhhc2gsIHNpZ25hdHVyZSwgc2VsZi5wdWJsaWNLZXkpLCAiSW52YWxpZCBzaWduYXR1cmUiKTsKCiAgICAgICAgLy8gQWRqdXN0IHZhbHVlIGlmIGJ1cm4gaXMgc2V0CiAgICAgICAgaWYgKHNlbGYuYnVybiAhPSBudWxsKSB7CiAgICAgICAgICAgIGxldCBidXJuOiBCdXJuUGFyYW1ldGVycyA9IHNlbGYuYnVybiEhOwogICAgICAgICAgICBsZXQgbm93OiBJbnQgPSBub3coKTsKICAgICAgICAgICAgaWYgKGJ1cm4uZW5kQXQgPD0gbm93KSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlcGx5KCJQYXlvdXQgYWxyZWFkeSBlbmRlZCIuYXNDb21tZW50KCkpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChub3cgPj0gYnVybi5zdGFydEF0KSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSAqIChidXJuLmVuZEF0IC0gbm93KSkgLyAoYnVybi5lbmRBdCAtIGJ1cm4uc3RhcnRBdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIG1pbiB2YWx1ZQogICAgICAgIHJlcXVpcmUodmFsdWUgPj0gdG9uKCIxLjAiKSwgIkNoZWNrIHdpdGhkcmF3IG1pbiB2YWx1ZSIpOwoKICAgICAgICAvLyBDaGVjayBiYWxhbmNlIGJlZm9yZSBzZW5kaW5nIGZvcndhcmQgdG8gc2F2ZSBzb21lIGdhcyBvbiBkZXBsZXRpb24KICAgICAgICByZXF1aXJlKG15QmFsYW5jZSgpID4gdG9uKCIxLjAiKSArIHNlbGYuc3RvcmFnZVJlc2VydmUgKyB2YWx1ZSwgIkluc3VmZmljaWVudCBiYWxhbmNlIG9uIG1hc3RlciIpOwoKICAgICAgICAvLyBTZW5kIG1lc3NhZ2UgdG8gYmFjb24KICAgICAgICBsZXQgaW5pdDogU3RhdGVJbml0ID0gaW5pdE9mIFBheW91dEJlYWNvbihjdHguc2VuZGVyLCBteUFkZHJlc3MoKSk7CiAgICAgICAgbGV0IGFkZHJlc3M6IEFkZHJlc3MgPSBjb250cmFjdEFkZHJlc3MoaW5pdCk7CiAgICAgICAgc2VsZi5mb3J3YXJkKGFkZHJlc3MsIFRyeVBheW91dHsgYWRkcmVzczogY3R4LnNlbmRlciwgdmFsdWU6IHZhbHVlIH0udG9DZWxsKCksIHRydWUsIGluaXQpOwogICAgfQoKICAgIHJlY2VpdmUob2s6IFBheW91dE9rKSB7CiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgY29udHJhY3QgaXMgbm90IHN0b3BwZWQKICAgICAgICBzZWxmLnJlcXVpcmVOb3RTdG9wcGVkKCk7CgogICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBjb250ZXh0CiAgICAgICAgbGV0IGN0eDogQ29udGV4dCA9IGNvbnRleHQoKTsKICAgICAgICBsZXQgaW5pdDogU3RhdGVJbml0ID0gaW5pdE9mIFBheW91dEJlYWNvbihvay5hZGRyZXNzLCBteUFkZHJlc3MoKSk7CiAgICAgICAgbGV0IGJlYWNvbkFkZHJlc3M6IEFkZHJlc3MgPSBjb250cmFjdEFkZHJlc3MoaW5pdCk7CiAgICAgICAgcmVxdWlyZShjdHguc2VuZGVyID09IGJlYWNvbkFkZHJlc3MsICJJbnZhbGlkIHNlbmRlciIpOwoKICAgICAgICAvLyBSZXF1aXJlIHJlcXVpcmVkIGJhbGFuY2UKICAgICAgICByZXF1aXJlKG15QmFsYW5jZSgpID4gdG9uKCIxLjAiKSArIHNlbGYuc3RvcmFnZVJlc2VydmUgKyBvay52YWx1ZSwgIkluc3VmZmljaWVudCBiYWxhbmNlIG9uIG1hc3RlciIpOwoKICAgICAgICAvLyBFbWl0IGV2ZW50CiAgICAgICAgZW1pdChFdmVudFBheW91dENvbXBsZXRlZHsgYWRkcmVzczogb2suYWRkcmVzcywgdmFsdWU6IG9rLnZhbHVlIH0udG9DZWxsKCkpOwoKICAgICAgICAvLyBTZW5kIHRoZSBwYXlvdXQKICAgICAgICBzZW5kKFNlbmRQYXJhbWV0ZXJzewogICAgICAgICAgICB2YWx1ZTogb2sudmFsdWUsIAogICAgICAgICAgICBtb2RlOiBTZW5kUmVtYWluaW5nVmFsdWUsCiAgICAgICAgICAgIHRvOiBvay5hZGRyZXNzLCAKICAgICAgICAgICAgYm9keTogIlBheW91dCDRgW9tcGxldGVkIi5hc0NvbW1lbnQoKQogICAgICAgIH0pOwogICAgfQoKICAgIHJlY2VpdmUoZmFpbGVkOiBQYXlvdXRGYWlsZWQpIHsKICAgICAgICBzZW5kKFNlbmRQYXJhbWV0ZXJzewogICAgICAgICAgICB2YWx1ZTogMCwgCiAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSwKICAgICAgICAgICAgdG86IGZhaWxlZC5hZGRyZXNzLCAKICAgICAgICAgICAgYm9keTogIkFscmVhZHkgcGFpZCIuYXNDb21tZW50KCkKICAgICAgICB9KTsKICAgIH0KCiAgICAvLwogICAgLy8gQWRtaW4gb3BlcmF0aW9ucwogICAgLy8KCiAgICByZWNlaXZlKCJEZXBvc2l0IikgewogICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIGlzIGFsbG93ZWQgZm9yIGFueW9uZQogICAgICAgIGxldCBjdHg6IENvbnRleHQgPSBjb250ZXh0KCk7CiAgICAgICAgcmVxdWlyZShjdHgudmFsdWUgPj0gdG9uKCIxLjAiKSwgIkludmFsaWQgdmFsdWUiKTsKICAgICAgICBzZW5kKFNlbmRQYXJhbWV0ZXJzewogICAgICAgICAgICB2YWx1ZTogdG9uKCIwLjEiKSwgCiAgICAgICAgICAgIG1vZGU6IFNlbmRJZ25vcmVFcnJvcnMsCiAgICAgICAgICAgIHRvOiBjdHguc2VuZGVyLCAKICAgICAgICAgICAgYm91bmNlOiBmYWxzZSwKICAgICAgICAgICAgYm9keTogIkRlcG9zaXQgcmVjZWl2ZWQiLmFzQ29tbWVudCgpCiAgICAgICAgfSk7CiAgICB9CgogICAgcmVjZWl2ZSgiV2l0aGRyYXciKSB7CiAgICAgICAgc2VsZi5yZXF1aXJlT3duZXIoKTsKICAgICAgICBuYXRpdmVSZXNlcnZlKHNlbGYuc3RvcmFnZVJlc2VydmUsIDApOwogICAgICAgIHNlbmQoU2VuZFBhcmFtZXRlcnN7CiAgICAgICAgICAgIHZhbHVlOiAwLCAKICAgICAgICAgICAgbW9kZTogU2VuZFJlbWFpbmluZ0JhbGFuY2UsCiAgICAgICAgICAgIHRvOiBzZWxmLm93bmVyLCAKICAgICAgICAgICAgYm91bmNlOiBmYWxzZSwKICAgICAgICAgICAgYm9keTogIldpdGhkcmF3IGNvbXBsZXRlZCIuYXNDb21tZW50KCkKICAgICAgICB9KTsKICAgIH0KCiAgICByZWNlaXZlKCJEZXN0cm95IikgewogICAgICAgIHNlbGYucmVxdWlyZU93bmVyKCk7CiAgICAgICAgc2VuZChTZW5kUGFyYW1ldGVyc3sKICAgICAgICAgICAgdmFsdWU6IDAsIAogICAgICAgICAgICBtb2RlOiBTZW5kUmVtYWluaW5nQmFsYW5jZSArIFNlbmREZXN0cm95SWZaZXJvLAogICAgICAgICAgICB0bzogc2VsZi5vd25lciwgCiAgICAgICAgICAgIGJvdW5jZTogZmFsc2UsCiAgICAgICAgICAgIGJvZHk6ICJDb250cmFjdCBkZXN0cm95ZWQiLmFzQ29tbWVudCgpCiAgICAgICAgfSk7CiAgICB9CgogICAgLy8gR2V0dGVycwoKICAgIGdldCBmdW4gcHVibGljS2V5KCk6IEludCB7CiAgICAgICAgcmV0dXJuIHNlbGYucHVibGljS2V5OwogICAgfQoKICAgIGdldCBmdW4gYnVybigpOiBCdXJuUGFyYW1ldGVycz8gewogICAgICAgIHJldHVybiBzZWxmLmJ1cm47CiAgICB9IAp9CgpmdW4gbm9ybWFsaXplS2V5KHNyYzogU3RyaW5nKTogU3RyaW5nIHsKICAgIGxldCBvdXQ6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKTsKICAgIGxldCBzbGljZTogU2xpY2UgPSBzcmMuYXNTbGljZSgpOwogICAgd2hpbGUoc2xpY2UuYml0cygpID4gMCB8fCBzbGljZS5yZWZzKCkgPiAwKSB7CiAgICAgICAgcmVxdWlyZShzbGljZS5iaXRzKCkgJSA4ID09IDAgJiYgc2xpY2UucmVmcygpIDw9IDEsICJJbnZhbGlkIHN0cmluZyIpOwogICAgICAgIGlmIChzbGljZS5iaXRzKCkgPiAwKSB7CiAgICAgICAgICAgIGxldCBjaDogSW50ID0gc2xpY2UubG9hZFVpbnQoOCk7CiAgICAgICAgICAgIGlmIChjaCA+PSAzMyAmJiBjaCA8PSAxMjYpIHsKICAgICAgICAgICAgICAgIG91dCA9IG91dC5zdG9yZVVpbnQoY2gsIDgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2xpY2UgPSBzbGljZS5sb2FkUmVmKCkuYmVnaW5QYXJzZSgpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBvdXQuYXNTbGljZSgpLmFzU3RyaW5nKCk7Cn0="},"compiler":{"name":"tact","version":"1.1.2","parameters":"{\"entrypoint\":\"./sources/contract.tact\",\"options\":{}}"}} -------------------------------------------------------------------------------- /sources/output/payouts_PayoutsMaster.stdlib.fc: -------------------------------------------------------------------------------- 1 | global (int, slice, int, slice) __tact_context; 2 | global slice __tact_context_sender; 3 | global cell __tact_context_sys; 4 | global int __tact_randomized; 5 | 6 | slice __tact_verify_address(slice address) inline { 7 | throw_unless(136, address.slice_bits() == 267); 8 | var h = address.preload_uint(11); 9 | throw_if(137, h == 1279); 10 | throw_unless(136, h == 1024); 11 | return address; 12 | } 13 | 14 | (slice, slice) __tact_load_address(slice cs) inline { 15 | slice raw = cs~load_msg_addr(); 16 | return (cs, __tact_verify_address(raw)); 17 | } 18 | 19 | builder __tact_store_address(builder b, slice address) inline { 20 | return b.store_slice(__tact_verify_address(address)); 21 | } 22 | 23 | slice __tact_create_address(int chain, int hash) inline { 24 | var b = begin_cell(); 25 | b = b.store_uint(2, 2); 26 | b = b.store_uint(0, 1); 27 | b = b.store_int(chain, 8); 28 | b = b.store_uint(hash, 256); 29 | var addr = b.end_cell().begin_parse(); 30 | return __tact_verify_address(addr); 31 | } 32 | 33 | slice __tact_compute_contract_address(int chain, cell code, cell data) inline { 34 | var b = begin_cell(); 35 | b = b.store_uint(0, 2); 36 | b = b.store_uint(3, 2); 37 | b = b.store_uint(0, 1); 38 | b = b.store_ref(code); 39 | b = b.store_ref(data); 40 | var hash = cell_hash(b.end_cell()); 41 | return __tact_create_address(chain, hash); 42 | } 43 | 44 | int __tact_my_balance() inline { 45 | return pair_first(get_balance()); 46 | } 47 | 48 | forall X -> X __tact_not_null(X x) inline { 49 | throw_if(128, null?(x)); return x; 50 | } 51 | 52 | (int, slice, int, slice) __tact_context_get() inline { 53 | return __tact_context; 54 | } 55 | 56 | slice __tact_context_get_sender() inline { 57 | return __tact_context_sender; 58 | } 59 | 60 | builder __tact_store_bool(builder b, int v) inline { 61 | return b.store_int(v, 1); 62 | } 63 | 64 | int __tact_slice_eq_bits(slice a, slice b) inline { 65 | return equal_slice_bits(a, b); 66 | } 67 | 68 | cell __tact_dict_set_code(cell dict, int id, cell code) inline { 69 | return udict_set_ref(dict, 16, id, code); 70 | } 71 | 72 | cell __tact_dict_get_code(cell dict, int id) inline { 73 | var (data, ok) = udict_get_ref?(dict, 16, id); 74 | throw_unless(135, ok); 75 | return data; 76 | } 77 | 78 | forall X0, X1 -> tuple __tact_tuple_create_2((X0, X1) v) asm "2 TUPLE"; 79 | 80 | forall X0, X1 -> (X0, X1) __tact_tuple_destroy_2(tuple v) asm "2 UNTUPLE"; 81 | 82 | slice $global_contractAddress((cell, cell) $s) impure inline { 83 | var (($s'code, $s'data)) = $s; 84 | return __tact_compute_contract_address(0, $s'code, $s'data); 85 | } 86 | 87 | () $global_send((int, slice, int, int, cell, cell, cell) $params) impure inline_ref { 88 | var (($params'bounce, $params'to, $params'value, $params'mode, $params'body, $params'code, $params'data)) = $params; 89 | builder $b = begin_cell(); 90 | $b = store_int($b, 1, 2); 91 | $b = __tact_store_bool($b, $params'bounce); 92 | $b = store_int($b, 0, 3); 93 | $b = __tact_store_address($b, $params'to); 94 | $b = store_coins($b, $params'value); 95 | $b = store_int($b, 0, ((((1 + 4) + 4) + 64) + 32)); 96 | if (( ((~ null?($params'code))) ? (true) : ((~ null?($params'data))) )) { 97 | $b = __tact_store_bool($b, true); 98 | builder $bc = begin_cell(); 99 | $bc = __tact_store_bool($bc, false); 100 | $bc = __tact_store_bool($bc, false); 101 | if ((~ null?($params'code))) { 102 | $bc = __tact_store_bool($bc, true); 103 | $bc = store_ref($bc, __tact_not_null($params'code)); 104 | } else { 105 | $bc = __tact_store_bool($bc, false); 106 | } 107 | if ((~ null?($params'data))) { 108 | $bc = __tact_store_bool($bc, true); 109 | $bc = store_ref($bc, __tact_not_null($params'data)); 110 | } else { 111 | $bc = __tact_store_bool($bc, false); 112 | } 113 | $bc = __tact_store_bool($bc, false); 114 | $b = __tact_store_bool($b, true); 115 | $b = store_ref($b, end_cell($bc)); 116 | } else { 117 | $b = __tact_store_bool($b, false); 118 | } 119 | cell $body = $params'body; 120 | if ((~ null?($body))) { 121 | $b = __tact_store_bool($b, true); 122 | $b = store_ref($b, __tact_not_null($body)); 123 | } else { 124 | $b = __tact_store_bool($b, false); 125 | } 126 | cell $c = end_cell($b); 127 | send_raw_message($c, $params'mode); 128 | } 129 | 130 | () $global_emit(cell $body) impure inline { 131 | cell $c = end_cell(store_ref(store_uint(begin_cell(), 15211807202738752817960438464513, 104), $body)); 132 | send_raw_message($c, 0); 133 | } 134 | 135 | slice $Builder$_fun_asSlice(builder $self) impure inline { 136 | var ($self) = $self; 137 | return begin_parse(end_cell($self)); 138 | } 139 | 140 | slice $Slice$_fun_fromBase64(slice $self) impure inline_ref { 141 | var ($self) = $self; 142 | int $size = (slice_bits($self) / 8); 143 | builder $result = begin_cell(); 144 | repeat ($size) { 145 | int $code = $self~load_uint(8); 146 | if (( (($code >= 65)) ? (($code <= 90)) : (false) )) { 147 | $result = store_uint($result, ($code - 65), 6); 148 | } elseif (( (($code >= 97)) ? (($code <= 122)) : (false) )) { 149 | $result = store_uint($result, ($code - (97 - 26)), 6); 150 | } elseif (( (($code >= 48)) ? (($code <= 57)) : (false) )) { 151 | $result = store_uint($result, ($code + (52 - 48)), 6); 152 | } elseif (( (($code == 45)) ? (true) : (($code == 43)) )) { 153 | $result = store_uint($result, 62, 6); 154 | } elseif (( (($code == 95)) ? (true) : (($code == 47)) )) { 155 | $result = store_uint($result, 63, 6); 156 | } elseif (($code == 61)) { 157 | } else { 158 | throw(134); 159 | } 160 | } 161 | int $total = builder_bits($result); 162 | int $padding = ($total % 8); 163 | if (($padding != 0)) { 164 | slice $s = $Builder$_fun_asSlice($result); 165 | return $s~load_bits(($total - $padding)); 166 | } else { 167 | return $Builder$_fun_asSlice($result); 168 | } 169 | } 170 | 171 | slice $String$_fun_fromBase64(slice $self) impure inline { 172 | var ($self) = $self; 173 | return $Slice$_fun_fromBase64(__tact_str_to_slice($self)); 174 | } 175 | 176 | ((slice, int, int, tuple), ()) $PayoutsMaster$_fun_forward((slice, int, int, tuple) $self, slice $to, cell $body, int $bounce, tuple $init) impure inline_ref { 177 | var (($self'owner, $self'publicKey, $self'stopped, $self'burn)) = $self; 178 | var ($init) = $init; 179 | cell $code = null(); 180 | cell $data = null(); 181 | if ((~ null?($init))) { 182 | var ($init2'code, $init2'data) = $StateInit$_not_null($init); 183 | $code = $init2'code; 184 | $data = $init2'data; 185 | } 186 | if ((100000000 > 0)) { 187 | var ($ctx'bounced, $ctx'sender, $ctx'value, $ctx'raw) = __tact_context_get(); 188 | int $balance = __tact_my_balance(); 189 | int $balanceBeforeMessage = ($balance - $ctx'value); 190 | if (($balanceBeforeMessage < 100000000)) { 191 | raw_reserve(100000000, 0); 192 | $global_send($SendParameters$_constructor_bounce_to_value_mode_body_code_data($bounce, $to, 0, (128 + 2), $body, $code, $data)); 193 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 194 | } 195 | } 196 | $global_send($SendParameters$_constructor_bounce_to_value_mode_body_code_data($bounce, $to, 0, (64 + 2), $body, $code, $data)); 197 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 198 | } 199 | 200 | ((slice, int, int, tuple), ()) $PayoutsMaster$_fun_reply((slice, int, int, tuple) $self, cell $body) impure inline { 201 | var (($self'owner, $self'publicKey, $self'stopped, $self'burn)) = $self; 202 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_forward(__tact_context_get_sender(), $body, true, null()); 203 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 204 | } 205 | 206 | ((slice, int, int, tuple), ()) $PayoutsMaster$_fun_notify((slice, int, int, tuple) $self, cell $body) impure inline { 207 | var (($self'owner, $self'publicKey, $self'stopped, $self'burn)) = $self; 208 | ($self'owner, $self'publicKey, $self'stopped, $self'burn)~$PayoutsMaster$_fun_forward(__tact_context_get_sender(), $body, false, null()); 209 | return (($self'owner, $self'publicKey, $self'stopped, $self'burn), ()); 210 | } -------------------------------------------------------------------------------- /sources/output/payouts_PayoutsMaster.storage.fc: -------------------------------------------------------------------------------- 1 | ;; 2 | ;; Type: StateInit 3 | ;; TLB: _ code:^cell data:^cell = StateInit 4 | ;; 5 | 6 | ((cell, cell)) $StateInit$_not_null(tuple v) inline { 7 | throw_if(128, null?(v)); 8 | var (cell vvv'code, cell vvv'data) = __tact_tuple_destroy_2(v); 9 | return (vvv'code, vvv'data); 10 | } 11 | 12 | tuple $StateInit$_as_optional((cell, cell) v) inline { 13 | var (v'code, v'data) = v; 14 | return __tact_tuple_create_2(v'code, v'data); 15 | } 16 | 17 | ;; 18 | ;; Type: SendParameters 19 | ;; TLB: _ bounce:bool to:address value:int257 mode:int257 body:Maybe ^cell code:Maybe ^cell data:Maybe ^cell = SendParameters 20 | ;; 21 | 22 | ((int, slice, int, int, cell, cell, cell)) $SendParameters$_constructor_bounce_to_value_mode_body_code_data(int bounce, slice to, int value, int mode, cell body, cell code, cell data) inline { 23 | return (bounce, to, value, mode, body, code, data); 24 | } 25 | 26 | ((int, slice, int, int, cell, cell, cell)) $SendParameters$_constructor_value_mode_to_body(int value, int mode, slice to, cell body) inline { 27 | return (true, to, value, mode, body, null(), null()); 28 | } 29 | 30 | ((int, slice, int, int, cell, cell, cell)) $SendParameters$_constructor_value_mode_to_bounce_body(int value, int mode, slice to, int bounce, cell body) inline { 31 | return (bounce, to, value, mode, body, null(), null()); 32 | } 33 | 34 | ;; 35 | ;; Type: Deploy 36 | ;; Header: 0x946a98b6 37 | ;; TLB: deploy#946a98b6 queryId:uint64 = Deploy 38 | ;; 39 | 40 | (slice, ((int))) $Deploy$_load(slice sc_0) inline { 41 | throw_unless(129, sc_0~load_uint(32) == 2490013878); 42 | var v'queryId = sc_0~load_uint(64); 43 | return (sc_0, (v'queryId)); 44 | } 45 | 46 | ;; 47 | ;; Type: DeployOk 48 | ;; Header: 0xaff90f57 49 | ;; TLB: deploy_ok#aff90f57 queryId:uint64 = DeployOk 50 | ;; 51 | 52 | builder $DeployOk$_store(builder build_0, (int) v) inline { 53 | var (v'queryId) = v; 54 | build_0 = store_uint(build_0, 2952335191, 32); 55 | build_0 = build_0.store_uint(v'queryId, 64); 56 | return build_0; 57 | } 58 | 59 | cell $DeployOk$_store_cell((int) v) inline { 60 | return $DeployOk$_store(begin_cell(), v).end_cell(); 61 | } 62 | 63 | ((int)) $DeployOk$_constructor_queryId(int queryId) inline { 64 | return (queryId); 65 | } 66 | 67 | ;; 68 | ;; Type: TryPayout 69 | ;; Header: 0x60912f1f 70 | ;; TLB: try_payout#60912f1f address:address value:coins = TryPayout 71 | ;; 72 | 73 | builder $TryPayout$_store(builder build_0, (slice, int) v) inline { 74 | var (v'address, v'value) = v; 75 | build_0 = store_uint(build_0, 1620127519, 32); 76 | build_0 = __tact_store_address(build_0, v'address); 77 | build_0 = build_0.store_coins(v'value); 78 | return build_0; 79 | } 80 | 81 | cell $TryPayout$_store_cell((slice, int) v) inline { 82 | return $TryPayout$_store(begin_cell(), v).end_cell(); 83 | } 84 | 85 | ((slice, int)) $TryPayout$_constructor_address_value(slice address, int value) inline { 86 | return (address, value); 87 | } 88 | 89 | ;; 90 | ;; Type: PayoutOk 91 | ;; Header: 0xd90aaa12 92 | ;; TLB: payout_ok#d90aaa12 address:address value:coins = PayoutOk 93 | ;; 94 | 95 | (slice, ((slice, int))) $PayoutOk$_load(slice sc_0) inline { 96 | throw_unless(129, sc_0~load_uint(32) == 3641354770); 97 | var v'address = sc_0~__tact_load_address(); 98 | var v'value = sc_0~load_coins(); 99 | return (sc_0, (v'address, v'value)); 100 | } 101 | 102 | ;; 103 | ;; Type: PayoutFailed 104 | ;; Header: 0x25bd488e 105 | ;; TLB: payout_failed#25bd488e address:address value:coins = PayoutFailed 106 | ;; 107 | 108 | (slice, ((slice, int))) $PayoutFailed$_load(slice sc_0) inline { 109 | throw_unless(129, sc_0~load_uint(32) == 633161870); 110 | var v'address = sc_0~__tact_load_address(); 111 | var v'value = sc_0~load_coins(); 112 | return (sc_0, (v'address, v'value)); 113 | } 114 | 115 | ;; 116 | ;; Type: BurnParameters 117 | ;; TLB: _ startAt:uint32 endAt:uint32 = BurnParameters 118 | ;; 119 | 120 | builder $BurnParameters$_store(builder build_0, (int, int) v) inline { 121 | var (v'startAt, v'endAt) = v; 122 | build_0 = build_0.store_uint(v'startAt, 32); 123 | build_0 = build_0.store_uint(v'endAt, 32); 124 | return build_0; 125 | } 126 | 127 | (slice, ((int, int))) $BurnParameters$_load(slice sc_0) inline { 128 | var v'startAt = sc_0~load_uint(32); 129 | var v'endAt = sc_0~load_uint(32); 130 | return (sc_0, (v'startAt, v'endAt)); 131 | } 132 | 133 | ((int, int)) $BurnParameters$_not_null(tuple v) inline { 134 | throw_if(128, null?(v)); 135 | var (int vvv'startAt, int vvv'endAt) = __tact_tuple_destroy_2(v); 136 | return (vvv'startAt, vvv'endAt); 137 | } 138 | 139 | tuple $BurnParameters$_as_optional((int, int) v) inline { 140 | var (v'startAt, v'endAt) = v; 141 | return __tact_tuple_create_2(v'startAt, v'endAt); 142 | } 143 | 144 | tuple $BurnParameters$_to_tuple(((int, int)) v) inline { 145 | var (v'startAt, v'endAt) = v; 146 | return __tact_tuple_create_2(v'startAt, v'endAt); 147 | } 148 | 149 | tuple $BurnParameters$_to_opt_tuple(tuple v) inline { 150 | if (null?(v)) { return null(); } 151 | return $BurnParameters$_to_tuple($BurnParameters$_not_null(v)); 152 | } 153 | 154 | tuple $BurnParameters$_to_opt_external(tuple v) inline { 155 | var loaded = $BurnParameters$_to_opt_tuple(v); 156 | if (null?(loaded)) { 157 | return null(); 158 | } else { 159 | return (loaded); 160 | } 161 | } 162 | 163 | ;; 164 | ;; Type: EventPayoutCompleted 165 | ;; Header: 0x3af7b4d6 166 | ;; TLB: event_payout_completed#3af7b4d6 address:address value:coins = EventPayoutCompleted 167 | ;; 168 | 169 | builder $EventPayoutCompleted$_store(builder build_0, (slice, int) v) inline { 170 | var (v'address, v'value) = v; 171 | build_0 = store_uint(build_0, 989312214, 32); 172 | build_0 = __tact_store_address(build_0, v'address); 173 | build_0 = build_0.store_coins(v'value); 174 | return build_0; 175 | } 176 | 177 | cell $EventPayoutCompleted$_store_cell((slice, int) v) inline { 178 | return $EventPayoutCompleted$_store(begin_cell(), v).end_cell(); 179 | } 180 | 181 | ((slice, int)) $EventPayoutCompleted$_constructor_address_value(slice address, int value) inline { 182 | return (address, value); 183 | } 184 | 185 | ;; 186 | ;; Type: PayoutBeacon 187 | ;; 188 | 189 | builder $PayoutBeacon$init$_store(builder build_0, (slice, slice) v) inline { 190 | var (v'owner, v'master) = v; 191 | build_0 = __tact_store_address(build_0, v'owner); 192 | build_0 = __tact_store_address(build_0, v'master); 193 | return build_0; 194 | } 195 | 196 | (cell, cell) $PayoutBeacon$_init_child(cell sys', slice $owner, slice $master) inline_ref { 197 | slice sc' = sys'.begin_parse(); 198 | cell source = sc'~load_dict(); 199 | cell contracts = new_dict(); 200 | 201 | ;; Contract Code: PayoutBeacon 202 | cell mine = __tact_dict_get_code(source, 23527); 203 | contracts = __tact_dict_set_code(contracts, 23527, mine); 204 | 205 | ;; Build cell 206 | builder b = begin_cell(); 207 | b = b.store_ref(begin_cell().store_dict(contracts).end_cell()); 208 | b = b.store_int(false, 1); 209 | b = $PayoutBeacon$init$_store(b, ($owner, $master)); 210 | return (mine, b.end_cell()); 211 | } 212 | 213 | ;; 214 | ;; Type: PayoutsMaster 215 | ;; 216 | 217 | builder $PayoutsMaster$_store(builder build_0, (slice, int, int, tuple) v) inline { 218 | var (v'owner, v'publicKey, v'stopped, v'burn) = v; 219 | build_0 = __tact_store_address(build_0, v'owner); 220 | build_0 = build_0.store_uint(v'publicKey, 256); 221 | build_0 = build_0.store_int(v'stopped, 1); 222 | build_0 = ~ null?(v'burn) ? build_0.store_int(true, 1).$BurnParameters$_store($BurnParameters$_not_null(v'burn)) : build_0.store_int(false, 1); 223 | return build_0; 224 | } 225 | 226 | (slice, ((slice, int, int, tuple))) $PayoutsMaster$_load(slice sc_0) inline { 227 | var v'owner = sc_0~__tact_load_address(); 228 | var v'publicKey = sc_0~load_uint(256); 229 | var v'stopped = sc_0~load_int(1); 230 | var v'burn = sc_0~load_int(1) ? $BurnParameters$_as_optional(sc_0~$BurnParameters$_load()) : null(); 231 | return (sc_0, (v'owner, v'publicKey, v'stopped, v'burn)); 232 | } 233 | 234 | (slice, ((slice, int, tuple))) $PayoutsMaster$init$_load(slice sc_0) inline { 235 | var v'owner = sc_0~__tact_load_address(); 236 | var v'publicKey = sc_0~load_int(257); 237 | var v'burn = sc_0~load_int(1) ? $BurnParameters$_as_optional(sc_0~$BurnParameters$_load()) : null(); 238 | return (sc_0, (v'owner, v'publicKey, v'burn)); 239 | } 240 | 241 | (slice, int, int, tuple) $PayoutsMaster$_contract_load() impure inline_ref { 242 | slice $sc = get_data().begin_parse(); 243 | __tact_context_sys = $sc~load_ref(); 244 | int $loaded = $sc~load_int(1); 245 | if ($loaded) { 246 | return $sc~$PayoutsMaster$_load(); 247 | } else { 248 | ;; Allow only workchain deployments 249 | throw_unless(137, my_address().preload_uint(11) == 1024); 250 | (slice owner, int publicKey, tuple burn) = $sc~$PayoutsMaster$init$_load(); 251 | $sc.end_parse(); 252 | return $PayoutsMaster$_contract_init(owner, publicKey, burn); 253 | } 254 | } 255 | 256 | () $PayoutsMaster$_contract_store((slice, int, int, tuple) v) impure inline { 257 | builder b = begin_cell(); 258 | b = b.store_ref(__tact_context_sys); 259 | b = b.store_int(true, 1); 260 | b = $PayoutsMaster$_store(b, v); 261 | set_data(b.end_cell()); 262 | } -------------------------------------------------------------------------------- /tact.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "projects": [{ 3 | "name": "payouts", 4 | "path": "./sources/contract.tact", 5 | "output": "./sources/output", 6 | "options":{ 7 | 8 | } 9 | }] 10 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | /* Basic Options */ 5 | // "incremental": true, /* Enable incremental compilation */ 6 | "target": "esnext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ 7 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ 8 | // "lib": [], /* Specify library files to be included in the compilation. */ 9 | // "allowJs": true, /* Allow javascript files to be compiled. */ 10 | // "checkJs": true, /* Report errors in .js files. */ 11 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ 12 | "declaration": true, /* Generates corresponding '.d.ts' file. */ 13 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 14 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 15 | // "outFile": "./", /* Concatenate and emit output to single file. */ 16 | "outDir": "./dist", /* Redirect output structure to the directory. */ 17 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 18 | // "composite": true, /* Enable project compilation */ 19 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 20 | // "removeComments": true, /* Do not emit comments to output. */ 21 | // "noEmit": false, /* Do not emit outputs. */ 22 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 23 | "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 24 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 25 | /* Strict Type-Checking Options */ 26 | "strict": true, /* Enable all strict type-checking options. */ 27 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 28 | // "strictNullChecks": true, /* Enable strict null checks. */ 29 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 30 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 31 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 32 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 33 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 34 | /* Additional Checks */ 35 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 36 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 37 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 38 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 39 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 40 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ 41 | // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ 42 | /* Module Resolution Options */ 43 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 44 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 45 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 46 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 47 | // "typeRoots": [], /* List of folders to include type definitions from. */ 48 | // "types": [], /* Type declaration files to be included in compilation. */ 49 | "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 50 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 51 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 52 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 53 | /* Source Map Options */ 54 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 55 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 56 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 57 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 58 | /* Experimental Options */ 59 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 60 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 61 | /* Advanced Options */ 62 | "skipLibCheck": true, /* Skip type checking of declaration files. */ 63 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, 64 | "resolveJsonModule": true 65 | }, 66 | "include": [ 67 | "src/**/*" 68 | ] 69 | } --------------------------------------------------------------------------------