Address Contract Verified
Address
0x30434BEf71c5d3c3a2D3A115f8B7Ae3773c78339
Balance
0 ETH
Nonce
60
Code Size
10831 bytes
Creator
0x94Aa2913...8cEC at tx 0x154ef1b7...7bb0b2
Indexed Transactions
0
Contract Bytecode
10831 bytes
0x608060405234801561000f575f5ffd5b506004361061007b575f3560e01c8063b7027b9411610059578063b7027b94146100eb578063c3c945ed1461011b578063e54e26b91461014b578063f2fde38b1461017b5761007b565b80638da5cb5b1461007f578063927ef0ef1461009d5780639399869d146100cd575b5f5ffd5b610087610197565b60405161009491906107b0565b60405180910390f35b6100b760048036038101906100b29190610973565b6101bc565b6040516100c491906107b0565b60405180910390f35b6100d5610551565b6040516100e29190610a15565b60405180910390f35b61010560048036038101906101009190610a2e565b61055d565b60405161011291906107b0565b60405180910390f35b61013560048036038101906101309190610a2e565b6105a4565b60405161014291906107b0565b60405180910390f35b61016560048036038101906101609190610a75565b6105e9565b60405161017291906107b0565b60405180910390f35b61019560048036038101906101909190610aa0565b610624565b005b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461024c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024390610b4b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f876040516102729190610bbb565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146102f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102ed90610c1b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035b90610c83565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036103d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103c990610ceb565b60405180910390fd5b5f858585856040516103e390610764565b6103f09493929190610d09565b604051809103905ff080158015610409573d5f5f3e3d5ffd5b509050809150815f8860405161041f9190610bbb565b90815260200160405180910390205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16886040516105069190610bbb565b60405180910390207f8e3ae431030b3b9c96fc779b74e62294b462b93e69fd7fc045e5194179f683b5888860405161053f929190610d4c565b60405180910390a45095945050505050565b5f600180549050905090565b5f818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f826040516105b49190610bbb565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600181815481106105f8575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106aa90610b4b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071890610dbd565b60405180910390fd5b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611c3e80610ddc83390190565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61079a82610771565b9050919050565b6107aa81610790565b82525050565b5f6020820190506107c35f8301846107a1565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610828826107e2565b810181811067ffffffffffffffff82111715610847576108466107f2565b5b80604052505050565b5f6108596107c9565b9050610865828261081f565b919050565b5f67ffffffffffffffff821115610884576108836107f2565b5b61088d826107e2565b9050602081019050919050565b828183375f83830152505050565b5f6108ba6108b58461086a565b610850565b9050828152602081018484840111156108d6576108d56107de565b5b6108e184828561089a565b509392505050565b5f82601f8301126108fd576108fc6107da565b5b813561090d8482602086016108a8565b91505092915050565b61091f81610790565b8114610929575f5ffd5b50565b5f8135905061093a81610916565b92915050565b5f819050919050565b61095281610940565b811461095c575f5ffd5b50565b5f8135905061096d81610949565b92915050565b5f5f5f5f5f60a0868803121561098c5761098b6107d2565b5b5f86013567ffffffffffffffff8111156109a9576109a86107d6565b5b6109b5888289016108e9565b95505060206109c68882890161092c565b94505060406109d78882890161095f565b93505060606109e88882890161095f565b92505060806109f98882890161092c565b9150509295509295909350565b610a0f81610940565b82525050565b5f602082019050610a285f830184610a06565b92915050565b5f60208284031215610a4357610a426107d2565b5b5f82013567ffffffffffffffff811115610a6057610a5f6107d6565b5b610a6c848285016108e9565b91505092915050565b5f60208284031215610a8a57610a896107d2565b5b5f610a978482850161095f565b91505092915050565b5f60208284031215610ab557610ab46107d2565b5b5f610ac28482850161092c565b91505092915050565b5f82825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f5f8201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b5f610b35602183610acb565b9150610b4082610adb565b604082019050919050565b5f6020820190508181035f830152610b6281610b29565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f610b9582610b69565b610b9f8185610b73565b9350610baf818560208601610b7d565b80840191505092915050565b5f610bc68284610b8b565b915081905092915050565b7f5061796d656e7420636f6e747261637420616c726561647920657869737473005f82015250565b5f610c05601f83610acb565b9150610c1082610bd1565b602082019050919050565b5f6020820190508181035f830152610c3281610bf9565b9050919050565b7f496e76616c69642067656e6572616c2077616c6c6574206164647265737300005f82015250565b5f610c6d601e83610acb565b9150610c7882610c39565b602082019050919050565b5f6020820190508181035f830152610c9a81610c61565b9050919050565b7f496e76616c696420746f6b656e20636f6e7472616374206164647265737300005f82015250565b5f610cd5601e83610acb565b9150610ce082610ca1565b602082019050919050565b5f6020820190508181035f830152610d0281610cc9565b9050919050565b5f608082019050610d1c5f8301876107a1565b610d296020830186610a06565b610d366040830185610a06565b610d4360608301846107a1565b95945050505050565b5f604082019050610d5f5f830185610a06565b610d6c6020830184610a06565b9392505050565b7f496e76616c6964206e6577206f776e65720000000000000000000000000000005f82015250565b5f610da7601183610acb565b9150610db282610d73565b602082019050919050565b5f6020820190508181035f830152610dd481610d9b565b905091905056fe610100604052348015610010575f5ffd5b50604051611c3e380380611c3e83398181016040528101906100329190610262565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036100a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161009790610320565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361010e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161010590610388565b60405180910390fd5b5f8311610150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014790610416565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508260a081815250508160c081815250508073ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff168152505050505050610434565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101fe826101d5565b9050919050565b61020e816101f4565b8114610218575f5ffd5b50565b5f8151905061022981610205565b92915050565b5f819050919050565b6102418161022f565b811461024b575f5ffd5b50565b5f8151905061025c81610238565b92915050565b5f5f5f5f6080858703121561027a576102796101d1565b5b5f6102878782880161021b565b94505060206102988782880161024e565b93505060406102a98782880161024e565b92505060606102ba8782880161021b565b91505092959194509250565b5f82825260208201905092915050565b7f496e76616c69642067656e6572616c2077616c6c6574000000000000000000005f82015250565b5f61030a6016836102c6565b9150610315826102d6565b602082019050919050565b5f6020820190508181035f830152610337816102fe565b9050919050565b7f496e76616c696420746f6b656e20636f6e7472616374000000000000000000005f82015250565b5f6103726016836102c6565b915061037d8261033e565b602082019050919050565b5f6020820190508181035f83015261039f81610366565b9050919050565b7f457870656374656420616d6f756e74206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f6104006026836102c6565b915061040b826103a6565b604082019050919050565b5f6020820190508181035f83015261042d816103f4565b9050919050565b60805160a05160c05160e0516117526104ec5f395f8181610288015281816104490152818161052701528181610694015281816106b90152818161096301528181610b6d0152610cd901525f81816106700152818161084e0152610a8901525f8181610325015281816107c6015281816107ef0152818161081f015281816108de01528181610a0001528181610a270152610a5b01525f818161093501528181610c6001528181610d100152610ecc01526117525ff3fe6080604052600436106100aa575f3560e01c8063603159ab11610063578063603159ab1461019b57806390339843146101c55780639632e720146101ef57806399882b3114610219578063eec5668b14610245578063fa391c641461025b576100b1565b806312065fe0146100b55780632feef2ec146100df578063410085df1461010957806342cde4e81461013157806355a373d61461015b5780635a17001314610185576100b1565b366100b157005b5f5ffd5b3480156100c0575f5ffd5b506100c9610285565b6040516100d69190610f55565b60405180910390f35b3480156100ea575f5ffd5b506100f3610323565b6040516101009190610f55565b60405180910390f35b348015610114575f5ffd5b5061012f600480360381019061012a9190610ff6565b610347565b005b34801561013c575f5ffd5b5061014561066e565b6040516101529190610f55565b60405180910390f35b348015610166575f5ffd5b5061016f610692565b60405161017c9190611043565b60405180910390f35b348015610190575f5ffd5b506101996106b6565b005b3480156101a6575f5ffd5b506101af610921565b6040516101bc9190611076565b60405180910390f35b3480156101d0575f5ffd5b506101d9610933565b6040516101e69190611043565b60405180910390f35b3480156101fa575f5ffd5b50610203610957565b6040516102109190610f55565b60405180910390f35b348015610224575f5ffd5b5061022d61095d565b60405161023c9392919061108f565b60405180910390f35b348015610250575f5ffd5b50610259610ab3565b005b348015610266575f5ffd5b5061026f610b0a565b60405161027c9190611076565b60405180910390f35b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016102df9190611043565b602060405180830381865afa1580156102fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061031e91906110d8565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60019054906101000a900460ff1615610396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038d90611183565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103fb906111eb565b60405180910390fd5b5f8111610446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043d90611253565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104a09190611043565b602060405180830381865afa1580156104bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104df91906110d8565b905081811015610524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051b906112bb565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b81526004016105809291906112d9565b6020604051808303815f875af115801561059c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c0919061132a565b905080610602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f99061139f565b60405180910390fd5b8260015f82825461061391906113ea565b925050819055508373ffffffffffffffffffffffffffffffffffffffff167fa171b6942063c6f2800ce40a780edce37baa2b618571b11eedd1e69e626e7d76846040516106609190610f55565b60405180910390a250505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107109190611043565b602060405180830381865afa15801561072b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f91906110d8565b90506001548111156107c3575f6001548261076a91906113ea565b9050816001819055503373ffffffffffffffffffffffffffffffffffffffff167f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770826040516107b99190610f55565b60405180910390a2505b5f7f000000000000000000000000000000000000000000000000000000000000000082101561081d57817f000000000000000000000000000000000000000000000000000000000000000061081891906113ea565b61084a565b7f00000000000000000000000000000000000000000000000000000000000000008261084991906113ea565b5b90507f0000000000000000000000000000000000000000000000000000000000000000811115801561088857505f60019054906101000a900460ff16155b1561091d575f5f9054906101000a900460ff166109145760015f5f6101000a81548160ff0219169083151502179055507f804fbdce9b2b430341d671cd679f22ccb903e9db545bedbbc7da4e6230e2bdb96001547f000000000000000000000000000000000000000000000000000000000000000060405161090b92919061141d565b60405180910390a15b61091c610b1b565b5b5050565b5f60019054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b5f5f5f5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109ba9190611043565b602060405180830381865afa1580156109d5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f991906110d8565b90508092507f00000000000000000000000000000000000000000000000000000000000000008110610a58577f000000000000000000000000000000000000000000000000000000000000000081610a5191906113ea565b9150610a87565b807f0000000000000000000000000000000000000000000000000000000000000000610a8491906113ea565b91505b7f0000000000000000000000000000000000000000000000000000000000000000821115935050909192565b5f5f9054906101000a900460ff16610b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af79061148e565b60405180910390fd5b610b08610b1b565b565b5f5f9054906101000a900460ff1681565b5f60019054906101000a900460ff1615610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b61906114f6565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610bc49190611043565b602060405180830381865afa158015610bdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0391906110d8565b90505f8111610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e9061155e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1603610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc906115c6565b60405180910390fd5b5f5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000084604051602401610d419291906112d9565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610dcb9190611636565b5f604051808303815f865af19150503d805f8114610e04576040519150601f19603f3d011682016040523d82523d5f602084013e610e09565b606091505b509150915081610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4590611696565b60405180910390fd5b5f81511115610eb0575f81806020019051810190610e6c919061132a565b905080610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea5906116fe565b60405180910390fd5b505b60015f60016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f8c9a4f13b67cb64d7c6aa1ae0c9bf07694af521a28b93e7060020810ab4bc59f84604051610f309190610f55565b60405180910390a2505050565b5f819050919050565b610f4f81610f3d565b82525050565b5f602082019050610f685f830184610f46565b92915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610f9b82610f72565b9050919050565b610fab81610f91565b8114610fb5575f5ffd5b50565b5f81359050610fc681610fa2565b92915050565b610fd581610f3d565b8114610fdf575f5ffd5b50565b5f81359050610ff081610fcc565b92915050565b5f5f6040838503121561100c5761100b610f6e565b5b5f61101985828601610fb8565b925050602061102a85828601610fe2565b9150509250929050565b61103d81610f91565b82525050565b5f6020820190506110565f830184611034565b92915050565b5f8115159050919050565b6110708161105c565b82525050565b5f6020820190506110895f830184611067565b92915050565b5f6060820190506110a25f830186611067565b6110af6020830185610f46565b6110bc6040830184610f46565b949350505050565b5f815190506110d281610fcc565b92915050565b5f602082840312156110ed576110ec610f6e565b5b5f6110fa848285016110c4565b91505092915050565b5f82825260208201905092915050565b7f46756e647320616c7265616479207472616e736665727265642c2063616e6e6f5f8201527f7420726566756e64000000000000000000000000000000000000000000000000602082015250565b5f61116d602883611103565b915061117882611113565b604082019050919050565b5f6020820190508181035f83015261119a81611161565b9050919050565b7f496e76616c696420726566756e642061646472657373000000000000000000005f82015250565b5f6111d5601683611103565b91506111e0826111a1565b602082019050919050565b5f6020820190508181035f830152611202816111c9565b9050919050565b7f496e76616c696420726566756e6420616d6f756e7400000000000000000000005f82015250565b5f61123d601583611103565b915061124882611209565b602082019050919050565b5f6020820190508181035f83015261126a81611231565b9050919050565b7f496e73756666696369656e742062616c616e636520666f7220726566756e64005f82015250565b5f6112a5601f83611103565b91506112b082611271565b602082019050919050565b5f6020820190508181035f8301526112d281611299565b9050919050565b5f6040820190506112ec5f830185611034565b6112f96020830184610f46565b9392505050565b6113098161105c565b8114611313575f5ffd5b50565b5f8151905061132481611300565b92915050565b5f6020828403121561133f5761133e610f6e565b5b5f61134c84828501611316565b91505092915050565b7f526566756e64207472616e73666572206661696c6564000000000000000000005f82015250565b5f611389601683611103565b915061139482611355565b602082019050919050565b5f6020820190508181035f8301526113b68161137d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6113f482610f3d565b91506113ff83610f3d565b9250828203905081811115611417576114166113bd565b5b92915050565b5f6040820190506114305f830185610f46565b61143d6020830184610f46565b9392505050565b7f5061796d656e74206e6f7420636f6d706c6574656420796574000000000000005f82015250565b5f611478601983611103565b915061148382611444565b602082019050919050565b5f6020820190508181035f8301526114a58161146c565b9050919050565b7f46756e647320616c7265616479207472616e73666572726564000000000000005f82015250565b5f6114e0601983611103565b91506114eb826114ac565b602082019050919050565b5f6020820190508181035f83015261150d816114d4565b9050919050565b7f4e6f2066756e647320746f207472616e736665720000000000000000000000005f82015250565b5f611548601483611103565b915061155382611514565b602082019050919050565b5f6020820190508181035f8301526115758161153c565b9050919050565b7f496e76616c69642067656e6572616c2077616c6c6574000000000000000000005f82015250565b5f6115b0601683611103565b91506115bb8261157c565b602082019050919050565b5f6020820190508181035f8301526115dd816115a4565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f611610826115e4565b61161a81856115ee565b935061162a8185602086016115f8565b80840191505092915050565b5f6116418284611606565b915081905092915050565b7f546f6b656e207472616e736665722063616c6c206661696c65640000000000005f82015250565b5f611680601a83611103565b915061168b8261164c565b602082019050919050565b5f6020820190508181035f8301526116ad81611674565b9050919050565b7f546f6b656e207472616e736665722072657475726e65642066616c73650000005f82015250565b5f6116e8601d83611103565b91506116f3826116b4565b602082019050919050565b5f6020820190508181035f830152611715816116dc565b905091905056fea264697066735822122097563f883a05b7a3963fe3db2636c8d75dd814c5ea7ff04ac66d8d0997b7d46764736f6c634300081e0033a2646970667358221220f30c7fc296f2ab209ea3ace62c3f429d3341ddb8cf40bfdf537bbf2e01fb1e7e64736f6c634300081e0033
Verified Source Code Full Match
Compiler: v0.8.30+commit.73712a01
EVM: prague
Optimization: No
PaymentFactory.sol 284 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
// USDT/USDC don't return bool, they revert on failure
// Use low-level call to handle both patterns
(bool success, bytes memory returnData) = tokenContract.call(
abi.encodeWithSignature("transfer(address,uint256)", generalWallet, balance)
);
// Check if call was successful
require(success, "Token transfer call failed");
// If return data exists, check if it's a boolean (some tokens return bool)
if (returnData.length > 0) {
// Decode the return value (should be bool for standard ERC20)
// If decoding fails or returns false, revert
bool transferResult = abi.decode(returnData, (bool));
require(transferResult, "Token transfer returned false");
}
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