Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0x744CaAC487b5C8A0a6091468C0c1fB2332480F13
Balance 0 ETH
Nonce 2
Code Size 10401 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

10401 bytes
0x608060405234801561000f575f5ffd5b506004361061007b575f3560e01c8063b7027b9411610059578063b7027b94146100eb578063c3c945ed1461011b578063e54e26b91461014b578063f2fde38b1461017b5761007b565b80638da5cb5b1461007f578063927ef0ef1461009d5780639399869d146100cd575b5f5ffd5b610087610197565b60405161009491906107b0565b60405180910390f35b6100b760048036038101906100b29190610973565b6101bc565b6040516100c491906107b0565b60405180910390f35b6100d5610551565b6040516100e29190610a15565b60405180910390f35b61010560048036038101906101009190610a2e565b61055d565b60405161011291906107b0565b60405180910390f35b61013560048036038101906101309190610a2e565b6105a4565b60405161014291906107b0565b60405180910390f35b61016560048036038101906101609190610a75565b6105e9565b60405161017291906107b0565b60405180910390f35b61019560048036038101906101909190610aa0565b610624565b005b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461024c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024390610b4b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f876040516102729190610bbb565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146102f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102ed90610c1b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035b90610c83565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036103d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103c990610ceb565b60405180910390fd5b5f858585856040516103e390610764565b6103f09493929190610d09565b604051809103905ff080158015610409573d5f5f3e3d5ffd5b509050809150815f8860405161041f9190610bbb565b90815260200160405180910390205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16886040516105069190610bbb565b60405180910390207f8e3ae431030b3b9c96fc779b74e62294b462b93e69fd7fc045e5194179f683b5888860405161053f929190610d4c565b60405180910390a45095945050505050565b5f600180549050905090565b5f818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f826040516105b49190610bbb565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600181815481106105f8575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106aa90610b4b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071890610dbd565b60405180910390fd5b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611a9080610ddc83390190565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61079a82610771565b9050919050565b6107aa81610790565b82525050565b5f6020820190506107c35f8301846107a1565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610828826107e2565b810181811067ffffffffffffffff82111715610847576108466107f2565b5b80604052505050565b5f6108596107c9565b9050610865828261081f565b919050565b5f67ffffffffffffffff821115610884576108836107f2565b5b61088d826107e2565b9050602081019050919050565b828183375f83830152505050565b5f6108ba6108b58461086a565b610850565b9050828152602081018484840111156108d6576108d56107de565b5b6108e184828561089a565b509392505050565b5f82601f8301126108fd576108fc6107da565b5b813561090d8482602086016108a8565b91505092915050565b61091f81610790565b8114610929575f5ffd5b50565b5f8135905061093a81610916565b92915050565b5f819050919050565b61095281610940565b811461095c575f5ffd5b50565b5f8135905061096d81610949565b92915050565b5f5f5f5f5f60a0868803121561098c5761098b6107d2565b5b5f86013567ffffffffffffffff8111156109a9576109a86107d6565b5b6109b5888289016108e9565b95505060206109c68882890161092c565b94505060406109d78882890161095f565b93505060606109e88882890161095f565b92505060806109f98882890161092c565b9150509295509295909350565b610a0f81610940565b82525050565b5f602082019050610a285f830184610a06565b92915050565b5f60208284031215610a4357610a426107d2565b5b5f82013567ffffffffffffffff811115610a6057610a5f6107d6565b5b610a6c848285016108e9565b91505092915050565b5f60208284031215610a8a57610a896107d2565b5b5f610a978482850161095f565b91505092915050565b5f60208284031215610ab557610ab46107d2565b5b5f610ac28482850161092c565b91505092915050565b5f82825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f5f8201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b5f610b35602183610acb565b9150610b4082610adb565b604082019050919050565b5f6020820190508181035f830152610b6281610b29565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f610b9582610b69565b610b9f8185610b73565b9350610baf818560208601610b7d565b80840191505092915050565b5f610bc68284610b8b565b915081905092915050565b7f5061796d656e7420636f6e747261637420616c726561647920657869737473005f82015250565b5f610c05601f83610acb565b9150610c1082610bd1565b602082019050919050565b5f6020820190508181035f830152610c3281610bf9565b9050919050565b7f496e76616c69642067656e6572616c2077616c6c6574206164647265737300005f82015250565b5f610c6d601e83610acb565b9150610c7882610c39565b602082019050919050565b5f6020820190508181035f830152610c9a81610c61565b9050919050565b7f496e76616c696420746f6b656e20636f6e7472616374206164647265737300005f82015250565b5f610cd5601e83610acb565b9150610ce082610ca1565b602082019050919050565b5f6020820190508181035f830152610d0281610cc9565b9050919050565b5f608082019050610d1c5f8301876107a1565b610d296020830186610a06565b610d366040830185610a06565b610d4360608301846107a1565b95945050505050565b5f604082019050610d5f5f830185610a06565b610d6c6020830184610a06565b9392505050565b7f496e76616c6964206e6577206f776e65720000000000000000000000000000005f82015250565b5f610da7601183610acb565b9150610db282610d73565b602082019050919050565b5f6020820190508181035f830152610dd481610d9b565b905091905056fe610100604052348015610010575f5ffd5b50604051611a90380380611a9083398181016040528101906100329190610262565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036100a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161009790610320565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361010e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161010590610388565b60405180910390fd5b5f8311610150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014790610416565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508260a081815250508160c081815250508073ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff168152505050505050610434565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101fe826101d5565b9050919050565b61020e816101f4565b8114610218575f5ffd5b50565b5f8151905061022981610205565b92915050565b5f819050919050565b6102418161022f565b811461024b575f5ffd5b50565b5f8151905061025c81610238565b92915050565b5f5f5f5f6080858703121561027a576102796101d1565b5b5f6102878782880161021b565b94505060206102988782880161024e565b93505060406102a98782880161024e565b92505060606102ba8782880161021b565b91505092959194509250565b5f82825260208201905092915050565b7f496e76616c69642067656e6572616c2077616c6c6574000000000000000000005f82015250565b5f61030a6016836102c6565b9150610315826102d6565b602082019050919050565b5f6020820190508181035f830152610337816102fe565b9050919050565b7f496e76616c696420746f6b656e20636f6e7472616374000000000000000000005f82015250565b5f6103726016836102c6565b915061037d8261033e565b602082019050919050565b5f6020820190508181035f83015261039f81610366565b9050919050565b7f457870656374656420616d6f756e74206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f6104006026836102c6565b915061040b826103a6565b604082019050919050565b5f6020820190508181035f83015261042d816103f4565b9050919050565b60805160a05160c05160e0516115a46104ec5f395f8181610288015281816104490152818161052701528181610694015281816106b90152818161096301528181610b6d0152610cd801525f81816106700152818161084e0152610a8901525f8181610325015281816107c6015281816107ef0152818161081f015281816108de01528181610a0001528181610a270152610a5b01525f818161093501528181610c6001528181610d140152610def01526115a45ff3fe6080604052600436106100aa575f3560e01c8063603159ab11610063578063603159ab1461019b57806390339843146101c55780639632e720146101ef57806399882b3114610219578063eec5668b14610245578063fa391c641461025b576100b1565b806312065fe0146100b55780632feef2ec146100df578063410085df1461010957806342cde4e81461013157806355a373d61461015b5780635a17001314610185576100b1565b366100b157005b5f5ffd5b3480156100c0575f5ffd5b506100c9610285565b6040516100d69190610e77565b60405180910390f35b3480156100ea575f5ffd5b506100f3610323565b6040516101009190610e77565b60405180910390f35b348015610114575f5ffd5b5061012f600480360381019061012a9190610f18565b610347565b005b34801561013c575f5ffd5b5061014561066e565b6040516101529190610e77565b60405180910390f35b348015610166575f5ffd5b5061016f610692565b60405161017c9190610f65565b60405180910390f35b348015610190575f5ffd5b506101996106b6565b005b3480156101a6575f5ffd5b506101af610921565b6040516101bc9190610f98565b60405180910390f35b3480156101d0575f5ffd5b506101d9610933565b6040516101e69190610f65565b60405180910390f35b3480156101fa575f5ffd5b50610203610957565b6040516102109190610e77565b60405180910390f35b348015610224575f5ffd5b5061022d61095d565b60405161023c93929190610fb1565b60405180910390f35b348015610250575f5ffd5b50610259610ab3565b005b348015610266575f5ffd5b5061026f610b0a565b60405161027c9190610f98565b60405180910390f35b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016102df9190610f65565b602060405180830381865afa1580156102fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061031e9190610ffa565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60019054906101000a900460ff1615610396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038d906110a5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103fb9061110d565b60405180910390fd5b5f8111610446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043d90611175565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104a09190610f65565b602060405180830381865afa1580156104bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104df9190610ffa565b905081811015610524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051b906111dd565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b81526004016105809291906111fb565b6020604051808303815f875af115801561059c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c0919061124c565b905080610602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f9906112c1565b60405180910390fd5b8260015f828254610613919061130c565b925050819055508373ffffffffffffffffffffffffffffffffffffffff167fa171b6942063c6f2800ce40a780edce37baa2b618571b11eedd1e69e626e7d76846040516106609190610e77565b60405180910390a250505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107109190610f65565b602060405180830381865afa15801561072b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190610ffa565b90506001548111156107c3575f6001548261076a919061130c565b9050816001819055503373ffffffffffffffffffffffffffffffffffffffff167f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770826040516107b99190610e77565b60405180910390a2505b5f7f000000000000000000000000000000000000000000000000000000000000000082101561081d57817f0000000000000000000000000000000000000000000000000000000000000000610818919061130c565b61084a565b7f000000000000000000000000000000000000000000000000000000000000000082610849919061130c565b5b90507f0000000000000000000000000000000000000000000000000000000000000000811115801561088857505f60019054906101000a900460ff16155b1561091d575f5f9054906101000a900460ff166109145760015f5f6101000a81548160ff0219169083151502179055507f804fbdce9b2b430341d671cd679f22ccb903e9db545bedbbc7da4e6230e2bdb96001547f000000000000000000000000000000000000000000000000000000000000000060405161090b92919061133f565b60405180910390a15b61091c610b1b565b5b5050565b5f60019054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b5f5f5f5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109ba9190610f65565b602060405180830381865afa1580156109d5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f99190610ffa565b90508092507f00000000000000000000000000000000000000000000000000000000000000008110610a58577f000000000000000000000000000000000000000000000000000000000000000081610a51919061130c565b9150610a87565b807f0000000000000000000000000000000000000000000000000000000000000000610a84919061130c565b91505b7f0000000000000000000000000000000000000000000000000000000000000000821115935050909192565b5f5f9054906101000a900460ff16610b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af7906113b0565b60405180910390fd5b610b08610b1b565b565b5f5f9054906101000a900460ff1681565b5f60019054906101000a900460ff1615610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190611418565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610bc49190610f65565b602060405180830381865afa158015610bdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c039190610ffa565b90505f8111610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90611480565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1603610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc906114e8565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000846040518363ffffffff1660e01b8152600401610d519291906111fb565b6020604051808303815f875af1158015610d6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d91919061124c565b905080610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90611550565b60405180910390fd5b60015f60016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f8c9a4f13b67cb64d7c6aa1ae0c9bf07694af521a28b93e7060020810ab4bc59f83604051610e539190610e77565b60405180910390a25050565b5f819050919050565b610e7181610e5f565b82525050565b5f602082019050610e8a5f830184610e68565b92915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610ebd82610e94565b9050919050565b610ecd81610eb3565b8114610ed7575f5ffd5b50565b5f81359050610ee881610ec4565b92915050565b610ef781610e5f565b8114610f01575f5ffd5b50565b5f81359050610f1281610eee565b92915050565b5f5f60408385031215610f2e57610f2d610e90565b5b5f610f3b85828601610eda565b9250506020610f4c85828601610f04565b9150509250929050565b610f5f81610eb3565b82525050565b5f602082019050610f785f830184610f56565b92915050565b5f8115159050919050565b610f9281610f7e565b82525050565b5f602082019050610fab5f830184610f89565b92915050565b5f606082019050610fc45f830186610f89565b610fd16020830185610e68565b610fde6040830184610e68565b949350505050565b5f81519050610ff481610eee565b92915050565b5f6020828403121561100f5761100e610e90565b5b5f61101c84828501610fe6565b91505092915050565b5f82825260208201905092915050565b7f46756e647320616c7265616479207472616e736665727265642c2063616e6e6f5f8201527f7420726566756e64000000000000000000000000000000000000000000000000602082015250565b5f61108f602883611025565b915061109a82611035565b604082019050919050565b5f6020820190508181035f8301526110bc81611083565b9050919050565b7f496e76616c696420726566756e642061646472657373000000000000000000005f82015250565b5f6110f7601683611025565b9150611102826110c3565b602082019050919050565b5f6020820190508181035f830152611124816110eb565b9050919050565b7f496e76616c696420726566756e6420616d6f756e7400000000000000000000005f82015250565b5f61115f601583611025565b915061116a8261112b565b602082019050919050565b5f6020820190508181035f83015261118c81611153565b9050919050565b7f496e73756666696369656e742062616c616e636520666f7220726566756e64005f82015250565b5f6111c7601f83611025565b91506111d282611193565b602082019050919050565b5f6020820190508181035f8301526111f4816111bb565b9050919050565b5f60408201905061120e5f830185610f56565b61121b6020830184610e68565b9392505050565b61122b81610f7e565b8114611235575f5ffd5b50565b5f8151905061124681611222565b92915050565b5f6020828403121561126157611260610e90565b5b5f61126e84828501611238565b91505092915050565b7f526566756e64207472616e73666572206661696c6564000000000000000000005f82015250565b5f6112ab601683611025565b91506112b682611277565b602082019050919050565b5f6020820190508181035f8301526112d88161129f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61131682610e5f565b915061132183610e5f565b9250828203905081811115611339576113386112df565b5b92915050565b5f6040820190506113525f830185610e68565b61135f6020830184610e68565b9392505050565b7f5061796d656e74206e6f7420636f6d706c6574656420796574000000000000005f82015250565b5f61139a601983611025565b91506113a582611366565b602082019050919050565b5f6020820190508181035f8301526113c78161138e565b9050919050565b7f46756e647320616c7265616479207472616e73666572726564000000000000005f82015250565b5f611402601983611025565b915061140d826113ce565b602082019050919050565b5f6020820190508181035f83015261142f816113f6565b9050919050565b7f4e6f2066756e647320746f207472616e736665720000000000000000000000005f82015250565b5f61146a601483611025565b915061147582611436565b602082019050919050565b5f6020820190508181035f8301526114978161145e565b9050919050565b7f496e76616c69642067656e6572616c2077616c6c6574000000000000000000005f82015250565b5f6114d2601683611025565b91506114dd8261149e565b602082019050919050565b5f6020820190508181035f8301526114ff816114c6565b9050919050565b7f546f6b656e207472616e73666572206661696c656400000000000000000000005f82015250565b5f61153a601583611025565b915061154582611506565b602082019050919050565b5f6020820190508181035f8301526115678161152e565b905091905056fea2646970667358221220bc02bae59351c70d97148593e7ae480b98376917b785f04819a2a7c3615ba92464736f6c634300081e0033a264697066735822122031c5526e1355cb5e689a6290cd5f1836fad69ec5ff3e5f27c35dbe4454eb611264736f6c634300081e0033

Verified Source Code Full Match

Compiler: v0.8.30+commit.73712a01 EVM: prague Optimization: No
PaymentFactory.sol 272 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

// ============================================================================
// PaymentContract - Single Token Version (User selects USDC or USDT)
// ============================================================================

interface IERC20 {
    function transfer(address to, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
}

/**
 * @title PaymentContract
 * @notice Smart contract for individual payments that receives ERC20 tokens and auto-transfers to general wallet
 * @dev User selects USDC or USDT on checkout, contract accepts only that token
 */
contract PaymentContract {
    // General wallet where funds will be transferred
    address public immutable generalWallet;
    
    // Expected payment amount (in token's smallest unit, e.g., 6 decimals for USDC/USDT)
    uint256 public immutable expectedAmount;
    
    // Acceptable threshold/difference from expected amount
    uint256 public immutable threshold;
    
    // ERC20 token contract address (USDC or USDT - selected by user)
    address public immutable tokenContract;
    
    // Payment status
    bool public isCompleted;
    bool public isTransferred;
    
    // Received amount
    uint256 public receivedAmount;
    
    // Events
    event PaymentReceived(address indexed from, uint256 amount);
    event PaymentCompleted(uint256 receivedAmount, uint256 expectedAmount);
    event FundsTransferred(address indexed to, uint256 amount);
    event RefundIssued(address indexed to, uint256 amount);
    
    modifier onlyWhenNotCompleted() {
        require(!isCompleted, "Payment already completed");
        _;
    }
    
    modifier onlyWhenNotTransferred() {
        require(!isTransferred, "Funds already transferred");
        _;
    }
    
    constructor(
        address _generalWallet,
        uint256 _expectedAmount,
        uint256 _threshold,
        address _tokenContract
    ) {
        require(_generalWallet != address(0), "Invalid general wallet");
        require(_tokenContract != address(0), "Invalid token contract");
        require(_expectedAmount > 0, "Expected amount must be greater than 0");
        
        generalWallet = _generalWallet;
        expectedAmount = _expectedAmount;
        threshold = _threshold;
        tokenContract = _tokenContract;
    }
    
    /**
     * @notice Check payment status and auto-transfer if complete
     * @dev Checks balance of the selected token (USDC or USDT)
     */
    function checkAndTransfer() external {
        uint256 balance = IERC20(tokenContract).balanceOf(address(this));
        
        // Update receivedAmount if balance increased
        if (balance > receivedAmount) {
            uint256 newAmount = balance - receivedAmount;
            receivedAmount = balance;
            
            emit PaymentReceived(msg.sender, newAmount);
        }
        
        // Check if payment is complete (within threshold)
        // Use current balance for threshold check (more reliable than receivedAmount)
        uint256 difference = balance >= expectedAmount 
            ? balance - expectedAmount 
            : expectedAmount - balance;
        
        // If payment is complete (within threshold) and not already transferred
        if (difference <= threshold && !isTransferred) {
            // Mark as completed if not already
            if (!isCompleted) {
                isCompleted = true;
                emit PaymentCompleted(receivedAmount, expectedAmount);
            }
            
            // Transfer funds to general wallet
            _transferToGeneralWallet();
        }
    }
    
    /**
     * @notice Manually trigger transfer to general wallet
     * @dev Can be called by anyone, but only transfers if payment is complete
     */
    function transferToGeneralWallet() external {
        require(isCompleted, "Payment not completed yet");
        _transferToGeneralWallet();
    }
    
    /**
     * @notice Internal function to transfer funds to general wallet
     */
    function _transferToGeneralWallet() internal onlyWhenNotTransferred {
        uint256 balance = IERC20(tokenContract).balanceOf(address(this));
        require(balance > 0, "No funds to transfer");
        require(generalWallet != address(0), "Invalid general wallet");
        
        // Transfer tokens to general wallet
        // Use SafeERC20 pattern for better error handling
        bool success = IERC20(tokenContract).transfer(generalWallet, balance);
        require(success, "Token transfer failed");
        
        isTransferred = true;
        emit FundsTransferred(generalWallet, balance);
    }
    
    /**
     * @notice Issue refund (send tokens back to sender)
     * @param to Address to refund
     * @param amount Amount to refund
     */
    function refund(address to, uint256 amount) external {
        require(!isTransferred, "Funds already transferred, cannot refund");
        require(to != address(0), "Invalid refund address");
        require(amount > 0, "Invalid refund amount");
        
        uint256 balance = IERC20(tokenContract).balanceOf(address(this));
        require(balance >= amount, "Insufficient balance for refund");
        
        bool success = IERC20(tokenContract).transfer(to, amount);
        require(success, "Refund transfer failed");
        
        receivedAmount -= amount;
        
        emit RefundIssued(to, amount);
    }
    
    /**
     * @notice Get current token balance
     */
    function getBalance() external view returns (uint256) {
        return IERC20(tokenContract).balanceOf(address(this));
    }
    
    /**
     * @notice Check if payment is complete (within threshold)
     */
    function checkPaymentStatus() external view returns (bool completed, uint256 currentAmount, uint256 difference) {
        uint256 balance = IERC20(tokenContract).balanceOf(address(this));
        currentAmount = balance;
        
        if (balance >= expectedAmount) {
            difference = balance - expectedAmount;
        } else {
            difference = expectedAmount - balance;
        }
        
        completed = difference <= threshold;
    }
    
    /**
     * @notice Receive ETH (for gas funding)
     */
    receive() external payable {}
}

// ============================================================================
// PaymentFactory - Uses Multi-Token PaymentContract above
// ============================================================================

/**
 * @title PaymentFactory
 * @notice Factory contract that deploys PaymentContract instances for each payment
 * @dev User selects USDC or USDT on checkout, contract accepts only that token
 */
contract PaymentFactory {
    // Mapping to track deployed contracts by payment ID
    mapping(string => address) public paymentContracts;
    
    // Array of all deployed contract addresses
    address[] public allContracts;
    
    // Owner address (for access control)
    address public owner;
    
    // Events
    event PaymentContractCreated(string indexed paymentId, address indexed contractAddress, address indexed generalWallet, uint256 expectedAmount, uint256 threshold);
    
    modifier onlyOwner() {
        require(msg.sender == owner, "Only owner can call this function");
        _;
    }
    
    constructor() {
        owner = msg.sender;
    }
    
    /**
     * @notice Deploy a new PaymentContract for a payment
     * @param paymentId Unique payment identifier
     * @param generalWallet Address where funds will be transferred
     * @param expectedAmount Expected payment amount (in token's smallest unit, e.g., 6 decimals for USDC/USDT)
     * @param threshold Acceptable difference from expected amount (in token's smallest unit)
     * @param tokenContract Address of the ERC20 token contract (USDC or USDT - selected by user)
     * @return contractAddress Address of the deployed PaymentContract
     */
    function createPaymentContract(
        string memory paymentId,
        address generalWallet,
        uint256 expectedAmount,
        uint256 threshold,
        address tokenContract
    ) external onlyOwner returns (address contractAddress) {
        require(paymentContracts[paymentId] == address(0), "Payment contract already exists");
        require(generalWallet != address(0), "Invalid general wallet address");
        require(tokenContract != address(0), "Invalid token contract address");
        
        // Deploy new PaymentContract (single token - user selected USDC or USDT)
        PaymentContract newContract = new PaymentContract(
            generalWallet,
            expectedAmount,
            threshold,
            tokenContract
        );
        
        contractAddress = address(newContract);
        paymentContracts[paymentId] = contractAddress;
        allContracts.push(contractAddress);
        
        emit PaymentContractCreated(paymentId, contractAddress, generalWallet, expectedAmount, threshold);
        
        return contractAddress;
    }
    
    /**
     * @notice Get contract address for a payment ID
     */
    function getPaymentContract(string memory paymentId) external view returns (address) {
        return paymentContracts[paymentId];
    }
    
    /**
     * @notice Get total number of deployed contracts
     */
    function getContractCount() external view returns (uint256) {
        return allContracts.length;
    }
    
    /**
     * @notice Transfer ownership of the factory
     */
    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "Invalid new owner");
        owner = newOwner;
    }
}


Read Contract

allContracts 0xe54e26b9 → address
getContractCount 0x9399869d → uint256
getPaymentContract 0xc3c945ed → address
owner 0x8da5cb5b → address
paymentContracts 0xb7027b94 → address

Write Contract 2 functions

These functions modify contract state and require a wallet transaction to execute.

createPaymentContract 0x927ef0ef
string paymentId
address generalWallet
uint256 expectedAmount
uint256 threshold
address tokenContract
returns: address
transferOwnership 0xf2fde38b
address newOwner

Recent Transactions

No transactions found for this address