Skip to content

Commit 1194f81

Browse files
Merge pull request #106 from Soneso/p-22
Support for protocol 22
2 parents 5cd0853 + e944c19 commit 1194f81

14 files changed

+368
-108
lines changed

lib/src/invoke_host_function_operation.dart

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,36 @@ abstract class HostFunction {
7272
}
7373
}
7474
break;
75+
case XdrHostFunctionType.HOST_FUNCTION_TYPE_CREATE_CONTRACT_V2:
76+
if (xdr.createContractV2 != null) {
77+
if (xdr.createContractV2!.contractIDPreimage.type ==
78+
XdrContractIDPreimageType.CONTRACT_ID_PREIMAGE_FROM_ADDRESS) {
79+
if (xdr.createContractV2!.executable.type ==
80+
XdrContractExecutableType.CONTRACT_EXECUTABLE_WASM &&
81+
xdr.createContractV2!.executable.wasmHash != null) {
82+
String wasmId = Util.bytesToHex(
83+
xdr.createContractV2!.executable.wasmHash!.hash);
84+
return CreateContractWithConstructorHostFunction(
85+
Address.fromXdr(
86+
xdr.createContractV2!.contractIDPreimage.address!),
87+
wasmId, xdr.createContractV2!.constructorArgs,
88+
salt: xdr.createContractV2!.contractIDPreimage.salt!);
89+
} else if (xdr.createContractV2!.executable.type ==
90+
XdrContractExecutableType.CONTRACT_EXECUTABLE_STELLAR_ASSET) {
91+
return DeploySACWithSourceAccountHostFunction(
92+
Address.fromXdr(
93+
xdr.createContractV2!.contractIDPreimage.address!),
94+
salt: xdr.createContractV2!.contractIDPreimage.salt!);
95+
}
96+
} else if (xdr.createContractV2!.contractIDPreimage.type ==
97+
XdrContractIDPreimageType.CONTRACT_ID_PREIMAGE_FROM_ASSET &&
98+
xdr.createContractV2!.executable.type ==
99+
XdrContractExecutableType.CONTRACT_EXECUTABLE_STELLAR_ASSET) {
100+
return DeploySACWithAssetHostFunction(Asset.fromXdr(
101+
xdr.createContractV2!.contractIDPreimage.fromAsset!));
102+
}
103+
}
104+
break;
75105
}
76106
throw UnimplementedError();
77107
}
@@ -117,6 +147,37 @@ class CreateContractHostFunction extends HostFunction {
117147
}
118148
}
119149

150+
class CreateContractWithConstructorHostFunction extends HostFunction {
151+
Address _address;
152+
Address get address => this._address;
153+
set address(Address value) => this._address = value;
154+
155+
String _wasmId;
156+
String get wasmId => this._wasmId;
157+
set wasmId(String value) => this._wasmId = value;
158+
159+
List<XdrSCVal> _constructorArgs;
160+
List<XdrSCVal> get constructorArgs => this._constructorArgs;
161+
set constructorArgs(List<XdrSCVal> value) => this._constructorArgs = value;
162+
163+
late XdrUint256 _salt;
164+
XdrUint256 get salt => this._salt;
165+
set salt(XdrUint256 value) => this._salt = value;
166+
167+
CreateContractWithConstructorHostFunction(this._address, this._wasmId, this._constructorArgs, {XdrUint256? salt}) {
168+
if (salt != null) {
169+
this._salt = salt;
170+
} else {
171+
this._salt = new XdrUint256(TweetNaCl.randombytes(32));
172+
}
173+
}
174+
175+
@override
176+
XdrHostFunction toXdr() {
177+
return XdrHostFunction.forCreatingContractV2(address.toXdr(), salt, wasmId, constructorArgs);
178+
}
179+
}
180+
120181
class DeploySACWithSourceAccountHostFunction extends HostFunction {
121182
Address _address;
122183
Address get address => this._address;

lib/src/responses/asset_response.dart

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ class AssetResponse extends Response {
1818
AssetBalances balances;
1919
String claimableBalancesAmount;
2020
String pagingToken;
21-
String amount;
22-
int numAccounts;
2321
int numLiquidityPools;
2422
String liquidityPoolsAmount;
2523
Flags flags;
@@ -39,8 +37,6 @@ class AssetResponse extends Response {
3937
this.balances,
4038
this.claimableBalancesAmount,
4139
this.pagingToken,
42-
this.amount,
43-
this.numAccounts,
4440
this.numLiquidityPools,
4541
this.liquidityPoolsAmount,
4642
this.flags,
@@ -65,8 +61,6 @@ class AssetResponse extends Response {
6561
AssetBalances.fromJson(json['balances']),
6662
json['claimable_balances_amount'],
6763
json['paging_token'],
68-
json['amount'],
69-
convertInt(json['num_accounts']!)!,
7064
convertInt(json['num_liquidity_pools']!)!,
7165
json['liquidity_pools_amount'],
7266
Flags.fromJson(json['flags']),

lib/src/responses/submit_transaction_response.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ class SubmitAsyncTransactionResponse {
386386
txStatus: json['tx_status'],
387387
hash: json['hash'],
388388
httpStatusCode: httpResponseStatusCode,
389-
errorResultXdrBase64: json['errorResultXdr'],
389+
errorResultXdrBase64: json['errorResultXdr'] ?? json['error_result_xdr'],
390390
);
391391
}
392392

lib/src/responses/transaction_response.dart

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ class TransactionResponse extends Response {
3131
Memo _memo;
3232
String? memoBytes;
3333
List<String> signatures;
34-
String? validAfter;
35-
String? validBefore;
3634
FeeBumpTransactionResponse? feeBumpTransaction;
3735
InnerTransaction? innerTransaction;
3836
TransactionResponseLinks links;
@@ -62,8 +60,6 @@ class TransactionResponse extends Response {
6260
this._memo,
6361
this.memoBytes,
6462
this.signatures,
65-
this.validAfter,
66-
this.validBefore,
6763
this.feeBumpTransaction,
6864
this.innerTransaction,
6965
this.links,
@@ -99,8 +95,6 @@ class TransactionResponse extends Response {
9995
Memo.fromJson(json),
10096
json['memo_bytes'],
10197
signaturesList,
102-
json['valid_after'],
103-
json['valid_before'],
10498
json['fee_bump_transaction'] == null
10599
? null
106100
: FeeBumpTransactionResponse.fromJson(json['fee_bump_transaction']),

lib/src/sep/0011/txrep.dart

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,10 @@ class TxRep {
710710
type) {
711711
var args = _getCreateContractArgs('$prefix.createContractHostFn', map);
712712
return XdrSorobanAuthorizedFunction.forCreateContractArgs(args);
713+
} else if ('SOROBAN_AUTHORIZED_FUNCTION_TYPE_CREATE_CONTRACT_V2_HOST_FN' ==
714+
type) {
715+
var args = _getCreateContractArgsV2('$prefix.createContractV2HostFn', map);
716+
return XdrSorobanAuthorizedFunction.forCreateContractArgsV2(args);
713717
} else {
714718
throw Exception('unknown $prefix.type');
715719
}
@@ -940,6 +944,26 @@ class TxRep {
940944
return XdrCreateContractArgs(preimage, executable);
941945
}
942946

947+
static XdrCreateContractArgsV2 _getCreateContractArgsV2(
948+
String prefix, Map<String, String> map) {
949+
var preimage = _getContractIDPreimage('$prefix.contractIDPreimage', map);
950+
var executable = _getContractExecutable('$prefix.executable', map);
951+
var argsLenStr = _getString('$prefix.constructorArgs.len', map);
952+
int argsLen = 0;
953+
try {
954+
argsLen = int.parse(argsLenStr);
955+
} catch (e) {
956+
throw Exception('invalid value for $prefix.constructorArgs.len');
957+
}
958+
List<XdrSCVal> args = List<XdrSCVal>.empty(growable: true);
959+
for (int i = 0; i < argsLen; i++) {
960+
XdrSCVal next = _getSCVal('$prefix.constructorArgs[$i]', map);
961+
args.add(next);
962+
}
963+
964+
return XdrCreateContractArgsV2(preimage, executable, args);
965+
}
966+
943967
static XdrHostFunction _getHostFunction(
944968
String prefix, Map<String, String> map) {
945969
String type = _getString('$prefix.type', map);
@@ -951,6 +975,10 @@ class TxRep {
951975
var createContractArgs =
952976
_getCreateContractArgs('$prefix.createContract', map);
953977
return XdrHostFunction.forCreatingContractWithArgs(createContractArgs);
978+
} else if (type == 'HOST_FUNCTION_TYPE_CREATE_CONTRACT_V2') {
979+
var createContractArgs =
980+
_getCreateContractArgsV2('$prefix.createContractV2', map);
981+
return XdrHostFunction.forCreatingContractV2WithArgs(createContractArgs);
954982
} else if (type == 'HOST_FUNCTION_TYPE_UPLOAD_CONTRACT_WASM') {
955983
var wasmStr = _getString('$prefix.wasm', map);
956984
return XdrHostFunction.forUploadContractWasm(Util.hexToBytes(wasmStr));
@@ -3137,6 +3165,11 @@ class TxRep {
31373165
_addLine('$fnPrefix.type', 'HOST_FUNCTION_TYPE_CREATE_CONTRACT', lines);
31383166
_addCreateContractArgs(
31393167
hostFunctionXdr.createContract!, lines, '$fnPrefix.createContract');
3168+
} else if (hostFunctionXdr.type ==
3169+
XdrHostFunctionType.HOST_FUNCTION_TYPE_CREATE_CONTRACT_V2) {
3170+
_addLine('$fnPrefix.type', 'HOST_FUNCTION_TYPE_CREATE_CONTRACT_V2', lines);
3171+
_addCreateContractArgsV2(
3172+
hostFunctionXdr.createContractV2!, lines, '$fnPrefix.createContractV2');
31403173
} else if (hostFunctionXdr.type ==
31413174
XdrHostFunctionType.HOST_FUNCTION_TYPE_UPLOAD_CONTRACT_WASM) {
31423175
_addLine(
@@ -3195,6 +3228,13 @@ class TxRep {
31953228
'SOROBAN_AUTHORIZED_FUNCTION_TYPE_CREATE_CONTRACT_HOST_FN', lines);
31963229
_addCreateContractArgs(function.createContractHostFn!, lines,
31973230
'$prefix.createContractHostFn');
3231+
} else if (function.type ==
3232+
XdrSorobanAuthorizedFunctionType
3233+
.SOROBAN_AUTHORIZED_FUNCTION_TYPE_CREATE_CONTRACT_V2_HOST_FN) {
3234+
_addLine('$prefix.type',
3235+
'SOROBAN_AUTHORIZED_FUNCTION_TYPE_CREATE_CONTRACT_V2_HOST_FN', lines);
3236+
_addCreateContractArgsV2(function.createContractV2HostFn!, lines,
3237+
'$prefix.createContractV2HostFn');
31983238
}
31993239
}
32003240

@@ -3227,6 +3267,19 @@ class TxRep {
32273267
_addContractExecutable(args.executable, lines, '$prefix.executable');
32283268
}
32293269

3270+
static _addCreateContractArgsV2(
3271+
XdrCreateContractArgsV2 args, List<String> lines, String prefix) {
3272+
_addContractIDPreimage(
3273+
args.contractIDPreimage, lines, '$prefix.contractIDPreimage');
3274+
_addContractExecutable(args.executable, lines, '$prefix.executable');
3275+
3276+
int argsLen = args.constructorArgs.length;
3277+
_addLine('$prefix.constructorArgs.len', argsLen.toString(), lines);
3278+
for (int i = 0; i < argsLen; i++) {
3279+
_addSCVal(args.constructorArgs[i], lines, '$prefix.constructorArgs[$i]');
3280+
}
3281+
}
3282+
32303283
static _addContractIDPreimage(
32313284
XdrContractIDPreimage preimage, List<String> lines, String prefix) {
32323285
if (preimage.type ==

lib/src/soroban/soroban_auth.dart

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -167,18 +167,19 @@ class SorobanCredentials {
167167
class SorobanAuthorizedFunction {
168168
XdrInvokeContractArgs? contractFn;
169169
XdrCreateContractArgs? createContractHostFn;
170+
XdrCreateContractArgsV2? createContractV2HostFn;
170171

171172
SorobanAuthorizedFunction(
172173
{XdrInvokeContractArgs? contractFn,
173-
XdrCreateContractArgs? createContractHostFn}) {
174-
if (contractFn == null && createContractHostFn == null) {
175-
throw ArgumentError("invalid arguments");
176-
}
177-
if (contractFn != null && createContractHostFn != null) {
174+
XdrCreateContractArgs? createContractHostFn,
175+
XdrCreateContractArgsV2? createContractV2HostFn}) {
176+
if (contractFn == null && createContractHostFn == null && createContractV2HostFn == null) {
178177
throw ArgumentError("invalid arguments");
179178
}
179+
180180
this.contractFn = contractFn;
181181
this.createContractHostFn = createContractHostFn;
182+
this.createContractV2HostFn = createContractV2HostFn;
182183
}
183184

184185
static SorobanAuthorizedFunction forContractFunction(
@@ -194,16 +195,28 @@ class SorobanAuthorizedFunction {
194195
createContractHostFn: createContractHostFn);
195196
}
196197

198+
static SorobanAuthorizedFunction forCreateContractV2HostFunction(
199+
XdrCreateContractArgsV2 createContractV2HostFn) {
200+
return SorobanAuthorizedFunction(
201+
createContractV2HostFn: createContractV2HostFn);
202+
}
203+
197204
static SorobanAuthorizedFunction fromXdr(XdrSorobanAuthorizedFunction xdr) {
198205
if (xdr.type ==
199206
XdrSorobanAuthorizedFunctionType
200207
.SOROBAN_AUTHORIZED_FUNCTION_TYPE_CONTRACT_FN &&
201208
xdr.contractFn != null) {
202209
return SorobanAuthorizedFunction(
203210
contractFn:xdr.contractFn!);
204-
} else {
211+
} else if (xdr.type ==
212+
XdrSorobanAuthorizedFunctionType
213+
.SOROBAN_AUTHORIZED_FUNCTION_TYPE_CREATE_CONTRACT_HOST_FN &&
214+
xdr.createContractHostFn != null) {
205215
return SorobanAuthorizedFunction(
206216
createContractHostFn: xdr.createContractHostFn);
217+
} else {
218+
return SorobanAuthorizedFunction(
219+
createContractV2HostFn: xdr.createContractV2HostFn);
207220
}
208221
}
209222

@@ -214,11 +227,17 @@ class SorobanAuthorizedFunction {
214227
.SOROBAN_AUTHORIZED_FUNCTION_TYPE_CONTRACT_FN);
215228
cfn.contractFn = contractFn!;
216229
return cfn;
230+
} else if (createContractHostFn != null) {
231+
XdrSorobanAuthorizedFunction cfn = XdrSorobanAuthorizedFunction(
232+
XdrSorobanAuthorizedFunctionType
233+
.SOROBAN_AUTHORIZED_FUNCTION_TYPE_CREATE_CONTRACT_HOST_FN);
234+
cfn.createContractHostFn = createContractHostFn!;
235+
return cfn;
217236
}
218237
XdrSorobanAuthorizedFunction cfn = XdrSorobanAuthorizedFunction(
219238
XdrSorobanAuthorizedFunctionType
220-
.SOROBAN_AUTHORIZED_FUNCTION_TYPE_CREATE_CONTRACT_HOST_FN);
221-
cfn.createContractHostFn = createContractHostFn!;
239+
.SOROBAN_AUTHORIZED_FUNCTION_TYPE_CREATE_CONTRACT_V2_HOST_FN);
240+
cfn.createContractV2HostFn = createContractV2HostFn!;
222241
return cfn;
223242
}
224243
}

0 commit comments

Comments
 (0)