Address Contract Verified
Address
0x744CaAC487b5C8A0a6091468C0c1fB2332480F13
Balance
0 ETH
Nonce
2
Code Size
10401 bytes
Creator
0x94Aa2913...8cEC at tx 0x47d0382f...5b1351
Indexed Transactions
0
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